0

我有一个分组数据结构(不同的家庭回答每周的民意调查),我观察他们超过 52 周(在下面的例子中为 4 周)。现在我想用基尼系数来表示一个家庭在给定时间点的价值。在这种情况下,如果该家庭在过去几周内没有参与,那么参与投票的家庭的价值应该更高。因此,一个总是回答民意调查的家庭在给定一周内的基尼系数应该低于每 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 表示不参与。

4

1 回答 1

1

这里有三种方式。它们都使用Ginipackage中的函数DescTools

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原始数据集的每行有一个系数值,而不是聚合,请使用aveintead oftapplymutate而不是summarise.

带底座 R

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

dplyr解决方案

da_poll %>% 
  group_by(household) %>%
  mutate(gini = Gini(participation))
于 2020-02-25T12:21:19.327 回答