首页 > 解决方案 > 如何平衡不平衡的面板数据?

问题描述

假设我有以下不平衡 pandel 数据:

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

其中每个唯一组(个体)由 和 的组合标识firmind即个体“A1”不同于“A2”个体。时间索引由year变量给出。

我想要的是平衡panal数据(索引=(个人=公司-ind,时间=年))用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(),但它无助于实现我想要的平衡面板。

这些是我的要求:当一个唯一的个体(firm-ind)缺少一年行时,时变变量(var1)必须用 NA 填充,但像特征(charact1)这样的时不变变量应该用唯一的填充价值。

方法有什么问题tidyr::complete()?它不允许我区分要填充或扩展的时不变变量和时变变量。并且它不能识别唯一的个人索引(在本例中为公司索引)。

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

上面的代码使出现一个新的个体“C2”并用NA填充时不变变量。

标签: rdplyrtidyrpanel-dataplm

解决方案


我们可以completetidyr包中使用。关键是设置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

推荐阅读