[英]Error thrown with nnet::multinom() passing programmed as.formula() to emmeans::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.