包 `plm` 和 `broom` 的一阶差分回归
Regression in first differences with packages `plm` and `broom`
我正在直接从教科书中估计一阶差分的线性回归:
- James H. Stock 和 Mark W. Watson,计量经济学导论,Pearson,第 4 版。
- Christoph Hanck、Martin Arnold、Alexander Gerber 和 Martin Schmelzer,R 计量经济学导论,https://www.econometrics-with-r.org/10-rwpd.html
- 数据包 AER,https://cran.r-project.org/web/packages/AER/AER.pdf
我正在使用 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
参考文献:
- https://cran.r-project.org/web/packages/plm/plm.pdf
- https://cran.r-project.org/web/packages/broom/broom.pdf
编辑参考:
- Using broom::augment Panel data models
这是由于误解或 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"
.
识别
我正在直接从教科书中估计一阶差分的线性回归:
- James H. Stock 和 Mark W. Watson,计量经济学导论,Pearson,第 4 版。
- Christoph Hanck、Martin Arnold、Alexander Gerber 和 Martin Schmelzer,R 计量经济学导论,https://www.econometrics-with-r.org/10-rwpd.html
- 数据包 AER,https://cran.r-project.org/web/packages/AER/AER.pdf
我正在使用 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
参考文献:
- https://cran.r-project.org/web/packages/plm/plm.pdf
- https://cran.r-project.org/web/packages/broom/broom.pdf
编辑参考:
- Using broom::augment Panel data models
这是由于误解或 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"
.