使用复制中心极限 t
using replicate central limit t
正在做一门课,下面就是题目。
library(downloader)
url <- "https://raw.githubusercontent.com/genomicsclass/dagdata/master/inst/extdata/femaleMiceWeights.csv"
filename <- "femaleMiceWeights.csv"
if(!file.exists("femaleMiceWeights.csv")) download(url,destfile=filename)
dat <- read.csv(filename)
假设我们对掷 n=100 骰子时看到 6 的次数的比例感兴趣。这是一个随机变量,我们可以用 x=sample(1:6, n, replace=TRUE) 模拟,我们感兴趣的比例可以表示为平均值:mean(x==6)。因为掷骰子是独立的,所以适用 CLT。
我们想掷 n 个骰子 10,000 次并保持这些比例。这个随机变量(6s 的比例)的均值 p=1/6 和方差 p*(1-p)/n。因此,根据 CLT z = (mean(x==6) - p) / sqrt(p*(1-p)/n) 应该是正常的,均值 0 和 SD 1。将种子设置为 1,然后使用复制到进行模拟,并报告z绝对值大于2的时间比例(CLT说应该是0.05左右)。
所以我写了以下内容:
set.seed(1)
n<-10000
p<-1/6
a<-replicate(n, {
x=sample(1:6, n, replace=TRUE)
z<-(mean(x==6) - p) / sqrt(p*(1-p)/n)
})
> mean(abs(a)>2)
[1] 0.0472
所以它错了但非常接近,有人看到我哪里错了吗?
My answer is marked wrong :( that is why i asked.. so i must have done something wrong :(
看起来你正在做功课什么的,然后你被标记为错误,因为你的代码并没有真正按照你的问题进行:
We want to roll n dice 10,000 times and keep these proportions
这是正确的版本;不要把 n
放在 sample()
.
里面
set.seed(1); n <- 10000; p <- 1/6
a <- replicate(n, (mean(sample(1:6, 10000, replace=TRUE)==6) - p) / sqrt(p*(1-p)/10000))
还有,你比较的对象不对。
CLT says it should be about 0.05
没有!您需要比较的理论数量是2 * pnorm(-2)
,即0.04550026
。 0.05
的相应分位数是 -qnorm(0.025)
,它是 1.96
而不是 2
。
让我们看看 mean(abs(a) > 2)
给出了什么。
- 使用
n = 10000
和set.seed(1)
,得到0.0472
,已经接近真实值;
- 使用
n = 20000
和 set.seed(1)
,您会得到 0.04565
,甚至更近!
我刚刚用几乎相同的代码解决了它:
set.seed(1); n <- 10000; p <- 1/6
a <- replicate(n, (mean(sample(1:6, 100, replace=TRUE)==6) - p) / sqrt(p*(1-p)/100))
请注意,问题是问题的表述...您想每次取 100 个样本,但要取 10000 个。0.0424 是正确答案。
正在做一门课,下面就是题目。
library(downloader)
url <- "https://raw.githubusercontent.com/genomicsclass/dagdata/master/inst/extdata/femaleMiceWeights.csv"
filename <- "femaleMiceWeights.csv"
if(!file.exists("femaleMiceWeights.csv")) download(url,destfile=filename)
dat <- read.csv(filename)
假设我们对掷 n=100 骰子时看到 6 的次数的比例感兴趣。这是一个随机变量,我们可以用 x=sample(1:6, n, replace=TRUE) 模拟,我们感兴趣的比例可以表示为平均值:mean(x==6)。因为掷骰子是独立的,所以适用 CLT。
我们想掷 n 个骰子 10,000 次并保持这些比例。这个随机变量(6s 的比例)的均值 p=1/6 和方差 p*(1-p)/n。因此,根据 CLT z = (mean(x==6) - p) / sqrt(p*(1-p)/n) 应该是正常的,均值 0 和 SD 1。将种子设置为 1,然后使用复制到进行模拟,并报告z绝对值大于2的时间比例(CLT说应该是0.05左右)。
所以我写了以下内容:
set.seed(1)
n<-10000
p<-1/6
a<-replicate(n, {
x=sample(1:6, n, replace=TRUE)
z<-(mean(x==6) - p) / sqrt(p*(1-p)/n)
})
> mean(abs(a)>2)
[1] 0.0472
所以它错了但非常接近,有人看到我哪里错了吗?
My answer is marked wrong :( that is why i asked.. so i must have done something wrong :(
看起来你正在做功课什么的,然后你被标记为错误,因为你的代码并没有真正按照你的问题进行:
We want to roll n dice 10,000 times and keep these proportions
这是正确的版本;不要把 n
放在 sample()
.
set.seed(1); n <- 10000; p <- 1/6
a <- replicate(n, (mean(sample(1:6, 10000, replace=TRUE)==6) - p) / sqrt(p*(1-p)/10000))
还有,你比较的对象不对。
CLT says it should be about 0.05
没有!您需要比较的理论数量是2 * pnorm(-2)
,即0.04550026
。 0.05
的相应分位数是 -qnorm(0.025)
,它是 1.96
而不是 2
。
让我们看看 mean(abs(a) > 2)
给出了什么。
- 使用
n = 10000
和set.seed(1)
,得到0.0472
,已经接近真实值; - 使用
n = 20000
和set.seed(1)
,您会得到0.04565
,甚至更近!
我刚刚用几乎相同的代码解决了它:
set.seed(1); n <- 10000; p <- 1/6
a <- replicate(n, (mean(sample(1:6, 100, replace=TRUE)==6) - p) / sqrt(p*(1-p)/100))
请注意,问题是问题的表述...您想每次取 100 个样本,但要取 10000 个。0.0424 是正确答案。