Пространственные веса: асимметричная матрица смежности?


Я создаю матрицу смежности для пространственного анализа в 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 3

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.

x <- us2.adj
colnames(x) <- rownames(x)
isSymmetric(x)
# [1] TRUE
y <- us2.adj
rownames(y) <- NULL
isSymmetric(y)
# [1] TRUE
Кстати, я думаю, что причина, по которой этот вопрос оставался без ответа в течение 18 часов, заключается в том, что вы не предоставили ссылку на свой шейп-файл. Если вы не приведете воспроизводимого примера, то участники будут склонны игнорировать или понижать значение вопроса. Смотрите эту ссылку для инструкций