从R中概率的两个分布绘制

时间:2016-10-20 04:27:38

标签: r probability distribution mixture

我试图从两个不同的分布中抽取概率为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)
   }
}

3 个答案:

答案 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,但不完全正确。