Ошибка `marginaleffects`: столбцы матрицы не поддерживаются

Краткое содержание

Я пытаюсь использовать 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")
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы внимательно прочитаете сообщение об ошибке еще раз, вы увидите, что во многом оно связано с тем, что «Столбцы матрицы» не поддерживаются 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
) 

Другие вопросы по теме