7

我想创建一个显示现象的局部空间集群的地图,最好使用 Local Moran (LISA)。

在下面的可重现示例中,我使用计算本地莫兰指数,spdep但我想知道是否有简单的方法来映射集群,最好使用ggplot2. 帮助 ?

library(UScensus2000tract)
library(ggplot2)
library(spdep)

# load data
data("oregon.tract")

# plot Census Tract map
plot(oregon.tract)

# create  Queens contiguity matrix
spatmatrix <- poly2nb(oregon.tract)

#calculate the local moran of the distribution of black population
lmoran <- localmoran(oregon.tract@data$black, nb2listw(spatmatrix))

现在为了使这个示例更类似于我的真实数据集,我NA的形状文件中有一些值,它们代表多边形中的孔,因此这些区域不应该用于计算。

oregon.tract@data$black[3:5] <- NA
4

3 回答 3

5

这是一个策略:

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 scatterplot, 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
oregon.tract@data[(oregon.tract$s_white <= 0 
               & oregon.tract$lag_s_white >= 0) & 
                (lmoran[, 5] <= 0.05), "quad_sig"] <- "low-high"
# non-significant observations
oregon.tract@data[(lmoran[, 5] > 0.05), "quad_sig"] <- "not signif."  

oregon.tract$quad_sig <- as.factor(oregon.tract$quad_sig)
oregon.tract@data$id <- rownames(oregon.tract@data)

# plotting the map
df <- fortify(oregon.tract, region="id")
df <- left_join(df, oregon.tract@data)
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")

该答案基于此页面,由Eli Knaap 在 twitter 上提出,也借鉴了@timelyportfolio 对此问题的答案。

我使用变量white而不是black因为black结果不太明确。

关于 NA,localmoran()包括参数na.action,文档说:

na.action 是一个函数(默认为 na.fail),也可以是 na.omit 或 > na.exclude - 在这些情况下,权重列表将被子集化以删除数据中的 NA。可能需要将 zero.policy 设置为 TRUE,因为此子集可能会创建无邻居观察。请注意,只有未使用 nb2listw 的 glist 参数创建的权重列表才可能被子集化。如果使用 na.pass,则在计算空间滞后时用零代替 NA 值。

我试过了:

oregon.tract@data$white[3:5] <- NA
lmoran <- localmoran(oregon.tract@data$white, listw, zero.policy = TRUE, 
                 na.action = na.exclude)

但是在遇到问题lag.listw却没有时间去研究它。对不起。

于 2016-06-08T21:42:42.890 回答
2

这显然已经很晚了,但是我在做类似的事情时遇到了这个帖子。这使用了rgeodapackage,当问题发布时它并没有出现,但它是由 GeoDa 开发的,用于将该软件的一些功能移植到 Rsf中。与此同时,它也真正起飞了,这使得操作空间数据非常简单的; rgeoda函数通常需要sf对象。

像另一张海报一样,我使用的是白人而不是黑人,因为集群显示得更好。我将原始数据(缺少这些少数观察结果)转换为sf. rgeoda::local_moran当缺少数据时不起作用,但如果您制作一个删除了缺失观察值的副本,您可以运行分析并通过 ID 将它们重新连接在一起。使用右连接,以便保留原始数据中的所有 ID,包括缺失值。

因为这模仿了 GeoDa,所以相同的颜色和标签存储在返回的LISA对象中local_moran。提取这些并将它们用作调色板。由于调色板已命名,并且这些名称不包含“NA”,因此您可以将 NA 值添加到调色板矢量,或手动指定NA值的颜色以确保仍绘制这些形状。我把它设为绿色只是为了让它可见(左上角)。

library(UScensus2000tract)
library(ggplot2)
library(dplyr)
library(sf)
library(rgeoda)

# load data
data("oregon.tract")
oregon.tract@data$white[3:5] <- NA
ore_sf <- st_as_sf(oregon.tract) %>%
  tibble::rownames_to_column("id")

to_clust <- ore_sf %>%
  filter(!is.na(white))
queen_wts <- queen_weights(to_clust)
moran <- local_moran(queen_wts, st_drop_geometry(to_clust["white"]))
moran_lbls <- lisa_labels(moran)
moran_colors <- setNames(lisa_colors(moran), moran_lbls)

ore_clustered <- to_clust %>%
  st_drop_geometry() %>%
  select(id) %>%
  mutate(cluster_num = lisa_clusters(moran) + 1, # add 1 bc clusters are zero-indexed
         cluster = factor(moran_lbls[cluster_num], levels = moran_lbls)) %>%
  right_join(ore_sf, by = "id") %>%
  st_as_sf()

ggplot(ore_clustered, aes(fill = cluster)) +
  geom_sf(color = "white", size = 0) +
  scale_fill_manual(values = moran_colors, na.value = "green") +
  theme_dark()

于 2021-12-17T02:49:07.350 回答
1

我不认为这个答案值得赏金,但也许它会让你更接近答案。由于我对 的一无所知localmoran,所以我只是猜测了一下。

library(UScensus2000tract)
library(ggplot2)
library(spdep)

# load data
data("oregon.tract")

# plot Census Tract map
plot(oregon.tract)

# create  Queens contiguity matrix
spatmatrix <- poly2nb(oregon.tract)

#calculate the local moran of the distribution of black population
lmoran <- localmoran(oregon.tract@data$black, nb2listw(spatmatrix))

# get our id from the rownames in a data.frame
oregon.tract@data$id <- rownames(oregon.tract@data)
oregon.tract@data$lmoran_ii <- lmoran[,1]
oregon_df <- merge(
  # convert to a data.frame
  fortify(oregon.tract, region="id"),
  oregon.tract@data, 
  by="id"
)

ggplot(data=oregon_df, aes(x=long,y=lat,group=group)) +
  geom_polygon(fill=scales::col_numeric("Blues",domain=c(-1,5))(oregon_df$lmoran_ii)) +
  geom_path(color="white")
于 2016-06-08T20:36:36.800 回答