Маржинальные средние и уровни доверия на группу с emmeans и geepack в R
Пожалуйста, примите во внимание следующее:
При установке GEE с geepack
мы получаем модель, которую мы можем predict
с новыми значениями, но база R не поддерживает модели GEE для расчета доверительных интервалов. Для получения доверительных интервалов мы можем использовать emmeans::emmeans()
,
Если переменные в модели являются категориальными и непрерывными, я сталкиваюсь с проблемами.
При оценке предельного среднего с emmeans::emmeans()
Я обнаружил, что предельное среднее значение рассчитывается на основе общих данных, а не данных на группу.
Вопрос: как я могу получить расчетное среднее значение для группы, включая доверительные интервалы, из модели GEE в R?
Минимальный воспроизводимый пример:
Данные
library("dplyr")
#>
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
library("emmeans")
#> Warning: package 'emmeans' was built under R version 3.5.2
library("geepack")
# Adding a grouping variable
pigs.group <- emmeans::pigs %>% mutate(group = c(rep("a", 20), rep("b", 9)))
Подгонка модели
# Fitting the model
fit <- geepack::geeglm(conc ~ as.numeric(percent) + factor(group),
id = source, data = pigs.group)
# Model results
fit
#>
#> Call:
#> geepack::geeglm(formula = conc ~ as.numeric(percent) + factor(group),
#> data = pigs.group, id = source)
#>
#> Coefficients:
#> (Intercept) as.numeric(percent) factor(group)b
#> 20.498948 1.049322 10.703857
#>
#> Degrees of Freedom: 29 Total (i.e. Null); 26 Residual
#>
#> Scale Link: identity
#> Estimated Scale Parameters: [1] 36.67949
#>
#> Correlation: Structure = independence
#> Number of clusters: 3 Maximum cluster size: 10
С помощью emmeans::emmeans()
рассчитать маржинальные средние и LCL/UCL. Тем не менее, группа означает для percent
12,9 в обеих группах. Это общее наблюдаемое среднее percent
а не группа значит.
# Calculating marginal means per group.
# Note that 'percent' is the same for both groups
emmeans::emmeans(fit, "percent", by = "group")
#> group = a:
#> percent emmean SE df asymp.LCL asymp.UCL
#> 12.9 34.1 3.252 Inf 27.7 40.4
#>
#> group = b:
#> percent emmean SE df asymp.LCL asymp.UCL
#> 12.9 44.8 0.327 Inf 44.1 45.4
#>
#> Covariance estimate used: vbeta
#> Confidence level used: 0.95
# Creating new data with acutal means per group
new.dat <- pigs.group %>%
group_by(group) %>%
summarise(percent = mean(percent))
# These are the actual group means
new.dat
#> # A tibble: 2 x 2
#> group percent
#> <chr> <dbl>
#> 1 a 13.2
#> 2 b 12.3
Прогнозирование с predict
также возвращает другие оцененные средние значения для каждой группы, но нельзя рассчитать доверительные интервалы для GEE в базе R.
# Prediction with new data
# These should be the marginal means but how to get the confidence interval?
predict(fit, newdata = new.dat)
#> 1 2
#> 34.35000 44.14444
Создано 2019-02-08 пакетом представлением (v0.2.1)
1 ответ
То, что вы подумали, что проблема с компьютером, оказывается статистической...
Когда у вас есть ковариаты в модели, обычный подход в post -hoc анализе заключается в управлении этими ковариатами. В контексте данного примера мы хотим сравнить средний ответ в разных группах. Тем не менее, ответ также зависит от ковариации, percent
и средний процент отличается в каждой группе. Если мы просто вычисляем предельные средние значения для каждой группы, эти средства отчасти различаются из-заpercent
,
В крайнем примере, представьте ситуацию, когда группа не имеет никакого значения, но percent
делает. Тогда если среднееpercent
Значения достаточно различаются между группами, тогда мы могли бы иметь статистически разные средства, но они были бы разными из-за эффекта percent
, а не из-за эффекта group
,
По этой причине "справедливое" сравнение получается путем прогнозирования средних значений на тотже процент - скажем, общий средний процент в наборе данных. Это метод по умолчанию, используемый в emmeans, и результаты называются скорректированными средствами(см. Его в учебнике по дизайну).
Существует ситуация, когда уместно использовать разные значения процента, и именно в этом случае процент является "посреднической переменной"; то есть проценты попадают в причинно-следственную связь между лечением и реакцией, так что group
Считается, что влияет percent
а также ответ. Смотрите виньетка с грязными данными в подразделе о посреднических ковариатах.
Если вы действительно думаете, что percent
это посредническая ковариата, тогда вы можете получить отдельные проценты, как это:
emmeans(model, "group", cov.reduce = percent ~ group)
Однако в ситуации, когда percent
считается независимым от group
не делай этого!