1

所以,这里我有一个可重复的例子说明为什么会出现这个错误:

时间序列数据

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 数据

数据航空旅客

Y= window(AirPassengers, start=c(1949,7), end=c(1950,10))
model2 = arima(Y, order=c(0,0,0))
fitted(model2)

然后我再次尝试创建相同的 Arima 模型并尝试获得模型的拟合值,它完美地工作,没有任何像这样的错误痕迹

成功获取AirPassengers的拟合值

知道这两个例子后,我无法弄清楚为什么第一个模型在 attr(data, "tsp") <- c(start, end, frequency) 对象不是矩阵中出现错误,任何人都可以给我一个线索/解释 ?有什么我想念的还是这是一些错误?

我还注意到与上面 2 模型的摘要模型有点不同,如下所示:

概要模型

summary(model)
summary(model2)

感谢您注意到我的问题,欢迎任何反馈:)

4

1 回答 1

2

太糟糕了,你的问题说得太糟糕了,因为我认为它实际上很有趣,比我更有知识的人可能应该回答它。
几个小时以来,我一直在研究函数、方法和命名空间,我认为这是名称屏蔽/冲突/作用域的情况。(我不是计算机科学家,我不知道所有的单词和所有的东西)

修复很容易,您只需使用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在您创建它之前已经存在,即作为 function time()。通常这不是一个问题,因为 R 倾向于理解何时需要变量以及何时需要函数,例如:

c <- 4
c
c(1, c)
c <- base::c
c

然而,在内部getResponse(),评估是不同的,但我不完全确定如何。

然而,教训是一样的:如果你把你的变量命名为一个函数,就会发生奇怪的事情。

于 2017-12-06T00:23:01.110 回答