[R] Row-by-row regression on matrix
Sundar Dorai-Raj
sundar.dorai-raj at pdf.com
Wed Sep 19 18:59:08 CEST 2007
murali.menon at uk.abnamro.com said the following on 9/19/2007 9:50 AM:
> Folks,
>
> I have a 3000 x 4 matrix (y), which I need to regress row-by-row against a
> 4-vector (x) to create a
> matrix lm.y of intercepts and slopes. To illustrate:
>
> y <- matrix(rnorm(12000), ncol = 4)
> x <- c(1/12, 3/12, 6/12, 1)
>
> system.time(lm.y <- t(apply(y, 1, function(z) lm(z ~ x)$coefficient)))
> [1] 44.72 18.00 69.52 NA NA
>
> Takes more than a minute to do (and I need to do many similar regressions
> a day).
>
> Is there a more efficient way of handling this?
>
> I'm running R 2.4.1 on Windows XP Service Pack 2 on a Intel Xeon dual-core
> 2.66GHz with 3GB RAM.
>
> Thanks very much,
>
> Murali
>
Yes. Try,
set.seed(1)
y <- matrix(rnorm(12000), ncol = 4)
x <- c(1/12, 3/12, 6/12, 1)
system.time(lm.y <- t(apply(y, 1, function(z) lm(z ~ x)$coefficient)))
## user system elapsed
## 1.10 0.00 38.69
system.time(lm.y2 <- t(coef(lm(t(y) ~ x))))
## user system elapsed
## 0.02 0.00 0.04
all.equal(lm.y, lm.y2)
## [1] TRUE
HTH,
--sundar
More information about the R-help
mailing list