我尽量避免使用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