`predict.lm`函数中的参数问题

3
<代码>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个回答

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时才对其进行评估。当然,当我编写这样的函数时,我必须确保在使用y之前正确定义了z,否则我会给自己提供一个极好的机会,让自己受伤。
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 的 变量查找 工作方式(简而言之,与顶层环境的意外冲突)。所以这里的灵活性是有代价的。
然而,在 predict.lm 的情况下,这相当方便,因为它提供了一个合理的默认值,并且实际上是在后面计算的,依赖于其他参数。
有关更多细节和可能性,请参见 Hadley Wickham 的 "Advanced R" 中的 "Lazy evaluation" 子部分:http://adv-r.had.co.nz/Functions.html

tonytonov提到的关于R变量查找机制如何工作的文章是必读之物。 - Eduardo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接