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.