R 使用;套用;加速
编辑:我根据你的一些建议编辑了下面的代码(我去掉了prop.test函数,爬出了地狱的第二圈)。我很想知道下一步会是什么,以使这更快。我应该开始使用apply或并行处理,还是其他什么 我的主要目标是让这跑得更快。正如我所说,我对这一点还很陌生,所以我非常感谢任何建议。谢谢你的帮助R 使用;套用;加速,r,performance,for-loop,apply,R,Performance,For Loop,Apply,编辑:我根据你的一些建议编辑了下面的代码(我去掉了prop.test函数,爬出了地狱的第二圈)。我很想知道下一步会是什么,以使这更快。我应该开始使用apply或并行处理,还是其他什么 我的主要目标是让这跑得更快。正如我所说,我对这一点还很陌生,所以我非常感谢任何建议。谢谢你的帮助 number.of.trials<-500 n.limit<-1000 final.n.list<-numeric(number.of.trials) for (trials in 1:number
number.of.trials<-500
n.limit<-1000
final.n.list<-numeric(number.of.trials)
for (trials in 1:number.of.trials){
p.value<-2
n<-1
a<-0
b<-0
#this while loop stops once test shows significance or when n reaches the limit
while ((p.value > .05 | p.value==0) & n<=n.limit) {
##add new data points to a and b
a<-a+rbinom(1, 1, .5)
b<-b+rbinom(1, 1, .5)
##calculate chi-square test statistic with continuity correction
yates.stat<-2*n*(abs(a*(n-b)-b*(n-a))-n)^2/(n*n*(a+b)*(2*n-a-b))
##calculate p-value
p.value<-pchisq(q=yates.stat, df=1, lower.tail=FALSE)
n<-n+1
}
final.n.list[trials]<-n-1
}
number.of.trials您已经收到了一些建议,这些建议指出了您的循环内容编码的有效性。您是否应该调用rbinom()
多次生成单个值?为什么不生成一个大数字,比如说一次生成1000个,每个500个,然后用mapply
处理它们呢?你读到的那些声称使用apply()
提高效率的人其实是大错特错的。循环是循环,无论生成为while()
或for()
或apply()
循环。关键是学习使用矢量化策略。您正在运行什么操作系统?Windows、OSX还是Linux?如果一次性使用多个内核,可以使用并行
包中的应用
系列。并行化将是非常不成熟的。首先,你必须爬出……你的下一步可能是编写你自己的、极其精简的prop.test
版本。里面有很多你可能不需要的原油。乔兰说得对。谢谢@Joran的建议。去掉增长向量会稍微提高速度,而编写方程式(而不是使用prop.test函数)会产生巨大的差异。我在原始帖子中添加了更新版本。我同意。即使是查看apply
的源代码也令人望而生畏。我在那里没有看到一点C代码/调用,所有的R代码…但我仍然使用它。C代码将在调用vapply
时发送到。Internal(vapply,…)