我试图从两个不同的分布中抽取概率为100000次。不幸的是,我无法看到我的for循环出了什么问题,但是,它只向simulated_data
添加了1个值而不是所需的100,000个值。
问题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 :(得分:1)
使用每个分布中所需的值分数创建一个向量,然后创建值的随机排列:
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
分数是固定的。如果你想要一个可能随机的部分(但统计上接近0.99),那么试试这个:
> 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
答案 1 :(得分:0)
这里有一个很好的解决方案:
os.system
答案 2 :(得分:0)
您似乎想要创建一个最终样本,其中每个元素都是从sample1或sample2中随机获取的,概率为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)
在这种情况下,不能保证样品1中的样品确实为0.99 * n,样品2中的样品为0.01 * n。事实上:
> sum(sample == sample1)
[1] 98953
按预期接近0.99 * n,但不完全正确。