重复模拟考试成绩1000次
Repeat simulation of test scores 1000 times
我想在 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 循环的控制结构。此外,是否有更简单的方法来完成 "apply" 函数族?
在一天结束时,您正在测试是否至少有 22 名学生的分数高于 78,这可以通过以下方式紧凑地计算:
sum(rnorm(75, 70, 10) > 78) >= 22
稍微分解一下,rnorm(75, 70, 10)
returns 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%。
概率计算为有利结果数/结果总数。所以..
> 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
我想在 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 循环的控制结构。此外,是否有更简单的方法来完成 "apply" 函数族?
在一天结束时,您正在测试是否至少有 22 名学生的分数高于 78,这可以通过以下方式紧凑地计算:
sum(rnorm(75, 70, 10) > 78) >= 22
稍微分解一下,rnorm(75, 70, 10)
returns 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%。
概率计算为有利结果数/结果总数。所以..
> 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