使用带有 emmeans 的抽象公式

Posted

技术标签:

【中文标题】使用带有 emmeans 的抽象公式【英文标题】:Using abstract formula with emmeans 【发布时间】:2020-03-16 02:00:30 【问题描述】:

我正在使用emmeans 来通过对数转换来调整均值。

但出乎意料的是,当我尝试使用自定义函数调用它时,行为完全不同,没有明确的警告(关于日志转换的警告除外)。

这是一个可重现的例子:

db = mtcars %>% mutate(cyl=factor(cyl))
m = lm(log(mpg) ~ log(disp) + cyl, data = db)
print(m$call)
emm = emmeans(m, spec = "cyl", type = "response")
as.data.frame(emm)

f = function(formula)
  m = lm(formula, data = db)
  print(m$call)
  emm = emmeans(m, spec = "cyl", type = "response")
  as.data.frame(emm)

f(log(mpg) ~ log(disp) + cyl)

这里,函数内外模型的唯一区别是call对象(用all.equal()测试)。否则,它们会给出完全相同的结果。

这段代码不是我的,我只是想自动化它,假设“外部函数”输出是正确的。

为什么输出不同?如何自动化emmeans 呼叫?

【问题讨论】:

另见***.com/a/36228342/4241780 【参考方案1】:

如here 所述,这也可以使用do.call 来完成。


db = dplyr::mutate(mtcars, cyl=factor(cyl))

f <- function(formula)
  m = do.call(lm, list(formula = formula, data = db))
  print(m$call$formula)
  emm = emmeans::emmeans(m, spec = "cyl", type = "response")
  as.data.frame(emm)

f(log(mpg) ~ log(disp) + cyl)
#> log(mpg) ~ log(disp) + cyl
#>   cyl response       SE df lower.CL upper.CL
#> 1   4 18.59940 1.847377 28 15.17535 22.79603
#> 2   6 17.71003 1.011478 28 15.75472 19.90802
#> 3   8 17.71054 1.020718 28 15.73839 19.92981

由reprex package (v0.3.0) 于 2021-07-08 创建

【讨论】:

【参考方案2】:

这是一个范围问题(公式有一个相关的环境,取决于它们的创建方式/位置)。您可以通过计算语言将公式插入到lm 调用中:

f = function(formula)
  m = eval(bquote(lm(.(formula), data = db)))
  print(m$call)
  emm = emmeans(m, spec = "cyl", type = "response")
  as.data.frame(emm)

【讨论】:

以上是关于使用带有 emmeans 的抽象公式的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSPredicate 解析带有变量的公式

在带有变量的javascript中使用haversine公式

带有自定义脚本的公式不会在 Google 电子表格中更新

PHPExcel 无法加载带有公式的电子表格

使用查询公式将带有分隔符的列数据和带有其他分隔符的行数据连接起来

带有公式的单元格在 Excel 2010 中不计算