使用ccf做时间序列分析时遇'Univariate time series only'错误
解决不规则时间序列的互相关(ccf)分析问题
问题根源
- 直接用
as.zoo()处理含日期列的data.frame时,zoo会把所有列都视为数据列,而非将日期作为时间索引,导致生成多变量zoo对象,不符合ccf对单变量序列的要求。 - 常规
ts对象要求时间序列等间隔,你的数据日期不固定、间隔不一致,强行使用会触发'Univariate time series only'错误。
分步解决方案
1. 正确创建单变量zoo时间序列
将日期列设为zoo对象的时间索引,数值列作为唯一数据变量,生成符合要求的单变量时间序列:
library(zoo) # 处理第一组数据:日期作为索引,数值作为变量 a_zoo <- zoo( x = a[["Tamaño internodo sin tendencia"]], order.by = a[["Fecha prod Internodo"]] ) # 处理第二组数据:同理创建单变量zoo序列 b_zoo <- zoo( x = b[["Energia"]], order.by = b[["Fecha"]] )
2. 对齐两个序列的时间索引
ccf要求两个序列在相同时间点有观测值,需先对齐索引:
方法1:保留共同时间点的数据
只保留两个序列都存在的时间点,适合时间点重叠较多的场景:
# 提取共同时间索引 common_dates <- intersect(index(a_zoo), index(b_zoo)) # 截取对齐后的序列 a_aligned <- a_zoo[common_dates] b_aligned <- b_zoo[common_dates]
方法2:插值填补缺失值
若时间范围重叠但时间点不全一致,用线性插值补全缺失数据,保留更多样本:
# 生成覆盖两个序列的完整时间序列(根据数据实际频率调整by参数,如"day"/"hour") all_dates <- seq( min(c(index(a_zoo), index(b_zoo))), max(c(index(a_zoo), index(b_zoo))), by = "hour" ) # 扩展序列并插值填补 a_interp <- na.approx(zoo(, all_dates), x = a_zoo) b_interp <- na.approx(zoo(, all_dates), x = b_zoo)
3. 运行互相关分析
对齐后即可正常调用ccf:
library(stats) # 使用共同时间点的序列 ccf(a_aligned, b_aligned) # 或使用插值后的序列 ccf(a_interp, b_interp)
内容的提问来源于stack exchange,提问作者Valentina Fonseca
相关产品推荐
相关产品推荐

