为什么这个 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)
目标:由于基于黄土的方法存在问题,我正在尝试使用带通滤波器从时间序列中提取季节性和趋势成分,您可以阅读有关 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)