Краткое содержание
Я пытаюсь использовать Marginaleffects::plot_predictions() для построения прогнозов на основе GLMM. Минимальный рабочий пример приведен ниже.
Цель
Я пытаюсь построить прогнозы только для четырехстороннего взаимодействия Scaled_exp * Соглашение * Условие * Группа в следующем GLMM:
glmer(Acceptance ~ scaled_exp * Agreement * Condition * Group +
scaled_age * Agreement * Group +
(1 | Item) +
(1 + Condition | Subject)
Однако кажется, что у метода Marginaleffects::plot_predictions() возникают проблемы (только с GLMM, а не с LMM), если не каждый отдельный предиктор включен в список условий (т. е. нас не интересует построение графика эффекта Scaled_age, это только включен для контроля влияния старения на результаты исследований), но если я попытаюсь запустить его без Scaled_age, я получу следующую ошибку.
Предупреждение. Столбцы матрицы не поддерживаются в качестве предикторов и поэтому опускаются. Это может помешать вычислению величин представляет интерес. Вы можете создать свой собственный набор данных прогнозирования и явно указать его в аргументе
newdata. Внимание: некоторые столбцы имеют многостолбцовый тип (например, столбец матрицы): [2, 6]. setDT сохранит эти столбцы как есть, но последующие операции, такие как группировка и объединение, могут завершиться неудачно. Вместо этого рассмотрите as.data.table(), который создаст новый столбец для каждого встроенного столбца. Ошибка: невозможно вычислить прогнозируемые значения с помощью этой модели. Вы можете попытаться передать в аргументnewdataдругой набор данных. Эта ошибка также возникла: объект «scaled_age» не найден. Отслеживание ошибок: https://github.com/vincentarelbundock/marginaleffects/issues
Я не сталкиваюсь с этими проблемами с соответствующими LMM с похожими структурами фиксированных и случайных эффектов, поэтому подозреваю, что это как-то связано с этим.
МВЕ
# Load necessary libraries
library(lme4)
library(tidyverse)
library(marginaleffects)
# Create a sample dataset
set.seed(123)
n <- 5000
sample_data <- tibble(
Subject = as.factor(rep(1:500, each = 10)), # Increase the number of subjects
Group = factor(rep(c("Group1", "Group2"), each = n / 2)),
Item = sample(1:120, n, replace = TRUE),
Condition = factor(rep(c("Cond1", "Cond2"), times = n / 2)),
Agreement = factor(sample(c("Agree", "Disagree"), n, replace = TRUE)),
Acceptance = rbinom(n, 1, 0.5),
scaled_age = scale(rnorm(n, 40, 15)),
scaled_exp = scale(rnorm(n, 0.3, 1.4))
)
# Fit the generalized linear mixed model
glmm_mod <- glmer(Acceptance ~
scaled_exp * Agreement * Condition * Group +
scaled_age * Agreement * Group +
(1 | Item) +
(1 + Condition | Subject),
data = sample_data,
family = binomial,
control = glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 100000)))
# Generate predictions for the four-way interaction using plot_predictions()
plot_predictions(
glmm_mod,
condition = list("scaled_exp", "Agreement", "Condition", "Group"),
re.form = NA
) +
aes(linetype = Agreement) + # Map linetype to Agreement
facet_wrap(~ Group + Condition, ncol = 4) +
scale_color_manual(values = c("Agree" = "blue", "Disagree" = "red")) +
scale_fill_manual(values = c("Agree" = "blue", "Disagree" = "red")) +
scale_linetype_manual(values = c("Agree" = "solid", "Disagree" = "longdash")) +
theme_classic() +
labs(x = "Scaled Experience", y = "Predicted Probability of Acceptance")





Если вы внимательно прочитаете сообщение об ошибке еще раз, вы увидите, что во многом оно связано с тем, что «Столбцы матрицы» не поддерживаются marginaleffects. И если вы проверите свой набор данных, вы заметите, что некоторые из ваших столбцов действительно относятся к классу «матрица»:
> class(sample_data$scaled_age)
[1] "matrix" "array"
Оказывается, функция scale() по умолчанию возвращает матрицу, а не числовой вектор. Чтобы это исправить, вы можете использовать функцию drop():
library(lme4)
library(tidyverse)
library(marginaleffects)
set.seed(123)
n <- 5000
sample_data <- tibble(
Subject = as.factor(rep(1:500, each = 10)), # Increase the number of subjects
Group = factor(rep(c("Group1", "Group2"), each = n / 2)),
Item = sample(1:120, n, replace = TRUE),
Condition = factor(rep(c("Cond1", "Cond2"), times = n / 2)),
Agreement = factor(sample(c("Agree", "Disagree"), n, replace = TRUE)),
Acceptance = rbinom(n, 1, 0.5),
scaled_age = drop(scale(rnorm(n, 40, 15))),
scaled_exp = drop(scale(rnorm(n, 0.3, 1.4)))
)
glmm_mod <- glmer(Acceptance ~
scaled_exp * Agreement * Condition * Group +
scaled_age * Agreement * Group +
(1 | Item) +
(1 + Condition | Subject),
data = sample_data,
family = binomial,
control = glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 100000)))
plot_predictions(
glmm_mod,
condition = list("scaled_exp", "Agreement", "Condition", "Group"),
re.form = NA
)