nnet::multinom() 将编程的 as.formula() 传递给 emmeans::emmeans() 时抛出错误?

Error thrown with nnet::multinom() passing programmed as.formula() to emmeans::emmeans()?

可以从以下位置获取参考数据:https://gist.github.com/markhwhiteii/6ce74461a789ddc6d04044de73d99939

我可以通过多项逻辑模型的交互来通过硬编码获得 post 临时测试:

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 函数,因为我可以使用硬编码的 multinom 模型将 emmeans 中的粘贴公式获取到 运行 .这很奇怪,因为我已将此方法用于 lmglmclm 模型。我查看了两个 model 对象的结构,它们似乎是相同的。重要的是,两者的 model$terms 是相同的。 emmeans 调用一个函数调用一个函数调用一个方法等,因此很难使用调试器找出错误发生的位置。

我想出了一个 hack 来解决这个问题。 multinom 将对象名称 formula 而不是公式本身存储到模型的 call 属性中:

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

其中returns字符formula.

然后我可以 re-create 错误:

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

所以,我只是手动 wrote-over 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)))

而且有效。