根据您的问题,很难完全理解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
我猜一旦涉及到二元结果等,就会更加复杂。
计算标准差残差的公式
使用 rstandard
方法,从 glm
中计算标准化差异残差。
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))
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")])
X <- cbind(rep(1, nrow(df)), X)
hat <- diag(X %*% solve(t(X) %*% X) %*% t(X))
现在计算您的标准偏差残差:
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
deviance
,还有pearson
、working
、response
和partial
)吗?我认为revoScaleR
并没有提供这些选项,但可以编写代码来计算残差。 - broti