【问题标题】:Repeat simulation of test scores 1000 times重复模拟考试成绩1000次
【发布时间】:2017-03-11 20:21:53
【问题描述】:

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

【问题讨论】:

  • 我也意识到我需要以某种方式在我的代码中考虑“至少 22”...我不能:(

标签: r simulation


【解决方案1】:

在一天结束时,您要测试是否至少有 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-liner(当然,在设置随机种子之后):

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

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

【讨论】:

  • 优雅简约!只是为了让我想对 josliber 说“谢谢”,我的评论仍然有效,所以我做了一个小的改进 - prop.table(table(replicate(1000, sum(rnorm(75, 70, 10) > 78) >= 22)))*100
【解决方案2】:

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

> 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

【讨论】:

  • 嗨 Clarius - 感谢您的回复,但您如何在代码中解释“至少 22”?
  • sum(replicate(1000, {scores 78))>=22}))/ 1000
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-03
  • 1970-01-01
  • 2023-03-24
  • 2016-02-07
相关资源
最近更新 更多