Ошибка при попытке оценить случайные поля Маркова с помощью mgcv::gam "несоответствие между именами областей, предоставленных nb/polys, и именами областей данных"
Я попытался реализовать это великолепное сообщение в блоге Гэвина Симпсона, используя данные, загруженные с помощью пакета Cancensus, но при попытке оценить игру я получаю следующую ошибку:
Error in smooth.construct.mrf.smooth.spec(object, dk$data, dk$knots) :
mismatch between nb/polys supplied area names and data area names
In addition: Warning message:
In if (all.equal(sort(a.name), sort(levels(k))) != TRUE) stop("mismatch
between nb/polys supplied area names and data area names") :
the condition has length > 1 and only the first element will be used
Я разместил мой минимальный рабочий пример здесь. Любой совет будет принята с благодарностью.
Лучший,
2 ответа
Я знаю, что вы уже нашли свой ответ, однако у меня была та же ошибка и другая проблема, поэтому я опубликую свое решение здесь для потомков.
(Примечание: я использовал sf
пакет вместо rgdal
а также spdep
)
library(sf)
sh_terr <- st_read("your_shp.shp", stringsAsFactors = T)
neighb <- st_touches(sh_terr, sparse = T) %>%
lapply(function(xx) sh_terr$FSA[xx] %>% factor(levels = levels(sh_terr$FSA))) %>%
set_names(sh_terr$FSA)
Структура вашего соседнего объекта должна выглядеть так:
str(neighb[1:5])
List of 5
$ G0A: Factor w/ 419 levels "G0A","G0C","G0E",..: 14 15 16 17 21 22 39 49 50 51 ...
$ G0C: Factor w/ 419 levels "G0A","G0C","G0E",..: 3 6 67
$ G0E: Factor w/ 419 levels "G0A","G0C","G0E",..: 2 6 65 67
$ G0G: Factor w/ 419 levels "G0A","G0C","G0E",..: 5 16 62 70 271
$ G0H: Factor w/ 419 levels "G0A","G0C","G0E",..: 4 14 16 68 70 71
И ваша сплайн формула:
Effect ~ s(FSA, bs = "mrf", xt = list(nb = neighb), k = 41, fx = TRUE)
Это все в факторах. FSA
в вашем основном объекте данных вашего gam
должно быть factor
, а структура вашего соседнего объекта должна быть списком факторов с таким количеством уровней, сколько ИТОГО количества уровней в ваших основных данных.
Нашел его - Вы должны убедиться, что у вас нет полигонов с отсутствующим Y: shp <- shp [! Is.na (shp @ data $ Y),]