#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. Я понял, что некоторые недостающие данные создают проблему, и теперь код работает. Большое вам спасибо за ваше время и помощь.