【问题标题】:Cross sectional correlation across grouped data and summarized in latex table跨分组数据的横截面相关性并汇总在乳胶表中
【发布时间】:2021-04-03 02:19:09
【问题描述】:

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

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
> 

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

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

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

【问题讨论】:

  • 你能显示预期的输出格式吗
  • 有点像这张图:imgur.com/a/7Jwmm8f
  • 对于不同的id'值,是否要创建列
  • 不,我希望将 id 之间的平均相关性作为最终输出。因此,例如获取 id 1 的 col 1 和 col2 之间的相关性,然后重复 id 2 并报告该对的相关性的最终输出作为 1 和 2 之间的平均值。在我的实际数据集中,我有更多的 id。跨度>
  • 请查看下面的更新解决方案。谢谢

标签: r dplyr cross-correlation hmisc


【解决方案1】:

一个选项是split by 'id' 列,然后在'col' 列上应用cor,得到元素+ 并除以lengthunique 'id'并将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

【讨论】:

  • 如果我有不同的列名,这仍然有效吗? (所以不再是 col1、col2、.. 而是汽车、飞机、股票等)
  • @ErwinRhine 是的,在这里,我按列索引而不是 split 中的名称进行子集化,即 df[3:5]。在第二个解决方案中,它正在删除 select 中不需要的列,即 year
  • 非常感谢您的解决方案。出于某种原因,我得到了所有输出的 NA 值。如果我的数据中有一些 NA 条目,这仍然有效吗?
  • @ErwinRhine cor 默认有use = "everything"。你可以指定use = "complete.obs"
  • 我意识到有一些丢失的数据造成了问题,代码现在可以工作了。非常感谢您的时间和帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-06
  • 2023-02-09
  • 2016-04-28
  • 2015-01-14
  • 2019-03-04
相关资源
最近更新 更多