我想在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循环的控制结构。另外,通过“应用”函数系列是否有更简单的方法?
答案 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