Full_Name: Mike Danilov
Version: 2.9.0
OS: Fedora Core 9
Submission from: (NULL) (142.103.121.198)
When checking for the symmetry of a matrix, function isSymmetric.matrix() gets
confused by the discrepancy of colnames/rownames if its argument. See the code
snippet below. Perhaps it's a problem of the matrix product which copies
colnames of the first argument but not the rownames of the second to its value.
Not sure which one should be fixed but the way it is now it seems illogical that
X'X is deemed to be non-symmetric.
x <- c(1,2,3)
names(x) <- c("v1","v2","v3")
isSymmetric(x%*%t(x)) ## returns FALSE instead of TRUE
unexpected behaviour of isSymmetric() (PR#14000)
3 messages · mike at stat.ubc.ca, Romain Francois, Douglas Bates
On 10/12/2009 02:05 AM, mike at stat.ubc.ca wrote:
Full_Name: Mike Danilov
Version: 2.9.0
OS: Fedora Core 9
Submission from: (NULL) (142.103.121.198)
When checking for the symmetry of a matrix, function isSymmetric.matrix() gets
confused by the discrepancy of colnames/rownames if its argument. See the code
snippet below. Perhaps it's a problem of the matrix product which copies
colnames of the first argument but not the rownames of the second to its value.
Not sure which one should be fixed but the way it is now it seems illogical that
X'X is deemed to be non-symmetric.
x<- c(1,2,3)
names(x)<- c("v1","v2","v3")
isSymmetric(x%*%t(x)) ## returns FALSE instead of TRUE
It seems to be concerned with the names
> y <- x %*% t(x)
> y
v1 v2 v3
[1,] 1 2 3
[2,] 2 4 6
[3,] 3 6 9
> isSymmetric( y )
[1] FALSE
# dropping the dimnames
> isSymmetric( structure( y, dimnames = NULL ) )
[1] TRUE
# pass the ... along this path : isSymmetric > all.equal > all.equal.numeric
> isSymmetric( y, check.attributes = F )
[1] TRUE
# set the dimnames equal
> dimnames( y ) <- rep( list( names(x) ), 2 )
> isSymmetric( y )
[1] TRUE
Not sure this is expected behaviour
Romain
Romain Francois Professional R Enthusiast +33(0) 6 28 91 30 30 http://romainfrancois.blog.free.fr |- http://tr.im/BcPw : celebrating R commit #50000 |- http://tr.im/ztCu : RGG #158:161: examples of package IDPmisc `- http://tr.im/yw8E : New R package : sos
On Mon, Oct 12, 2009 at 6:41 AM, Romain Francois
<romain.francois at dbmail.com> wrote:
On 10/12/2009 02:05 AM, mike at stat.ubc.ca wrote:
Full_Name: Mike Danilov
Version: 2.9.0
OS: Fedora Core 9
Submission from: (NULL) (142.103.121.198)
When checking for the symmetry of a matrix, function isSymmetric.matrix()
gets
confused by the discrepancy of colnames/rownames if its argument. See the
code
snippet below. Perhaps it's a problem of the matrix product which copies
colnames of the first argument but not the rownames of the second to its
value.
Not sure which one should be fixed but the way it is now it seems
illogical that
X'X is deemed to be non-symmetric.
x<- c(1,2,3)
names(x)<- c("v1","v2","v3")
isSymmetric(x%*%t(x)) ## returns FALSE instead of TRUE
It seems to be concerned with the names
y <- x %*% t(x) y
? ? v1 v2 v3 [1,] ?1 ?2 ?3 [2,] ?2 ?4 ?6 [3,] ?3 ?6 ?9
isSymmetric( y )
[1] FALSE # dropping the dimnames
isSymmetric( structure( y, dimnames = NULL ) )
[1] TRUE # pass the ... along this path : isSymmetric > all.equal > all.equal.numeric
isSymmetric( y, check.attributes = F )
[1] TRUE # set the dimnames equal
dimnames( y ) <- rep( list( names(x) ), 2 ) isSymmetric( y )
[1] TRUE Not sure this is expected behaviour Romain
I think the problem is more with the propagation of the column names in the construction x %*% t(x). If you use the tcrossprod function to create x %*% t(x) more carefully then the results are sensible
x<- c(1,2,3); names(x)<- c("v1","v2","v3")
isSymmetric(tcrossprod(x))
[1] TRUE
tcrossprod(x)
[,1] [,2] [,3] [1,] 1 2 3 [2,] 2 4 6 [3,] 3 6 9