为什么这个 Chistiano-Fitzgerald 过滤器(mFilter 的 cffilter)的 Trend 组件会过拟合?

Why is the Trend component of this Chistiano-Fitzgerald filter (mFilter's cffilter) so overfitted?

目标:由于基于黄土的方法存在问题,我正在尝试使用带通滤波器从时间序列中提取季节性和趋势成分,您可以阅读有关 here 的更多信息。

数据:数据是10年跨度的日降雨量测量值,具有高度随机性,并表现出明显的年度季节性。可以查到数据here

问题:当我执行过滤器时,循环组件按预期显示(捕获年度季节性)但趋势组件似乎极度过度拟合,因此残差变成极小的值,生成的模型对样本外预测没有用。

US1ORLA0076 <- read_csv("US1ORLA0076_cf.csv")
head(US1ORLA0076)

  water_date  PRCP prcp_log
  <date>     <dbl>    <dbl>
1 2006-12-22  0.09   0.0899
2 2006-12-23  0.75   0.693 
3 2006-12-24  1.63   1.26  
4 2006-12-25  0.06   0.0600
5 2006-12-26  0.36   0.353 
6 2006-12-27  0.63   0.594 

然后我使用 mFilter 包中的以下命令应用 Christiano-Fitzgerald 带通滤波器(设计用于通过半年和全年之间的波长,即单年波)。

library(mFilter)

US1ORLA0076_cffilter  <- cffilter(US1ORLA0076$prcp_log,pl=180,pu=365,root=FALSE,drift=FALSE,
                                  type=c("asymmetric"),
                                  nfix=NULL,theta=1)

创建一个 S3 对象,其中包含 "trend" 值的向量和 "cycle" 值的向量,如下所示:

head(US1ORLA0076_cffilter$trend)
          [,1]
[1,] 0.1482724
[2,] 0.7501137
[3,] 1.3202868
[4,] 0.1139883
[5,] 0.4051551
[6,] 0.6453462

head(US1ORLA0076_cffilter$cycle)
            [,1]
[1,] -0.05839342
[2,] -0.05696651
[3,] -0.05550995
[4,] -0.05402422
[5,] -0.05250982
[6,] -0.05096727

绘制:

plot(US1ORLA0076_cffilter)

我对这个输出感到困惑。这个周期看起来和我预期的差不多。趋势没有。与其说是一条逐渐变化的线,表示在季节性被确定后数据的整体趋势,不如说是在密切跟踪原始数据,即非常过拟合。

问题:mfilter 甚至定义 "trend" 的方式与 decompose() 或 stl() 等函数的定义方式相同吗?如果不是,那我该怎么考虑?

问题:我是否错误地校准了 cffilter(),我可以更改什么以改善趋势组件的定义?

答案是,"no" mfilter() 的定义 "trend" 与某些分解函数(如 stl())的定义方式不同。它更笼统地将其定义为 "the thing from which the cycle deviates"。为通过滤波器设置 180-365 的带宽,我已经分离出已从数据中减去的年度周期分量,留下其他所有内容,这里定义为 "trend" 并且可以被认为作为一种残差。

要识别 "trend",因为它在分解包(如 stl() 或 decomp() 中使用相同的方法,可以应用与上述类似的带通滤波器,但带有句点振荡定义在(对于该数据集)366-3652 之间,这将捕获反映整个 10 年期间的频率范围,不包括年内频率,例如年度季节性。

#Overall trend captured with similar code (and slightly different data):
US1ORLA0076_cffilter_trend  <- cffilter(US1ORLA0076$prcp_log,pl=366,pu=3652,root=FALSE,drift=FALSE,
                                        type=c("asymmetric"),
                                        nfix=1,theta=1)

plot(US1ORLA0076_cffilter_trend)