2016-08-28 1 views
-1

J'ai essayé de me prouver que predict() ne donnera pas de prédictions incorrectes, lorsque les étiquettes et les niveaux (l'entier sous-jacent pour le niveau de facteur) de newdata ne correspondent pas à ceux des données de train.R predict.glm lorsque newdata a moins de niveaux

Je pense que je l'ai prouvé, et je partage ce code ci-dessous, mais je voudrais juste demander ce que fait exactement R lors de la prédiction pour newdata. Je sais qu'il n'attribue pas newdata à la formation des données, traduit-il les étiquettes de facteurs de newdata dans la représentation correspondante des données de train avant de les prédire?

options(stringsAsFactors = TRUE) 
dat <- data.frame(x = rep(c("cat", "dog", "bird", "horse"), 100), y = rgamma(100, shape=3, scale = 300)) 
model <- glm(y~., family = Gamma(link = "log"), data = dat) 

coefficients(model) 
# (Intercept)  xcat  xdog  xhorse 
# 6.5816536 0.2924488 0.3586094 0.2740487 

newdata1 <- data.frame(x = "cat") 
newdata2 <- data.frame(x = "bird") 
newdata3 <- data.frame(x = "dog") 

predict.glm(object = model, newdata = newdata1, type = "response") 
#  1 
# 966.907 
exp(6.5816536 + 0.2924488) #intercept + cat coef 
# [1] 966.9071 

predict.glm(object = model, newdata = newdata2, type = "response") 
#  1 
# 721.7318 
exp(6.5816536) 
# [1] 721.7318 

predict.glm(object = model, newdata = newdata3, type = "response") 
#  1 
# 1033.042 
exp(6.5816536 + 0.3586094) 
# [1] 1033.042 

unclass(dat$x) 
# [1] 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 
# [87] 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 
# [173] 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 
# [259] 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 
# [345] 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 2 3 1 4 
# attr(,"levels") 
# [1] "bird" "cat" "dog" "horse" 

unclass(newdata1$x) 
# [1] 1 
# attr(,"levels") 
# [1] "cat" 

unclass(newdata2$x) 
# [1] 1 
# attr(,"levels") 
# [1] "bird" 

Répondre

3

L'objet du modèle a un niveau de facteur d'enregistrement xlevels utilisé pour l'estimation du modèle. Pour votre exemple, nous avons:

model$xlevels 
#$x 
#[1] "bird" "cat" "dog" "horse" 

Lorsque vos nouvelles données sont présentées dans la prévision, les niveaux de facteur seront appariés. Par exemple, votre newdata1 sera apparié aux niveaux "chat", et c'est le deuxième niveau en xlevels. Ainsi, prédire n'aura aucune difficulté à trouver les coefficients corrects pour ce niveau.

+0

Merci - n'a pas pu trouver comment accepter la réponse, mais c'est ce dont j'avais besoin. – mb158127