Построение нескольких матриц корреляции по категориальной переменной с использованием ggcorrplot

Я создал простую корреляционную матрицу, используя пакет ggcorrplot и следующий код:

library(ggcorrplot)
corr <- round(cor(data[,18:24], use = "complete.obs"),2)
gg <- ggcorrplot(corr)
print(gg)

Что я хотел бы сделать, так это создать несколько матриц корреляции, используя одни и те же данные, но разбив их на категориальную переменную с именем «регион» (позиция столбца «5»): аналогично использованию функции facet_wrap. Однако, когда я пытаюсь это сделать, я получаю сообщение об ошибке. Я пробовал следующее:

library(ggcorrplot)
corr <- round(cor(data[,18:24], use = "complete.obs"),2)
gg <- ggcorrplot(corr) +
facet_wrap("region", ncol = 2)
print(gg)

Я получаю ошибку "Error in combine_vars(data, params$plot_env, vars, drop = params$drop) : At least one layer must contain all variables used for facetting"

Я понимаю, что «corr» не ссылается на поле «регион», и мне было интересно, как я могу это сделать. Таким образом, на выходе будет 6 матриц корреляции, разделенных «регионом», а не одна матрица корреляции для всех данных.


person A.G.    schedule 05.04.2018    source источник


Ответы (1)


Это, вероятно, невозможно при использовании ggcorrplot, который принимает в качестве входных данных корреляционную матрицу и переплавляет ее в подходящий фрейм данных, который затем используется для некоторых конкретных вещей ggplot для построения графика.

Но вы можете использовать исходный код ggcorrplot, чтобы получить то, что хотите.

В качестве предварительного шага давайте рассмотрим «расплавленную» корреляционную матрицу.

(small_cor <- cor(replicate(2, rnorm(25))))
#>            [,1]       [,2]
#> [1,] 1.00000000 0.06064063
#> [2,] 0.06064063 1.00000000
(reshape2::melt(small_cor))
#>   Var1 Var2      value
#> 1    1    1 1.00000000
#> 2    2    1 0.06064063
#> 3    1    2 0.06064063
#> 4    2    2 1.00000000

Это версия корреляционной матрицы в формате данных, где каждая строка представляет собой корреляцию для комбинации переменных из исходных данных.

Теперь мы приступим к работе с некоторыми примерами данных. Есть 6 регионов и 7 переменных.

library(tidyverse)
library(reshape2)

my_data <- data.frame(region = factor(rep(1:6, each = 25)),
                      replicate(7, rnorm(6*25)))

Нам нужны расплавленные корреляционные матрицы с идентификаторами регионов. Вот как я это сделал. Может есть более приятный способ. Я думаю, что это может быть самое сложное, что вам придется сделать.

my_cors <- cbind(region = factor(rep(levels(my_data$region), each = 7^2)),
              do.call(rbind, lapply(split(my_data, my_data$region), function(x) melt(cor(x[,-1])))))

Теперь я скопирую и вставлю исходный код ggcorrplot. Сначала вставил из списка аргументов, чтобы получить некоторые значения по умолчанию:

ggtheme = ggplot2::theme_minimal
colors = c("blue", "white", "red")
outline.color = "gray"
legend.title = "Corr"
tl.cex = 12
tl.srt = 45

Теперь я вырезаю и вставляю соответствующие части ggcorrplot и вставляю facet_wrap в конце, чтобы получить то, что вы хотели.

my_cors %>% 
  ggplot(aes(Var1, Var2, fill = value)) + 
  geom_tile(color = outline.color) + 
  scale_fill_gradient2(low = colors[1], 
                       high = colors[3], 
                       mid = colors[2], 
                       midpoint = 0,
                       limit = c(-1, 1), 
                       space = "Lab", 
                       name = legend.title) + 
  ggtheme() + theme(axis.text.x = element_text(angle = tl.srt,
                                               vjust = 1, 
                                               size = tl.cex, hjust = 1), 
                    axis.text.y = ggplot2::element_text(size = tl.cex)) + 
  coord_fixed() +
  facet_wrap("region", ncol=2)

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

person ngm    schedule 05.04.2018
comment
Спасибо за ваш вклад. Я попробовал ваш код, и, к сожалению, он не сработал для меня. Однако вместо этого я создал пару фреймов данных, а затем использовал пакеты ggpubr/ggarrange для включения всех матриц корреляции на одну страницу. Я успешно использовал этот подход, и я очень признателен за то, что вы показали мне функцию плавления с пакетом reshape2. - person A.G.; 06.04.2018