簡體   English   中英

使用帶有 emmeans 的抽象公式

[英]Using abstract formula with emmeans

我正在使用emmeans通過對數轉換來調整均值。

但出乎意料的是,當我嘗試使用自定義 function 調用它時,行為完全不同,沒有明確的警告(關於日志轉換的警告除外)。

這是一個可重現的示例:

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)

在這里,function 內部和外部模型之間的唯一區別是call object (使用all.equal()測試)。 否則,它們會給出完全相同的結果。

這段代碼不是我的,我只是想自動化它,假設“外部功能”output 是正確的。

為什么 output 不一樣? 如何自動化emmeans呼叫?

這是一個范圍問題(公式有一個相關的環境,取決於它們的創建方式/位置)。 您可以通過計算語言將公式插入到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)
}

如此所述,這也可以使用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

代表 package (v0.3.0) 於 2021 年 7 月 8 日創建

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM