Skip to content

Question on symmetric for nb2mat

5 messages · Roger Bivand, Andrea Gilardi

#
Dear all, probably I'm missing something obvious but I have a question on
the matrix built using nb2mat with argument style = "B". More precisely, I
don't understand why the following code says that the matrix *W* (which
should be a binary first-order adjacency matrix) is not symmetric:













*library(spdep)library(rgdal)library(Matrix)# datanc.sids <-
readOGR(system.file("shapes/sids.shp", package = "spData"))adj <-
poly2nb(nc.sids)W <- as(nb2mat(adj, style = "B"),
"Matrix")Matrix::isSymmetric(W)#> [1] FALSEchol(W)#> Error in
asMethod(object): not a symmetric matrix; consider forceSymmetric() or
symmpart()*

Kind regards
Andrea
#
Please follow-up in this thread posting in plain text (not HTML). As you 
can see below, HTML garbles your message.
On Wed, 29 Jul 2020, Andrea Gilardi wrote:

            

  
    
#
Dear all, I think the following message should work. Excuse me for the
previous message.

library(spdep)
library(rgdal)
library(Matrix)

nc_sids <- readOGR(system.file("shapes/sids.shp", package = "spData"))
adj <- poly2nb(nc_sids)
W <- as(nb2mat(adj, style = "B"), "Matrix")
Matrix::isSymmetric(W)
chol(W)

If it's still not working I added a reprex here:
https://gist.github.com/agila5/59d3a173df9b1efabe13800f748a2d48

Kind regards
Andrea


Il giorno mer 29 lug 2020 alle ore 17:19 Roger Bivand <Roger.Bivand at nhh.no>
ha scritto:

  
  
#
On Wed, 29 Jul 2020, Andrea Gilardi wrote:

            
Do things in steps:

adj <- poly2nb(nc_sids)
is.symmetric.nb(adj, force=TRUE)
# [1] TRUE
W0 <- nb2mat(adj, style = "B")
all(W0 == t(W0))
# [1] TRUE
W <- as(W0, "symmetricMatrix")
isSymmetric(W)
#[1] TRUE
res <- chol(W)
#Error in asMethod(object) : not a positive definite matrix

This step makes little sense - why is it included?

I don't know why coercing to Matrix does not see the matrix as symmetric. 
Or:

lw <- nb2listw(adj, style="B")
library(spatialreg)
W <- as(lw, "CsparseMatrix")
#> isSymmetric(W)
#[1] TRUE

This works and is what you might need:

res <- chol((Diagonal(nrow(W)) - 0.1 * W))

or see ?Matrix::USCounties.

Roger
Not useful, not in thread nor do any answers stay in thread.

  
    
#
Dear Prof. Bivand, thank you very much for the super quick reply and fix.
The approach using *spatialreg* and as(x, "CsparseMatrix") works perfectly.

This step makes little sense - why is it included?
I included the Cholesky decomposition since I found this problem while I
was estimating the Cholesky decomposition of a precision matrix in a
multivariate CAR model (as you probably guessed) and the function *chol *was
complaining that D - alpha * W was not symmetric (where D is a diagonal
matrix with the total number of neighbours for each spatial unit and alpha
is the parameter controlling the strength in the proper CAR model). D is
clearly symmetric by construction so the problem was with W and I couldn't
understand why. I did not include all the details about how or why I found
the error because I think they were not important but, unfortunately, the
example with *chol(W)* is also meaningless.

Anyway thank you very much for the solution and the other suggestions.
Kind regards
Andrea









Il giorno mer 29 lug 2020 alle ore 17:51 Roger Bivand <Roger.Bivand at nhh.no>
ha scritto: