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ć?
r
matrix
visualization
correlation
Zamień 'Tux' Takle
źródło
źródło
cor
funkcję lubrcorr
funkcję wHmisc
pakiecieOdpowiedzi:
Przykład,
d <- data.frame(x1=rnorm(10), x2=rnorm(10), x3=rnorm(10)) cor(d) # get correlations (returns matrix)
źródło
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
Więcej informacji tutaj: http://cran.r-project.org/web/packages/corrplot/vignettes/corrplot-intro.html
źródło
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))
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()
źródło
image(x=seq(dim(x)[2]), y=seq(dim(y)[2]), z=COR, col=rev(heat.colors(20)), xlab="x column", ylab="y column")
image
Funkcja nie jest automatycznie się nazwy wierszy i kolumn, tak więc należy dodać.Spójrz na qtlcharts . Pozwala na tworzenie interaktywnych macierzy korelacji:
library(qtlcharts) data(iris) iris$Species <- NULL iplotCorr(iris, reorder=TRUE)
Robi się bardziej imponująco, gdy skorelujesz więcej zmiennych, takich jak winieta pakietu:
źródło
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')
źródło