2017-08-03 63 views
3

predict.lm函數的頭部是論點`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 - 但我看不出如何。

回答

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時對其進行評估。當然,當我寫這樣的功能我必須確保我之前使用yz正確定義,否則我提供了一個很好的機會,拍自己的腿:

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的情況下,這是非常方便的,因爲它在現場提供了合理的默認值,實際上它計算得更晚並且取決於其他參數。

更多細節和可能性看哈德利韋翰的「高級R」「懶惰評估」小節:http://adv-r.had.co.nz/Functions.html

+0

的文章tonytonov R上的變量查找的工作原理是必讀mencioned。 – Eduardo