Как вычислить корреляцию Пирсона между переменными с помощью функции map()?

#r #dictionary

#r #словарь

Вопрос:

У меня возникли проблемы с использованием одной из map() функций в r для вычисления корреляции между переменными во фрейме данных. Вопрос в том, «используйте одну из функций map для вычисления корреляции Пирсона между гепатитом А и каждым из других 6 заболеваний и возвращайте двойной вектор в качестве выходных данных».

введите описание изображения здесь

Данные показывают ежегодный уровень заболеваемости каждым заболеванием каждый год.
Я могу вычислить корреляцию между гепатитом А и другими заболеваниями с помощью cor() функции, но есть ли способ использовать одну из map() функций для вычисления корреляции?

 cor(US_incidence$`Hepatitis A`, US_incidence$Measles, method = "pearson", use = "complete.obs")
cor(US_incidence$`Hepatitis A`, US_incidence$Mumps, method = "pearson", use = "complete.obs")
cor(US_incidence$`Hepatitis A`, US_incidence$Pertussis, method = "pearson", use = "complete.obs")
cor(US_incidence$`Hepatitis A`, US_incidence$Polio, method = "pearson", use = "complete.obs")
cor(US_incidence$`Hepatitis A`, US_incidence$Rubella, method = "pearson", use = "complete.obs")
cor(US_incidence$`Hepatitis A`, US_incidence$Smallpox, method = "pearson", use = "na.or.complete")
 

Ответ №1:

Вы можете map напрямую использовать подмножество фрейма данных, поскольку фреймы данных представляют собой списки векторов, а map может выполнять итерации по спискам:

 map(your_data_frame[,-c(1,2)], #every column except year and Hep A
~ cor(US_incidence$`Hepatitis A`, ., method = "Pearson", use  = "complete.obs")
 

Обратите внимание, что если вы хотите изменить свой аргумент ‘use’, как вы делаете выше, вам нужно создать список символьных строк для этой цели и использовать map2 .

Вы также можете рассмотреть возможность использования dplyr::summarise() с dplyr::across()

 require(dplyr)

your_data_frame %>%
select(-year) %>% #don't need year column
ungroup() %>% # make sure d.f isn't grouped
summarise(across(everything(), function(x){
cor(`Hepatitis A`, x, method = "Pearson", use  = "complete.obs")
})) -> correlations
 

Выше приведен Hepatitis A столбец, который показывает корреляцию с самим собой, но вы можете просто удалить его, если хотите.

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

1. Большое спасибо! Этот первый код был тем, что я искал! У меня также есть еще один вопрос. Для каждого из 7 заболеваний, как мне использовать циклы или функции отображения, чтобы найти наиболее положительно (pearson’s) коррелированное заболевание (кроме самого себя) и соответствующую корреляцию?

2. Используйте cor.test вместо cor — вместо длины-один двойной, он возвращает список. Значение p result$p.value равно, а значение равно result$estimate

Ответ №2:

Вы можете создать вектор имен столбцов, к которому хотите применить cor функцию, а затем использовать map_dbl его для получения двойного вектора.

 cols <- c('Measles', 'Mumps', 'Pertussis', 'Polio', 'Rubella', 'Smallpox')

result <- purrr::map_dbl(cols, 
                ~cor(US_incidence$`Hepatitis A`, US_incidence[[.x]], 
                   method = "pearson", use = "complete.obs"))