Як я можу створити кореляційну матрицю в R?


86

У мене є 92 набори даних одного типу.

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

тобто я хочу матрицю 92 х92.

такий, що елемент (ci, cj) повинен бути співвідношенням між ci і cj.

Як це зробити?


5
Подивіться на corфункцію або на rcorrфункцію в Hmiscупаковці
Мануель Рамон,

Я можу знайти корекцію між двома параметрами. Річ у тому, як розташувати їх у матриці?
Swapnil 'Tux' Takle

6
Як на Землі це набрало стільки голосів?
Позов Фонду Моніки

Відповіді:



72

Ви можете використовувати пакет "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


Чи можна отримати графік, подібний до цих, cran.r-project.org/web/packages/corrplot/vignettes/… , або просту матрицю, але з R-квадратом замість співвідношення pearson, kendall або spearman?
FraNut

R2 дорівнює квадрату коефіцієнта кореляції Пірсона. Отже, все, що вам потрібно, - помножити M на M (помножити матрицю кореляції само по собі) перед створенням графіку.
Jot eN

17

Функція 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()

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


Приклад @Manuel Ramón, мабуть, найкращий для вашого випадку (одна матриця) - упорядкуйте свої набори даних у вигляді стовпців.
Марк у коробці

на зображенні вище, як можна "інвертувати" кольори, чи кореляція червоного наближається до -1 або 1, а біла, коли близька до 0?
tagoma

image(x=seq(dim(x)[2]), y=seq(dim(y)[2]), z=COR, col=rev(heat.colors(20)), xlab="x column", ylab="y column")
Марк у коробці

@Marcinthebox, як би ви додали мітки змінних до осей x та y (замість цифр)? Дякую
Агустін Індако

@ AgustínIndaco - Я оновив свою відповідь ще одним прикладом. imageФункція автоматично не приймає імена рядків і стовпців, так що це повинно бути додано.
Марк в коробці

15

Погляньте на qtlcharts . Це дозволяє створювати інтерактивні кореляційні матриці:

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

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

Це вражає, коли ви співвідносите більше змінних, як у віньетці пакета: введіть тут опис зображення


1

Є й інші способи досягти цього тут: ( Побудувати матрицю кореляції у графік ), але мені подобається ваша версія із співвідношеннями у полях. Чи є спосіб додати імена змінних до стовпців x та y замість цих номерів індексу? Для мене це зробило б це ідеальне рішення. Дякую!

редагувати: Я намагався прокоментувати публікацію [Марк у полі], але явно не знаю, що роблю. Однак мені вдалося відповісти на це запитання для себе.

якщо 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: для придушення функції друку () функції друку чисел у сітці (інакше вони перекривають мітки змінних), додайте 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')
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.