R 3.2.2中对称矩阵的isSymmetric返回FALSE

R 3.2.2中对称矩阵的isSymmetric返回FALSE,r,matrix,R,Matrix,我创建了一个对称矩阵,该矩阵是R中sem()函数输入所必需的,但不断得到一个错误,表明该矩阵是不对称的 当我逐个元素检查时,我没有发现任何差异 IsSymmetry()是否以更高的精度进行检查?如果是这样,我如何强制矩阵在内存中对称 SCA = c(1,.73,.70,.58,.46,.56) PPE = c(.73,1,.68,.61,.43,.52) PTE = c(.7,.68,1,.57,.4,.48) PFE = c(.58,.61,.57,1,.37,.41) EA = c

我创建了一个对称矩阵,该矩阵是R中sem()函数输入所必需的,但不断得到一个错误,表明该矩阵是不对称的

当我逐个元素检查时,我没有发现任何差异

IsSymmetry()是否以更高的精度进行检查?如果是这样,我如何强制矩阵在内存中对称

 SCA = c(1,.73,.70,.58,.46,.56)
 PPE = c(.73,1,.68,.61,.43,.52)
 PTE = c(.7,.68,1,.57,.4,.48)
 PFE = c(.58,.61,.57,1,.37,.41)
 EA = c(.46,.43,.4,.37,1,.72)
 CP = c(.56,.52,.48,.41,.71,1)

 ability = as.matrix(cbind(SCA,PPE,PTE,PFE,EA,CP))
 rownames(ability)=t(colnames(ability))

 ability.diag = diag(ability)
 ability[lower.tri(ability,diag=T)] = 0
 ability = ability + t(ability) + diag(ability.diag)
 ability
#      SCA  PPE  PTE  PFE   EA   CP
# SCA 1.00 0.73 0.70 0.58 0.46 0.56
# PPE 0.73 1.00 0.68 0.61 0.43 0.52
# PTE 0.70 0.68 1.00 0.57 0.40 0.48
# PFE 0.58 0.61 0.57 1.00 0.37 0.41
# EA  0.46 0.43 0.40 0.37 1.00 0.71
# CP  0.56 0.52 0.48 0.41 0.71 1.00
 sum(ability != t(ability))
# [1] 0
 isSymmetric(ability)
# [1] FALSE

函数
issymmetry
使用函数
all.equal
实现。测试的不是矩阵是否等于它的转置,而是这两个矩阵作为
R
对象是否相等。在你的例子中,它们不是:如果你看看它们的结构,你会得到以下结果:

> str(ability) 
num [1:6, 1:6] 1 0.73 0.7 0.58 0.46 0.56 0.73 1 0.68 0.61 ...
- attr(*, "dimnames")=List of 2
 ..$ : chr [1, 1:6] "SCA" "PPE" "PTE" "PFE" ...
 ..$ : chr [1:6] "SCA" "PPE" "PTE" "PFE" ...


> str(t(ability))
num [1:6, 1:6] 1 0.73 0.7 0.58 0.46 0.56 0.73 1 0.68 0.61 ...
 - attr(*, "dimnames")=List of 2
  ..$ : chr [1:6] "SCA" "PPE" "PTE" "PFE" ...
  ..$ : chr [1, 1:6] "SCA" "PPE" "PTE" "PFE" ...
因此问题在于如何生成
能力
的行名称。您可以轻松解决此问题:

> rownames(ability) <- colnames(ability)
> isSymmetric(ability)
[1] TRUE
>行名(能力)对称(能力)
[1] 真的

或者更简单地说:
是对称的(能力,check.attributes=FALSE)
@Pascal感谢您指出这一点。但是,如果函数
sem
确实是使用
issymmetry
实现的,则OP需要更改输入(或使用注释重写函数)。