R中如何还原ARIMA建模所用的季节性与非季节性差分数据
两次差分还原原始序列方案
差分的逆操作核心是基于初始值的累加,你先后做了「4阶季节性差分、1阶普通差分」两次操作,还原时逆序执行即可:先还原1阶普通差分得到第一次差分后的序列,再还原4阶季节性差分得到原始值。
完整实现代码
1. 补全原代码逻辑
你的原代码存在差分顺序的小问题,先修正后执行差分:
library(dplyr) # 定义季节周期为4(对应季度数据) season <- 4 raw <- read.csv("https://raw.githubusercontent.com/thistleknot/Python-Stock/master/data/combined_set.csv",row.names=1,header=TRUE) temp <- raw$CSUSHPINSA # 执行第一次4阶季节性差分 temp_1 <- temp - lag(temp, season) # 校验普通差分阶数 print(ndiffs(na.omit(temp_1))) # 执行第二次1阶普通差分 temp_2 <- temp_1 - lag(temp_1, 1)
2. 手动实现差分逆操作
# 第一步:还原1阶普通差分,得到temp_1序列 # 取temp_1的第一个非空值作为还原初始值 init_temp1 <- temp_1[!is.na(temp_1)][1] # 累加temp_2的有效值,得到还原后的temp_1 restored_temp1 <- c(init_temp1, init_temp1 + cumsum(na.omit(temp_2))) # 第二步:还原4阶季节性差分,得到原始序列 # 取原始序列前4个值作为还原初始值(4阶差分丢失前4个观测) init_raw <- temp[1:season] restored_temp <- init_raw for (i in (season + 1):length(temp)) { restored_temp[i] <- restored_temp[i - season] + restored_temp1[i - season] } # 验证还原结果和原始序列完全一致 print(all.equal(restored_temp, temp))
3. 简化实现(调用封装函数)
可以直接调用forecast包的diffinv函数快速实现,无需手动写循环:
library(forecast) restored_temp <- diffinv( x = na.omit(temp_2), lag = c(1, season), # 和两次差分的滞后长度、顺序一一对应 xi = list(temp_1[!is.na(temp_1)][1], temp[1:season]) # 对应两次差分的初始值 ) # 验证一致性 print(all.equal(as.numeric(restored_temp), temp))
内容的提问来源于stack exchange,提问作者thistleknot
相关产品推荐
相关产品推荐

