[R] How to extract residuals from multiple regressions from a loop

William Dunlap wdunlap at tibco.com
Mon Oct 28 16:33:44 CET 2013

Can you trim down your example to a size where you can show us
the data (using dump() or dput()) and the commands you used so
one can just copy it from your mail and paste it into R to reproduce
the problem?

I don't see your problem when I made up data similar to what you described:

> timeseries <- ts(cbind(c(NA, 2:9, NA), c(1,NA,3,NA,5:10), c(rep(NA,9), 10)))
> exc.mkt <- log(1:10)
> for(i in 1:ncol(timeseries)) print(length(residuals(lm(timeseries[,i]~exc.mkt, na.action=na.exclude))))
[1] 10
[1] 10
[1] 10
> # without na.action=na.exclude residuals do vary in length
> for(i in 1:ncol(timeseries)) print(length(residuals(lm(timeseries[,i]~exc.mkt))))
[1] 8
[1] 8
[1] 1

Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com

> -----Original Message-----
> From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] On Behalf
> Of Ben Ammar
> Sent: Monday, October 28, 2013 6:20 AM
> To: r-help at r-project.org
> Subject: [R] How to extract residuals from multiple regressions from a loop
>    Dear all
>    I've  got  the following problem, I want to extract the residuals from
>    regression loops. The problem here is that some columns include NA's at the
>    beginning and end (i.e. each time series of stocks starts at different
>    points  in  time and ends at different points in time). When I want to
>    transfer these residuals into a matrix to determine the residual matrix, I
>    get the error message ("number of items to replace is not a multiple of
>    replacement length"). I tried it with na.action=na.exclude but that doesn't
>    work because that command doesn't actually change the vector length. With a
>    loop I came this far:
>    Number of stocks is 50 and maximum time period is 258 months:
>    for (i in 1:50) {CAPM.res[,i] <- residuals(lm(timeseries[,i]~exc.mkt),
>    na.action=na.exclude)}
>    as I said it doesn't work because of the different column length in the
>    matrix "timeseries". So right now I'm doing kind of manually which works
>    perfectly but is quite intensive and looks like that:
>    test.1 <- lm(timeseries[,1]~exc.mkt, na.action=na.exclude)
>    residual.test.1 <- residuals(test.1)
>    CAPM.res[,1] <- residual.Life.1
>    test.2 <- lm(timeseries[,2]~exc.mkt, na.action=na.exclude)
>    residual.test.2 <- residuals(test.2)
>    CAPM.res[,2] <- residual.test.2
>    ....and so on for the remaining 49 stocks. When I look at that I obviously
>    see that this must be done with a loop but in the end I can't put in the
>    matrix because of the different lengths. So far I got this:
>    test<-matrix(0,50,258)
>    residual.test<-matrix(0,50,258)
>    for (i in 1:50) {lm(timeseries[,i]~exc.mkt, na.action=na.exclude)
>                    {residual.test[i] <- residuals(test[i])
>                    {CAPM.res[,i] <- residual.test[i]
>    }}}
>    but here I get the error message: "Error: $ operator is invalid for atomic
>    vectors"
>    and I don't think "test"  and "residual.test" is defined correctly because I
>    don't know where to look for the residuals.
>    Does anyone have an idea how to extract the residuals and put them in a
>    258x50 matrix?
>    Any help would be very much appreciated!
>    Cheers,
>    Ben
> ______________________________________________
> R-help at 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.

More information about the R-help mailing list