You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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),最终回归系数完全不同。

解决方法

  1. 优先使用变量名+data参数的调用方式:这是最稳妥的方法,让lag()基于完整数据框的时间序列属性正确处理滞后对齐,即保留模型a1的写法。
  2. 若必须用列索引,手动对齐变量:先在数据框中创建滞后变量,再用公式调用,示例代码:
# 手动生成对齐后的滞后变量
predictor_data1$lag_dp <- lag(predictor_data1[, 2])
# 使用新变量建模
b1 <- lm(premium ~ lag_dp, data = predictor_data1)

这样得到的结果会和模型a1完全一致。

内容的提问来源于stack exchange,提问作者Aleksey Kipriyanov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 14:45:40