【问题标题】:How to balance an unbalanced panel data?如何平衡不平衡的面板数据?
【发布时间】:2020-06-07 14:54:42
【问题描述】:

假设我有以下不平衡 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"),但出现以下错误:

模式错误

我什至尝试使用tidyr::complete(),但这无助于实现我想要的平衡面板。

这些是我的要求:当一个独特的个体 (firm-ind) 缺少一年行时,时变变量 (var1) 必须填写 NA,但时不变变量如特征 (charact1) 应填写具有独特的价值。

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

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

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

【问题讨论】:

    标签: r dplyr tidyr panel-data plm


    【解决方案1】:

    我们可以使用tidyr 包中的complete。关键是要正确设置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
    

    【讨论】:

    • 当年份是Date 类时,我如何使用full_seq(year, period = 1)?我的意思是,在我的情况下,年份是具有“%Y-%m-%d”格式的年度日期变量,使用full_seq(year, period = 1) 不会填充完整的日期窗口。此外,我想用其他频率日期变量来推广这种方法,例如每日、每月或每季度的数据。谢谢
    • 您没有在示例中将年份列显示为日期类,因此很难回答。您始终可以使用 seq.Date 生成所需的日期序列。不需要使用full_seq。
    • 遇到了与@Cristhian 相同的问题,但我的年份变量是“数字”。
    【解决方案2】:

    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
    

    【讨论】:

    • 那么,你将如何填充 charac1、firm、ind 中生成的 NA?我正在尝试fill(),但让我回到不平衡面板。
    • 您可以使用基本 R 的常用数据框插入方法(结合子集)。它们也适用于 pdata.frame。 fill() 不是来自基础 R,也不是来自 plm。可能您的意思是tidyr::fill() - 我认为它不知道特殊的 pdata.frame 结构,它可能会破坏您所取得的成就;检查它的文档(我没有)。您可以通过plm::as.data.frame 转换数据框中的 pdata.frame,然后使用适用于数据框的任何内容。
    猜你喜欢
    • 2019-06-18
    • 2014-10-30
    • 2016-12-31
    • 1970-01-01
    • 2021-08-25
    • 2021-06-01
    • 2020-01-13
    • 1970-01-01
    • 2014-12-02
    相关资源
    最近更新 更多