2017-08-03 3 views
3

La tête de la fonction predict.lm estArgument en fonction `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, ...) 

Je vais avoir du mal à comprendre comment certains l'argument pred.var = res.var/weights est évalué. Je sais que cela représente la variance des résidus, mais elle est transmise en tant que variable comme oposed à une chaîne de caractères où il pourrait être lu et traduit plus tard.

L'aide pour cette fonction n'est pas explicite sur ce problème, ce qui pourrait être lié à la façon dont R fonctionne réellement et pas tellement à cette fonction particulière.

Certains comment, l'argument pred.var par défaut à la variance des résidus - sd(fit$residuals)^2 - mais je ne peux pas voir comment.

Répondre

2

Ce que vous voyez ici est le mécanisme d'évaluation paresseuse de R pour les arguments de fonction. Jetez un oeil à un exemple simplifié:

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 

Le deuxième appel évidemment ne fonctionnera pas dans les langues qui évaluent les arguments immédiatement après l'appel a lieu. Au lieu de cela, R conserve simplement la "recette" y = z et ne l'évalue que lorsque y est effectivement utilisé. Bien sûr, quand j'écris cette fonction, je dois veiller à ce que z est correctement défini avant que je l'utilise y, sinon je donne une excellente occasion de me tirer une balle dans la jambe:

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 

Si vous vous demandez pourquoi cela est arrivé , c'est ainsi que fonctionne variable lookup de R (en bref, c'est le conflit involontaire avec l'environnement de niveau supérieur). Donc, la flexibilité a un prix ici. Cependant, dans le cas de predict.lm cela est plutôt pratique, car il fournit une valeur par défaut raisonnable sur place, et il est effectivement calculé beaucoup plus tard et dépend d'autres arguments.

Pour plus de détails et de possibilités, voir « évaluation paresseuse » sous-section de « Advanced R » de Hadley Wickham: http://adv-r.had.co.nz/Functions.html

+0

L'article mencioned par tonytonov sur la façon dont fonctionne recherche variable R est un incontournable. – Eduardo