在R中轻松输入相关矩阵

6
我有一个正在运行的R脚本,目前正在使用3个相关变量。我想添加第四个变量,并想知道是否有一种简单的方法来输入矩阵数据,特别是对于相关矩阵——一些类似Matlab的技术,可以在R中输入一个相关矩阵,3x3或4x4,而不需要我一直使用线性转换到矩阵重塑的方法。
在Matlab中,您可以使用分号作为结束行定界符,因此很容易跟踪交叉相关性的位置。
在R中,我首先创建
corr <- c(1, 0.1, 0.5,
0.1, 1, 0.9,
0.5, 0.9, 1)
cormat <- matrix(corr, ncol=3)

对比

cormat = [1 0.1 0.5; 
0.1 1 0.9; 
0.5 0.9 1]

它感觉有点笨重,这让我怀疑是否有更聪明的方法,但我还没有查找过。你有什么想法吗?

6个回答

6
欢迎访问该网站! :) 您应该能够在一步内完成:

欢迎来到本站! :) 您应该只需一步即可完成:

MyMatrix = matrix( 
    c(1, 0.1, 0.5, 
      0.1, 1, 0.9,
      0.5, 0.9, 1), 
    nrow=3, 
    ncol=3) 

1
请注意,这里仅适用于相关矩阵是对称的情况。对于非对称矩阵,您需要添加 byrow=TRUE - Sacha Epskamp

4
如果您想要输入对称矩阵,可以使用MCMCpack库中的xpnd()函数。

xpnd()函数接受一个向量,该向量对应于矩阵的上三角(因此每个值只需输入一次)。例如,如果您想输入:

$ \ left (\ begin {array} {ccc} 1&0.1&0.5 \\ 0.1&1&0.9 \\ 0.5&0.9&1 \ end {array} \ right) $

您将使用
library(MCMCpack)
xpnd(c(1, 0.1, 0.5, 1, 0.9, 1), 3)

这里的3是指矩阵中的行数。

xpnd的帮助页面


4
rbind(c(1, 0.1, 0.5),
      c(0.1, 1, 0.9),
      c(0.5, 0.9, 1))

看起来这是最优雅的解决方案,最接近Matlab的解决方案。+1 - Tomas

4

这里还有一种方法:

CorrMat <- matrix(scan(),3,3,byrow=TRUE)
1 0.1 0.5
0.1 1 0.9
0.5 0.9 1

末尾的空白行非常重要。


3

对于现有的解决方案,可能只适用于3*3矩阵。我尝试了这个。

a<-diag(3)
m<-diag(3)
m[lower.tri(m,diag=F)]<-c(0.1, 0.5, 0.9)
m<-m+t(m)-a

2

由于你正在处理相关矩阵,可能不需要输入对角线和上下部分。你可以使用diag()upper.tri()lower.tri()分别操作/提取这三个部分。

> M <- diag(3) # create 3x3 matrix, diagonal defaults to 1's
> M[lower.tri(M, diag=F)] <- c(0.1, 0.5, 0.9) # read in lower part
> M # lower matrix containing all information
      [,1] [,2] [,3]
 [1,]  1.0  0.0    0
 [2,]  0.1  1.0    0
 [3,]  0.5  0.9    1

如果您想要完整的矩阵:
> M[upper.tri(M, diag=F)] <- M[lower.tri(M)] # fill upper part
> M # full matrix
      [,1] [,2] [,3]
 [1,]  1.0  0.1  0.5
 [2,]  0.1  1.0  0.9
 [3,]  0.5  0.9  1.0

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