从R中的相关向量创建相关矩阵
我想创建一个给定相关向量的相关矩阵,它是相关矩阵的上(或下)三角矩阵 目标是变换这个向量 该相关矩阵的对角线为1从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?我不知道是否有一种自动方法可以做到这一点,但我的评论如下:
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