包 `plm` 和 `broom` 的一阶差分回归

Regression in first differences with packages `plm` and `broom`

我正在直接从教科书中估计一阶差分的线性回归:

我正在使用 plm 包中的 plm() 函数对模型进行一阶差分估计,并使用 broom 包中的 augment() 函数提取残差.我收到一条错误消息,怀疑我可能没有正确使用 "fd" 选项 and/or 误用了 augment()model="pooling" 的类似尝试似乎有效。感谢帮助!

library(AER)
data(Fatalities)
Fatalities$fatality <- Fatalities$fatal / Fatalities$pop * 10000

library(plm)
library(broom)

plm.pool <- plm(fatality ~ beertax, data=Fatalities, model="pooling")
tidy(plm.pool)  # ok
augment(plm.pool)  # ok


plm.fd <- plm(fatality ~ beertax, data=Fatalities, 
              index=c("state", "year"), 
              model="fd")
tidy(plm.fd)  # looks ok
# A tibble: 2 × 5
  term        estimate std.error statistic p.value
  <chr>          <dbl>     <dbl>     <dbl>   <dbl>
1 (Intercept) -0.00314    0.0119   -0.263    0.792
2 beertax      0.0137     0.285     0.0480   0.962


augment(plm.fd)  # not ok

Error in `$<-.data.frame`(`*tmp*`, ".resid", value = c(`2` = 0.219840293582125,  : 
  replacement has 288 rows, data has 336
In addition: Warning message:
In get(.Generic)(e1, e2) :
  longer object length is not a multiple of shorter object length

编辑:解决方法

所以我怀疑这个问题与plm返回的模型和残差的行数不同有关:

length(row.names(plm.fd$model)) 是 336

length(names(plm.fd$residuals)) 是 288.

谁能告诉我以下是否是从一阶差分估计中获取残差和拟合值的正确方法?

data.frame(".rownames" = row.names(plm.fd$model), plm.fd$model) %>%
  left_join(data.frame(".rownames" = names(resid(plm.fd)), 
                       ".fitted" = fitted(plm.fd),
                       ".resid" = resid(plm.fd)
                       )) -> Fatalities.augmented
head(Fatalities.augmented)

  .rownames fatality  beertax       .fitted       .resid
1         1  2.12836 1.539379            NA           NA
2         2  2.34848 1.788991  0.0034166261  0.219840294
3         3  2.33643 1.714286 -0.0010225479 -0.007890716
4         4  2.19348 1.652542 -0.0008451287 -0.138968054
5         5  2.66914 1.609907 -0.0005835833  0.479380363
6         6  2.71859 1.560000 -0.0006831177  0.053269973

参考文献:

编辑参考:

这是由于误解或 non-special 在 broom::augment_columns 中套用了 first-difference (FD) 面板模型:该函数假定 FD 模型的残差与预测值。

更具体地说,这一行:ret$.resid <- residuals0(x) (https://github.com/tidymodels/broom/blob/069c21e903174fcf5d491091b7c347a9fdcd2999/R/utilities.R#L256)

FD 模型压缩数据,因此残差数量低于用于模型估计的观测值数量。您可以在 summary 输出中看到:

summary(panel3) # FD model
Oneway (individual) effect First-Difference Model

[...]
Balanced Panel: n = 90, T = 7, N = 630
Observations used in estimation: 540
[...]

虽然模型有 630 个观测值的输入,但经过 FD 变换后,仅使用 540 个变换后的观测值,因为每组(个体维度)丢失一个观测值 -> 630 - 90 = 540。

broom:augment_columns 想把预测值(630)和残差(540)放在同一个数据框中,这注定会失败。如果他们想这样做,他们可以用 NA 填充值(例如,每个人的第一行设置为 NA)。

我的建议是让 developers/the broom 的维护者意识到这个问题(也许还有这个 post)。 plm 的 FD 面板型号通过 plm_object$args$model == "fd".

识别