首页 > 解决方案 > 此蒙特卡洛模拟 (R) 中的 set.seed 函数

问题描述

我对这段代码的工作方式有一些疑问。这既是统计数据又是编码问题,所以请让我知道我是否应该将其带到堆栈交换的统计数据部分。我知道要编写什么代码来获得答案,但是返回的代码对我来说没有意义。这是问题

问:假设您正在测试 20 种饮食对小鼠体重的影响。对于 20 种饮食中的每一种,您都用 10 只对照小鼠和 10 只治疗小鼠进行了实验。假设饮食对所有 20 种饮食都没有影响的零假设是正确的,并且小鼠体重遵循平均 30 克和标准偏差为 2 克的正态分布,对其中一项研究运行蒙特卡罗模拟:

cases = rnorm(10,30,2)
controls = rnorm(10,30,2)
t.test(cases,controls)

现在运行蒙特卡罗模拟,模拟所有 20 种饮食的实验结果。如果将种子设置为 100,请 set.seed(100),并在调用中使用与上述相同的代码来复制有多少 p 值(数字而非比例)低于 0.05?”

这是我写的代码

set.seed(100)
pvals <- replicate(20,{
  cases = rnorm(10,30,2)
  controls = rnorm(10,30,2)
  t.test(cases,controls)$p.val
})
sum(pvals<.05)

首先,我的编码问题是为什么我需要 set.seed(100) 部分?复制不是在这里为我做所有事情吗?当我在注释掉 set.seed 部分时重新运行代码时,答案为 1 并没有改变,所以我很困惑 set.seed 在这里有什么用处。

其次,这个问题听起来与统计数据相关,但我认为它与代码有关。sum(pvals<.o5)即使在我多次运行后,该部分返回的答案也始终为 1,这令人困惑,因为我认为 p 值是随机的,并且通过多次随机比较,p 值会有所不同。为什么每次我运行它时,在这个模拟中总是只有 1 个低于 0.05 的 p 值?

标签: rmontecarlo

解决方案


推荐阅读