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ć?


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)

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


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


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


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')
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.