Ошибка с nnet::multinom(), переданная запрограммированной как.formula() emmeans::emmeans()?

Можно получить данные, указанные ниже, по адресу: https://gist.github.com/markhwhiteii/6ce74461a789ddc6d04044de73d99939

Я могу передать взаимодействие для многочленной логистической модели, чтобы получить специальные тесты с помощью жестко запрограммированных вещей:

library(nnet)
library(emmeans)
model <- multinom(outcome ~ cond * party, data)
emmeans(model, ~ outcome + cond | party)

Тем не менее, мне нужно иметь функцию-обертку для этого. Если у меня есть входные данные, которые являются переменными, то передайте эти as.formula() тогда я получаю сообщение об ошибке:

iv <- "cond"
dv <- "outcome"
mod <- "party"
formula <- as.formula(paste(dv, "~", iv, "*", mod))
model <- multinom(formula, data)
emmeans(model, as.formula(paste("~", dv, "+", iv, "|", mod)))

Призыв к emmeans генерирует:

Error in object$call$formula[[2]] : 
  object of type 'symbol' is not subsettable

Кажется, это исходит от multinom функция, как я могу получить вставленную формулу в emmeans бежать с жестко закодированным multinom модель. Это странно, потому что я получил этот метод для работы с lm, glm, а также clm моделей. Я посмотрел на структуру двух model объекты, и они кажутся идентичными. Важно отметить, что model$terms для обоих одинаково. emmeans вызывает функцию, которая вызывает функцию, которая вызывает метод и т. д., поэтому сложно определить, где происходит ошибка, с помощью отладчика.

1 ответ

Решение

Я понял, как взломать, чтобы обойти это. multinom хранил имя объекта formula, а не сама формула, в call атрибут модели:

iv <- "cond"
dv <- "outcome"
mod <- "party"
formula <- as.formula(paste(dv, "~", iv, "*", mod))
model <- multinom(formula, data)
model$call$formula

Который возвращает символ formula,

Затем я могу заново создать ошибку:

> model$call$formula[[2]]
Error in model$call$formula[[2]] : 
  object of type 'symbol' is not subsettable

Итак, я просто вручную переписал, что multinom хранить:

iv <- "cond"
dv <- "outcome"
mod <- "party"
formula <- as.formula(paste(dv, "~", iv, "*", mod))
model <- multinom(formula, data)
model$call$formula <- formula
emmeans(model, as.formula(paste("~", dv, "+", iv, "|", mod)))

И это работает.

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