1

100000 回の確率で 2 つの異なる分布から描画しようとしています。残念ながら、for ループの何が問題なのかわかりませんsimulated_dataが、必要な 100,000 の値ではなく、1 つの値しか追加されません。

質問 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)
   }
}
4

3 に答える 3

0

各要素がサンプル 1 またはサンプル 2 のいずれかから確率 0.99 および 0.01 でランダムに取得される最終サンプルを作成する必要があるようです。

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

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

# 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)

この場合、sample1 から正確に 0.99*n サンプルがあり、sample2 から 0.01*n サンプルがあるという保証はありません。実際には:

> sum(sample == sample1)
[1] 98953

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

于 2016-10-20T05:16:45.523 に答える
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)
于 2016-10-20T04:51:05.733 に答える