在R中创建矩阵,有没有更快的方法?

Ale*_*lex 0 r matrix

基本上,这是我需要创建的矩阵

sig = matrix(c(0.56^2, 0.56*7.77*-0.07, 0.56*13.48*-0.095, 0.56*16.64*-0.095,
               0.56*7.77*-0.07, 7.77^2, 7.77*13.48*0.959, 7.77*16.64*0.936,
               0.56*13.48*-0.095, 7.77*13.48*0.959, 13.48^2, 13.48*16.64*0.997,
               0.56*16.64*-0.095, 7.77*16.64*0.936, 13.48*16.64*0.997, 16.64^2), nrow = 4, ncol = 4)
Run Code Online (Sandbox Code Playgroud)

我写信是想询问是否有更好的方法可以在不实际输入每个值的情况下计算出矩阵?我想这是很容易犯错误的。

G. *_*eck 5

这看起来像协方差矩阵,因此定义标准差 ,d并定义相关性(在相关矩阵的上三角部分) ,corssig根据这两者进行重建。

给定dcors我们定义m为每个对角元素为 1/2 的对角矩阵。然后在下一行中将相关性插入到其上三角部分。在下面的行中,我们通过添加来填充下三角部分t(m),这也将对角线元素设置为 1 (1/2 + 1/2 = 1),给出相关矩阵corr。最后乘以 转换corr为协方差矩阵outer

d <- c(0.56, 7.77, 13.48, 16.64)
cors <- c(-0.07, -0.095, 0.959, -0.095, 0.936, 0.997)

m <- diag(length(d))/2
m[upper.tri(m)] <- cors
corr <- m + t(m)
sig2 <- corr * outer(d, d)

all.equal(sig, sig2)
## [1] TRUE
Run Code Online (Sandbox Code Playgroud)

其他方向

请注意,从另一个方向,即从导出d和,标准差和相关性分别为:corssig

d2 <- sqrt(diag(sig))
all.equal(d, d2)
## [1] TRUE

cors2 <- cov2cor(sig)[upper.tri(sig)]
all.equal(cors, cors2)
## [1] TRUE
Run Code Online (Sandbox Code Playgroud)