Вот стратегия:
library(UScensus2000tract)
library(spdep)
library(ggplot2)
library(dplyr)
# load data
data("oregon.tract")
# plot Census Tract map
plot(oregon.tract)
# create Queens contiguity matrix
spatmatrix <- poly2nb(oregon.tract)
# create a neighbours list with spatial weights
listw <- nb2listw(spatmatrix)
# calculate the local moran of the distribution of white population
lmoran <- localmoran(oregon.tract$white, listw)
summary(lmoran)
# padronize the variable and save it to a new column
oregon.tract$s_white <- scale(oregon.tract$white) %>% as.vector()
# create a spatially lagged variable and save it to a new column
oregon.tract$lag_s_white <- lag.listw(listw, oregon.tract$s_white)
# summary of variables, to inform the analysis
summary(oregon.tract$s_white)
summary(oregon.tract$lag_s_white)
# moran sccaterplot, in basic graphics (with identification of influential observations)
x <- oregon.tract$s_white
y <- oregon.tract$lag_s_white %>% as.vector()
xx <- data_frame(x, y)
moran.plot(x, listw)
# moran sccaterplot, in ggplot
# (without identification of influential observations - which is possible but requires more effort)
ggplot(xx, aes(x, y)) + geom_point() + geom_smooth(method = 'lm', se = F) + geom_hline(yintercept = 0, linetype = 'dashed') + geom_vline(xintercept = 0, linetype = 'dashed')
# create a new variable identifying the moran plot quadrant for each observation, dismissing the non-significant ones
oregon.tract$quad_sig <- NA
# high-high quadrant
oregon.tract[(oregon.tract$s_white >= 0 &
oregon.tract$lag_s_white >= 0) &
(lmoran[, 5] <= 0.05), "quad_sig"] <- "high-high"
# low-low quadrant
oregon.tract[(oregon.tract$s_white <= 0 &
oregon.tract$lag_s_white <= 0) &
(lmoran[, 5] <= 0.05), "quad_sig"] <- "low-low"
# high-low quadrant
oregon.tract[(oregon.tract$s_white >= 0 &
oregon.tract$lag_s_white <= 0) &
(lmoran[, 5] <= 0.05), "quad_sig"] <- "high-low"
# low-high quadrant
[email protected][(oregon.tract$s_white <= 0
& oregon.tract$lag_s_white >= 0) &
(lmoran[, 5] <= 0.05), "quad_sig"] <- "low-high"
# non-significant observations
[email protected][(lmoran[, 5] > 0.05), "quad_sig"] <- "not signif."
oregon.tract$quad_sig <- as.factor(oregon.tract$quad_sig)
[email protected]$id <- rownames([email protected])
# plotting the map
df <- fortify(oregon.tract, region="id")
df <- left_join(df, [email protected])
df %>%
ggplot(aes(long, lat, group = group, fill = quad_sig)) +
geom_polygon(color = "white", size = .05) + coord_equal() +
theme_void() + scale_fill_brewer(palette = "Set1")
Этот ответ был основан на this page, предложенный Eli Knaap on twitter, а также заимствованные из ответа по @timelyportfolio на этот вопрос.
Я использовал переменную white
вместо black
, потому что black
имел менее явные результаты.
Относительно Nas, localmoran()
включает аргумент na.action
, о котором говорится в документации:
na.action является функцией (na.fail по умолчанию), а также может быть na.omit или> na.exclude - в этих случаях список весов будет подмножеством для удаления NA в данных. Возможно, необходимо установить для параметра zero.policy значение TRUE, потому что это подмножество может создавать наблюдения соседей. Обратите внимание, что только списки весов, созданные без использования аргумента glist для nb2listw, могут быть подмножествами. Если используется na.pass, то при вычислении пространственного запаздывания вместо значений NA заменяется ноль.
Я пробовал:
[email protected]$white[3:5] <- NA
lmoran <- localmoran([email protected]$white, listw, zero.policy = TRUE,
na.action = na.exclude)
Но столкнулись с проблемами в lag.listw
и не было времени, чтобы посмотреть на него. Сожалею.
Спасибо @timelyportfolio. Это уже полезно, но по-прежнему не устраняет проблему с помощью значений NA, представляющих пустые области многоугольника. Он также должен учитывать идентификацию кластеров высок-высокий, высокий-низкий, низкий-высокий, низкий-низкий и незначительный. [Что-то похожее на это] (http://rstudio-pubs-static.s3.amazonaws.com/4938_b5fc230d586c48b291627ff6ea484d2e.html) –