我从教科书中直接估计出第一个差异的线性回归:
Edition.
首先,我从plm()包中估计模型与plm函数的差异,并从broom包中提取augment()函数的残差。我收到了一条错误消息,并怀疑我可能没有正确使用"fd"选项和/或误用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参考文献:
编辑参考资料:
发布于 2022-05-18 19:19:14
这是由于误解或非特殊的套管,第一差分( FD )面板模型在broom::augment_columns:函数假定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的第一行)。
我的建议是让开发人员/扫帚的维护者意识到这个问题(也许还有这篇文章)。plm的FD面板模型是通过plm_object$args$model == "fd"识别的。
https://stackoverflow.com/questions/72266256
复制相似问题