【发布时间】:2014-07-05 08:09:40
【问题描述】:
我正在模拟类似Jim Berger's applet 的东西。
模拟工作如下:我将从零分布 N(0,1) 或替代分布 N( θ,1)。我将假设空值的先验概率是某个比例prop(因此替代方案的先验是1-prop)并且theta 在替代方案中的分布是N(0,2) (我可以更改所有这些参数,但这只是开始)。
我想从上述模拟场景中获得一定范围内的大量 pvalue(例如 0.049 和 0.05 之间的 2000 个 pvalue,在模拟中这将相当于 z stats arround 1.96 和 1.97),并查看有多少来自 null,有多少来自替代。
到目前为止,我想出了一个这样的解决方案:
berger <- function(prop, n){
z=0
while(z<=1.96|z>=1.97){
u <- runif(1)
if(u<prop){
H0 <- TRUE
x<-rnorm(n, 0, 1)
}else{
H0 <- FALSE
theta <- rnorm(1, 0, 2)
x <- rnorm(n, theta, 1)
}
z <- sqrt(n)*abs(mean(x))
}
return(H0)
}
results<-replicate(2000, berger(0.1, 100))
sum(results)/length(results) ## approximately 25%
大约需要 3.5 分钟。有可能加快这个速度吗?如何?欢迎所有答案,包括与 C 的集成。
更新:并行化可以稍微加快速度。但是,我在 Julia 中尝试过相同的代码,并且在没有任何并行化的情况下只需要 14 秒(代码如下)。
更新 2:使用 Rcpp 和并行化可以将模拟时间缩短到 8 秒。查看新答案。
function berger(prop, n)
z = 0
h0 = 0
while z<1.96 || z > 1.97
u = rand()
if u < prop
h0 = true;
x = randn(n)
else
h0 = false
theta = randn()*2
x = randn(n) + theta
end
z = sqrt(n)*abs(mean(x))
end
h0
end
results = [0]
for i in 1:2000
push!(results, berger(0.1, 100))
end
sum(results)/length(results)
【问题讨论】:
-
我真的不明白为什么只考虑
0.049 < p < 0.05很重要?我看到论文中提到了它,但对我个人来说没有意义。 -
@PascalvKooten 您想计算 H0 为真的概率,给定 p 约为 0.05。阅读 Jim Berger 的页面了解更多详情。
标签: r while-loop simulation bayesian julia