R: использование corrplot для визуализации двух переменных (например, корреляции и p-значения) с использованием размера и цвета кругов

Я пытаюсь воссоздать чей-то образ с помощью corrplot. Это исходное изображение, которое я пытаюсь воссоздать:

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

Я использую следующий R-код:

corrplot(as.matrix(rgs), 
         method="circle", 
         type="upper", 
         col=brewer.pal(n=8, name="PuOr"), 
         tl.col="black", 
         tl.srt=45, 
         p.mat = as.matrix(pvalues), 
         sig.level = 0.05, 
         insig = "blank")

Что дает мне это:

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

Проблема, с которой я столкнулся, заключается в том, что цвет, а также размер кругов на моем графике основаны на корреляциях, но на исходном изображении выше цвет кругов основан на корреляции, в то время как размер кругов основан на p-значения. У меня есть p-значения в другом фрейме данных, называемом pvalues ​​(я фактически использую это в приведенном выше коде, чтобы определить, какие круги должны отображаться, а какие нет в нижних 3 строках). У меня вопрос: как сделать так, чтобы цвет и размер зависели от двух разных переменных, как в исходном изображении? Возможно ли такое использование corrplot?


person Abdel    schedule 26.02.2020    source источник
comment
Было бы полезно, если бы вы могли сделать свой пример воспроизводимым. Что такое rgs, откуда вы взяли p-значения.   -  person JBGruber    schedule 02.03.2020
comment
@JBGruber Похоже, диаграмма взята из этой научной статьи, где есть также некоторые загружаемые наборы данных. Было бы намного проще, если бы OP предоставил нам образцы данных.   -  person Allan Cameron    schedule 02.03.2020
comment
Приведите данные, см. минимальный воспроизводимый пример   -  person denis    schedule 02.03.2020


Ответы (2)


То, что вы хотите, кажется невозможным с corrplot, если вы немного не взломаете его. Я просто добавил новый параметр size_vector, который используется при рисовании кругов. См. https://github.com/johannes-titz/mit4b92/index8982/cf2d02b02b02b8d08a8a8aaaaaaaaaaaaaaaaaaaaaaaaaaaa, a> для измененных строк.

# install the hacked version
devtools::install_github("johannes-titz/corrplot@size_parameter")
library(corrplot)
data(mtcars)
M <- cor(mtcars)
# get p values
p_vals_mat <- cor.mtest(mtcars)$p
corrplot(M, size_vector = 1-as.numeric(p_vals_mat))

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

Обратите внимание, что я использовал размер 1-p (маленькие значения p дают большие круги). Вы можете использовать любое значение от 0 до 1 для размера.

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

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

PS: Я не стал добавлять легенду, но это не должно быть слишком сложно сделать с legend.

Небольшое обновление: преобразование значений p может быть примерно таким:

transform_p <- function(x) {
  y <- 0.91 - (0.82) * (1 - exp(-3.82 * x))
  y
}

Что немного изменит размер кругов:

corrplot(M, size_vector = as.numeric(transform_p((p_vals_mat))))

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

Опять же, я не рекомендую это, но он должен быть немного ближе к исходной фигуре.

Если вам нужен только верхний треугольник, передайте только p-значения верхнего треугольника:

upper_tri <- p_vals_mat[upper.tri(p_vals_mat, diag = T)]
corrplot(M, size_vector = transform_p(upper_tri), type = "upper")

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

