revoScaleR :: rxGlm () Вопрос в R - Остатки GLM - PullRequest
5 голосов
/ 06 апреля 2020

Я не могу найти здесь ответ, потому что не думаю, что пакет revoScaleR широко используется.

Если я создаю GLM с использованием rxGlm(), он работает нормально. Однако остатки модели, доступные через rxPredict(), кажутся просто «необработанными» остатками, ie наблюдаемое значение минус установленное значение. Различные преобразованные версии (остатки отклонения, остатки Пирсона и т. Д. c.), По-видимому, недоступны.

Кто-нибудь знает, есть ли способ достичь этого? Я могу получить остатки отклонения (например) для модели, запустив ее снова, используя glm() (с той же формулой, данными, структурой ошибок, функцией связи, весами) и используя residuals(glm_object, type = "deviance"), но это Это неудобство, потому что glm() работает очень медленно (большой набор данных, много параметров модели).

Спасибо.

Отредактировано: включить это руководство из литературы, которой я пытаюсь следовать:

enter image description here

1 Ответ

3 голосов
/ 16 апреля 2020

Из вашего вопроса немного сложно понять, что предоставляет пакет RevoScaleR с точки зрения остатков и какие именно остатки вам нужны. Кроме того, существует некоторая путаница в отношении терминологии остатков, поскольку это иллюстрируется, например, здесь и здесь .

Несколько замечаний / наблюдений, которые могут помочь вам тем не менее.

В линейной регрессии "сырые" идентичны невязкам "отклонения"

По крайней мере, это то, что я получаю из запуска регрессии игрушек с glm и прогнозирования результатов, таких как:

df <- mtcars
modl <- glm(formula = mpg ~ wt + qsec + am, data = mtcars)
y_hat <- predict(modl)

Затем вычислите «сырые» остатки (прогнозируемый результат минус фактический результат), а также отклонения от отклонения:

y <- as.vector(df[["mpg"]])
res_raw <- y - y_hat
res_dev <- residuals(modl, type = "deviance")

Эти два значения идентичны:

identical(res_raw, res_dev)
[1] TRUE

Я думаю, что это сложнее, когда вы попадаете в бинарные результаты и т.д. c.

Формула для вычисления остатков стандартизированного отклонения

Остатки стандартизированного отклонения вычисляются из glm с помощью метода rstandard.

res_std <- rstandard(modl)

Глядя на getAnywhere(rstandard.glm), вы узнаете, как стандартизованные остатки могут быть вычислены вручную из остатков отклонения:

function (model, infl = influence(model, do.coef = FALSE), type = c("deviance", 
    "pearson"), ...) 
{
    type <- match.arg(type)
    res <- switch(type, pearson = infl$pear.res, infl$dev.res)
    res <- res/sqrt(summary(model)$dispersion * (1 - infl$hat)) # this is the key line
    res[is.infinite(res)] <- NaN
    res
}

Так что в моем примере вы бы вручную вычислили стандартизованные остатки запустив res/sqrt(summary(modl)$dispersion * (1 - influence(modl)$hat)). Итак, вам нужны две вещи: hat и dispersion. Я предполагаю, что RevoScaleR обеспечивает параметр дисперсии. Если в RevoScaleR нет ничего, как influence(modl)$hat, чтобы получить значения шляп, вам придется делать это с нуля:

X <- as.matrix(df[, c("wt", "qsec", "am")]) # Gets the X variables
X <- cbind(rep(1, nrow(df)), X) # adds column for the constant
hat <- diag(X %*% solve(t(X) %*% X) %*% t(X)) # formula for hat values

Теперь вычислите ваши стандартизированные отклонения отклонения:

res_man <- res_raw/sqrt(summary(modl)$dispersion * (1 - hat))

То же, что и с rstandard:

head(res_man)
        Mazda RX4     Mazda RX4 Wag        Datsun 710    Hornet 4 Drive Hornet Sportabout           Valiant 
       -0.6254171        -0.4941877        -1.4885771         0.2297471         0.7217423        -1.1790097 
head(res_std)
        Mazda RX4     Mazda RX4 Wag        Datsun 710    Hornet 4 Drive Hornet Sportabout           Valiant 
       -0.6254171        -0.4941877        -1.4885771         0.2297471         0.7217423        -1.1790097 
...