Hi, everyone.
I need to run lm with the same response vector but with varying predictor 
vectors. (i.e. 1 response vector on each individual 6,000 predictor vectors)
After looking through the R archive, I found roughly 3 methods that has been 
suggested.
Unfortunately, I need to run this task multiple times(~ 5,000 times) and would 
like to find a faster way than the existing methods.
All three methods I have bellow run on my machine timed with system.time 13~20 
seconds.

The opposite direction of 6,000 response vectors and 1 predictor vectors, that 
is supported with lm runs really fast ~0.5 seconds. 
They are pretty much performing the same number of lm fits, so I was wondering 
if there was a faster way, before I try to code this up in c++.

thanks!!

## sample data ###
regress.y = rnorm(150)
predictors = matrix(rnorm(6000*150), ncol=150, nrow=6000)

## method 1 ##                                                                  
                                                                                
                                                  
data.residuals = t(apply(predictors, 1, function(x)( lm(regress.y ~ -1 + 
as.vector(x))$residuals)))

user  system elapsed 
 15.076   0.048  15.128

## method 2 ##                                                                  
                                                                                
           
data.residuals = matrix(rep(0, nrow(predictors) * ncol(predictors)), 
nrow=nrow(predictors), ncol=ncol(predictors) )

for( i in 1:nrow(predictors)){
    pred = as.vector(predictors[i,])
    data.residuals[i, ] = lm(regress.y ~ -1 + pred )$residuals
}

 user  system elapsed 
 13.841   0.012  13.854

## method 3 ##
library(nlme)                                                                   
                                                                                
                                                

all.data <- data.frame( y=rep(regress.y, nrow(predictors)), x=c(t(predictors)), 
g=gl(nrow(predictors), ncol(predictors)) )
all.fits <- lmList( y ~ x | g, data=all.data)
data.residuals = matrix( residuals(all.fits), nrow=nrow(predictors), 
ncol=ncol(predictors))

user  system elapsed 
 36.407   0.484  36.892 


## the opposite direction, supported by lm ### 
lm(t(predictors) ~ -1 + regress.y)$residuals

 user  system elapsed 
 0.500   0.120   0.613 

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to