`predict.lm`函数中的参数

时间:2017-08-03 09:48:58

标签: r arguments prediction

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 - 但我看不出如何。

1 个答案:

答案 0 :(得分: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只保留“配方”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的“高级R”的“懒惰评估”小节:http://adv-r.had.co.nz/Functions.html