You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何zoo与xts对象调用auto.arima会得到不同ARIMA参数?

工作日新冠死亡时间序列:zoo与xts对象的ARIMA建模差异问题

问题描述

我拥有仅包含工作日的新冠死亡病例时间序列数据,在R中分别创建了zoo对象(deathzoo)和xts对象(deathxts),并计算了二者的收益率序列(deathzoor、deathxtsr)。调用auto.arima函数对两个收益率序列建模时,得到了不同的ARIMA参数;即使手动指定auto.arima建议的p、q、d值,结果仍存在差异。请问哪种结果正确,原因是什么?

所需R库

library(timeSeries)
library(zoo)
library(tseries)
library(xts)
library(forecast)

数据处理与建模代码

reconstruct<-structure(list(...1 = structure(c(1579651200, 1579737600, 1579824000, 
                                 1580083200, 1580169600, 1580256000, 1580342400, 1580428800, 1580688000, 
                                 1580774400, 1580860800, 1580947200, 1581033600, 1581292800, 1581379200, 
                                 1581465600, 1581552000, 1581638400, 1581897600, 1581984000, 1582070400, 
                                 1582156800, 1582243200, 1582502400, 1582588800, 1582675200, 1582761600, 
                                 1582848000, 1583107200, 1583193600, 1583280000, 1583366400, 1583452800, 
                                 1583712000, 1583798400, 1583884800, 1583971200, 1584057600, 1584316800, 
                                 1584403200, 1584489600, 1584576000, 1584662400, 1584921600, 1585008000, 
                                 1585094400, 1585180800, 1585267200, 1585526400, 1585612800, 1585699200, 
                                 1585785600, 1585872000, 1586131200, 1586217600, 1586304000, 1586390400, 
                                 1586476800, 1586736000, 1586822400, 1586908800, 1586995200, 1587081600, 
                                 1587340800, 1587427200, 1587513600, 1587600000, 1587686400, 1587945600, 
                                 1588032000, 1588118400, 1588204800, 1588291200, 1588550400, 1588636800, 
                                 1588723200, 1588809600, 1588896000, 1589155200, 1589241600, 1589328000, 
                                 1589414400, 1589500800, 1589760000, 1589846400, 1589932800, 1590019200, 
                                 1590105600, 1590364800, 1590451200, 1590537600, 1590624000, 1590710400, 
                                 1590969600, 1591056000, 1591142400, 1591228800, 1591315200, 1591574400, 
                                 1591660800), class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
              death = c(17, 18, 26, 82, 131, 133, 172, 214, 428, 494, 566, 
                        636, 721, 1015, 1115, 1120, 1373, 1525, 1870, 2010, 2125, 
                        2250, 2254, 2633, 2713, 2774, 2817, 2876, 3090, 3164, 3260, 
                        3355, 3469, 4009, 4284, 4636, 4957, 5460, 7265, 8117, 9073, 
                        10215, 11789, 17518, 19944, 22915, 26165, 29804, 42040, 47204, 
                        53846, 60087, 66583, 85288, 93805, 101022, 109173, 116914, 
                        136917, 144272, 153036, 160746, 169629, 188670, 195864, 203141, 
                        210412, 217250, 233562, 240188, 247168, 253423, 259010, 274146, 
                        280293, 287056, 292923, 298876, 312208, 317941, 323378, 329130, 
                        334886, 347700, 352668, 358074, 363110, 368816, 378366, 383144, 
                        388363, 393355, 398511, 409902, 415166, 420786, 426314, 431371, 
                        443223, 448268)), row.names = c(NA, 100L), class = "data.frame")

dt <- seq(as.Date("2020-01-22"), as.Date("2020-06-09"), by = "days")
dt<-dt[!weekdays(dt) %in% c("Saturday","Sunday")] # 移除周末数据
deathdata<-reconstruct[,2]
deathzoo=zoo(deathdata,dt)
deathxts=xts(deathdata,dt)

# 计算类似收益率的变化率
deathxtsr=100*diff(log(deathxts))
deathzoor = 100*diff(log(deathzoo))


arimaxts=auto.arima(deathxtsr)
summary(arimaxts)

arimazoo=auto.arima(deathzoor)
summary(arimazoo)

问题解答

核心原因:auto.arima对zoo/xts对象的时间频率识别差异

auto.arima在处理带时间索引的对象时,会根据对象类型推断序列频率,二者的逻辑存在明显区别:

  • xts对象:其Date/POSIXct索引会被auto.arima默认识别为日度频率,即使你的数据是跳过周末的非规则序列,函数仍会强制按日度频率处理,隐含假设周末存在缺失值,这会干扰模型的参数选择。
  • zoo对象:虽然同样带Date索引,但auto.arima会将其视为无固定频率的不规则序列,直接把每个工作日当作连续的观测点(即第1、2、3...个观测)建模,完全忽略时间间隔的差异。

哪种结果更合适?

两种结果没有绝对的“正确”,取决于你的建模目标:

  • 若只关注观测值的连续变化,忽略时间间隔:选择zoo对象的建模结果更合理,它不对缺失的周末数据做额外假设,仅基于现有观测的顺序关系建模。
  • 若要考虑真实时间维度的间隔:需先将序列转换为规则日度序列,填充周末缺失值(如用NA或插值),再进行建模。此时xts对象的结果是基于日度频率的假设,但因实际数据缺失周末值,模型可能存在偏差。

统一建模结果的方法

要消除二者的差异,可将zoo/xts对象转换为普通数值向量,让auto.arima仅关注观测值本身:

# 统一转换为数值向量建模
arima_vec <- auto.arima(as.numeric(deathzoor))
summary(arima_vec)

此时无论原对象是zoo还是xts,只要观测值一致,建模结果会完全相同。


内容的提问来源于stack exchange,提问作者nadeem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 07:42:04