[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