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