如何平衡不平衡的面板数据?
How to balance an unbalanced panel data?
假设我有以下不平衡 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
其中每个独特的组(个体)由 firm
和 ind
的组合标识,即个体 "A1" 不同于 "A2" 个体。时间索引由 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")
但出现以下错误:
Error in mode<-(tmp, value = id_orig_typeof) : invalid to change the storage mode of a factor
我什至尝试使用 tidyr::complete()
,但它无助于实现我想要的平衡面板。
这些是我的要求:当一个唯一个体(firm-ind)缺少年份行时,时变变量(var1)必须用NA填充,但时不变变量如特征(charact1)应该填充唯一值。
tidyr::complete()
方法有什么问题?它不允许我区分要填充或扩展的时不变变量和时变变量。并且它没有唯一标识个人索引(在本例中为 firm-ind)。
unbalanced.panel >%>
tidyr::complete(firm, year, nesting(var1))
以上代码使出现一个新个体"C2"并用NA填充时不变变量
我们可以使用 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
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
假设我有以下不平衡 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
其中每个独特的组(个体)由 firm
和 ind
的组合标识,即个体 "A1" 不同于 "A2" 个体。时间索引由 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")
但出现以下错误:
Error in mode<-(tmp, value = id_orig_typeof) : invalid to change the storage mode of a factor
我什至尝试使用 tidyr::complete()
,但它无助于实现我想要的平衡面板。
这些是我的要求:当一个唯一个体(firm-ind)缺少年份行时,时变变量(var1)必须用NA填充,但时不变变量如特征(charact1)应该填充唯一值。
tidyr::complete()
方法有什么问题?它不允许我区分要填充或扩展的时不变变量和时变变量。并且它没有唯一标识个人索引(在本例中为 firm-ind)。
unbalanced.panel >%>
tidyr::complete(firm, year, nesting(var1))
以上代码使出现一个新个体"C2"并用NA填充时不变变量
我们可以使用 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
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