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

CPI时间序列分析:R中mts对象的最优结构与命名保留方法

问题解答

1. mts对象的最优数据布局

没错,用于ACF/PACF分析、差分、ARIMA建模及相关性计算的mts对象,最优布局就是日期为行、各指数为列的宽格式。mts本质是多变量时间序列结构,每一列对应一个独立的时间序列变量(比如headline CPI、food、non-food等),每一行对应一个时间点。这种布局下,不管是单序列的ACF/PACF分析、差分、ARIMA建模,还是多序列的相关性计算、向量ARIMA建模,都能直接基于列进行操作,和你熟悉的Stata面板数据筛选分析逻辑高度匹配。

2. 在mts对象中保留序列名称的方法

你之前的错误是因为用长格式dataframe直接转ts,ts函数会把所有行按顺序当作单一序列的连续观测,导致序列名称被转码、子指数被误判为同一序列的后续周期。正确的做法是先把长格式转回宽格式,再生成带名称的mts对象,步骤如下:

步骤1:标准化日期格式

先把长格式中的date列转为R可识别的时间格式(因为你的数据是季度频率,推荐用yearqtr类型):

# 假设date列是"2002Q1"这类字符格式
df$date <- zoo::as.yearqtr(df$date, format = "%YQ%q")
# 如果是"2002-01"这类日期格式,先转Date再转季度
df$date <- zoo::as.yearqtr(as.Date(df$date))

步骤2:转回宽格式

用pivot_wider将长格式转为「日期为行、各指数为列」的宽格式:

df_wide <- tidyr::pivot_wider(df, id_cols = date, names_from = name, values_from = index)

步骤3:生成带名称的mts对象

提取宽格式中的数值部分,转为ts对象后设置列名:

# 提取数值列(排除date列)
ts_values <- df_wide[, !names(df_wide) %in% "date"]
# 生成mts对象
df_ts <- ts(ts_values, start = c(2002, 1), frequency = 4)
# 设置序列名称(就是宽格式的列名)
colnames(df_ts) <- colnames(ts_values)

完成后,你就可以像在Stata中那样按名称操作序列了,比如计算food指数的ACF:

acf(df_ts[,"food"])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 23:16:09