【问题标题】:Creating matrix in R, is there a faster way?在 R 中创建矩阵,有没有更快的方法?
【发布时间】:2021-11-13 11:04:03
【问题描述】:

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

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)

我写信是想问是否有更好的方法来计算矩阵而不实际输入每个值?我想这是很容易犯错的。

【问题讨论】:

  • 可能有,但除非我们知道矩阵条目中的模式是什么,否则很难说。

标签: r matrix


【解决方案1】:

这看起来像一个协方差矩阵,因此定义标准差 d,并定义相关性(在相关性矩阵的上三角部分)cors,并从这两者重构 sig

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

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

其他方向

请注意,要朝另一个方向发展,即从 sig 导出 dcors,标准差和相关性分别为:

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

cors2 <- cov2cor(sig)[upper.tri(sig)]
all.equal(cors, cors2)
## [1] TRUE

【讨论】:

  • 秒杀我... +1
  • 请问为什么 for command (m + t(m)) 有效,为什么我们不需要输入对角线 1。我很难理解 m &lt;- diag(length(d))/2 m[upper.tri(m)] &lt;- c(-0.07, -0.095, 0.959, -0.095, 0.936, 0.997) 这两行
  • 添加了一些评论。
猜你喜欢
  • 2021-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-10
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
  • 2012-08-31
相关资源
最近更新 更多