计算分组面板数据中的熵

Calculating entropy in grouped panel data

我有一个分组数据结构(不同的家庭每周回答一次民意调查)并且我观察每个家庭超过 52 周(在示例中为 4 周)。现在我想用熵来表示一个家庭在给定时间点的价值。如果家庭在过去几周没有参与投票,则参与投票的家庭的价值应该更高。因此,一个总是回答民意调查的家庭在这 4 周内的价值应该低于一个家庭在它参与的两周内每两周回答一次的价值。重要的是,对于给定的家庭,不平等衡量标准会随着时间的推移而变化。

最好的方法是什么?如果是熵,如何使用 R 将其应用于面板数据结构?

数据结构如下:

da_poll <- data.frame(household = c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4), participation = c(1,1,1,1,0,0,0,1,0,1,0,1,1,1,1,0))

da_poll
   household participation
1          1             1
2          1             1
3          1             1
4          1             1
5          2             0
6          2             0
7          2             0
8          2             1
9          3             0
10         3             1
11         3             0
12         3             1
13         4             1
14         4             1
15         4             1
16         4             0

# 1 indicates participation, 0 no participation.

我试过按家庭分组,但后来每个家庭只得到一个值:

da_poll %>% 
  group_by(household) %>%
  mutate(entropy = entropy(participation))

A tibble: 16 x 4
# Groups:   household [4]
   household  week participation entropy
       <dbl> <dbl>         <dbl>   <dbl>
 1         1     1             1   1.39 
 2         1     2             1   1.39 
 3         1     3             1   1.39 
 4         1     4             1   1.39 
 5         2     1             0   0    
 6         2     2             0   0    
 7         2     3             0   0    
 8         2     4             1   0    
 9         3     1             0   0.693
10         3     2             1   0.693
11         3     3             0   0.693
12         3     4             1   0.693
13         4     1             1   1.10 
14         4     2             1   1.10 
15         4     3             1   1.10 
16         4     4             0   1.10 

如果我以家庭和周为单位分组,我也会得到一些奇怪的东西:

da_poll %>% 
  group_by(household, week) %>%
  mutate(entropy = entropy(participation))
# A tibble: 16 x 4
# Groups:   household, week [16]
   household  week participation entropy
       <dbl> <dbl>         <dbl>   <dbl>
 1         1     1             1       0
 2         1     2             1       0
 3         1     3             1       0
 4         1     4             1       0
 5         2     1             0      NA
 6         2     2             0      NA
 7         2     3             0      NA
 8         2     4             1       0
 9         3     1             0      NA
10         3     2             1       0
11         3     3             0      NA
12         3     4             1       0
13         4     1             1       0
14         4     2             1       0
15         4     3             1       0
16         4     4             0      NA

要累积计算熵,您需要编写自己的累积函数。可能有一种更 tidyverse-idomatic 的方法,但这是我想出的。根据您的 post 和您的评论,熵可能不是您正在寻找的指标。

cummulEntropy <- function(x){
   unlist(lapply(seq_along(x), function(i) entropy::entropy(x[1:i]))) 
 }

 da_poll %>% 
    group_by(household) %>% 
    mutate(entropy=cummulEntropy(participation))
# A tibble: 16 x 3
# Groups:   household [4]
#   household participation entropy
#       <dbl>         <dbl>   <dbl>
# 1         1             1   0    
# 2         1             1   0.693
# 3         1             1   1.10 
# 4         1             1   1.39 
# 5         2             0  NA    
# 6         2             0  NA    
# 7         2             0  NA    
# 8         2             1   0    
# 9         3             0  NA    
#10         3             1   0    
#11         3             0   0    
#12         3             1   0.693
#13         4             1   0    
#14         4             1   0.693
#15         4             1   1.10 
#16         4             0   1.10