我写过我认为是半快速ols-回归函数
ols32 <- function (y, x,Ridge=1.1) {
xrd<-crossprod(x)
xry<-crossprod(x, y)
diag(xrd)<-Ridge*diag(xrd)
solve(xrd,xry)
}
现在我想将其应用于以下
(vapply(1:la, function(J)
ME %*% ols32((nza[,J]),(cbind(nzaf1[,J],nzaf2[,J],nza[,-J],MOMF)))
[(la+2):(2*la+1)],FUN.VALUE=0))
其中nza,nzaf1,nzaf2和MOMF是500x50矩阵,la = 50,ME是长度为50的向量。 所以我实际上做的是回归,但只使用MOMF中的β系数,乘以ME。
nza.mat<-matrix(rnorm(500*200),ncol=200)
nza<-nza.mat[,1:50]
nzaf2<-nza.mat[,101:150]
MOMF<-nza.mat[,151:200]
nzaf1<-nza.mat[,51:100]
ME<-nza.mat[500,151:200]
是否有一种让事情变得更快的方法,或者我是否需要使用像RcppEigen这样的东西? Tks P
所以我通过重写我的ols-function来提出一种稍微快一点的方法来解决这个问题,这样它就可以为整个矩阵计算两次交叉产品。新功能如下所示:
ols.quick <- function (y, x, ME) {
la<-dim(y)[2]
XX.cross<-crossprod(x)
XY.cross<-crossprod(x, y)
diag(XX.cross)<-Ridge*diag(XX.cross)
betas<-sapply(1:la, function(J){
idx<-c((1:la)[-J],la+J,2*la+J,(3*la+1):(4*la));
solve(XX.cross[idx,idx],XY.cross[idx,J])},simplify=T)
ME%*%betas[(la+2):(2*la+1),]
}
,其中 y = nza(500x50)和x = cbind(nza,nzaf1,nzaf2,MOMF)(500x200) 这解决了问题的速度提高了3.5倍。
microbenchmark(ols.quick(nza,nza.mat,ME),
vapply(1:la, function(J) ME%*%ols32(nza[,J],(cbind(nzaf1[,J],nzaf2[,J],nza[,-J],MOMF)))
[(la+2): (lb+2)],FUN.VALUE=0))
min lq median uq max neval
66.30495 67.71903 68.57001 70.17742 77.80069 100
251.59395 255.43306 258.35041 262.85742 296.51313 100
我想我可以通过并行程序包中的parLapply获得一些速度但我还没看过它。