如何在R中创建相关矩阵?


86

我有92组相同类型的数据。

我想为任何两个组合建立一个相关矩阵。

即我想要一个92 x92的矩阵。

这样元素(ci,cj)应该是ci和cj之间的相关性。

我怎么做?


5
看一看的cor功能,或将rcorr在功能Hmisc
曼努埃尔·拉蒙

我能够找到两个参数之间的cor。问题是如何将它们排列成矩阵?
Swapnil'Tux'Takle

6
这到底是如何获得这么多投票的?
基金莫妮卡的诉讼

Answers:



72

您可以使用“ 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平方而不是pearson,kendall或spearman相关性?
FraNut 2015年

R2等于皮尔逊相关系数的平方。因此,您需要做的就是在创建图之前将M乘以M(乘以相关矩阵本身)。
Jot eN 2015年

17

COR函数将使用矩阵的列中的相关性的计算。因此,矩阵xy之间的行数必须相同。例如:

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

在此处输入图片说明


@ManuelRamón的示例可能最适合您的情况(单个矩阵)-将数据​​集组织为列。
马克·马克(Marc)在

在上图中,如何将颜色“反转”,红色是一种相关性接近-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")
马克·马克(Marc)在

@Marcinthebox如何在x和y轴(而不是数字)上添加变量标签?谢谢
奥古斯丁Indaco

@AgustínIndaco-我用另一个例子更新了我的答案。该image函数不会自动获取行名和列名,因此必须添加它。
Marc in box

15

看看qtlcharts。它使您可以创建交互式相关矩阵:

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

在此处输入图片说明

当您关联更多变量时,例如在包装的插图中,它会给人留下深刻的印象: 在此处输入图片说明


1

还有其他方法可以在这里实现:(将相关矩阵绘制成图表),但是我喜欢您的版本,并且在框中有相关性。有没有一种方法可以将变量名添加到x和y列中,而不仅仅是这些索引号?对我来说,这将是一个完美的解决方案。谢谢!

编辑:我试图评论[框中的Marc]的帖子,但我显然不知道自己在做什么。但是,我确实设法自己回答了这个问题。

如果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使其垂直于轴。

edit2:要禁止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')
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.