[R] Moving window regressions - how can I improve this code?

Ajay Shah ajayshah at mayin.org
Sat Apr 24 07:09:21 CEST 2004


I wrote a function which does "moving window" regressions. E.g. if
there are 100 observations and the window width is 50, then I first
run the regression for observations 1..50, then for 2..51, and so on.

I am extremely pleased with R in my experience with writing this,
since I was able to pass the model as an argument into the function
:-) Forgive me if I sound naive, but that's rocket science to me!!

For a regression with K explanatory variables, I make a matrix with
2*K+2 columns, where I capture:
    K coefficients and K standard errors
    the residual sigma
    R^2

My code is:

   # ------------------------------------------------------------ 
   movingWindowRegression <- function(data, T, width, model, K) {
     results = matrix(nrow=T, ncol=2*K+2)
     for (i in width:T) {
       details <- summary.lm(lm(as.formula(model), data[(i-width+1):i,]))
       n=1;
       for (j in 1:K) {
         results[i, n]   = details$coefficients[j, 1]
         results[i, n+1] = details$coefficients[j, 2]
         n = n + 2
       }
       results[i, n] = details$sigma
       results[i, n+1] = details$r.squared
     }
     return(results)
   }
   
   # Simulate some data for a linear regression
   T = 20
   x = runif(T); y = 2 + 3*x + rnorm(T);
   D = data.frame(x, y)
   
   r = movingWindowRegression(D, T=T, width=10, model="y ~ x", K=2)
   print(r)
   # ------------------------------------------------------------ 

I would be very happy if you could look at this and tell me how to do
things better.

I have two specific questions:

  1. I find it silly that I have to manually pass K and T into the
     function. It would be so much nicer to have:

        r = movingWindowRegression(D,      width=10, model="y ~ x")
     instead of the existing
        r = movingWindowRegression(D, T=T, width=10, model="y ~ x", K=2)

     How can the function inspect the data frame D and learn the
     number of rows?

     How can the function inspect the model specification string and
     learn K, the number of explanatory variables?

  2. "The R way" consists of avoiding loops when the code is
     vectorisable. I am using a loop to copy out from
     details$coefficients into the columns of results[i,]. Is there a
     better way?

-- 
Ajay Shah                                                   Consultant
ajayshah at mayin.org                      Department of Economic Affairs
http://www.mayin.org/ajayshah           Ministry of Finance, New Delhi




More information about the R-help mailing list