《Forecasting Principles and Practice》干预变量示例及代码运行问题求助
问题核心原因
你混淆了两个同名的step()函数:
stats::step()用于逐步回归变量选择,不能直接嵌入TSLM()的公式中使用fable::step()是构造干预分析用的阶跃变量的专用函数,需要传入干预发生时间的判断条件作为参数,而非模型对象。你代码中传入lm模型对象作为参数,不符合函数要求,因此返回空模型。
干预变量的正确用法
step()和spike()是用来构造特定时点的干预特征的函数,使用时需要先明确干预发生的时间点,以us_change数据集的季度时间粒度为例:
step(date == yearquarter("YYYY Qq")):从指定季度开始,变量取值为1,之前为0,适合模拟永久性结构冲击spike(date == yearquarter("YYYY Qq")):仅指定季度取值为1,其余时间为0,适合模拟一次性短期冲击
可运行代码示例
library(tidyverse) library(fpp3) fit_consBest <- us_change %>% model( # 基准线性模型 lm = TSLM(Consumption ~ Income + Savings + Unemployment + trend() + season()), # 加入2008年Q4金融危机阶跃干预的模型 step_interv = TSLM(Consumption ~ Income + Savings + Unemployment + trend() + season() + step(date == yearquarter("2008 Q4"))), # 加入2008年Q4金融危机脉冲干预的模型 spike_interv = TSLM(Consumption ~ Income + Savings + Unemployment + trend() + season() + spike(date == yearquarter("2008 Q4"))) ) # 正常查看结果 report(fit_consBest) fit_consBest %>% select(step_interv) glance(fit_consBest)
如果你需要做逐步变量选择
如果你的需求是做变量筛选而非干预分析,需要单独调用stats::step(),不能直接写在TSLM()的公式内,写法如下:
# 提取基准模型的拟合引擎 base_lm <- us_change %>% model(lm = TSLM(Consumption ~ Income + Savings + Unemployment + trend() + season())) %>% extract_fit_engine() # 执行逐步回归 step_select_model <- step(base_lm, scope = . ~ .)
内容的提问来源于stack exchange,提问作者Russ Conte
相关产品推荐
相关产品推荐

