ggplot2如何找到存储lm对象的残差和拟合值?

问题描述 投票:0回答:2

我通常使用

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

r ggplot2 linear-regression
2个回答
5
投票

无论在 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

现在该数据集是用于绘图的数据集。


0
投票

这些可能与

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()
© www.soinside.com 2019 - 2024. All rights reserved.