Как сбалансировать несбалансированную панель данных? - PullRequest
1 голос
/ 24 февраля 2020

Предположим, у меня есть следующие данные о дисбалансе:

unbalanced.panel = structure(list(firm = c("A", "A", "A", "A", "B", "B", "A", "A", 
"B", "C", "C"), ind = c(1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1), year = c(2010, 
2011, 2012, 2013, 2011, 2013, 2011, 2012, 2010, 2012, 2013), 
    charac1 = c("x", "x", "x", "x", "y", "y", "z", "z", "g", 
    "h", "h"), var1 = c(11, 12, 13, 14, 15, 18, 15, 29, 31, 13, 
    2)), row.names = c(NA, -11L), class = c("tbl_df", "tbl", 
"data.frame"))
   firm    ind  year charac1  var1
   <chr> <dbl> <dbl> <chr>   <dbl>
 1 A         1  2010 x          11
 2 A         1  2011 x          12
 3 A         1  2012 x          13
 4 A         1  2013 x          14
 5 B         2  2011 y          15
 6 B         2  2013 y          18
 7 A         2  2011 z          15
 8 A         2  2012 z          29
 9 B         1  2010 g          31
10 C         1  2012 h          13
11 C         1  2013 h           2

, где каждая уникальная группа (индивидуум) идентифицируется комбинацией firm и ind, то есть индивидуальный "A1" отличается от "А2" человека. И временной индекс задается переменной year.

Я хочу сбалансировать данные панорамы (индекс = (индивидуальный = фирма-инд, время = год)), заполняя неявные пропуски с помощью NA.

Требуемый результат выглядит следующим образом:

   firm    ind  year charac1  var1
   <chr> <dbl> <dbl> <chr>   <dbl>
 1 A         1  2010 x          11
 2 A         1  2011 x          12
 3 A         1  2012 x          13
 4 A         1  2013 x          14
 5 B         2  2010 y          NA
 6 B         2  2011 y          15
 7 B         2  2012 y          NA
 8 B         2  2013 y          18
 9 A         2  2010 z          NA
10 A         2  2011 z          15
11 A         2  2012 z          29
12 A         2  2013 z          NA
13 B         1  2010 g          31
14 B         1  2011 g          NA
15 B         1  2012 g          NA
16 B         1  2013 g          NA
17 C         1  2010 h          NA
18 C         1  2011 h          NA
19 C         1  2012 h          13
20 C         1  2013 h           2

Я пытался использовать plm::make.pbalanced(unbalanced.panel, balance.type = "fill"), но получил следующую ошибку:

Ошибка в режиме <- (tmp, value = id_orig_typeof): неверно для изменения режима хранения фактора </p>

Я даже пытался использовать tidyr::complete(), но это не помогает достичь желаемой сбалансированной панели.

Это моя просьба: когда уникальный год (фирма-индекс) отсутствует в строке года, переменные времени (var1) должны быть заполнены NA, но не зависящие от времени переменные, такие как характеристики (charact1) должно быть заполнено уникальным значением.

В чем проблема с подходом tidyr::complete()? Это не позволяет мне различать неизменяемые во времени и изменяющиеся во времени переменные для заполнения или расширения. И он не идентифицирует однозначно индивидуальный индекс (в данном случае фирменный индекс).

unbalanced.panel >%>
  tidyr::complete(firm, year, nesting(var1))

Над кодом появляется новый индивидуальный «С2» и заполняется NA постоянными переменными.

Ответы [ 2 ]

1 голос
/ 29 февраля 2020

plm использует два измерения для данных панели (индивидуально, время). Сначала создайте переменную, которая отражает индивидуальное измерение, объединив две переменные, которые вы должны отнести к отдельному человеку, давайте назовем эту переменную idvar. Для краткости назовем набор данных u. Для функций plm манипулирования данными легче работать с pdata.frame. Объединяя все эти подсказки в коде, используйте что-то вроде следующего:

u <- unbalanced.panel
u$idvar <- paste(u$firm, u$ind)
pu <- pdata.frame(u, index = c("idvar", "year"))
make.pbalanced(pu, balance.type = "fill")

#         firm ind year charac1 var1 idvar
# A 1-2010    A   1 2010       x   11   A 1
# A 1-2011    A   1 2011       x   12   A 1
# A 1-2012    A   1 2012       x   13   A 1
# A 1-2013    A   1 2013       x   14   A 1
# A 2-2010 <NA>  NA 2010    <NA>   NA   A 2
# A 2-2011    A   2 2011       z   15   A 2
# A 2-2012    A   2 2012       z   29   A 2
# A 2-2013 <NA>  NA 2013    <NA>   NA   A 2
# B 1-2010    B   1 2010       g   31   B 1
# B 1-2011 <NA>  NA 2011    <NA>   NA   B 1
# B 1-2012 <NA>  NA 2012    <NA>   NA   B 1
# B 1-2013 <NA>  NA 2013    <NA>   NA   B 1
# B 2-2010 <NA>  NA 2010    <NA>   NA   B 2
# B 2-2011    B   2 2011       y   15   B 2
# B 2-2012 <NA>  NA 2012    <NA>   NA   B 2
# B 2-2013    B   2 2013       y   18   B 2
# C 1-2010 <NA>  NA 2010    <NA>   NA   C 1
# C 1-2011 <NA>  NA 2011    <NA>   NA   C 1
# C 1-2012    C   1 2012       h   13   C 1
# C 1-2013    C   1 2013       h    2   C 1
1 голос
/ 24 февраля 2020

Мы можем использовать complete из пакета tidyr. Ключ должен правильно установить nesting.

library(dplyr)
library(tidyr)

balanced.panel <- unbalanced.panel %>%  
  complete(nesting(firm, ind, charac1), year = full_seq(year, period = 1))
balanced.panel
# # A tibble: 20 x 5
#  firm    ind charac1  year  var1
#  <chr> <dbl> <chr>   <dbl> <dbl>
#  1 A         1 x        2010    11
#  2 A         1 x        2011    12
#  3 A         1 x        2012    13
#  4 A         1 x        2013    14
#  5 A         2 z        2010    NA
#  6 A         2 z        2011    15
#  7 A         2 z        2012    29
#  8 A         2 z        2013    NA
#  9 B         1 g        2010    31
# 10 B         1 g        2011    NA
# 11 B         1 g        2012    NA
# 12 B         1 g        2013    NA
# 13 B         2 y        2010    NA
# 14 B         2 y        2011    15
# 15 B         2 y        2012    NA
# 16 B         2 y        2013    18
# 17 C         1 h        2010    NA
# 18 C         1 h        2011    NA
# 19 C         1 h        2012    13
# 20 C         1 h        2013     2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...