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

90

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

我想为任意两个可能的组合制作相关矩阵。

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

使得元素 (ci,cj) 是 cicj 之间的相关性。

我该怎么做?


6
请查看Hmisc软件包中的cor函数或rcorr函数。 - Manuel Ramón
1
我能够找到两个参数之间的相关性。问题是如何将它们排列在矩阵中? - Swapnil 'Tux' Takle
8
这怎么有这么多赞? - anon
5个回答

106

一个例子,

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

76

1
是否可以获得类似于这些图表的图形 http://cran.r-project.org/web/packages/corrplot/vignettes/corrplot-intro.html,或者一个简单的矩阵,但是使用R-squared而不是pearson、kendall或spearman相关性? - FraNut
1
R2等于Pearson相关系数的平方。因此,在创建图表之前,您只需要将M乘以M(将相关矩阵相乘)即可。 - Jot eN

18

cor函数在计算相关性时会使用矩阵的列。因此,您的矩阵x和矩阵y之间的行数必须相同。例如:

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

enter image description here

编辑:

这里是使用单个矩阵计算相关矩阵并自定义行和列标签的示例:

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

在此输入图片描述


1
@Manuel Ramón的例子可能最适合你的情况(单个矩阵)- 将数据集组织为列。 - Marc in the box
1
在上面的图像中,如何“反转”颜色,即当相关性接近-1或1时为红色,而当接近0时为白色? - tagoma
1
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 in the box
1
@Marcinthebox,你如何在X和Y轴上添加变量标签(而不是数字)?谢谢。 - Agustín Indaco
1
@AgustínIndaco - 我已经更新了我的答案,并提供了更多的示例。image函数不会自动获取行和列的名称,因此必须手动添加。 - Marc in the box

16

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

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

在此输入图像描述

当您关联更多变量时,效果会更加显著,就像包的vignette中所示: 在此输入图像描述


2
这里有其他实现方式:(将相关矩阵绘制成图形),但我喜欢你的版本,因为它在方框中显示了相关性。是否有办法将变量名称添加到x和y列而不仅仅是这些索引号?这对我来说将是完美的解决方案。谢谢!编辑:我试图在[马克在方框里]的帖子下发表评论,但我显然不知道自己在做什么。然而,我设法自己回答了这个问题。如果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')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接