Пространственные веса: асимметричная матрица смежности?
Я создаю матрицу смежности для пространственного анализа в R. данные - это все округа в континентальной части США. У меня есть пространственные полигоны округов из файлов переписи населения США.
Я могу создать список соседей, и он симметричен. Но когда я преобразую это в матрицу смежности, она не симметрична. Это проблема, потому что моя цель-запустить пространственную автологистическую модель с использованием ngspatial::autologistic
, и я получаю ошибку, что я должен предоставить симметричную двоичную смежность матрица.
Вот мой R-код для создания матрицы смежности:
us<-readShapeSpatial("County_2010Census_DP1.shp")
#Trim out counties outside of continental US
us2<-us[!substr(us$GEOID10,1,2)%in%c('02','60','66','78','15','72'),]
us2.nb = poly2nb(us2)
is.symmetric.nb(us2.nb) #Comes out true
us2.adj = nb2mat(us2.nb, style="B",zero.policy=F)
isSymmetric(us2.adj) #comes out false
В качестве отступления, я могу использовать splogit
с этой матрицей смежности без проблем. Я не специалист по пространственному анализу, поэтому не могу сказать, что знаю, что происходит внутри этих команд.
1 ответ:
Матрицы
us2.adj
является симметричной. Проблема заключается в тесте. Получается, чтоisSymmetric(us2.adj)
Использует
all.equal(...)
для проверки равенства матрицы с ее транспонированием, аall.equal(...)
проверяет атрибуты, а также значения.nb2mat(...)
создает матрицу с именами строк, заданными для идентификаторов полигонов,и именами столбцов, не заданными. Таким образом,all.equal(...)
возвращаетFALSE
, а следовательно, иisSymmetric(...)
. Очевидно, функцияautologistic(...)
использует этот же тест.us2.adj <- nb2mat(us2.nb, style="B",zero.policy=F) isSymmetric(us2.adj) # [1] FALSE isSymmetric(us2.adj,check.attributes=FALSE) # [1] TRUE
Простое решение состоит в том, чтобы либо установить столбцы имена для имен строк или задайте для них значение
NULL
.Кстати, я думаю, что причина, по которой этот вопрос оставался без ответа в течение 18 часов, заключается в том, что вы не предоставили ссылку на свой шейп-файл. Если вы не приведете воспроизводимого примера, то участники будут склонны игнорировать или понижать значение вопроса. Смотрите эту ссылку для инструкцийx <- us2.adj colnames(x) <- rownames(x) isSymmetric(x) # [1] TRUE y <- us2.adj rownames(y) <- NULL isSymmetric(y) # [1] TRUE