跨分组数据的横截面相关性并在乳胶中总结 table

Cross sectional correlation across grouped data and summarized in latex table

我有一个时间序列面板数据集,其结构如下:

df <- data.frame(
  year = c(2012L, 2013L, 2014L, 2012L, 2013L, 2014L, 2015L),
  id = c(1L, 1L, 1L, 2L, 2L, 2L, 2L),
  col1 = c(11L, 13L, 13L, 16L, 15L, 15L, 16L),
   col2 = c(10L, 14L, 12L, 13L, 11L, 16L, 17L),
col3 = c(17L, 12L, 12L, 14L, 19L, 21L, 12L),
)
> df
  year id col1 col2 col3
1 2012  1   11   10   17
2 2013  1   13   14   12
3 2014  1   13   12   12
4 2012  2   16   13   14
5 2013  2   15   11   19
6 2014  2   15   16   21
7 2015  2   16   17   12
> 

我想在每个列对和所有组中生成横截面下三角相关乳胶 table,但我希望最终的 table 是所有组的平均值,并且包括 p 统计。 这是我到目前为止使用 dplyr:

library(dplyr)
df %>%
  group_by(id) %>%
  summarize(COR=cor(col1,col2))

但我想对所有列对都使用这个,并且在我的实际数据集中,我有更多的 ID。我想使用 xtable、stargazer 或 Hmisc 来生成乳胶相关性 table,它具有跨组的平均 corr 作为输出,还包括 p 值。我希望我的最终输出看起来像这样:imgur.com/a/7Jwmm8f

一个选项是 split by 'id' 列,然后在 'col' 列上应用 cor,获取元素 + 并除通过 unique 'id' 的 length 并将 upper.tri 值替换为 NA

out <- Reduce(`+`, lapply(split(df[3:5], df$id),
      function(x) cor(x, use = "complete.obs")))/length(unique(df$id))
out[upper.tri(out)] <- NA

-输出

out
#           col1      col2 col3
#col1  1.0000000        NA   NA
#col2  0.5902554  1.000000   NA
#col3 -0.9807620 -0.569806    1

或使用tidyverse

library(dplyr)
library(purrr)
library(magrittr)
df %>% 
  select(-year) %>%
  group_split(id, .keep = FALSE) %>%
  map(cor, use = "complete.obs") %>% 
  reduce(`+`) %>% 
  divide_by(n_distinct(df$id)) %>% 
  replace(., upper.tri(.), NA)
#           col1      col2 col3
#col1  1.0000000        NA   NA
#col2  0.5902554  1.000000   NA
#col3 -0.9807620 -0.569806    1