1

我试图避免 R 中的循环,但似乎我必须使用它有时:

X=rnorm(100)
Y=matrix(rnorm(200*100),ncol=100)
Beta=function(y,period){  # y is a vector, maybe one row of Y
  num.col=length(y)-period+1
  ret=matrix(NA,1,num.col)  # store the result
  for(i in period:(length(y))){
    lm.sol=lm(y[(i-period+1):i]~X[(i-period+1):i])
    ret[i-period+1]=lm.sol$coefficients[2]
    }
  return(ret)
}
beta.30=apply(Y,1,Beta,period=30)
beta.30=t(beta.30)

我尝试通过使用来避免循环apply,但是函数中仍然存在for循环Beta,并且计算速度不够快,有没有什么方法可以避免for这种算法中的循环?或者有什么方法可以加速算法?

谢谢!

我能想到的一种方法是Beta通过以下方式编译函数:

require(compiler)
enableJIT(3)

但仍然不够快,我想我需要修改算法本身。

lm.fit很有帮助!它大大提高了速度。

Beta1=function(y,period){
  num.col=length(y)-period+1
  ret=matrix(NA,1,num.col)
  for(i in period:(length(y))){
    A=matrix(c(rep(1,period),X[(i-period+1):i]),ncol=2)
    lm.sol=lm.fit(A,y[(i-period+1):i])
    ret[i-period+1]=lm.sol$coefficients[2]
  }
  return(ret)
}
system.time(apply(Y,1,Beta,period=30))
user system elapsed
19.08 0.00 19.08
system.time(apply(Y,1,Beta1,period=30))
user system elapsed
1.09 0.00 1.09
4

0 回答 0