Как я могу создать корреляционную матрицу в R?

У меня 92 набора однотипных данных.

Я хочу создать корреляционную матрицу для любых двух возможных комбинаций.

т.е. мне нужна матрица 92 х92.

такой, что элемент (ci, cj) должен быть корреляцией между ci и cj.

Как я могу это сделать?


person Swapnil 'Tux' Takle    schedule 21.05.2012    source источник
comment
Взгляните на функцию cor или на функцию rcorr в пакете Hmisc   -  person Manuel Ramón    schedule 21.05.2012
comment
Я могу найти корреляцию между двумя параметрами. Дело в том, как их расположить в матрице?   -  person Swapnil 'Tux' Takle    schedule 21.05.2012
comment
Как, черт возьми, это получило столько голосов?   -  person Fund Monica's Lawsuit    schedule 23.05.2016


Ответы (5)


Пример,

 d <- data.frame(x1=rnorm(10),
                 x2=rnorm(10),
                 x3=rnorm(10))
cor(d) # get correlations (returns matrix)
person Manuel Ramón    schedule 21.05.2012

Вы можете использовать пакет corrplot.

d <- data.frame(x1=rnorm(10),
                 x2=rnorm(10),
                 x3=rnorm(10))
M <- cor(d) # get correlations

library('corrplot') #package corrplot
corrplot(M, method = "circle") #plot matrix

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

Дополнительная информация здесь: http://cran.r-project.org/web/packages/corrplot/vignettes/corrplot-intro.html

person Jot eN    schedule 31.07.2014
comment
Можно ли получить график, аналогичный этим cran .r-project.org / web / packages / corrplot / vignettes / или простая матрица, но с R-квадратом вместо корреляции Пирсона, Кендалла или Спирмена? - person FraNut; 22.01.2015
comment
R2 равно квадрату коэффициента корреляции Пирсона. Итак, все, что вам нужно, это умножить M на M (умножить корреляционную матрицу на себя) перед созданием графика. - person Jot eN; 23.01.2015

Функция cor будет использовать столбцы матрицы при вычислении корреляции. Таким образом, количество строк в вашей матрице x и матрице y должно быть одинаковым. Бывший.:

set.seed(1)
x <- matrix(rnorm(20), nrow=5, ncol=4)
y <- matrix(rnorm(15), nrow=5, ncol=3)
COR <- cor(x,y)
COR
image(x=seq(dim(x)[2]), y=seq(dim(y)[2]), z=COR, xlab="x column", ylab="y column")
text(expand.grid(x=seq(dim(x)[2]), y=seq(dim(y)[2])), labels=round(c(COR),2))

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

Редактировать:

Вот пример настраиваемых меток строк и столбцов на корреляционной матрице, рассчитанной с помощью одной матрицы:

png("corplot.png", width=5, height=5, units="in", res=200)
op <- par(mar=c(6,6,1,1), ps=10)
COR <- cor(iris[,1:4])
image(x=seq(nrow(COR)), y=seq(ncol(COR)), z=cor(iris[,1:4]), axes=F, xlab="", ylab="")
text(expand.grid(x=seq(dim(COR)[1]), y=seq(dim(COR)[2])), labels=round(c(COR),2))
box()
axis(1, at=seq(nrow(COR)), labels = rownames(COR), las=2)
axis(2, at=seq(ncol(COR)), labels = colnames(COR), las=1)
par(op)
dev.off()

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

person Marc in the box    schedule 21.05.2012
comment
Пример @Manuel Ramón, вероятно, лучше всего подходит для вашего случая (одна матрица) - организуйте наборы данных в виде столбцов. - person Marc in the box; 21.05.2012
comment
на изображении выше, как можно «инвертировать» цвета, если корреляция красного цвета близка к -1 или 1, а белого - близка к 0? - person tagoma; 04.12.2012
comment
@Marcinthebox, как бы вы добавили метки переменных к осям x и y (вместо чисел)? Спасибо - person Agustín Indaco; 11.04.2017
comment
@ AgustínIndaco - Я добавил в свой ответ еще один пример. Функция image не принимает автоматически имена строк и столбцов, поэтому их необходимо добавить. - person Marc in the box; 11.04.2017

Взгляните на qtlcharts. Он позволяет создавать интерактивные матрицы корреляции:

library(qtlcharts)
data(iris)
iris$Species <- NULL
iplotCorr(iris, reorder=TRUE)

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

Это более впечатляюще, когда вы коррелируете больше переменных, как в виньетке пакета:  введите описание изображения здесь

person epo3    schedule 22.05.2016

Здесь есть и другие способы добиться этого: (Постройте корреляционную матрицу в виде графика), но мне нравится ваша версия с соотношениями в квадратах. Есть ли способ добавить имена переменных в столбцы x и y вместо этих номеров индексов? Для меня это было бы идеальным решением. Спасибо!

edit: Я пытался прокомментировать сообщение [Марк в рамке], но я явно не знаю, что делаю. Однако мне все же удалось ответить для себя на этот вопрос.

если d - матрица (или исходный фрейм данных), а имена столбцов - то, что вы хотите, то работает следующее:

axis(1, 1:dim(d)[2], colnames(d), las=2)
axis(2, 1:dim(d)[2], colnames(d), las=2)

las = 0 вернет имена в их нормальное положение, мои были длинными, поэтому я использовал las = 2, чтобы сделать их перпендикулярными оси.

edit2: чтобы подавить функцию image (), печатающую числа в сетке (в противном случае они перекрывают ваши метки переменных), добавьте xaxt = 'n', например:

image(x=seq(dim(x)[2]), y=seq(dim(y)[2]), z=COR, col=rev(heat.colors(20)), xlab="x column", ylab="y column", xaxt='n')
person TSeymour    schedule 12.02.2013