Easily input a correlation matrix in R

扶醉桌前 提交于 2019-12-04 06:23:06

Here is another way:

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

Trailing white line is important.

Welcome to the site! :) you should be able to do it in one step:

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

If you want to input a symmetric matrix, you can use the xpnd() function in the MCMCpack library.

xpnd() takes a vector which corresponds to the upper-triangle of the matrix (thus you only have to enter each value once). For instance, if you want to input:

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

You would use

library(MCMCpack)
xpnd(c(1, 0.1, 0.5, 1, 0.9, 1), 3)

where 3 refers to the number of rows in the matrix.

Help page for xpnd.

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

For the existing solutions. That may only work for 3*3 matrix. I tried this one.

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

As you are working with correlation matrices, you are probably not interested in entering the diagonal, and both the upper and lower parts. You can manipulate/extract those three parts separately using diag(), upper.tri() and 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

If you want the full matrix:

> 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
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!