我使用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调用自动化?
发布于 2019-11-20 11:19:15
这是一个范围界定问题(公式有一个相关的环境,取决于如何/在何处创建它们)。您可以通过计算语言将公式插入到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)
}https://stackoverflow.com/questions/58952867
复制相似问题