如何解决构造Arima(0,0,0) White Noise时fitted(arima_model)中的Error "object is not a matrix"
How to Solve Error "object is not a matrix" in fitted(arima_model) when constructing Arima(0,0,0) White Noise
所以,这里我有一个可重现的例子来说明为什么会出现这个错误:
Time Series Data
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) 这个时间序列数据是白噪声,但是在成功创建模型之后,当我尝试提取模型的拟合值时开始出错
Error in getting fitted model
model = arima(time,order=c(0,0,0))
fitted(model)
我不明白这个错误是什么意思,因此,我尝试使用另一个时间序列数据 AirPassengers 来确保它可以获得拟合值,这是我使用的 AirPassengers 数据
Data AirPassengers
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(data, "tsp") <- c(start, end, frequency) object is not a matrix 中出错,
谁能给我一个 clue/explanation ?有什么我遗漏的或者这是一些错误吗?
我还注意到与上面 2 模型的摘要模型有点不同,如下所示:
Summary Model
summary(model)
summary(model2)
感谢您注意到我的问题,欢迎任何反馈:)
太糟糕了,你的问题陈述得如此糟糕,因为我认为它实际上很有趣,比我更有知识的人应该会回答它。
几个小时以来,我一直在研究函数、方法和命名空间,结果我认为是名称 masking/conflict/scoping 的情况。 (我不是计算机科学家,我不知道所有的单词和所有的东西)
修复很简单,您只需使用 Arima()
代替 arima()
,或者直接使用 auto.arima()
。
library(forecast)
model.ARIMA <- Arima(time, order=c(0,0,0))
fitted(model.ARIMA)
# or
fitted(auto.arima(time))
此工作的原因是 Arima()
returns 一个包含原始时间序列和拟合值的对象。 fitted()
然后简单地 returns 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()
内部,评估是不同的,但我不完全确定如何。
然而,教训是一样的:如果您将变量命名为与函数相同的名称,就会发生奇怪的事情。
所以,这里我有一个可重现的例子来说明为什么会出现这个错误:
Time Series Data
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) 这个时间序列数据是白噪声,但是在成功创建模型之后,当我尝试提取模型的拟合值时开始出错
Error in getting fitted model
model = arima(time,order=c(0,0,0))
fitted(model)
我不明白这个错误是什么意思,因此,我尝试使用另一个时间序列数据 AirPassengers 来确保它可以获得拟合值,这是我使用的 AirPassengers 数据
Data AirPassengers
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(data, "tsp") <- c(start, end, frequency) object is not a matrix 中出错, 谁能给我一个 clue/explanation ?有什么我遗漏的或者这是一些错误吗?
我还注意到与上面 2 模型的摘要模型有点不同,如下所示:
Summary Model
summary(model)
summary(model2)
感谢您注意到我的问题,欢迎任何反馈:)
太糟糕了,你的问题陈述得如此糟糕,因为我认为它实际上很有趣,比我更有知识的人应该会回答它。
几个小时以来,我一直在研究函数、方法和命名空间,结果我认为是名称 masking/conflict/scoping 的情况。 (我不是计算机科学家,我不知道所有的单词和所有的东西)
修复很简单,您只需使用 Arima()
代替 arima()
,或者直接使用 auto.arima()
。
library(forecast)
model.ARIMA <- Arima(time, order=c(0,0,0))
fitted(model.ARIMA)
# or
fitted(auto.arima(time))
此工作的原因是 Arima()
returns 一个包含原始时间序列和拟合值的对象。 fitted()
然后简单地 returns 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()
内部,评估是不同的,但我不完全确定如何。
然而,教训是一样的:如果您将变量命名为与函数相同的名称,就会发生奇怪的事情。