Как сбалансировать несбалансированные данные панели?

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

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, т. е. индивидуум «А1» отличается от индивидуума «А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): невозможно изменить режим хранения фактора

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

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

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

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

Вышеприведенный код создает новую индивидуальную «C2» и заполняет NA переменные, не зависящие от времени.


person Cristhian    schedule 24.02.2020    source источник


Ответы (2)


Мы можем использовать 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
person www    schedule 24.02.2020
comment
Как я могу использовать full_seq(year, period = 1), когда год - это класс Date? Я имею в виду, что в моем случае год - это ежегодная переменная даты в формате %Y-%m-%d, использование full_seq(year, period = 1) не заполняет все окно даты. Кроме того, я хотел бы обобщить этот подход с другой переменной даты частоты, такой как ежедневные, ежемесячные или квартальные данные. Спасибо - person Cristhian; 24.02.2020
comment
Вы не показали свой столбец года как класс даты в своем примере, поэтому сложно ответить. Вы всегда можете использовать seq.Date для создания нужной вам последовательности дат. Не нужно использовать full_seq. - person www; 24.02.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
person Helix123    schedule 29.02.2020