ฉันจะสร้างเมทริกซ์สหสัมพันธ์ใน R ได้อย่างไร


86

ฉันมีข้อมูลประเภทเดียวกัน 92 ชุด

ฉันต้องการสร้างเมทริกซ์สหสัมพันธ์สำหรับสองชุดค่าผสมที่เป็นไปได้

เช่นฉันต้องการเมทริกซ์ 92 x92

องค์ประกอบดังกล่าว (ci, cj) ควรมีความสัมพันธ์ระหว่าง ci และ cj

ฉันจะทำอย่างไร?


5
ดูcorฟังก์ชั่นหรือrcorrฟังก์ชั่นในHmiscแพ็คเกจ
Manuel Ramón

ฉันสามารถค้นหา cor ระหว่างพารามิเตอร์สองตัวได้ สิ่งนี้คือวิธีการจัดเรียงในเมทริกซ์?
Swapnil 'Tux' Takle

6
สิ่งนี้ได้รับการโหวตเพิ่มขึ้นมากมายบนโลกนี้ได้อย่างไร?
คดีของ Fund Monica

คำตอบ:



73

คุณสามารถใช้แพ็คเกจ '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

ป้อนคำอธิบายภาพที่นี่

ข้อมูลเพิ่มเติมที่นี่: http://cran.r-project.org/web/packages/corrplot/vignettes/corrplot-intro.html


เป็นไปได้ไหมที่จะได้กราฟที่คล้ายกับกราฟเหล่านี้cran.r-project.org/web/packages/corrplot/vignettes/…หรือเมทริกซ์ธรรมดา แต่ใช้ R-squared แทนเพียร์สันเคนดอลหรือสเปียร์แมนสหสัมพันธ์
FraNut

R2 เท่ากับกำลังสองของค่าสัมประสิทธิ์สหสัมพันธ์ของเพียร์สัน ดังนั้นสิ่งที่คุณต้องมีคือคูณ M ด้วย M (เมทริกซ์สหสัมพันธ์คูณด้วยตัวมันเอง) ก่อนสร้างพล็อต
eN

17

ครฟังก์ชั่นจะใช้คอลัมน์ของเมทริกซ์ในการคำนวณของความสัมพันธ์ ดังนั้นจำนวนแถวที่จะต้องเหมือนกันระหว่างเมทริกซ์ของคุณxและเมทริกซ์ปี เช่น:

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

ป้อนคำอธิบายภาพที่นี่

แก้ไข:

นี่คือตัวอย่างของป้ายชื่อแถวและคอลัมน์ที่กำหนดเองบนเมทริกซ์สหสัมพันธ์ที่คำนวณด้วยเมทริกซ์เดียว:

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

ป้อนคำอธิบายภาพที่นี่


ตัวอย่างของ @Manuel Ramónน่าจะดีที่สุดสำหรับกรณีของคุณ (เมทริกซ์เดียว) - จัดระเบียบชุดข้อมูลของคุณเป็นคอลัมน์
Marc in the box

ในภาพด้านบนเราจะ 'กลับด้าน' สีได้อย่างไรความสัมพันธ์คือสีแดงใกล้กับ -1 หรือ 1 และสีขาวเมื่อใกล้กับ 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")
มาร์คในกล่อง

@Marcinthebox คุณจะเพิ่มป้ายกำกับตัวแปรให้กับแกน x และ y ได้อย่างไร (แทนตัวเลข) ขอบคุณ
Agustín Indaco

@ AgustínIndaco - ฉันได้อัปเดตคำตอบพร้อมตัวอย่างเพิ่มเติม imageฟังก์ชั่นไม่ได้โดยอัตโนมัติใช้เวลาแถวและคอลัมน์ชื่อนี้จึงต้องมีการเพิ่ม
Marc in the box

15

มีลักษณะที่qtlcharts ช่วยให้คุณสร้างเมทริกซ์สหสัมพันธ์แบบโต้ตอบ :

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

ป้อนคำอธิบายภาพที่นี่

น่าประทับใจยิ่งขึ้นเมื่อคุณเชื่อมโยงตัวแปรมากขึ้นเช่นในบทความสั้น ๆ ของแพ็คเกจ: ป้อนคำอธิบายภาพที่นี่


1

มีวิธีอื่นในการบรรลุสิ่งนี้: ( พล็อตเมทริกซ์สหสัมพันธ์ลงในกราฟ ) แต่ฉันชอบเวอร์ชันของคุณที่มีความสัมพันธ์ในช่อง มีวิธีเพิ่มชื่อตัวแปรในคอลัมน์ x และ y แทนที่จะเป็นเพียงตัวเลขดัชนีเหล่านั้นหรือไม่? สำหรับฉันนั่นจะทำให้เป็นโซลูชันที่สมบูรณ์แบบ ขอบคุณ!

แก้ไข: ฉันพยายามแสดงความคิดเห็นในโพสต์ของ [Marc in the box] แต่ฉันไม่รู้อย่างชัดเจนว่าฉันกำลังทำอะไรอยู่ อย่างไรก็ตามฉันจัดการเพื่อตอบคำถามนี้ด้วยตัวเอง

ถ้า d คือเมทริกซ์ (หรือเฟรมข้อมูลเดิม) และชื่อคอลัมน์เป็นสิ่งที่คุณต้องการการทำงานต่อไปนี้:

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

las = 0 จะพลิกชื่อกลับสู่ตำแหน่งปกติของฉันยาวฉันจึงใช้ las = 2 เพื่อทำให้มันตั้งฉากกับแกน

แก้ไข 2: เพื่อระงับ image () ฟังก์ชั่นการพิมพ์ตัวเลขบนเส้นตาราง (มิฉะนั้นจะซ้อนทับป้ายกำกับตัวแปรของคุณ) ให้เพิ่ม xaxt = 'n' เช่น:

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')
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.