1

可以从以下位置获取以下引用的数据: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调用一个函数,该函数调用一个函数,该函数调用一个方法等,因此很难使用调试器找出错误发生在哪里。

4

1 回答 1

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)))

它有效。

于 2018-02-23T20:26:56.587 回答