Jak mogę stworzyć macierz korelacji w R?

86

Mam 92 zestawy danych tego samego typu.

Chcę stworzyć macierz korelacji dla dowolnych dwóch możliwych kombinacji.

tj. chcę macierz 92 x 92.

taki, że element (ci, cj) powinien być korelacją między ci i cj.

Jak mogę to zrobić?

Zamień 'Tux' Takle
źródło
5
Spójrz na corfunkcję lub rcorrfunkcję w Hmiscpakiecie
Manuel Ramón
Jestem w stanie znaleźć kore między dwoma parametrami. Chodzi o to, jak ułożyć je w matrycy?
Swapnil 'Tux' Takle
6
Skąd to u licha tyle głosów pozytywnych?
Załóż pozew Moniki

Odpowiedzi:

104

Przykład,

 d <- data.frame(x1=rnorm(10),
                 x2=rnorm(10),
                 x3=rnorm(10))
cor(d) # get correlations (returns matrix)
Manuel Ramón
źródło
72

Możesz użyć pakietu „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

wprowadź opis obrazu tutaj

Więcej informacji tutaj: http://cran.r-project.org/web/packages/corrplot/vignettes/corrplot-intro.html

Jot eN
źródło
Czy można uzyskać wykres podobny do tych cran.r-project.org/web/packages/corrplot/vignettes/… lub prostą macierz, ale z R-kwadrat zamiast korelacji Pearsona , Kendalla lub Spearmana ?
FraNut
R2 jest równe kwadratowi współczynnika korelacji Pearsona. Więc wszystko, czego potrzebujesz, to pomnożyć M przez M (mnożenie macierzy korelacji przez samą siebie), przed utworzeniem wykresu.
Jot eN
17

Funkcja cor użyje kolumn macierzy do obliczenia korelacji. Tak więc liczba wierszy musi być taka sama między twoją macierzą x i macierzą y . Dawny.:

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))

wprowadź opis obrazu tutaj

Edytować:

Oto przykład niestandardowych etykiet wierszy i kolumn w macierzy korelacji obliczonej za pomocą jednej macierzy:

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()

wprowadź opis obrazu tutaj

Marc w pudełku
źródło
Przykład @Manuel Ramón jest prawdopodobnie najlepszy w Twoim przypadku (pojedyncza macierz) - uporządkuj swoje zestawy danych jako kolumny.
Marc w pudełku
na powyższym obrazku, jak można „odwrócić” kolory, czy korelacja na czerwono jest bliska -1 lub 1, a biel, gdy jest bliska 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")
Marc w pudełku
@Marcinthebox jak dodać etykiety zmiennych do osi X i Y (zamiast liczb)? Dzięki
Agustín Indaco
@ AgustínIndaco - zaktualizowałem moją odpowiedź o kolejny przykład. imageFunkcja nie jest automatycznie się nazwy wierszy i kolumn, tak więc należy dodać.
Marc in the box
15

Spójrz na qtlcharts . Pozwala na tworzenie interaktywnych macierzy korelacji:

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

wprowadź opis obrazu tutaj

Robi się bardziej imponująco, gdy skorelujesz więcej zmiennych, takich jak winieta pakietu: wprowadź opis obrazu tutaj

epo3
źródło
1

Istnieją inne sposoby na osiągnięcie tego tutaj: ( Wykreśl macierz korelacji na wykres ), ale podoba mi się twoja wersja z korelacjami w ramkach. Czy istnieje sposób na dodanie nazw zmiennych do kolumny xiy zamiast tylko tych numerów indeksów? Dla mnie byłoby to idealne rozwiązanie. Dzięki!

edycja: Próbowałem skomentować post [Marc w pudełku], ale najwyraźniej nie wiem, co robię. Jednak udało mi się odpowiedzieć sobie na to pytanie.

jeśli d jest macierzą (lub oryginalną ramką danych), a nazwy kolumn są takie, jakie chcesz, to działa:

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

las = 0 odwróciłby nazwy z powrotem do ich normalnej pozycji, moje były długie, więc użyłem las = 2, aby ustawić je prostopadle do osi.

edit2: aby powstrzymać funkcję image () wypisującą liczby na siatce (w przeciwnym razie nakładają się one na etykiety zmiennych), dodaj xaxt = 'n', np .:

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')
TSeymour
źródło