使用带有 emmeans 的抽象公式
Using abstract formula with emmeans
我正在使用 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()
测试)。否则他们给出完全相同的结果。
这段代码不是我的,我只是想自动化它,假设 "outside function" 输出是正确的。
为什么输出不同?如何使 emmeans
调用自动化?
这是一个范围问题(公式有一个关联的环境,该环境取决于 how/where 它们的创建)。您可以通过计算语言将公式插入 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
由 reprex package (v0.3.0)
于 2021-07-08 创建
我正在使用 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()
测试)。否则他们给出完全相同的结果。
这段代码不是我的,我只是想自动化它,假设 "outside function" 输出是正确的。
为什么输出不同?如何使 emmeans
调用自动化?
这是一个范围问题(公式有一个关联的环境,该环境取决于 how/where 它们的创建)。您可以通过计算语言将公式插入 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
由 reprex package (v0.3.0)
于 2021-07-08 创建