重复模拟测试分数1000次

时间:2017-03-11 20:21:54

标签: r simulation

我想在R中模拟下面的问题,并根据1000次模拟计算平均概率 - 测试分数通常以平均值70和标准差10分布。 估计75名随机选择的学生中至少22分大于78的概率

这是我到目前为止所做的事情

set.seed(1)
scores = rnorm(1000,70,10)
head(scores)
hist(scores)
sm75=sample(scores,75)
length(sm75[sm75>78])/75
#[1] 0.1866667

然而,这只给我一次迭代,我想要1000次迭代,然后取这1000次概率的平均值。我相信可以实现某种使用for循环的控制结构。另外,通过“应用”函数系列是否有更简单的方法?

2 个答案:

答案 0 :(得分:2)

在一天结束时,您正在测试是否至少有22名学生的得分高于78,这可以通过以下方式进行紧凑计算:

sum(rnorm(75, 70, 10) > 78) >= 22

稍微分解一下,rnorm(75, 70, 10)返回75分,通常分布为平均值70和标准差10. rnorm(75, 70, 10) > 78是一个长度为75的向量,表示这些是否都是得分高于78. sum(rnorm(75, 70, 10) > 78)将每个true转换为1,将每个false转换为0并将这些值加起来,这意味着它计算超过78的75个分数。最后我们测试总和是22还是上面的完整表达更高。

replicate可以用来复制任意次。因此,要查看1000个模拟的细分,您可以使用以下1个线程(当然,在设置随机种子之后):

set.seed(144)
table(replicate(1000, sum(rnorm(75, 70, 10) > 78) >= 22))
# FALSE  TRUE 
#   936    64 

在64个重复中,至少有22个学生的得分高于78,因此我们估计概率为6.4%。

答案 1 :(得分:0)

概率计算为有利结果的数量/结果总数。所以..

> scores <- sample(rnorm(1000,70,10),75)
> probability <- length(subset(scores,scores>78))/length(scores)
> probability
[1] 0.28

但是,你想要这样做1000次,然后取平均值。

> mean(replicate(1000, {scores<-sample(rnorm(1000,70,10),75);length(subset(scores,scores>78))/length(scores)}))
[1] 0.2133333