面板数据中的基尼系数

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 而不是 tapplymutate 而不是 summarise

带底座R

da_poll$gini <- ave(da_poll$participation, da_poll$household, FUN = Gini)

dplyr解决方案

da_poll %>% 
  group_by(household) %>%
  mutate(gini = Gini(participation))