Làm cách nào để tạo ma trận tương quan trong R?


86

Tôi có 92 bộ dữ liệu cùng loại.

Tôi muốn tạo một ma trận tương quan cho bất kỳ sự kết hợp nào có thể.

tức là tôi muốn một ma trận 92 x92.

sao cho phần tử (ci, cj) phải tương quan giữa ci và cj.

Làm thế nào để làm điều đó?


5
Hãy xem corchức năng hoặc rcorrchức năng trong Hmiscgói
Manuel Ramón

Tôi có thể tìm thấy cor giữa hai tham số. Vấn đề là làm thế nào để sắp xếp chúng trong ma trận?
Swapnil 'Tux' Takle

6
Làm thế nào mà điều này lại nhận được nhiều ủng hộ đến vậy?
Vụ kiện của Fund Monica

Câu trả lời:


104

Một ví dụ,

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

72

Bạn có thể sử dụng gói '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

nhập mô tả hình ảnh ở đây

Thông tin thêm tại đây: http://cran.r-project.org/web/packages/corrplot/vignettes/corrplot-intro.html


Có thể có được biểu đồ tương tự như những biểu đồ này cran.r-project.org/web/packages/corrplot/vignettes/… , hoặc một ma trận đơn giản, nhưng với R bình phương thay vì tương quan pearson, kendall hoặc Speman không?
FraNut

R2 bằng bình phương của hệ số tương quan Pearson. Vì vậy, tất cả những gì bạn cần là nhân M với M (nhân ma trận tương quan với chính nó), trước khi tạo cốt truyện.
Jot eN

17

Hàm cor sẽ sử dụng các cột của ma trận để tính toán tương quan. Vì vậy, số hàng phải giống nhau giữa ma trận x và ma trận y của bạn . Ví dụ.:

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

nhập mô tả hình ảnh ở đây

Biên tập:

Dưới đây là một ví dụ về các nhãn hàng và cột tùy chỉnh trên ma trận tương quan được tính bằng một ma trận:

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

nhập mô tả hình ảnh ở đây


Ví dụ của @Manuel Ramón có lẽ là tốt nhất cho trường hợp của bạn (một ma trận đơn) - tổ chức các tập dữ liệu của bạn dưới dạng cột.
Marc trong hộp

Trong hình trên, làm thế nào một người có thể 'đảo ngược' các màu, tương quan là màu đỏ gần -1 hoặc 1 và màu trắng khi gần bằng 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 trong hộp

@Marcinthebox làm cách nào để bạn thêm nhãn biến vào trục x và y (thay vì số)? Cảm ơn
Agustín Indaco

@ AgustínIndaco - Tôi đã cập nhật câu trả lời của mình với một ví dụ khác. Các imagechức năng không tự động lấy tên hàng và cột, vì vậy đây phải được thêm vào.
Marc trong hộp

15

Hãy xem qtlcharts . Nó cho phép bạn tạo ma trận tương quan tương tác :

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

nhập mô tả hình ảnh ở đây

Sẽ ấn tượng hơn khi bạn tương quan nhiều biến hơn, như trong họa tiết của gói: nhập mô tả hình ảnh ở đây


1

Có những cách khác để đạt được điều này ở đây: ( Vẽ ma trận tương quan thành đồ thị ), nhưng tôi thích phiên bản của bạn với các tương quan trong các ô. Có cách nào để thêm tên biến vào cột x và y thay vì chỉ những số chỉ số đó không? Đối với tôi, đó sẽ là một giải pháp hoàn hảo. Cảm ơn!

chỉnh sửa: Tôi đang cố gắng bình luận về bài đăng của [Marc in the box], nhưng rõ ràng tôi không biết mình đang làm gì. Tuy nhiên, tôi đã xoay sở để trả lời câu hỏi này cho chính mình.

nếu d là ma trận (hoặc khung dữ liệu ban đầu) và tên cột là những gì bạn muốn, thì các thao tác sau sẽ hoạt động:

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

las = 0 sẽ lật tên trở lại vị trí bình thường của chúng, của tôi dài, vì vậy tôi sử dụng las = 2 để làm cho chúng vuông góc với trục.

edit2: để loại bỏ hàm image () in các số trên lưới (nếu không chúng sẽ chồng lên các nhãn biến của bạn), hãy thêm xaxt = 'n', ví dụ:

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')
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.