矢量化复杂的for循环并提高R的速度

时间:2013-09-11 05:41:27

标签: r for-loop vector matrix sapply

您好我正试图通过矢量化来加速计算以下for循环,即使用sapply()等。

但由于结构非常复杂,似乎不可能完成任务。我已经尝试了几天但最终没有解决方案。

有没有人可以看看如何加快以下功能?

alpha2f <- function(p0,t2,n1,n2){
  alpha2=0
  for (x1 in 12:n1){    
    for (x2 in 0:n2){    
      for (y2 in 0:n2){
        a=dbinom(x1,n1,p0)
        b=dbinom(x2,n2,p0)
        alpha2=alpha2+a*b*dbinom(y2,n2,p0)*ifelse(ztest(x1+x2,y2,n1+n2,n2)>t2,1,0)
      }}}
  return(alpha2)
}

1 个答案:

答案 0 :(得分:0)

你可以通过对代码进行矢量化并删除不必要的东西(如ifelse)来加快代码速度。你应该试试:

alpha2f <- function(p0, t2, n1, n2){
  alls <- expand.grid(x1=12:n1, x2=0:n2, y2=0:n2)
  a <- dbinom(alls$x1, n1, p0)
  b <- dbinom(alls$x2, n2, p0)
  z <- numeric(nrow(alls))
  X <- alls$x1+alls$x2
  N <- n1+n2
  for (i in 1:length(z))
   z[i] <- (ztest(X[i], alls$y2|i], N, n2) > t2)
  d <- dbinom(alls$y2,n2,p0)
  alpha2 <- sum(a*b*d*z)
  return(alpha2)
  }

我无法测试它,因为我不知道你使用了哪个ztest功能。如果此函数是矢量化的,那么您不需要循环。 HTH