Коэффициенты обратного преобразования от glmer с масштабированными независимыми переменными для прогнозирования - PullRequest
0 голосов
/ 15 ноября 2018

Я установил смешанную модель, используя пакет lme4.Я преобразовал свои независимые переменные с помощью функции scale() до подгонки модели.Теперь я хочу отобразить свои результаты на графике, используя predict(), поэтому мне нужно, чтобы прогнозные данные вернулись в исходный масштаб.Как мне это сделать?

Упрощенный пример:

database <- mtcars

# Scale data
database$wt <- scale(mtcars$wt)
database$am <- scale(mtcars$am)

# Make model
model.1 <- glmer(vs ~ scale(wt) + scale(am) + (1|carb), database, family = binomial, na.action = "na.fail")

# make new data frame with all values set to their mean
xweight <- as.data.frame(lapply(lapply(database[, -1], mean), rep, 100))

# make new values for wt
xweight$wt <- (wt = seq(min(database$wt), max(database$wt), length = 100))

#  predict from new values
a <- predict(model.1, newdata = xweight, type="response", re.form=NA)

# returns scaled prediction

Я пытался использовать этот пример для обратного преобразования прогнозов:

# save scale and center values
scaleList <- list(scale = attr(database$wt, "scaled:scale"),
              center = attr(database$wt, "scaled:center"))

# back-transform predictions
a.unscaled <- a * scaleList$scale + scaleList$center

# Make model with unscaled data to compare
un.model.1 <- glmer(vs ~ wt + am + (1|carb), mtcars, family = binomial, na.action = "na.fail")

# make new data frame with all values set to their mean
un.xweight <- as.data.frame(lapply(lapply(mtcars[, -1], mean), rep, 100))

# make new values for wt
un.xweight$wt <- (wt = seq(min(mtcars$wt), max(mtcars$wt), length = 100))

#  predict from new values
b <- predict(un.model.1, newdata = xweight, type="response", re.form=NA)

all.equal(a.unscaled,b)
# [1] "Mean relative difference: 0.7223061"

Это не работает - не должно быть никакой разницы. Что я сделал не так?

Я также рассмотрел ряд подобных вопросов, но не смог применить ни один к моему делу ( Как вывести коэффициенты из лмера() -модель с масштабированным откликом , параметры немасштабирования и блеска без центра , Уменьшение коэффициентов линейной регрессии в R по масштабированным и центрированным данным , https://stats.stackexchange.com/questions/302448/back-transform-mixed-effects-models-regression-coefficients-for-fixed-effects-f).

1 Ответ

0 голосов
/ 12 декабря 2018

Проблема вашего подхода заключается в том, что он только «масштабируется» на основе переменной wt, тогда как вы масштабировали все переменные в своей регрессионной модели. Один из подходов, который работает, заключается в корректировке всех переменных в вашем новом (прогнозируемом) фрейме данных с использованием значений центрирования / масштабирования, которые использовались в исходном фрейме данных:

## scale variable x using center/scale attributes
## of variable y
scfun <- function(x,y) {
    scale(x, 
          center=attr(y,"scaled:center"), 
          scale=attr(y,"scaled:scale"))
}
## scale prediction frame
xweight_sc <- transform(xweight,
                        wt = scfun(wt, database$wt),
                        am = scfun(am, database$am))
## predict
p_unsc <- predict(model.1, 
                  newdata=xweight_sc, 
                  type="response", re.form=NA)

Сравнение этого p_unsc с вашими прогнозами по немасштабированной модели (b в вашем коде), т.е. all.equal(b,p_unsc), дает TRUE.

Другим разумным подходом было бы

  • unscale / uncenter всех ваших параметров, используя подходы "unscaling", представленные в одном из связанных вопросов (например, this ), генерируя вектор коэффициентов beta_unsc
  • создайте подходящую матрицу модели из вашей рамки прогнозирования:
X <- model.matrix(formula(model,fixed.only=TRUE), 
         newdata=pred_frame)
  • вычислить линейный предиктор и обратное преобразование:
pred <- plogis(X %*% beta_unsc)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...