2015-10-28 43 views
3

我創建了一個輸入到R中的sem()函數所需的對稱矩陣,但不斷收到一個說明矩陣不對稱的錯誤。isSymmetric對於R中的對稱矩陣返回FALSE 3.2.2

當我逐個檢查元素時,我發現沒有區別。

isSymmetric()檢查的精度更高嗎?如果是這樣,我如何強制矩陣在內存中對稱?

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 

回答

2

功能isSymmetric使用函數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" ... 

所以問題是怎麼用的ability行名字已經產生。你可以很容易地解決這個問題:

> rownames(ability) <- colnames(ability) 
> isSymmetric(ability) 
[1] TRUE 
+2

或更簡單地說:'isSymmetric(ability,check.attributes = FALSE)'。 –

+0

@帕斯卡感謝您指出了這一點。但是,如果函數'''sem''確實是使用''isSymmetric'''實現的,則OP需要改變輸入(或者使用註釋重寫該函數)。 –