【问题标题】:forecast.lm predicts always the same time period aheadforecast.lm 总是预测未来相同的时间段
【发布时间】:2016-01-05 17:35:16
【问题描述】:

我想预测一个线性模型,我是用 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 的长度相同。

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

感谢您的帮助。

【问题讨论】:

    标签: r linear-regression forecasting predict


    【解决方案1】:

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

    新数据

    一个可选的数据框,用于查找变量 预测。如果省略,则假定唯一的变量是趋势 和季节,并产生 h 预测。

    h

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

    这就是错误的原因

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

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

    恐怕从 forecast 方法中得到长度为 6 的预测,您需要一些长度为 6 的 newdata。然后在这 6 个点上评估由系数 coef(model) 确定的线性函数。

    当然你可以问系数

    > 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 有点误导。如果f1f2bcdff 的预测值为@9876@5,forecast 仅计算预测值a

    【讨论】:

    • 你说得对。我知道我使用与newdata 中相同的数据来构建模型。问题是,如果没有newdata,我就不能使用forecast()。问题是为什么以及我必须设置什么。也许是对其他变量的预测?但后来我又面临同样的问题,因为我首先需要预测其他变量来预测它们。
    • tslm 除了线性回归之外什么都不做,forecast 在新数据点上对其进行评估。我不知道您想要实现什么,但也许 tslmforecast 组合不是正确的工具。
    • 我编辑了我的答案。现在解释了newdata 的必要性、h 的不相关性以及错误消息的原因。所以请不要让我感到寒冷。正确的答案是一个很好的答案,即使它不能帮助您立即进行申请。
    • 非常感谢您的帮助。现在我至少知道,我必须改变我的方法并理解tsml
    猜你喜欢
    • 1970-01-01
    • 2022-07-16
    • 2017-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    • 2020-01-09
    相关资源
    最近更新 更多