加载 haven 时使用 plm 包估计随机效应模型时出错
Error when estimating random effects model with plm package when haven is loaded
我在使用 R 中的 plm
包估计随机效应时遇到了一个奇怪的问题。
这是我的部分数据的 link 到 dput
:https://pastebin.com/raw/mTdh26dg
我的代码是:
library(plm)
library(haven)
pmales <- pdata.frame(males_part, index = c("NR", "YEAR"))
random <- plm(WAGE ~ SCHOOL + EXPER + EXPER2 + BLACK + HISP + MAR + UNION + RUR + NE + NC + S + factor(YEAR),
data = pmales, model = "random")
我包含 libary(haven)
的原因是我的原始数据集是一个 .dta 文件。
当我 运行 这个代码时,我得到这个错误:
Error in is.pbalanced.default(x) :
argument "y" is missing, with no default
奇怪的是,如果我从一个干净的 R 会话开始并且不加载 haven
(并且从 dput
导入数据),我不会收到此错误.如果我从 dput
导入但仍然加载 haven
,我确实会收到错误消息。我在估计 within
或 pooling
模型时也没有得到错误(即使有避风港 loaded
)。
这是我的 sessionInfo()
:
R version 3.6.3 (2020-02-29)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Linux Mint 19.3
Matrix products: default
BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.7.1
LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.7.1
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 LC_MONETARY=nl_NL.UTF-8
[6] LC_MESSAGES=en_US.UTF-8 LC_PAPER=nl_NL.UTF-8 LC_NAME=C LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=nl_NL.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] haven_2.2.0 plm_2.2-3
loaded via a namespace (and not attached):
[1] Rcpp_1.0.4.6 rstudioapi_0.11 Formula_1.2-3 magrittr_1.5 hms_0.5.3 MASS_7.3-51.5 lattice_0.20-41 rlang_0.4.5
[9] bibtex_0.4.2.2 fansi_0.4.1 stringr_1.4.0 tools_3.6.3 grid_3.6.3 nlme_3.1-144 cli_2.0.2 ellipsis_0.3.0
[17] maxLik_1.3-8 miscTools_0.6-26 assertthat_0.2.1 lmtest_0.9-37 digest_0.6.25 lifecycle_0.2.0 tibble_3.0.0 crayon_1.3.4
[25] bdsmatrix_1.3-4 vctrs_0.2.4 Rdpack_0.11-1 gbRd_0.4-11 glue_1.4.0 sandwich_2.5-1 stringi_1.4.6 pillar_1.4.3
[33] compiler_3.6.3 forcats_0.5.0 pkgconfig_2.0.3 zoo_1.8-7
这是 plm
或 haven
中的错误吗?或者两者(或它们的依赖关系)的某种不兼容性?
我认为问题在于您的数据 males_part
是一个 tibble,但是在附加 haven
之前您没有加载 tibble
包。如果你没有加载 tibble
,那么你将没有任何方法用于小标题 classes "tbl_df"
和 "tbl"
,它的行为就像一个数据框架。一旦 tibble
被加载,它就会开始像一个 tibble。
这是一个问题,因为小标题和数据帧不相同,但小标题的 class 包括 "data.frame"
。我猜想发生的事情是 plm
假设从数据框中提取单个列会给出一个向量,但是如果有一个小标题,它会给出另一个小标题。
您的解决方法非常简单。只需使用 males_part <- as.data.frame(males_part)
删除小标题 class,然后 haven
就没有关系了。
可以想象,这值得向 plm
的维护者报告。这是导致问题的 tibble
中的一个设计缺陷(如果 tibbles 继承自 data.frame
,它们应该像数据帧一样工作),但是现在 tibbles 很常见,而且这种设计不太可能改变。 plm
函数可以通过将 data <- as.data.frame(data)
放在 pdata.frame
函数的前面来保护自己免受这种情况的影响,
或使用 drop = TRUE
.
保护每个列提取
我在使用 R 中的 plm
包估计随机效应时遇到了一个奇怪的问题。
这是我的部分数据的 link 到 dput
:https://pastebin.com/raw/mTdh26dg
我的代码是:
library(plm)
library(haven)
pmales <- pdata.frame(males_part, index = c("NR", "YEAR"))
random <- plm(WAGE ~ SCHOOL + EXPER + EXPER2 + BLACK + HISP + MAR + UNION + RUR + NE + NC + S + factor(YEAR),
data = pmales, model = "random")
我包含 libary(haven)
的原因是我的原始数据集是一个 .dta 文件。
当我 运行 这个代码时,我得到这个错误:
Error in is.pbalanced.default(x) :
argument "y" is missing, with no default
奇怪的是,如果我从一个干净的 R 会话开始并且不加载 haven
(并且从 dput
导入数据),我不会收到此错误.如果我从 dput
导入但仍然加载 haven
,我确实会收到错误消息。我在估计 within
或 pooling
模型时也没有得到错误(即使有避风港 loaded
)。
这是我的 sessionInfo()
:
R version 3.6.3 (2020-02-29)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Linux Mint 19.3
Matrix products: default
BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.7.1
LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.7.1
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8 LC_MONETARY=nl_NL.UTF-8
[6] LC_MESSAGES=en_US.UTF-8 LC_PAPER=nl_NL.UTF-8 LC_NAME=C LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=nl_NL.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] haven_2.2.0 plm_2.2-3
loaded via a namespace (and not attached):
[1] Rcpp_1.0.4.6 rstudioapi_0.11 Formula_1.2-3 magrittr_1.5 hms_0.5.3 MASS_7.3-51.5 lattice_0.20-41 rlang_0.4.5
[9] bibtex_0.4.2.2 fansi_0.4.1 stringr_1.4.0 tools_3.6.3 grid_3.6.3 nlme_3.1-144 cli_2.0.2 ellipsis_0.3.0
[17] maxLik_1.3-8 miscTools_0.6-26 assertthat_0.2.1 lmtest_0.9-37 digest_0.6.25 lifecycle_0.2.0 tibble_3.0.0 crayon_1.3.4
[25] bdsmatrix_1.3-4 vctrs_0.2.4 Rdpack_0.11-1 gbRd_0.4-11 glue_1.4.0 sandwich_2.5-1 stringi_1.4.6 pillar_1.4.3
[33] compiler_3.6.3 forcats_0.5.0 pkgconfig_2.0.3 zoo_1.8-7
这是 plm
或 haven
中的错误吗?或者两者(或它们的依赖关系)的某种不兼容性?
我认为问题在于您的数据 males_part
是一个 tibble,但是在附加 haven
之前您没有加载 tibble
包。如果你没有加载 tibble
,那么你将没有任何方法用于小标题 classes "tbl_df"
和 "tbl"
,它的行为就像一个数据框架。一旦 tibble
被加载,它就会开始像一个 tibble。
这是一个问题,因为小标题和数据帧不相同,但小标题的 class 包括 "data.frame"
。我猜想发生的事情是 plm
假设从数据框中提取单个列会给出一个向量,但是如果有一个小标题,它会给出另一个小标题。
您的解决方法非常简单。只需使用 males_part <- as.data.frame(males_part)
删除小标题 class,然后 haven
就没有关系了。
可以想象,这值得向 plm
的维护者报告。这是导致问题的 tibble
中的一个设计缺陷(如果 tibbles 继承自 data.frame
,它们应该像数据帧一样工作),但是现在 tibbles 很常见,而且这种设计不太可能改变。 plm
函数可以通过将 data <- as.data.frame(data)
放在 pdata.frame
函数的前面来保护自己免受这种情况的影响,
或使用 drop = TRUE
.