`predict.lm` 函数中的参数

Argument in `predict.lm` function

predict.lm函数的头部是

predict.lm <- function (object, newdata, se.fit = FALSE, scale = NULL, df = Inf,
                        interval = c("none", "confidence", "prediction"), level = 0.95,
                        type = c("response", "terms"), terms = NULL, na.action = na.pass,
                        pred.var = res.var/weights, weights = 1, ...)

我无法理解参数 pred.var = res.var/weights 的计算方式。

我知道它代表残差的方差,但它是作为变量传递的,而不是字符串,以后可以在其中读取和翻译它。

这个函数的帮助没有明确说明这个问题,我认为这可能与 R 的实际工作方式有关,而不是与这个特定函数有关。

有些方法,参数 pred.var 将默认为残差的方差 - sd(fit$residuals)^2 - 但我看不出如何。

您在这里看到的是 R 的函数参数惰性求值机制。看一个简化的例子:

lazy_arg <- function(x, y = z) {
    z <- sum(x * x)
    x / y
}
lazy_arg(1:5, y = 10)
#[1] 0.1 0.2 0.3 0.4 0.5
lazy_arg(1:5)
#[1] 0.01818182 0.03636364 0.05454545 0.07272727 0.09090909

第二次调用显然不适用于在调用发生后立即计算参数的语言。相反,R 仅保留 "recipe" y = z 并仅在实际使用 y 时对其进行评估。当然,当我写这样的函数时,我必须确保 z 在我使用 y 之前被正确定义,否则我提供了一个很好的机会来射击自己的腿:

bad_arg <- function(x, y = z) {
    if (runif(1) > 0.5) z <- 1
    x / y
}

set.seed(112)
z <- 1e5
bad_arg(1:5)
#[1] 1e-05 2e-05 3e-05 4e-05 5e-05
bad_arg(1:5)
#[1] 1 2 3 4 5

如果您想知道为什么会发生这种情况,这就是 R 的 variable lookup 的工作方式(简而言之,这是与顶级环境的意外冲突)。所以这里的灵活性是有代价的。

然而,在 predict.lm 的情况下,这非常方便,因为它当场提供了一个合理的默认值,而且它实际上是在很晚的时候计算的,并且取决于其他参数。

有关更多详细信息和可能性,请参阅 Hadley Wickham 的 "Advanced R" 的 "Lazy evaluation" 小节:http://adv-r.had.co.nz/Functions.html