动态回归中lag参数选择及dyn$lm适用性技术咨询
问题解答
1. 关于lag函数的选择:lag(x,1)是正确的
在R的时间序列体系中,lag(x, k)参数k为正整数时,代表取序列的滞后k期值——也就是对于当前周t,lag(x,1)对应的是前一周t-1的x值,完全匹配你用前一周指标预测当前周BTC收益的需求。
而lag(x,-1)是取超前1期值(t+1周),这是未来数据,显然不是你要的方向。你代码里的lag(x,1)用法没问题。
你可以简单验证:
# 查看BTC_Ret和其滞后1期的对齐情况 head(cbind(BTC_Ret = your_data[,1], BTC_Ret_lag1 = lag(your_data[,1],1)))
输出里第一行的滞后值为NA,第二行的滞后值是第一行的BTC_Ret,正好对应前一周的数据。
2. dyn$lm的适用性及替代方案
(1)dyn$lm完全适用
dyn包的dyn$lm就是为带滞后项的时间序列回归设计的,它会自动处理时间序列的对齐,无需手动删除缺失值或调整序列长度,对你的动态回归模型(含滞后自变量和滞后因变量)来说是高效的工具。
(2)其他可选方法
- 手动构建滞后变量+基础lm:如果你不想依赖dyn包,手动生成滞后项后用普通lm拟合也可以,结果一致:
# 转换为数据框 df <- as.data.frame(your_data) # 生成滞后1期变量 df$PSVI_lag1 <- c(NA, df$PSVI[-nrow(df)]) df$NSVI_lag1 <- c(NA, df$NSVI[-nrow(df)]) df$BTC_Ret_lag1 <- c(NA, df$BTC_Ret[-nrow(df)]) # 删去缺失值行 df_clean <- na.omit(df) # 拟合模型 model_lm <- lm(BTC_Ret ~ PSVI_lag1 + NSVI_lag1 + BTC_Ret_lag1, data = df_clean) summary(model_lm)
- fable包(tidy时间序列框架):如果你习惯tidyverse风格,
fable包提供更优雅的时间序列建模体验,还支持残差分析、预测等功能:
library(fable) library(tsibble) # 转换为tsibble格式 tb <- as_tsibble(your_data) # 拟合带外部回归项的模型 model_fable <- tb %>% model(ARIMA(BTC_Ret ~ 1 + lag(PSVI,1) + lag(NSVI,1) + lag(BTC_Ret,1))) # 查看结果 report(model_fable)
- 稳健标准误差修正:由于模型包含滞后因变量,残差可能存在自相关,普通OLS标准误差可能偏误。可以用
sandwich包计算Newey-West稳健标准误差:
library(sandwich) library(lmtest) # 对dyn$lm的结果修正标准误差 coeftest(test1, vcov = NeweyWest(test1))
额外建议
拟合模型后,记得检查残差的自相关性(acf(residuals(test1))),如果存在显著自相关,可能需要增加更多滞后项,或考虑ARMA类模型结合外部变量。
内容的提问来源于stack exchange,提问作者Keeran04
相关产品推荐
相关产品推荐

