面板数据中的基尼系数
Gini coefficient in panel data
我有一个分组数据结构(不同的家庭每周回答一次民意调查),我观察了他们超过 52 周(在下面的例子中是四个星期)。现在我想用基尼系数来表示一个家庭在给定时间点的价值。在这种情况下,如果家庭在过去几周没有参与投票,则参与投票的家庭的价值应该更高。因此,总是回答民意调查的家庭在给定一周内的基尼系数应该低于每 4 周回答一次的家庭。
数据结构如下:
da_poll <- data.frame(household = c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4), week = c(1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4), participation = c(1,1,1,1,0,0,0,1,0,1,0,1,1,1,1,0))
da_poll
household week participation
1 1 1 1
2 1 2 1
3 1 3 1
4 1 4 1
5 2 1 0
6 2 2 0
7 2 3 0
8 2 4 1
9 3 1 0
10 3 2 1
11 3 3 0
12 3 4 1
13 4 1 1
14 4 2 1
15 4 3 1
16 4 4 0
1表示参与,0表示不参与。
这是三种方法。他们都使用包DescTools
中的函数Gini
。
library(DescTools)
基础 R
tapply(da_poll$participation, da_poll$household, Gini)
# 1 2 3 4
#0.0000000 1.0000000 0.6666667 0.3333333
或者,另一种基本的 R 方式。
aggregate(participation ~ household, da_poll, Gini)
# household participation
#1 1 0.0000000
#2 2 1.0000000
#3 3 0.6666667
#4 4 0.3333333
dplyr
library(dplyr)
da_poll %>%
group_by(household) %>%
summarise(gini = Gini(participation))
## A tibble: 4 x 2
# household gini
# <dbl> <dbl>
#1 1 0
#2 2 1
#3 3 0.667
#4 4 0.333
编辑。
要使原始数据集的每一行有一个 Gini
系数值,而不是聚合,请使用 ave
而不是 tapply
和 mutate
而不是 summarise
。
带底座R
da_poll$gini <- ave(da_poll$participation, da_poll$household, FUN = Gini)
dplyr
解决方案
da_poll %>%
group_by(household) %>%
mutate(gini = Gini(participation))
我有一个分组数据结构(不同的家庭每周回答一次民意调查),我观察了他们超过 52 周(在下面的例子中是四个星期)。现在我想用基尼系数来表示一个家庭在给定时间点的价值。在这种情况下,如果家庭在过去几周没有参与投票,则参与投票的家庭的价值应该更高。因此,总是回答民意调查的家庭在给定一周内的基尼系数应该低于每 4 周回答一次的家庭。
数据结构如下:
da_poll <- data.frame(household = c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4), week = c(1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4), participation = c(1,1,1,1,0,0,0,1,0,1,0,1,1,1,1,0))
da_poll
household week participation
1 1 1 1
2 1 2 1
3 1 3 1
4 1 4 1
5 2 1 0
6 2 2 0
7 2 3 0
8 2 4 1
9 3 1 0
10 3 2 1
11 3 3 0
12 3 4 1
13 4 1 1
14 4 2 1
15 4 3 1
16 4 4 0
1表示参与,0表示不参与。
这是三种方法。他们都使用包DescTools
中的函数Gini
。
library(DescTools)
基础 R
tapply(da_poll$participation, da_poll$household, Gini)
# 1 2 3 4
#0.0000000 1.0000000 0.6666667 0.3333333
或者,另一种基本的 R 方式。
aggregate(participation ~ household, da_poll, Gini)
# household participation
#1 1 0.0000000
#2 2 1.0000000
#3 3 0.6666667
#4 4 0.3333333
dplyr
library(dplyr)
da_poll %>%
group_by(household) %>%
summarise(gini = Gini(participation))
## A tibble: 4 x 2
# household gini
# <dbl> <dbl>
#1 1 0
#2 2 1
#3 3 0.667
#4 4 0.333
编辑。
要使原始数据集的每一行有一个 Gini
系数值,而不是聚合,请使用 ave
而不是 tapply
和 mutate
而不是 summarise
。
带底座R
da_poll$gini <- ave(da_poll$participation, da_poll$household, FUN = Gini)
dplyr
解决方案
da_poll %>%
group_by(household) %>%
mutate(gini = Gini(participation))