forecast.lm预测始终是同一时间段

时间:2015-10-08 08:02:26

标签: r linear-regression forecasting predict

我想预测一个线性模型,我用ols估计。但是,它始终预测未来的相同时间段,其长度与我的数据集相同。

这就是我所做的。

data <- ts(matrix(rnorm(144, mean=0, sd=1), ncol=6), start=c(2007,1), frequency=12)

我计算了两个因素。

factors <- ts(t(t(eigen(cor(data))$vectors[,1:2] %*% 
         sqrt(diag(eigen(cor(data))$values[1:2]))) %*% 
         t(scale(data))), start=c(2007,1), frequency=12)
colnames(factors) <- c("f1", "f2")

我将这些因素与数据集结合起来。

favar <- ts.union(factors, data)
colnames(favar) <- c(colnames(factors), "a", "b", "c", "d", "e", "f")

然后,我估计了“a”的线性模型。

require(forecast)
model <- tslm(a ~ f1 + f2 + b + c + d + e + f + 0, data=ts(sapply(favar, function(x) 
             lag(x, h=1))[-1,], start=c(2007, 2), frequency=12))

如果我现在预测我的模型,那么在我的数据集之前的时间段内它会花费相同的长度。

forecast(model, newdata=favar, h=6, ts=T)

我为h设定的值无关紧要,结果总是提前24个月预测。我认为,问题出现了,因为我必须提供newdata,我使用原始数据集favar。但是,如果我尝试在没有它的情况下预测模型,我会收到以下错误:

  

eval(expr,envir,enclos)中的错误:找不到对象'f1'

我已尝试使用predict.lm进行预测,仅使用lm而非tslm估算模型。在任何情况下,我都面临同样的问题:预测期始终与提供的newdata的长度相同。

更新:我刚刚注意到,不仅我的预测长度与我的数据集相同,而且还有值。基本上,我只有原始数据的副本。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

forecast(model, newdata=favar, h=6, ts=T)来电forecast.lm。 来自forecast.lm的文档:

  

newdata

     

一个可选的数据框,用于查找与之相关的变量   预测。如果省略,则假设唯一的变量是趋势   和季节,以及h预测产生。

     

h

     

预测的期间数。如果存在新数据则忽略。

因此出错的原因

> forecast(model,h=6,ts=T)
Error in eval(expr, envir, enclos) : object 'f1' not found
> 

唯一已知的变量是trendseason,而不是f1f2。等等 因此,newdata一定不能丢失,因此会忽略h

我害怕从forecast方法得到长度为6的预测,你需要一些长度为newdata的长度为6.然后由系数coef(model)确定的线性函数在这6点。

当然你可以问系数

> coef(model)
       f1        f2         b         c         d         e         f 
 2.008211  1.344910 -0.532548 -1.375166  0.378199  2.169784 -1.971422 

并在没有forecast方法的情况下使用它们。

> myData <- X[1:6,-3] + matrix(sample(-100:100,6*7,,replace=TRUE)/100,6,7)
> myData
             f1         f2          b          c          d          e          f
[1,]  1.3901181  0.5794323  0.2638713  1.7911077 -1.9140976 -0.1632654  1.2130388
[2,] -0.5106604  1.0037957 -0.5357955  1.1981059 -0.3636334 -1.2746126 -0.1845794
[3,]  2.0191347 -0.8724608 -1.7707524  0.2779736  1.2814462 -0.4834006  0.1504435
[4,]  1.4574348  0.2173202 -1.1881501  0.7911197 -0.7332919 -1.0103667 -0.8201907
[5,] -1.8129340  0.2294362  0.7379416 -1.3893631  0.5011054  0.4321159  0.4026663
[6,]  1.9659584  1.8596798  0.7286796  1.9930237  0.6643413 -0.2609216 -0.2635644
> fcst <- myData %*% coef(model)
> fcst
          [,1]
[1,] -2.502231
[2,] -3.577032
[3,]  2.581397
[4,]  1.911273
[5,] -1.481277
[6,]  3.525071
> forecast(model,myData,ts=T)
         Point Forecast     Lo 80     Hi 80     Lo 95     Hi 95
Jan 2009      -2.502231 -2.502231 -2.502231 -2.502231 -2.502231
Feb 2009      -3.577032 -3.577032 -3.577032 -3.577032 -3.577032
Mar 2009       2.581397  2.581397  2.581397  2.581397  2.581397
Apr 2009       1.911273  1.911273  1.911273  1.911273  1.911273
May 2009      -1.481277 -1.481277 -1.481277 -1.481277 -1.481277
Jun 2009       3.525071  3.525071  3.525071  3.525071  3.525071
> 

函数forecast的名称有点误导。如果forecastaf1f2b的预测值,c只计算预测值defnewdata