我试图避免 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