我通常使用
broom::augment()
创建 .fitted
和 .resid
列,然后可以绘制它们。偶然我使用了非增强模型对象,但仍然得到了一个根据我的理解不应该工作的图。 ggplot2 在哪里找到 .resid
和 .fitted
?
mod <- lm(Ozone ~ Solar.R + Wind + Temp, data = airquality)
mod$`.resid`
#> NULL
mod$`.fitted`
#> NULL
library(ggplot2)
ggplot(mod, aes(x = .fitted, y = .resid)) + geom_point()
创建于 2024-02-01,使用 reprex v2.1.0
无论在 ggplot 中传递什么,在绘图完成之前都会首先传递到函数
fortify
中。看一下下面的 ggplot 函数:
ggplot2:::ggplot.default
function (data = NULL, mapping = aes(), ..., environment = parent.frame())
{
if (!missing(mapping) && !inherits(mapping, "uneval")) {
cli::cli_abort(c("{.arg mapping} should be created with {.fn aes}.",
x = "You've supplied a {.cls {class(mapping)[1]}} object"))
}
data <- fortify(data, ...)
....
Th 函数
fortify
是通用的,它确实包含线性模型对象的方法,其定义如下:
ggplot2:::fortify.lm
function (model, data = model$model, ...)
{
infl <- stats::influence(model, do.coef = FALSE)
data$.hat <- infl$hat
data$.sigma <- infl$sigma
data$.cooksd <- stats::cooks.distance(model, infl)
data$.fitted <- stats::predict(model)
data$.resid <- stats::resid(model)
data$.stdresid <- stats::rstandard(model, infl)
data
}
注意 fortify 如何创建所有变量:
例如
head(fortify(lm(Ozone ~ Solar.R + Wind + Temp, data = airquality)))
Ozone Solar.R Wind Temp .hat .sigma .cooksd .fitted .resid .stdresid
1 41 190 7.4 67 0.04213526 21.26578 1.619281e-03 33.045483 7.9545175 0.38372526
2 36 118 8.0 72 0.02386496 21.28020 1.399323e-05 34.998710 1.0012902 0.04784798
3 12 149 12.6 74 0.01493584 21.24339 1.410343e-03 24.822814 -12.8228139 -0.60997176
4 18 313 11.5 62 0.07184509 21.28037 1.049577e-05 18.475226 -0.4752262 -0.02328889
7 23 299 8.6 65 0.06645355 21.26005 3.644684e-03 32.261431 -9.2614315 -0.45255232
8 19 99 13.8 59 0.04581198 21.12342 1.888167e-02 -6.949919 25.9499188 1.25423141
现在该数据集是用于绘图的数据集。
这些可能与
fitted.values
和 residuals
相同,只是在更深的环境中。
data("airquality")
mod <- lm(Ozone ~ Solar.R + Wind + Temp, data = airquality)
mod$residuals
# These produce the same plot
ggplot(mod, aes(x = .fitted, y = .resid)) + geom_point()
ggplot(mod, aes(x = mod$fitted.values, y = mod$residuals)) + geom_point()