我相信 thar lm_robust 对象是 lm 的扩展,因此它使用 emmeans 对 lm 的支持。反过来,这意味着估计是通过 coef(model) 得出的,并且它们的 SE 是使用 vcov(model) 得出的。因此,如果 vcov() 返回您需要的稳健方差,emmeans 将使用它们。
对于大多数转换,它将按照转换小插图中的描述工作。特别是,指定 type = "response" 会导致估计值和置信限被反向转换,P 值被单独保留,SE 由 delta 方法计算(但不用于 CI 和测试) .
附加信息
首先,我发现lm_robust
不继承自lm
; 相反,estimatr包包含自己对emmeans的支持。没有给出太多细节,但estimatr的开发者必须相信所提供的内容必须是适当的。
scale()
转换不是内置的,因为它很复杂。仅仅说我们使用"scale"
了并不像说它那么简单"log"
,比如说,因为要处理scale()
结果,我们需要知道使用什么来居中和划分结果。
解决方法是创建对象emmeans()
及其亲属需要反转转换;那是由stats::make.link()
or返回的形式的函数列表emmeans::make.tran()
。这是一个用于该目的的函数:
make.scaletran = function(y, ...) {
sy = scale(y, ...)
if(is.null(m <- attr(sy, "scaled:center")))
m = 0
if(is.null(s <- attr(sy, "scaled:scale")))
s = 1
list(
linkfun = function(mu) (mu - m) / s,
linkinv = function(eta) s * eta + m,
mu.eta = function(eta) s,
valideta = function(eta) TRUE,
name = paste0("scale(", signif(m, 3), ", ", signif(s, 3), ")")
)
}
要使用它,您需要手动指定转换,因为它不会自动检测到。这是一个使用warpbreaks
R 中已有数据的示例:
> warp.lmr = lm_robust(scale(breaks) ~ tension, cluster = wool,
+ se_type = 'CR2', data = warpbreaks)
> tran = make.scaletran(warpbreaks$breaks)
> emmeans(warp.lmr, "tension", tran = tran)
tension emmean SE df lower.CL upper.CL
L 0.624 0.619 51 -0.618 1.8666
M -0.133 0.181 51 -0.497 0.2301
H -0.491 0.219 51 -0.930 -0.0517
Results are given on the scale(28.1, 13.2) (not the response) scale.
Confidence level used: 0.95
> emmeans(warp.lmr, "tension", tran = tran, type = "response")
tension response SE df lower.CL upper.CL
L 36.4 8.17 51 20.0 52.8
M 26.4 2.39 51 21.6 31.2
H 21.7 2.89 51 15.9 27.5
Confidence level used: 0.95
Intervals are back-transformed from the scale(28.1, 13.2) scale
调用的 OP 中的代码emmip()
不正确,因为它使用规范emmeans()
,而不是emmip()
.
我会考虑emmeans::make.tran()
在未来的更新中添加这个比例转换选项。