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

```