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

时间:2018-02-23 19:39:40

标签: r nnet 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模型一起运行。这很奇怪,因为我已经使用此方法来处理lmglmclm模型。我查看了两个model对象的结构,它们看起来完全相同。重要的是,两者的model$terms是相同的。 emmeans调用一个调用方法等函数的函数,因此很难用调试器找出错误发生的位置。

1 个答案:

答案 0 :(得分: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)))

它有效。