Как читать матрицу корреляции и формировать матрицу рассеяния в R

У меня есть корреляционная матрица в excel следующим образом:

dfA <- read.table(text=
      "beta1   beta2   beta3   beta4   beta5   beta6       X      X2      X3
beta1  1.0000 -0.2515 -0.2157  0.7209 -0.7205  0.4679  0.1025 -0.3606 -0.0356
beta2 -0.2515  1.0000  0.9831  0.1629 -0.1654 -0.5595 -0.0316  0.0946  0.0829
beta3 -0.2157  0.9831  1.0000  0.1529 -0.1559 -0.4976 -0.0266  0.0383  0.0738
beta4  0.7209  0.1629  0.1529  1.0000 -1.0000 -0.2753  0.0837 -0.1445  0.0080
beta5  0.4679 -0.5595 -0.4976 -0.2753  1.0000  0.2757  0.0354 -0.3149 -0.0596
beta6 -0.7205 -0.1654 -0.1559 -1.0000  0.2757  1.0000 -0.0837  0.1451 -0.0081
X      0.1025 -0.0316 -0.0266  0.0837 -0.0837  0.0354  1.0000  0.0278 -0.0875
X2    -0.3606  0.0946  0.0383 -0.1445  0.1451 -0.3149  0.0278  1.0000  0.2047
X3    -0.0356  0.0829  0.0738  0.0080 -0.0081 -0.0596 -0.0875  0.2047  1.0000", 
      header=TRUE) 

У меня есть только матрица корреляции, а не исходные данные, из которых формируется матрица, поэтому я попытался прочитать эту матрицу в матрицу в R с помощью этого кода:

 B <- as.matrix(dfA)

Но когда я пытаюсь сформировать матрицу диаграммы рассеяния со следующим кодом:

library(corrplot)
corrplot(B, method="circle")

я получаю сообщение об ошибке

Error in corrplot(B, method = "circle") : The matrix is not in [-1, 1]!

Пожалуйста, помогите мне с этой проблемой.


person Happy Camper    schedule 30.04.2016    source источник
comment
Возможно, я неправильно понял, но я думаю, что вы создаете корреляционную матрицу графика корреляционной матрицы, сделанного из Excel, который не будет летать. Вы можете использовать только аккуратные данные для построения корреляционной матрицы. Аккуратность в этом случае означает, что вам нужны уникальные наблюдения, поскольку строки и бета1, бета2, бета3, ... являются вашими столбцами. Надеюсь это поможет.   -  person BGA    schedule 30.04.2016
comment
@BGA на самом деле у меня есть корреляционная матрица в Excel, поэтому я пытаюсь построить матричный график диаграммы рассеяния из этой корреляционной матрицы.   -  person Happy Camper    schedule 30.04.2016
comment
ах. но та же концепция. Я считаю, что вам все еще нужны необработанные данные для выполнения вашей матрицы диаграммы рассеяния. у вас больше нет необработанных данных? если он доступен, его довольно легко перенести в r в виде фрейма данных из csv или excel.   -  person BGA    schedule 30.04.2016
comment
@BGA У меня нет необработанных данных. Значит, нет никакой надежды сделать диаграмму рассеивания?   -  person Happy Camper    schedule 30.04.2016
comment
на данный момент вы просто создаете круги из десятичных чисел, и это больше не точечная диаграмма.   -  person BGA    schedule 30.04.2016
comment
@BGA, но коэффициенты корреляции представляют собой десятичное число. Я получаю что-то действительно не так здесь.   -  person Happy Camper    schedule 30.04.2016
comment
Я не использовал пакет corrplot, но ошибка, которую вы получаете, заключается в том, что значения в вашей матрице не находятся в интервале [-1, 1]. может случиться так, что есть проблема с числовой точностью. Глядя на значения матрицы, вероятными нарушителями являются единицы. Они, вероятно, на самом деле 1.000000001 или что-то в этом роде. Внимательно посмотрите на значения, возможно, вам потребуется выполнить небольшую манипуляцию. Перед этим, как говорит BGA, вы должны дважды проверить, какой тип объекта ищет corrplot. прочитайте ?corrplot и убедитесь, что его первый аргумент является корреляционной матрицей.   -  person lmo    schedule 30.04.2016
comment
Счастливый, ваш код должен работать - абсолютно нормально передавать подобную матрицу в corrplot. Если я скопирую и вставлю ваш код, он сработает, поэтому, как говорит Имо, он должен быть точным. Попробуйте corrplot(round(B, 4), method="circle")   -  person user20650    schedule 30.04.2016
comment
пожалуйста Хэппи. Числовая точность (если в этом проблема) много раз ловила меня - не помогает то, что R будет выводить на экран только заданное количество цифр, чтобы убаюкать вас ложной безопасностью. Вы могли бы попробовать print(B, digits=15) посмотреть? (ps. было здорово, что вы добавили свои данные, но иногда нужны более мелкие детали — добавление результатов dput(dfA) — хороший способ добавить данные)   -  person user20650    schedule 30.04.2016
comment
@ user20650 да, это была одна из проблем. Обязательно учту ваши предложения на будущее. Ваше здоровье!   -  person Happy Camper    schedule 30.04.2016


