从R中的相关向量创建相关矩阵

从R中的相关向量创建相关矩阵,r,vector,matrix,correlation,R,Vector,Matrix,Correlation,我想创建一个给定相关向量的相关矩阵,它是相关矩阵的上(或下)三角矩阵 目标是变换这个向量 该相关矩阵的对角线为1 你知道有没有一种方法可以创建一个给定对角线上方三角形的矩阵,并将对角线设置为1?我不知道是否有一种自动方法可以做到这一点,但我的评论如下: myvec <- c(-.55, -.48, .66, .47, -.38, -.46) mempty <- matrix(0, nrow = 4, ncol = 4) mindex <- matrix(1:16, nrow

我想创建一个给定相关向量的相关矩阵,它是相关矩阵的上(或下)三角矩阵

目标是变换这个向量

该相关矩阵的对角线为1


你知道有没有一种方法可以创建一个给定对角线上方三角形的矩阵,并将对角线设置为1?

我不知道是否有一种自动方法可以做到这一点,但我的评论如下:

myvec <- c(-.55, -.48, .66, .47, -.38, -.46)
mempty <- matrix(0, nrow = 4, ncol = 4)
mindex <- matrix(1:16, nrow = 4, ncol = 4)
mempty[mindex[upper.tri(mindex)]] <- myvec
mempty[lower.tri(mempty)] <- t(mempty)[lower.tri(t(mempty))]
diag(mempty) <- 1
mempty
#       [,1]  [,2]  [,3]  [,4]
# [1,]  1.00 -0.55 -0.48  0.47
# [2,] -0.55  1.00  0.66 -0.38
# [3,] -0.48  0.66  1.00 -0.46
# [4,]  0.47 -0.38 -0.46  1.00
如果您试图提供无法创建方阵的数据,则会显示一条错误消息

vec2symmat(1:4)
# Error in vec2symmat(1:4) : 
#   invec is wrong length to create a square symmetrical matrix
并且,使用默认设置

vec2symmat(1:10)
#      [,1] [,2] [,3] [,4] [,5]
# [1,]    1    1    2    3    4
# [2,]    1    1    5    6    7
# [3,]    2    5    1    8    9
# [4,]    3    6    8    1   10
# [5,]    4    7    9   10    1

在任何编程语言中,我认为您只需使用两个嵌套for循环即可,如下所示:

鉴于:

向量R;//我将使用圆括号R(3)来表示一的第三个元素。 //(以具有零基数组的语言存储在内存位置R[2]中) int N

矩阵M=矩阵(N,N);//矩阵对象的新实例,也可以只使用数组

int i,j,k;

k=1;
for(i=1;i<N;i++)
{
   M(i,i)=1;
   for(j=i+1,j<=N;j++)
   { 
      M(i,j)=M(j,i)=R[k];
      k=k+1;
   }
}
inti,j,k;
k=1;

对于(i=1;i你可以说服R你的向量是一个距离对象,然后使用
as.matrix
转换它:

> myvec <- c(-.55, -.48, .66, .47, -.38, -.46)
> class(myvec) <- 'dist'
> attr(myvec,'Size') <- 4
> as.matrix(myvec)
      1     2     3     4
1  0.00 -0.55 -0.48  0.66
2 -0.55  0.00  0.47 -0.38
3 -0.48  0.47  0.00 -0.46
4  0.66 -0.38 -0.46  0.00
>myvec类(myvec)属性(myvec,'Size')作为.matrix(myvec)
1     2     3     4
1  0.00 -0.55 -0.48  0.66
2 -0.55  0.00  0.47 -0.38
3 -0.48  0.47  0.00 -0.46
4  0.66 -0.38 -0.46  0.00
或@AnandaMahto对答案的修改(类似于上面使用的内部构件):

myvec mycor mycor[col(mycor)
带有一些辅助函数的答案,可能对其他问题有用:

`lower.tri<-` <- function(x,value){
    x[lower.tri(x)] <- value
    x
}

`upper.tri<-` <- function(x,value){
    y <- t(x)
    lower.tri(y) <- value
    t(y)
}

vec2mat <- function(r){
    n <- (1+sqrt(1+8*length(r)))/2
    x <- diag(1,n)
    lower.tri(x) <- upper.tri(x) <- r
    x
}

请看问题标签。语言已经清楚地说明了。还有一个小问题:您的函数按列填充矩阵,我如何按行填充矩阵,如上面的示例所示?非常感谢!!!@jeffrey,在矩阵中添加了一个
byrow
参数。不过,请查看Greg Snow的答案。效果不错,就是我所看到的ng代表。你能解释一下你的步骤吗?我是一个不懂R的人,目前只能听懂。谢谢你必须将
diag(1,4)
添加到
as.matrix(myvec)
> myvec <- c(-.55, -.48, .66, .47, -.38, -.46)
> class(myvec) <- 'dist'
> attr(myvec,'Size') <- 4
> as.matrix(myvec)
      1     2     3     4
1  0.00 -0.55 -0.48  0.66
2 -0.55  0.00  0.47 -0.38
3 -0.48  0.47  0.00 -0.46
4  0.66 -0.38 -0.46  0.00
> myvec <- c(-.55, -.48, .66, .47, -.38, -.46)
> mycor <- matrix(0,4,4)
> mycor[ col(mycor) < row(mycor) ] <- myvec
> mycor <- mycor + t(mycor)
> diag(mycor) <- 1
> mycor
      [,1]  [,2]  [,3]  [,4]
[1,]  1.00 -0.55 -0.48  0.66
[2,] -0.55  1.00  0.47 -0.38
[3,] -0.48  0.47  1.00 -0.46
[4,]  0.66 -0.38 -0.46  1.00
`lower.tri<-` <- function(x,value){
    x[lower.tri(x)] <- value
    x
}

`upper.tri<-` <- function(x,value){
    y <- t(x)
    lower.tri(y) <- value
    t(y)
}

vec2mat <- function(r){
    n <- (1+sqrt(1+8*length(r)))/2
    x <- diag(1,n)
    lower.tri(x) <- upper.tri(x) <- r
    x
}
vec2mat(c(-0.55, -0.48, 0.66, 0.47, -0.38, -0.46))

      [,1]  [,2]  [,3]  [,4]
[1,]  1.00 -0.55 -0.48  0.66
[2,] -0.55  1.00  0.47 -0.38
[3,] -0.48  0.47  1.00 -0.46
[4,]  0.66 -0.38 -0.46  1.00