person Johannes Titz    schedule 02.03.2020
comment
Я пришел к такому же выводу. Однако, вероятно, лучше иметь функцию-оболочку, которая временно перезаписывает строки в функции, а не переустанавливать пакет. Отметьте unlockBinding, чтобы разрешить доступ к функции, и используйте body(corrplot), чтобы внести изменения. Затем вы можете изменить его перед выходом из оболочки. - person Allan Cameron; 03.03.2020
comment
Это здорово, спасибо вам большое! Я согласен с вашим советом, я также создам рисунок, который не визуализирует подобные p-значения, но он мне также нужен просто для сравнения. В вашем решении осталась только одна проблема, а именно, если я использую параметр type = upper, я получаю следующее сообщение об ошибке: Ошибка в символах (Pos, add = TRUE, дюймы = FALSE, круги = asp_rescale_factor *: x / y Несоответствие длины параметра /. Есть идеи, почему это так? - person Abdel; 03.03.2020
comment
@Allan: Спасибо! Мне было интересно, возможно ли это, но в конце концов мне было проще загрузить новую версию на github. Собственно, пакет должен работать как раньше. Я добавил условие, чтобы проверить, равен ли новый параметр нулю. Если это так, функция использует корреляцию для радиуса круга (как обычно). В противном случае используется размер, определенный вручную. Извините, у меня нет времени попробовать ваше предложение, но оно звучит очень хорошо! - person Johannes Titz; 03.03.2020
comment
@Abdel: это ожидается, поскольку для параметра upper требуется меньше элементов vector_size. Просто передайте верхний треугольник матрицы значений p: corrplot(M, size_vector = p_vals_mat[upper.tri(p_vals_mat, diag = T)], type = "upper") - person Johannes Titz; 03.03.2020
comment
Здравствуйте, я пытаюсь использовать это решение, но у меня возникают ошибки установки Ошибка: не удалось установить 'corrplot' из GitHub: (преобразовано из предупреждения) установка пакета '/ var / folder / 1m / 1pbv4y0158b1108zl0vwcnxm0000gn / T // RtmpmkKVPd / file148b67086f13a / corrplot_0.85.tar.gz 'имел ненулевой статус выхода - person Maheen Siddiqui; 07.10.2020
comment
Не могли бы вы помочь? Спасибо! - person Maheen Siddiqui; 07.10.2020
comment
Только что протестировал, у меня все еще работает. Ваша система обновлена? - person Johannes Titz; 08.10.2020

Возможно, этот человек использовал ggcor, который находится в стадии разработки. Если вы это сделаете:

install.packages("devtools")
devtools::install_github("houyunhuang/ggcor")

library(ggplot2)
library(ggcor)

quickcor(fortify_cor(mtcars,cor.test = T), type = "upper") + 
  geom_circle2(aes(fill = r,r0 = p.value))

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

Вы можете изменить размер в зависимости от значения p.

fortify_cor(mtcars,cor.test = T)

создает таблицу корреляции со значениями p

# A tibble: 121 x 8
   .row.names .col.names      r  p.value upper.ci lower.ci .row.id .col.id
 * <chr>      <chr>       <dbl>    <dbl>    <dbl>    <dbl>   <int>   <int>
 1 mpg        mpg         1     0.          1       1           11       1
 2 cyl        mpg        -0.852 6.11e-10   -0.716  -0.926       10       1
 3 disp       mpg        -0.848 9.38e-10   -0.708  -0.923        9       1
 4 hp         mpg        -0.776 1.79e- 7   -0.586  -0.885        8       1
 5 drat       mpg         0.681 1.78e- 5    0.832   0.436        7       1
 6 wt         mpg        -0.868 1.29e-10   -0.744  -0.934        6       1
 7 qsec       mpg         0.419 1.71e- 2    0.670   0.0820       5       1
 8 vs         mpg         0.664 3.42e- 5    0.822   0.410        4       1
 9 am         mpg         0.600 2.85e- 4    0.784   0.318        3       1
10 gear       mpg         0.480 5.40e- 3    0.710   0.158        2       1
person denis    schedule 02.03.2020
comment
Я получаю сообщение об ошибке при установке этого пакета с сообщением об ошибке HTTP, не найдено. Не могли бы вы помочь? Файл перемещен из этого репозитория? - person Maheen Siddiqui; 07.10.2020
comment
Я понятия не имею. Попробуйте связаться с разработчиком пакета: rdrr.io/github/houyunhuang/ggcor - person denis; 12.10.2020