0

嗨,我正在尝试通过矢量化来加速以下 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)
}
4

1 回答 1

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 函数。如果这个函数是矢量化的,那么你不需要循环。高温高压

于 2013-09-11T07:50:20.487 回答