【问题标题】:Replacing pair of element of symmetric matrix with NA用 NA 替换对称矩阵的元素对
【发布时间】:2021-12-16 16:30:03
【问题描述】:

我有一个正定对称矩阵。粘贴使用以下代码生成的矩阵:

set.seed(123)
m <- genPositiveDefMat(
    dim = 3, 
    covMethod = "unifcorrmat",
    rangeVar = c(0,1) )

x <- as.matrix(m$Sigma)
  diag(x) <- 1

x

#Output
          [,1]       [,2]       [,3]
[1,]  1.0000000 -0.2432303 -0.4110525
[2,] -0.2432303  1.0000000 -0.1046602
[3,] -0.4110525 -0.1046602  1.0000000


现在,我想通过迭代运行矩阵,并且在每次迭代中我想用 NA 替换对称对。例如,

迭代 1: x[1,2] = x[2,1]

迭代2: x[1,3] = x[3,1]

等等……

我的想法是使用 for 循环检查

原型:

for( r in 1:nrow(x)
for( c in 1:ncol(x)

if x[r,c]=x[c,r]<-NA

else

x[r,c]

我的代码的问题在于第 1 行和第 1 列,值相等,因此设置为 0(这是错误的)。此外,当它不是 NA 时,它就会退出循环。

在这里感谢任何帮助。

谢谢

【问题讨论】:

  • 也许upper.tri(x)lower.tri(x) 可能会帮助您消除对称性的一侧。
  • 谢谢。但这一下子就全部取代了。我希望它在迭代中。每次迭代后,我都会将此输出传递给其他函数。因此,我希望它分步进行,而不是一次全部完成。从某种意义上说,在第一步中,只有第一对 - 1,2 和 2,1 应替换为 NA,其余矩阵应保持原样
  • 将每个非对角项更改为 NA 并在更改项之前,取出您想要的值?

标签: r loops matrix


【解决方案1】:

如果您需要迭代完成替换,您可以使用upper.tri(x)/lower.tri 表示的值的索引来逐对进行替换。这将允许您在每次替换之前/之后将结果传递给函数,例如:

idx <- which(lower.tri(mat), arr.ind=TRUE)
sel <- cbind(
  replace(mat, , seq_along(mat))[ idx ],
  replace(mat, , seq_along(mat))[ idx[,2:1] ]
)
#     [,1] [,2]
#[1,]    2    4 ##each row represents the lower/upper pair
#[2,]    3    7
#[3,]    6    8

for( i in seq_len(nrow(sel)) ) {
    mat[ sel[i,] ] <- NA
    print(mean(mat, na.rm=TRUE))
}
#[1] 0.2812249
#[1] 0.5581359
#[1] 1

【讨论】:

  • 这段代码似乎有一件事。这适用于 3*3 矩阵。但是对于 4*4 及以上的尺寸,lower.tri 和 upper.tri 的位置似乎不匹配 例如,4*4 矩阵的位置是 (2,5) , (3,9) , (4 ,10) , (7,13) , (8,14) , (12,15)。 @thelatemail
  • 原因,我理解是由于lower.tri和upper.tri矩阵中的行和列选择不匹配。不幸的是,在lower.tri 和/或upper.tri 中没有像“byrow=T/F”这样的参数。另一个替代函数是gdata 包中的upperTriangle 和LowerTringe 函数。但是,与 lower.tri 和 upper,tri 不同,它直接给出值。因此,获得职位变得困难
  • @RogKa - 现在试试,我想我已经修好了
  • 完美。看起来很棒。谢谢
猜你喜欢
  • 2023-04-08
  • 1970-01-01
  • 2013-07-29
  • 2015-07-09
  • 2017-05-09
  • 1970-01-01
  • 2016-11-13
  • 1970-01-01
  • 2014-12-07
相关资源
最近更新 更多