在下面的代码中,我不是以p = 0.01开始然后递增它,而是希望能够执行类似p =(1:99)/ 100的操作,然后循环执行p.例如,代替p = 0.01,让我们让p =(1:99)/ 100.现在,我尝试用p替换我的for循环中的1:99.但是,当我运行代码时,我开始遇到coverage [i]的问题(它返回数字(0)).看起来这应该是相当微不足道的,所以我希望我只是在我的代码中忽略了一些东西.
此外,如果你看到任何容易提高的效率,请随时加入!谢谢=)
w=seq(.01,.99,by=.01)
coverage=seq(1:99)
p=0.01
for (i in 1:99){
count = 0
for (j in 1:1000){
x = rbinom(30,1,p)
se=sqrt(sum(x)/30*(1-sum(x)/30)/30)
if( sum(x)/30-1.644854*se < p && p < sum(x)/30+1.644854*se )
count = count + 1
}
coverage[i]=count/1000
print(coverage[i])
p=p+0.01
}
Run Code Online (Sandbox Code Playgroud)
我会在中间部分而不是外部循环上工作.
coverage <- p <- 1:99/100
z <- qnorm(0.95)
for (i in seq(along=p) ){
# simulate all of the binomials/30 at once
x <- rbinom(1000, 30, p[i])/30
# ses
se <- sqrt(x * (1-x)/30)
# lower and upper limits
lo <- x - z*se
hi <- x + z*se
# coverage
coverage[i] <- mean(p[i] > lo & p[i] < hi)
}
Run Code Online (Sandbox Code Playgroud)
这几乎是我的瞬间.诀窍是矢量化那些模拟和计算.在我6岁的Mac Pro上,增加到100,000个模拟重复只用了4秒钟.
(你需要增加重复数以查看结果中的结构; plot(p, coverage, las=1)100k reps给出以下结果; 仅用1000次重复就不清楚了.)

| 归档时间: |
|
| 查看次数: |
8939 次 |
| 最近记录: |