Ошибка при оценке модели случайных эффектов с пакетом plm при загрузке гавани - PullRequest
1 голос
/ 16 апреля 2020

У меня странная проблема при оценке случайных эффектов с помощью пакета plm в R.

Вот ссылка на 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       

Is это ошибка в plm или haven? Или какая-то несовместимость двух (или их зависимостей)?

1 Ответ

1 голос
/ 16 апреля 2020

Я думаю, что проблема в том, что ваши данные males_part являются скачками, но вы не загрузили пакет tibble, пока не приложите haven. Если у вас не загружено tibble, у вас не будет никаких методов для классов tibble "tbl_df" и "tbl", и он будет действовать точно так же, как фрейм данных. Как только tibble загружен, он начинает действовать как тиббл.

Это проблема, потому что тиблы и фреймы данных не идентичны, но класс тиббла включает "data.frame". Я предполагаю, что происходит то, что plm предполагает, что извлечение одного столбца из фрейма данных дает вектор, а с тибблом - еще один тибл.

Обходной путь для вас довольно прост. Просто используйте males_part <- as.data.frame(males_part) для удаления класса tibble, и тогда haven не будет иметь значения.

Возможно, стоит сообщить об этом сопровождающему plm. Это ошибка проектирования в tibble, которая вызывает проблему (если тиблы наследуются от data.frame, они должны действовать как фреймы данных), но в наше время тиблы довольно распространены, и этот дизайн вряд ли изменится. Функция plm может защитить себя от этого, поставив data <- as.data.frame(data) в начале функции pdata.frame или защитив каждую колонку с помощью drop = TRUE.

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...