【问题标题】:Using "apply" to increase speed in R使用“应用”来提高 R 中的速度
【发布时间】:2014-05-20 22:01:53
【问题描述】:

已编辑:我根据您的一些建议编辑了下面的代码(我摆脱了 prop.test 函数并爬出了地狱的第二个圈子)。我很好奇在加快速度方面接下来的步骤是什么。我应该开始使用应用或并行处理,还是其他?

我的主要目标是让它运行得更快。正如我所说,我对此很陌生,所以我会很感激任何建议。感谢您的帮助!

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
}

解释我试图用这段代码做什么: 这是一个实验模拟,其中测试两组(a 和 b)以查看它们在整个实验中是否持续存在显着差异。我想证明传统的 p 值在这种情况下是如何不起作用的。当两组的样本量都为 1000 时(或者如果两组在实验期间的任何时候看起来有显着差异),实验就结束了,我将整个实验重复 500 次。

【问题讨论】:

  • 你运行的是什么操作系统? Windows、OSX 还是 Linux?如果您的一次性设备中有多个内核,则可以使用 parallel 包中的 apply 系列。
  • 并行化非常为时过早。首先你必须爬出Second Circle of Hell
  • ...下一步可能是编写自己的、极其精简的prop.test 版本。里面有很多你可能不需要的东西。
  • 乔兰完全正确
  • 感谢@joran 的建议。摆脱不断增长的向量会稍微提高速度,并且编写方程(而不是使用 prop.test 函数)会产生巨大的差异。我在原帖中添加了更新版本。

标签: r performance for-loop apply


【解决方案1】:

您已经获得了一些建议,这些建议指出了您对循环内容进行编码的有效性。您是否应该多次调用rbinom() 来生成单个值?为什么不生成一个大数字,比如一次 1000 个,每个 500 个,然后处理它们,可能使用mapply?你读到的那些声称用apply() 提高效率的人真的是大错特错。无论生成为while()for()apply() 循环,循环都是循环。关键是学习使用矢量化策略。

【讨论】:

  • 我同意。即使查看apply 的来源也令人生畏。我没有看到 C 代码/调用的碎片,所有的 R 代码......但我仍然使用它。
  • C 代码将在对vapply 的调用中发送到.Internal(vapply, ....)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-11
  • 2020-03-16
  • 2018-03-20
  • 1970-01-01
  • 2012-01-05
  • 2012-04-20
  • 1970-01-01
相关资源
最近更新 更多