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

Gabor Grothendieck ggrothendieck at myway.com
Sat Apr 24 08:53:21 CEST 2004


1. ?nrow
2. ?all.vars

Getting rid of loop was discussed on Mar 22 and there was some debate
on whether or not it was a good idea although it turned out there was
a bug in the code that only the loop free version brought out.  
See archives.

Ajay Shah <ajayshah <at> mayin.org> writes:

: 
: 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?
:




More information about the R-help mailing list