Корреляция поперечного сечения между сгруппированными данными и суммируется в таблице latex

#r #dplyr #cross-correlation #hmisc

#r #dplyr #перекрестная корреляция #hmisc

Вопрос:

У меня есть набор данных панели временных рядов, который структурирован следующим образом:

 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
> 
 

Я хотел бы создать таблицу latex корреляции нижнего треугольника поперечного сечения по каждой паре столбцов и по всем группам, но я хочу, чтобы итоговая таблица была средней по всем группам, а также включала статистику p.
Это то, что я до сих пор использую dplyr:

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

Но я хотел бы иметь это для всех пар столбцов, и в моем фактическом наборе данных у меня есть еще много идентификаторов. Я хотел бы использовать xtable, stargazer или Hmisc для создания таблицы корреляции latex, которая имеет среднее значение corr по группам в качестве выходных данных, а также включает p-значение. Я бы хотел, чтобы мой конечный результат выглядел примерно так: imgur.com/a/7Jwmm8f

Комментарии:

1. Можете ли вы показать ожидаемый формат вывода

2. Что-то вроде этой картинки: imgur.com/a/7Jwmm8f

3. Для разных значений id’ вы хотите создать столбец

4. Нет, я хотел бы иметь среднюю корреляцию между идентификаторами в качестве конечного результата. Так, например, получите корреляцию между col 1 и col2 для идентификатора 1, а затем повторите для идентификатора 2 и сообщите конечный результат корреляции для этой пары как среднее значение между 1 и 2. В моем актуальном наборе данных у меня гораздо больше идентификаторов.

5. Пожалуйста, проверьте обновленное решение ниже. Спасибо

Ответ №1:

Вариантом было бы split указать столбец ‘id’, затем применить cor к столбцам ‘col’, получить поэлементно и разделить на length unique ‘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
 

Комментарии:

1. Будет ли это работать, если у меня разные имена столбцов? (так что больше нет col1, col2, … но такие вещи, как автомобиль, самолет, акции и т. Д.)

2. @ErwinRhine Да, здесь я задаю подмножество по индексу столбца вместо имен в split т.е. df[3:5] . Во втором решении это удаление столбцов, которые не нужны select , т.е. year

3. Большое спасибо за ваше решение. По какой-то причине я получаю значения NA для всего вывода. Будет ли это по-прежнему работать, если в моих данных есть несколько записей NA?

4. @ErwinRhine cor по умолчанию имеет use = "everything" . вы можете указать use = "complete.obs"

5. Я понял, что некоторые недостающие данные создают проблему, и теперь код работает. Большое вам спасибо за ваше время и помощь.