Я считаю, что объекты lm_robust являются расширением lm, поэтому он использует поддержку emmeans для lm. В свою очередь, это будет означать, что оценки получены с помощью coef (модели), а их SE получены с помощью vcov (модели). Поэтому, если vcov () возвращает нужные устойчивые дисперсии, emmeans будет их использовать.
Что касается большинства трансформаций, это будет работать, как описано в виньетке о трансформациях. В частности, указание type = "response" приводит к обратному преобразованию оценок и доверительных интервалов, значения P оставить в покое, а SE должны вычисляться дельта-методом (но не используется в КИ и тестах).
Дополнительная информация
Во-первых, я выяснил, что lm_robust
не наследуется от lm
; скорее, пакет Estimatr включает собственную поддержку emmeans . Приведено не так много подробностей, но разработчик Estimatr должен полагать, что предоставленное должно быть подходящим.
Преобразование scale()
не является встроенным, потому что оно сложно. Сказать, что мы использовали "scale"
, не так просто, как сказать, что это "log"
, скажем, потому что для работы с scale()
результатами нам нужно знать, что было использовано для центрирования и разделения результатов.
Обходной путь - создать объект, который emmeans()
и его родственники должны инвертировать преобразование; и это список функций формы, возвращаемых stats::make.link()
или 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()
в будущем обновлении.