`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
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