Это не немедленная операция. Вы можете посмотреть на код moran.plot
, чтобы узнать все операции, необходимые для построения графика Морана. Я собрал их здесь (если вы запустите приведенный ниже код, вы получите тот же график):
library(spdep)
data(afcon, package="spData")
x <- afcon$totcon
listw <- nb2listw(paper.nb)
wx <- lag.listw(listw, x, zero.policy = NULL)
xwx.lm <- lm(wx ~ x)
infl.xwx <- influence.measures(xwx.lm)
is.inf <- which(apply(infl.xwx$is.inf, 1, any))
labels <- as.character(attr(listw, "region.id"))
xlab <- "afcon$totcon"
ylab <- paste("spatially lagged", xlab)
plot(x, wx, xlab=xlab, ylab=ylab)
abline(xwx.lm)
abline(h = mean(wx), lty = 2)
abline(v = mean(x), lty = 2)
points(x[is.inf], wx[is.inf], pch = 9, cex = 1.2)
text(x[is.inf], wx[is.inf], labels = labels[is.inf],
pos = 2, cex = 0.7)
Поэтому я бы предложил разделить эти операции на два этапа: затем подготовить данные замышляя это. Первая функция будет иметь вид
library(dplyr)
prepare_data <- function(data, x, listw){
# prepare a dataframe with variables x and wx, from the x and listw arguments
# this dataframe will be the base data for the ggplot() call
plot_data <- data %>%
mutate(
x = !!enquo(x),
wx = lag.listw(listw, x, zero.policy = NULL),
label = as.character(attr(listw, "region.id"))
) %>%
select(x, wx, label)
# Prepare other needed objects that don't fit into a dataframe
xwx.lm <- lm(plot_data$wx ~ plot_data$x)
infl.xwx <- influence.measures(xwx.lm)
# add non variables objects as attributes
attr(plot_data, which = "is.inf") <- which(apply(infl.xwx$is.inf, 1, any))
attr(plot_data, which = 'xwx.lm') <- xwx.lm
return(plot_data)
}
moran_plot_data <- prepare_data(afcon, totcon, nb2listw(paper.nb))
. Это дает вам весь необходимый объект для графика: x
, wx
и label
переменные, is.inf
и xwx.lm
объекты в качестве атрибутов. Затем вы можете построить ggplot с этими объектами. Вам нужно будет использовать следующие функции ggplot2 (приведенный ниже код минимален, вам нужно будет добавить метки, стили и прочее):
library(ggplot2)
inf_data <- moran_plot_data[attr(moran_plot_data, "is.inf"), ]
ggplot() +
geom_point(data = plot_data, mapping = aes(x, y)) + # equivalent of plot(x, wx, xlab=xlab, ylab=ylab)
geom_abline("wxw.lm coefficients used here") +
geom_hline("mean(wx) used here") +
geom_vline("mean(x) used here") +
geom_point(data = inf_data, mapping = aes(x, y)) +
geom_text(data = inf_data, mapping = aes(x, y, label) +
labs(x = "x variable", y = "Spatially lagged x variable") +
theme("use this function to customise appearence")
Не стесняйтесь, чтобы подробно рассмотреть Руководство ggplot2 поможет вам с этими функциями.