[R] how to predict dynamic model in R

Gabor Grothendieck ggrothendieck at gmail.com
Thu Jul 23 19:28:01 CEST 2009


Please provide your code in a reproducible form (as requested previously).

Here we fit with first 9 points and then add a point for prediction.  (Of
course your model can only predict the current value of Y so you may
have to rethink your model even aside from the implementation if you
really want to predict future values of Y.)

> library(dyn)
> set.seed(123)
> tt <- ts(cbind(Y = 1:10, x = rnorm(10), z = rnorm(10)))
> L <- function(x, k = 1) lag(x, -k)
> tt.zoo <- as.zoo(tt)
> fit <- dyn$lm(Y ~ L(Y) + L(x, 0:2) + z, tt.zoo[-10, ])
> predict(fit, tt.zoo)
 1  2  3  4  5  6  7  8  9 10 11 12
NA NA  3  4  5  6  7  8  9 10 NA NA




On Thu, Jul 23, 2009 at 1:01 PM, Hongwei Dong<pdxdong at gmail.com> wrote:
> Hi, Gabor and Other R users,
>   I'm re-posting my script and the results I got.
>
>   here is the dynamic model I used to estimate in-sample model (1996-2006)
> and it works:
>
>   fit<-dyn$lm(Y~lag(Y,-1)+z+x+lag(x,-1)+lag(x,-2)+lag(x,-3)+lag(x,-4))
>   Then I used this model to do out sample forecast with the following
> scripts, which do not work:
>
>  z<-ts(Z[41:52],start=2006,frequency=4)
>  x<-ts(X[41:52],start=2006,frequency=4)
> newdata<-data.frame(cbind(z,x))
> newdata<-ts(newdata,start=2006,frequency=4)
> pred<-predict(fit,newdata)
> Here is the results I got from R:
>              Qtr1     Qtr2     Qtr3     Qtr4
> 2006       NA       NA       NA       NA
> 2007 3083.362       NA       NA       NA
> 2008       NA       NA       NA       NA
> 2009       NA       NA       NA       NA
>
> I got only one prediction for the first quarter in 2007. Intuitively, there
> might be two problems: the definition of the newdata and how to define Y in
> newdata. But I just can't figure this out. It will greatly appreciated if
> someone can give me some help. Thanks.
> Harry
>
>
> On Thu, Jul 23, 2009 at 5:15 AM, Gabor Grothendieck
> <ggrothendieck at gmail.com> wrote:
>>
>> You have to use consistent classes.  You can't start out using
>> ts class and then suddenly switch to zoo class as if you had been
>> using zoo all along.   Either use ts everywhere or zoo everywhere.
>>
>> Also in the future please post reproducible examples as requested
>> at the bottom of every message to r-help.  That means include
>> a minimal amount of data so we can get exactly what you
>> are getting.
>>
>> On Thu, Jul 23, 2009 at 4:48 AM, Hongwei Dong<pdxdong at gmail.com> wrote:
>> > Thanks, Gabor. This is really helpful.
>> > When the regressive part, lag(Y,-1), is not included, my sytax works
>> > well.
>> > However, when I include the lag(Y) in the model, the prediction part
>> > does
>> > not work. Here is my sytax for in-sample estimation and it works well:
>> > fit<-dyn$lm(Y~lag(Y,-1)+x+lag(x,-1)+lag(x,-2)+lag(x,-3)+lag(x,-4)+z).
>> > Then I use this model to do out of sample prediction:
>> > x<-ts(X[41:52],start=2006,frequency=4)
>> > z<-ts(Z[41:52],start=2006,frequency=4)
>> > newdata<-data.frame(cbind(x,z))
>> > newdata<-zooreg(newdata)
>> > pred<-predict(fit,newdata)
>> > With these, I got weird result, a prediction for each year from year 1
>> > to
>> > the first quarter of year 2007 (all "NA"). What I expect is a prediction
>> > for
>> > the 8 quarters from 2007 to 2008. Intuitively, I know there must be
>> > something wrong with my newdata definition. But I can't figure it out.
>> > I'll
>> > appreciate it very much if you can give some suggestions to modify my
>> > syntax. Thanks.
>> >
>> > Harry
>> >
>> >
>> >
>> >
>> >
>> >
>> >
>> >
>> >
>> >
>> >
>> > On Wed, Jul 22, 2009 at 10:53 PM, Gabor Grothendieck
>> > <ggrothendieck at gmail.com> wrote:
>> >>
>> >> Here is an example closer to yours.
>> >>
>> >> > library(dyn)
>> >> > set.seed(123)
>> >> > x <- zooreg(rnorm(10))
>> >> > y <- zooreg(rnorm(10))
>> >> > L <- function(x, k = 1) lag(x, k = -k)
>> >> > mod <- dyn$lm(y ~ L(y) + L(x, 0:2))
>> >> > mod
>> >>
>> >> Call:
>> >> lm(formula = dyn(y ~ L(y) + L(x, 0:2)))
>> >>
>> >> Coefficients:
>> >> (Intercept)         L(y)   L(x, 0:2)1   L(x, 0:2)2   L(x, 0:2)3
>> >>    0.06355     -0.74540      0.63649      0.44957     -0.41360
>> >>
>> >> > newdata <- cbind(x = c(coredata(x), rnorm(1)), y = c(coredata(y),
>> >> > rnorm(1)))
>> >> > newdata <- zooreg(newdata)
>> >> > predict(mod, newdata)
>> >>         1          2          3          4          5          6
>> >>  7
>> >>        NA         NA  0.9157808  0.6056333 -0.5496422  1.5984615
>> >> -0.2574875
>> >>         8          9         10         11         12         13
>> >> -1.6148859  0.3329285 -0.5284646 -0.1799693         NA         NA
>> >>
>> >>
>> >> On Thu, Jul 23, 2009 at 1:04 AM, Gabor
>> >> Grothendieck<ggrothendieck at gmail.com> wrote:
>> >> > Use dyn.predict like this:
>> >> >
>> >> >> library(dyn)
>> >> >> x <- y <- zoo(1:5)
>> >> >> mod <- dyn$lm(y ~ lag(x, -1))
>> >> >> predict(mod, list(x = zoo(6:10, 6:10)))
>> >> >  7  8  9 10
>> >> >  7  8  9 10
>> >> >
>> >> >
>> >> > On Thu, Jul 23, 2009 at 12:54 AM, Hongwei Dong<pdxdong at gmail.com>
>> >> > wrote:
>> >> >> I have a dynamic time series model like this:
>> >> >> dyn$lm( y ~ lag(y,-1) + x + lag(x,-1)+lag(x,-2) )
>> >> >>
>> >> >> I need to do an out of sample forecast with this model. Is there any
>> >> >> way I
>> >> >> can do this with R?
>> >> >> It would be greatly appreciated if some one can give me an example.
>> >> >> Thanks.
>> >> >>
>> >> >>
>> >> >> Harry
>> >> >>
>> >> >>        [[alternative HTML version deleted]]
>> >> >>
>> >> >> ______________________________________________
>> >> >> 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