基于bsts包的时间序列趋势方向正式检验方法咨询
问题解答
结论
不需要移除局部线性趋势项,直接基于你已经拟合完成的bsts模型的后验样本就可以完成趋势方向的正式统计推断,比替换为全局时间回归的方案更适配你的数据特征。
为什么不推荐替换为全局时间回归
你当前使用的局部线性趋势假设斜率可以随时间动态变化,能更好捕捉数据中潜在的趋势转折(比如你提供的序列在2020年3月有明显的跳升),而全局时间回归强制要求整个观测周期的趋势斜率固定,会大幅降低模型拟合效果,也不符合你数据的实际波动特征。
基于现有模型的趋势检验方法
bsts的贝叶斯框架天然支持概率化的趋势推断,不需要额外做频率派的假设检验,操作步骤如下:
- 提取斜率的后验样本
局部线性趋势的状态向量包含两个维度:第一个是趋势水平值,第二个就是你需要的趋势斜率值,你之前的代码只提取了水平值的均值,补充代码获取斜率的全后验样本:
# 提取烧完期后的斜率样本,第三个维度为2对应斜率分量 slope_samples <- bsts.model$state[-(1:burn), , 2]
- 计算整体趋势方向的后验概率
如果你需要判断整个观测周期的平均趋势方向:
# 计算每一条后验样本对应的全周期平均斜率 mean_slope_per_draw <- rowMeans(slope_samples) # 计算趋势为正的后验概率 prob_positive_trend <- mean(mean_slope_per_draw > 0) # 计算趋势为负的后验概率 prob_negative_trend <- mean(mean_slope_per_draw < 0)
- 若
prob_positive_trend大于0.95,可认为有95%以上的概率序列整体呈上升趋势 - 若
prob_negative_trend大于0.95,可认为有95%以上的概率序列整体呈下降趋势 - 若两者均低于0.95,可判定序列整体为平稳态势
- 可选的简化方案(精度更低)
如果你不想额外处理斜率样本,也可以直接用你已经提取的平滑后趋势序列(components中Component为Trend的值),对时间做普通线性回归,查看时间系数的显著性,但该方法丢失了后验不确定性信息,推断严谨性低于后验概率方案。
优化建议
你当前设置的迭代次数niter=500偏低,建议调整为2000及以上,获得更稳定的后验估计结果;另外序列2020年3月的异常值可以考虑添加干预项,避免对趋势估计产生干扰。
内容的提问来源于stack exchange,提问作者Gabriel De Oliveira Caetano
相关产品推荐
相关产品推荐

