Bagaimana cara membuat matriks korelasi di R?

86

Saya memiliki 92 set data dengan tipe yang sama.

Saya ingin membuat matriks korelasi untuk dua kombinasi yang mungkin.

yaitu saya ingin matriks 92 x92.

sehingga elemen (ci, cj) harus merupakan korelasi antara ci dan cj.

Bagaimana aku melakukan itu?

Swapnil 'Tux' Takle
sumber
5
Lihat corfungsi, atau rcorrfungsi dalam Hmiscpaket
Manuel Ramón
Saya dapat menemukan inti antara dua parameter. Masalahnya adalah bagaimana menyusunnya dalam matriks?
Swapnil 'Tux' Takle
6
Bagaimana bisa ini mendapatkan begitu banyak suara positif?
Dana Gugatan Monica

Jawaban:

104

Sebuah contoh,

 d <- data.frame(x1=rnorm(10),
                 x2=rnorm(10),
                 x3=rnorm(10))
cor(d) # get correlations (returns matrix)
Manuel Ramón
sumber
73

Anda bisa menggunakan paket '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

masukkan deskripsi gambar di sini

Informasi lebih lanjut di sini: http://cran.r-project.org/web/packages/corrplot/vignettes/corrplot-intro.html

Jot eN
sumber
Apakah mungkin untuk mendapatkan grafik yang mirip dengan yang berikut ini cran.r-project.org/web/packages/corrplot/vignettes/… , atau matriks sederhana, tetapi dengan R-kuadrat dan bukan korelasi pearson, kendall, atau spearman?
FraNut
R2 sama dengan kuadrat dari koefisien korelasi Pearson. Jadi yang Anda butuhkan hanyalah mengalikan M dengan M (mengalikan matriks korelasi dengan dirinya sendiri), sebelum membuat plot.
Jot eN
17

Fungsi cor akan menggunakan kolom-kolom matriks dalam perhitungan korelasi. Jadi, jumlah baris antara matriks x dan matriks y harus sama . Ex.:

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

masukkan deskripsi gambar di sini

Edit:

Berikut adalah contoh label baris dan kolom kustom pada matriks korelasi yang dihitung dengan matriks tunggal:

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

masukkan deskripsi gambar di sini

Marc di dalam kotak
sumber
Contoh @Manuel Ramón mungkin paling baik untuk kasus Anda (matriks tunggal) - atur kumpulan data Anda sebagai kolom.
Marc di dalam kotak
Pada gambar di atas, bagaimana seseorang bisa 'membalikkan' warna, korelasinya yang merah mendekati -1 atau 1 dan putih ketika mendekati 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 di dalam kotak
@Marcinthebox bagaimana Anda menambahkan label variabel ke sumbu x dan y (bukan angka)? Terima kasih
Agustín Indaco
@ AgustínIndaco - Saya telah memperbarui jawaban saya dengan contoh lebih lanjut. The imagefungsi tidak secara otomatis mengambil nama baris dan kolom, jadi ini harus ditambahkan.
Marc di dalam kotak
15

Lihat qtlcharts . Ini memungkinkan Anda membuat matriks korelasi interaktif :

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

masukkan deskripsi gambar di sini

Ini lebih mengesankan ketika Anda menghubungkan lebih banyak variabel, seperti dalam sketsa paket: masukkan deskripsi gambar di sini

epo3
sumber
1

Ada cara lain untuk mencapai ini di sini: ( Plot matriks korelasi ke dalam grafik ), tapi saya suka versi Anda dengan korelasi di kotak. Apakah ada cara untuk menambahkan nama variabel ke kolom x dan y daripada hanya nomor indeks tersebut? Bagi saya, itu akan membuat ini menjadi solusi yang sempurna. Terima kasih!

sunting: Saya mencoba mengomentari kiriman oleh [Marc di dalam kotak], tetapi saya jelas tidak tahu apa yang saya lakukan. Namun, saya berhasil menjawab pertanyaan ini untuk diri saya sendiri.

jika d adalah matriks (atau bingkai data asli) dan nama kolom yang Anda inginkan, maka berikut ini berfungsi:

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

las = 0 akan membalik nama kembali ke posisi normalnya, nama saya panjang, jadi saya menggunakan las = 2 untuk membuatnya tegak lurus dengan sumbu.

edit2: untuk menyembunyikan gambar () fungsi pencetakan angka pada grid (jika tidak mereka tumpang tindih dengan label variabel Anda), tambahkan xaxt = 'n', misalnya:

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')
TSeymour
sumber