2016-10-20 6 views
0

確率が100000倍の2つの異なる分布から描画しようとしています。残念ながら私はforループで何が間違っているかはわかりませんが、希望する100,000の値の代わりに1つの値をsimulated_dataに加えるだけです。確率が2つの分布から描画するR

質問1:これを修正するにはどうすればよいですか?

質問2:リスト内の100,000項目をループする必要がない、はるかに効率的な方法がありますか?ここで

#creating a vector of probabilities 
probabilities <- rep(0.99,100000) 
#creating a vector of booleans 
logicals <- runif(length(probabilities)) < probabilities 

#empty list for my simulated data 
simulated_data <- c() 

#drawing from two different distributions depending on the value in logicals 
for(i in logicals){ 

    if (isTRUE(i)) { 
    simulated_data[i] <- rnorm(n = 1, mean = 0, sd = 1) 
    }else{ 
    simulated_data[i] <- rnorm(n = 1, mean = 0, sd = 10) 
    } 
} 
+0

を私はあなたが理由あなたのループきちんとあなたの問題を解決しますが、今後の参考のためご覧くださいなぜなら 'for each'ループを使うとき、' i番目の項はインデックスではないからです。したがって、 'simulated_data [i]'は 'simulated_data [TRUE]'または 'simulated_data [FALSE]'としてのみインスタンス化され、1つの値が割り当てられます。 1つの潜在的な解決策は 'for(i in 1:length(logicals)) 'を使用することです。 – Zach

+0

@ Zach:ループで '1:n'を使うべきではないことを除けば、ほぼ+1です。代わりに 'seq_len(n)'を使います( 'n'がゼロであると判明した場合、前者は奇妙なことを行います)。 'seq_along'は別の関連する関数です。 – JDL

答えて

0

ここに誰のための素晴らしいソリューションです:

n <- 100000 
prob1 <- 0.99 
prob2 <- 1-prob1 

dist1 <- rnorm(prob1*n, 0, 1) 
dist2 <- rnorm(prob2*n, 0, 10) 

actual_sample <- c(dist1, dist2) 
0

あなたが確率0.99と0.01で、各要素はSAMPLE1またはsample2のいずれかからランダムに取られ、最終的なサンプルを作成したいと思われます。

正しいアプローチは、それぞれが同じ数の要素を含み、どちらかからランダムに選択する両方のサンプルを生成することです。

正しいアプローチは次のようになります

# Generate both samples 
n = 100000 
sample1 = rnorm(n,0,1) 
sample2 = rnorm(n,0,10) 

# Create the logical vector that will decide whether to take from sample 1 or 2 
s1_s2 = runif(n) < 0.99 

# Create the final sample 
sample = ifelse(s1_s2 , sample1, sample2) 

この場合には、* N SAMPLE2からSAMPLE1と0.01から正確に150個の* n個のサンプルがあることを保証されません。実際:

これは、予想通り0.99 * nに近いですが、正確ではありません。

0

は、各分布からの値の所望の画分を有するベクターを作成し、値のランダム順列を作成する:

N = 10000 
frac =0.99 
rand_mix = sample(c(rnorm(frac*N, 0, sd=1) , rnorm((1-frac)*N, 0, sd=10))) 

> table(abs(rand_mix) >1.96) 

FALSE TRUE 
9364 636 
> (100000-636)/100000 
[1] 0.99364 

> table(rnorm(10000) >6) 

FALSE 
10000 

割合が固定されています。あなたはおそらくランダム画分(しかし、統計的に150に近い)をwante場合、この方法を試してください。

> table(sample(c(rnorm(10e6), rnorm(10e4, sd=10)), 10e4) > 1.96) 

FALSE TRUE 
97151 2849 

は、と比較する:

> N = 100000 
> frac =0.99 
> rand_mix = sample(c(rnorm(frac*N, 0, sd=1) , rnorm((1-frac)*N, 0, sd=10))) 
> table(rand_mix > 1.96) 

FALSE TRUE 
97117 2883 
+0

これはこれまでのところ最高だと思います。ディストリビューションに正確に0.99と0.1を強制するような強制はありません。 – mat4nier

+0

実際には、1つから0.99 * N、もう1つでは0.01 * Nであることが強制されますが、値はランダムであるため、指定されたカットポイントより上の部分は描画ごとに変化します。この解決策は、注文がスクランブルされてから特定の値がどの分布になったのかを実際には分からないような方法で値を返すという意味で「より良い」ことがあります。 –

+0

ああ、1 distのベクトル0.99 * nと別のdistの0.01 * nを生成し、それらを一緒に接着する最初の解決法と同じです。 – mat4nier

関連する問題