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ć?
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ć?
Odpowiedzi:
Przykład,
d <- data.frame(x1=rnorm(10),
x2=rnorm(10),
x3=rnorm(10))
cor(d) # get correlations (returns matrix)
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
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))
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()
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ć.
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')
cor
funkcję lubrcorr
funkcję wHmisc
pakiecie