Ответы (1)


коррплот() Решение

Обновите мой первый пост, используя ggplot, на основе комментариев пользователя 20650 выше. user20650 показывает, что вероятным источником ошибки были ошибки округления, приводящие к тому, что некоторые числа выходили за пределы допустимого диапазона [-1,1], и что округление решает эту проблему. Я также смог создать график, используя corrplot().

На этом этапе запуск corplot() дает следующий график:

corMat<-as.matrix(dfA)

library('corrplot')
corrplot(corMat, method='circle')

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

ggplot() Решение

Вы также можете сделать это в ggplot2, выполнив несколько дополнительных шагов. Я лично думаю, что это выглядит намного лучше.

1) Избавляюсь от лишней информации в нижнем треугольнике матрицы.

corMat[lower.tri(corMat)]<-NA

> print(corMat)
      beta1   beta2   beta3  beta4   beta5   beta6       X      X2      X3
beta1     1 -0.2515 -0.2157 0.7209  0.4679 -0.7205  0.1025 -0.3606 -0.0356
beta2    NA  1.0000  0.9831 0.1629 -0.5595 -0.1654 -0.0316  0.0946  0.0829
beta3    NA      NA  1.0000 0.1529 -0.4976 -0.1559 -0.0266  0.0383  0.0738
beta4    NA      NA      NA 1.0000 -0.2753 -1.0000  0.0837 -0.1445  0.0080
beta5    NA      NA      NA     NA  1.0000  0.2757 -0.0837  0.1451 -0.0081
beta6    NA      NA      NA     NA      NA  1.0000  0.0354 -0.3149 -0.0596
X        NA      NA      NA     NA      NA      NA  1.0000  0.0278 -0.0875
X2       NA      NA      NA     NA      NA      NA      NA  1.0000  0.2047
X3       NA      NA      NA     NA      NA      NA      NA      NA  1.0000

2) Затем я использую reshape2::melt() для преобразования матрицы в длинную форму и создания отформатированной версии значений, которые отображаются только до двух знаков после запятой. Это пригодится для сюжета.

library(reshape2)
m<-melt(corMat)
m<-data.frame(m[!is.na(m[,3]),]) # get rid of the NA matrix entries
m$value_lab<-sprintf('%.2f',m$value)

Вот как выглядят данные:

> head(m)
    Var1  Var2   value value_lab
1  beta1 beta1  1.0000      1.00
10 beta1 beta2 -0.2515     -0.25
11 beta2 beta2  1.0000      1.00
19 beta1 beta3 -0.2157     -0.22
20 beta2 beta3  0.9831      0.98
21 beta3 beta3  1.0000      1.00

3) Наконец, я передаю эти данные в ggplot2, в основном полагаясь на функцию geom_tile() для печати матрицы и функцию geom_text() для печати меток над каждой плиткой. Вы можете одеть это больше, если хотите.

library(ggplot2)
ggplot(m, aes(Var2, Var1, fill = value, label=value_lab),color='blue') + 
  geom_tile() + 
  geom_text() +
  xlab('')+
  ylab('')+
  theme_minimal()

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

person AOGSTA    schedule 30.04.2016
comment
@ user20650 О, круто. Я отправил свой ответ до того, как увидел ваш комментарий к вопросу. Я обновлю свой пост, чтобы включить corrplot(). Кроме того, зачем мне аргумент byrow? Кажется, что matrix() уже правильно помещает значения в corMat. - person AOGSTA; 30.04.2016
comment
Хороший глаз. Я собираюсь обновить с помощью нового импорта OP read.table(). - person AOGSTA; 30.04.2016
comment
он работает отлично (я сделал обе матрицы диаграммы рассеяния) спасибо за ваш ответ и такое пошаговое объяснение кода. На самом деле ggplot выглядит намного лучше, чем точечный график на основе круга. Прошу прощения за то, что предоставил данные. Не могли бы вы помочь мне, как я могу импортировать матрицу корреляции в R в формате матрицы? - person Happy Camper; 30.04.2016