我可能在这里找不到答案,因为我认为revoScaleR
软件包没有被广泛使用。
如果我使用rxGlm()
创建GLM,则可以正常工作。但是,可通过rxPredict()
获得的模型残差似乎只是“原始”残差,即观测值减去拟合值。各种转换版本(偏差残差,皮尔逊残差等)似乎不可用。
有人知道是否有办法实现这一目标?我can通过使用glm()
(具有相同的公式,数据,错误结构,链接函数,权重)并使用residuals(glm_object, type = "deviance")
再次运行该模型,以获得模型的偏差残差(例如),但这是一个令人讨厌,因为glm()
运行非常慢(大型数据集,许多模型参数)。
谢谢。
编辑:包括我正在尝试遵循的文献中的本指南:
很难从您的问题中完全理解RevoScaleR
程序包在残差方面提供了什么,以及究竟需要什么残差。此外,关于残差的术语还存在一些混淆,例如here和here。
尽管如此,一些观点/看法仍可能对您有帮助。
至少我从使用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
计算标准偏差残差的公式
标准偏差残差是使用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