所以,这里有一个可重现的例子,说明为什么会出现这个错误:
data = c(48,148,284,72,48,24,48,24,48,24,24,0,96,24,48,96,72,24,96,24,48)
time = ts(data, start=c(2015,2), end=c(2016,10), frequency=12)
我正在尝试将这个时间序列构建成Arima模型,auto.arima推荐我Arima(0,0,0)到这个时间序列数据,这是白噪声,但在成功创建模型后,错误开始于我尝试提取模型的拟合值
model = arima(time,order=c(0,0,0))
fitted(model)
我不明白这个错误是什么意思,因为这个,我尝试使用AirPassengers的另一个时间序列数据来确保它可以得到拟合值,这里是我使用的AirPassengers数据< / p>
Y= window(AirPassengers, start=c(1949,7), end=c(1950,10))
model2 = arima(Y, order=c(0,0,0))
fitted(model2)
然后我尝试创建相同的Arima模型并尝试获得模型的拟合值,并且它完美无缺地运行,没有任何像这样的错误
Successfully get fitted value of AirPassengers
知道了这两个例子后,我无法弄清楚为什么第一个模型在attr(数据,&#34; tsp&#34;)&lt; -c(开始,结束,频率)对象中获得错误不是矩阵, 谁能给我一个线索/解释?我有什么遗漏或这是一些错误吗?我也注意到上面两个模型的摘要模型有点不同:
summary(model)
summary(model2)
感谢您注意我的问题,欢迎任何反馈:)
答案 0 :(得分:1)
太糟糕了,你的问题陈述得很糟糕,因为我认为它实际上非常有趣,而且比我更了解的人应该回答它。
我现在一直在推动函数,方法和命名空间几个小时,而且我认为这是一个名称屏蔽/冲突/范围的情况。 (我不是计算机科学家,我不知道所有的单词和所有的东西)
修复很简单,您只需使用Arima()
代替arima()
,或直接使用auto.arima()
。
library(forecast)
model.ARIMA <- Arima(time, order=c(0,0,0))
fitted(model.ARIMA)
# or
fitted(auto.arima(time))
这项工作的原因是Arima()
返回一个对象,其中包含原始时间序列和已包含的拟合值。 fitted()
然后只返回model.ARIMA$fitted
。
arima()
不包括返回对象中的拟合值,因此fitted()
必须计算它们。这很简单,你只需从原始时间序列中减去残差。唯一的问题是,虽然残差包含在模型对象中,但原始时间序列不是,因此需要应用一些技巧。会发生的是fitted()
调用另一个函数getResponse()
,它在您的案例model.ARIMA$series
中搜索环境中是否有名称包含在模型对象(time
)中的对象。出现问题是因为time
在创建之前已经存在,即作为函数time()
。通常这不是一个问题,因为R倾向于理解何时需要变量以及何时需要该函数,例如:
c <- 4
c
c(1, c)
c <- base::c
c
在getResponse()
内部,评估的方式不同,但我不确定如何。
然而,课程是相同的:如果你将变量命名为与函数相同,则可能会发生奇怪的事情。