R'de bir korelasyon matrisi nasıl oluşturabilirim?


86

Aynı türden 92 veri setim var.

Mümkün olan herhangi iki kombinasyon için bir korelasyon matrisi yapmak istiyorum.

yani 92 x92'lik bir matris istiyorum.

öyle ki (ci, cj) öğesi ci ve cj arasında korelasyon olmalıdır.

Bunu nasıl yaparım?


5
İşleve corveya paketteki rcorrişleve bir göz atınHmisc
Manuel Ramón

İki parametre arasındaki koru bulabiliyorum. Mesele onları matriste nasıl düzenleyeceğimiz?
Swapnil 'Tux' Takle

6
Bu nasıl bu kadar çok olumlu oy aldı?
Fund Monica'nın Davası

Yanıtlar:


104

Bir örnek,

 d <- data.frame(x1=rnorm(10),
                 x2=rnorm(10),
                 x3=rnorm(10))
cor(d) # get correlations (returns matrix)

73

'Corrplot' paketini kullanabilirsiniz.

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

görüntü açıklamasını buraya girin

Daha fazla bilgi burada: http://cran.r-project.org/web/packages/corrplot/vignettes/corrplot-intro.html


Bu grafiğe benzer bir grafiği cran.r-project.org/web/packages/corrplot/vignettes/… veya basit bir matris, ancak pearson, kendall veya spearman korelasyonu yerine R-kare ile elde etmek mümkün müdür ?
FraNut

R2, Pearson korelasyon katsayısının karesine eşittir. Öyleyse ihtiyacınız olan tek şey, grafiği oluşturmadan önce M ile M'yi çarpmaktır (korelasyon matrisini kendisiyle çarpın).
Jot eN

17

Kor fonksiyonu korelasyon hesaplanmasında matrisin sütun kullanır. Yani, satır sayısı x matrisiniz ve y matrisiniz arasında aynı olmalıdır . Ör .:

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

görüntü açıklamasını buraya girin

Düzenle:

Tek bir matrisle hesaplanan bir korelasyon matrisindeki özel satır ve sütun etiketlerinin bir örneğini burada bulabilirsiniz:

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

görüntü açıklamasını buraya girin


@Manuel Ramón'un örneği muhtemelen sizin durumunuz için en iyisidir (tek bir matris) - veri kümelerinizi sütunlar halinde düzenleyin.
Marc kutudaki

Yukarıdaki görüntüde, renkler nasıl 'tersine çevrilebilir', kırmızı bir korelasyon -1'e veya 1'e yakın ve 0'a yakınken beyaz?
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

@Marcinthebox değişken etiketlerini x ve y eksenlerine (sayılar yerine) nasıl eklersiniz? Teşekkürler
Agustín Indaco

@ AgustínIndaco - Cevabımı başka bir örnekle güncelledim. imageİşlevi otomatik satır ve sütun adlarını almaz, bu nedenle bu eklenmelidir.
Marc kutuda

15

Qtlcharts'a bir göz atın . Etkileşimli korelasyon matrisleri oluşturmanıza olanak sağlar :

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

görüntü açıklamasını buraya girin

Paketin vinyetinde olduğu gibi daha fazla değişkeni ilişkilendirdiğinizde daha etkileyici: görüntü açıklamasını buraya girin


1

Burada bunu başarmanın başka yolları da var: ( Korelasyon matrisini bir grafiğe çizin ), ancak kutudaki korelasyonların bulunduğu versiyonunuzu beğendim. Değişken adlarını yalnızca bu dizin numaraları yerine x ve y sütunlarına eklemenin bir yolu var mı? Benim için bu, bunu mükemmel bir çözüm yapar. Teşekkürler!

düzenleme: [Kutudaki Marc] tarafından yayınla ilgili yorum yapmaya çalışıyordum, ancak ne yaptığımı açıkça bilmiyorum. Ancak bu soruyu kendim cevaplamayı başardım.

d matrisse (veya orijinal veri çerçevesi) ve sütun adları istediğiniz şeyse, aşağıdaki çalışır:

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

las = 0 isimleri normal konumlarına geri çevirirdi, benimki uzun, bu yüzden onları eksene dik yapmak için las = 2 kullandım.

edit2: resim () işlevinin ızgaradaki sayıları yazdırmasını engellemek için (aksi takdirde değişken etiketlerinizle örtüşürler), xaxt = 'n' ekleyin, örneğin:

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')
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.