R语言相同数据不同滞后变量回归输出差异技术求助
关于R语言中滞后变量回归结果差异的问题
我在R语言中尝试使用滞后变量估计模型,采用了两种逻辑一致但调用方式不同的回归设定:
a1 <- lm(premium ~ lag(dp), data = predictor_data1) b1 <- lm(predictor_data1[,1] ~ lag(predictor_data1[,2]))
第一种回归通过变量名调用变量,第二种通过data.frame的对应列索引调用变量。
所用数据
head(predictor_data1) premium dp dy ep de svar csp b.m ntis tbl ltr lty 1926-12-01 0.023247 -2.973012 NA -2.386837 -0.5861751 0.0004646178 NaN 0.4414758 0.05087618 0.0307 0.0078 0.0354 1927-01-01 -0.005410 -2.942374 -2.963349 -2.374773 -0.5676012 0.0004698947 NaN 0.4437056 0.05082378 0.0323 0.0075 0.0351 1927-02-01 0.042922 -2.979535 -2.932946 -2.430353 -0.5491819 0.0002873343 NaN 0.4285009 0.05166764 0.0329 0.0088 0.0347 1927-03-01 0.004324 -2.976535 -2.970053 -2.445079 -0.5314564 0.0009241928 NaN 0.4697651 0.04635658 0.0320 0.0253 0.0331 1927-04-01 0.010521 -2.984225 -2.967143 -2.471309 -0.5129164 0.0006025886 NaN 0.4567541 0.05051402 0.0339 -0.0005 0.0333 1927-05-01 0.059353 -3.025963 -2.975058 -2.531446 -0.4945175 0.0003917338 NaN 0.4347826 0.05527539 0.0333 0.0109 0.0327 tms infl 1926-12-01 0.0047 0.000000000 1927-01-01 0.0028 -0.011299440 1927-02-01 0.0018 -0.005714286 1927-03-01 0.0011 -0.005747126 1927-04-01 -0.0006 0.000000000 1927-05-01 -0.0006 0.05780347
回归结果摘要
模型a1的结果
summary(a1) Call: lm(formula = premium ~ lag(dp), data = predictor_data1) Residuals: Min 1Q Median 3Q Max -0.28744 -0.02662 0.00254 0.02773 0.41043 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) -0.018464 0.011652 -1.585 0.1133 lag(dp) -0.007484 0.003393 -2.206 0.0276 * --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Residual standard error: 0.05418 on 1139 degrees of freedom Multiple R-squared: 0.004253, Adjusted R-squared: 0.003379 F-statistic: 4.865 on 1 and 1139 DF, p-value: 0.02761
模型b1的结果
summary(b1) Call: lm(formula = predictor_data1[, 1] ~ lag(predictor_data1[, 2])) Residuals: Min 1Q Median 3Q Max -0.29828 -0.02658 0.00369 0.02921 0.40126 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 0.025923 0.011686 2.218 0.0267 * lag(predictor_data1[, 2]) 0.005571 0.003404 1.637 0.1020 --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Residual standard error: 0.05426 on 1138 degrees of freedom (1 observation deleted due to missingness) Multiple R-squared: 0.002349, Adjusted R-squared: 0.001472 F-statistic: 2.679 on 1 and 1138 DF, p-value: 0.102
问题原因与解决方法
核心原因
两种调用方式的结果差异源于**lag()函数的行为依赖于上下文**:
- 在
lm()公式中结合data参数使用时,lag()会识别数据框的时间序列索引(你的数据带有日期索引),自动将dp的滞后值与premium的对应观测对齐,不会额外删除有效观测(模型a1自由度为1139)。 - 直接对单独提取的列向量使用
lag()时,函数仅对向量本身做滞后操作,此时没有与响应变量的索引关联,导致滞后后的向量和响应变量的观测错位,且lm()会删除因错位产生的NA观测(模型b1显示1个观测被删除,自由度1138),最终回归系数完全不同。
解决方法
- 优先使用变量名+data参数的调用方式:这是最稳妥的方法,让
lag()基于完整数据框的时间序列属性正确处理滞后对齐,即保留模型a1的写法。 - 若必须用列索引,手动对齐变量:先在数据框中创建滞后变量,再用公式调用,示例代码:
# 手动生成对齐后的滞后变量 predictor_data1$lag_dp <- lag(predictor_data1[, 2]) # 使用新变量建模 b1 <- lm(premium ~ lag_dp, data = predictor_data1)
这样得到的结果会和模型a1完全一致。
内容的提问来源于stack exchange,提问作者Aleksey Kipriyanov
相关产品推荐
相关产品推荐

