Набор данных, с которым я работаю, имеет термин взаимодействия. Я хочу, чтобы модель соответствовала термину взаимодействия по оси x и y.var
по оси y. Я попытался следовать примеру это, но не слишком разобрался в том, как воспроизвести его в ggplot2 (т. Е. Функция стиля графика больше не работает ... поэтому я не знал, как воспроизвести результаты).
temp <- rnorm(100, 2,1)set.seed(111)
temp <- rnorm(100, 3,1)
rainfall <- rnorm(100,5,1)
y.var <- rnorm(100, 2,1)
site <- rep(c("A","B","C","D"), each = 25)
df <- data.frame(temp, rainfall, y.var, site)
df$site <- as.factor(as.character(df$site))
mod <- lmer(y.var ~ temp * rainfall + (1|site), data = df)
summary(mod)
ggplot2
для отображения данных. Для построения коэффициентов модели или модельных эффектов я рекомендую ggeffects
и sjPlot
. Кроме того, lm
— это не модель смешанных эффектов, а обычный метод наименьших квадратов. Вы захотите использовать lme4::lmer
.
@Quinten plot_model(fit, type = "pred", terms = c("temp:rainfall"))
Ошибка в plot_model (fit, type = «pred», terms = c («temp: rainfall»)): не удалось найти функцию «plot_model»
@Arthur Смотрите мой обновленный df и код. Я попробовал ggPredict(model, c("temp * rainfall", "site"))
и получил сообщение об ошибке... Ошибка: оператор $ не определен для этого класса S4
Используя пакет ggeffects
, ggpredict(mod, terms=c("temp", "rainfall")) %>% plot()
должно работать.
Если вы хотите построить модель напрямую в ggplot, а не использовать пакет расширения, вам необходимо создать фрейм данных прогнозов для построения. Преимущество этого способа заключается в том, что вы также можете включить свои исходные точки данных на график.
Поскольку у вас есть y.var
на оси y, у вас остается только одна ось для построения двух переменных с фиксированным эффектом. Это означает, что вам нужно будет выбрать либо количество осадков, либо температуру для оси x, а другую переменную представить с помощью другого эстетического вида, например цвета. В этом примере я буду использовать температуру для оси x. Очевидно, чтобы сделать график интерпретируемым, нам нужно ограничить количество «кусочков» осадков, которые мы предсказываем. Здесь я буду использовать 5.
Эффект взаимодействия виден здесь как изменение наклона линии по мере увеличения количества осадков.
library(geomtextpath)
library(lme4)
mod <- lmer(y.var ~ temp * rainfall + (1|site), data = df)
newdf <- expand.grid(temp = seq(min(df$temp), max(df$temp), length = 100),
rainfall = seq(min(df$rainfall), max(df$rainfall),
length = 5))
newdf$y.var <- predict(mod, newdata = newdf)
ggplot(newdf, aes(x = temp, y = y.var, group = rainfall)) +
geom_point(data = df, aes(shape = site, color = rainfall)) +
geom_textline(aes(color = rainfall, label = round(rainfall, 2)),
hjust = 0.95) +
scale_color_gradient(low = 'navy', high = 'red4') +
theme_light(base_size = 16)
Большой! Очень полезно. Есть ли способ указать уровень влажности. Скажем, я хочу построить только 1,3,5 и 7, или модель заранее назначает это?
@Biotechgeek, как их назначить, находится в вызове expand.grid
. Просто измените rainfall = seq(..., length = 5)
на rainfall = c(1, 3, 5, 7)
Хотите повторить это в
ggplot
? Функцияplot_model
работает.