2017-06-02 1 views
0

Je voudrais ajuster le modèle au niveau du facteur et utiliser le nom de modèle ajusté à la volée pour prédire de nouvelles données à un tel niveau de facteur d'appariement. J'échoue dans la prédiction de cette logique, quelqu'un peut-il nous guider dans ce cas?ajuster et prédire le modèle au niveau du facteur dans r

Aa <- data.frame(amount=c(1,2,1,2,1,1,2,2,1,1,1,2,2,2,1), cat1=sample(letters[21:24], 15,rep=TRUE),cat2=sample(letters[11:18], 5,rep=TRUE), 
        card=c("a","b","c","a","c","b","a","c","b","a","b","c","a","c","a"), delay=sample(c(1,1,0,0,0),5,rep=TRUE)) 

ModelFit<-sapply(as.character(unique(Aa[["card"]])), function(x)glm(delay~amount+cat1+cat2, family = "binomial", data = subset(Aa, card==x)), simplify = FALSE, USE.NAMES = TRUE) 

Bb<-Aa[-(which(names(Aa) %in% "delay"))] 

sapply(unique(Aa[["card"]]), function(x,y) predict(seq_along(x=ModelFit), newdata=DataOPEN[DataOPEN$SubsidiaryName],type="response")) 
+0

Pourquoi délai vous convient pas '~ (montant + cat1 + cat2) * card' au lieu de boucle? – Roland

Répondre

0

J'ai fait ceci dans une boucle pour la simplicité. La prédiction lance un avertissement, mais semble fonctionner. Votre jeu de données DataOPEN n'a pas été fourni, donc je viens de calculer la prédiction en utilisant l'Aa d'origine (nouvelle colonne pred). Une version arrondie finale de la prédiction est affichée dans la colonne pred.round.

Aa <- data.frame(amount=c(1,2,1,2,1,1,2,2,1,1,1,2,2,2,1), cat1=sample(letters[21:24], 15,rep=TRUE),cat2=sample(letters[11:18], 5,rep=TRUE), 
        card=c("a","b","c","a","c","b","a","c","b","a","b","c","a","c","a"), delay=sample(c(1,1,0,0,0),5,rep=TRUE)) 

ModelFit <- sapply(as.character(unique(Aa[["card"]])), function(x)glm(delay~amount+cat1+cat2, family = "binomial", data = subset(Aa, card==x)), simplify = FALSE, USE.NAMES = TRUE) 

Aa$pred <- NaN # create a new variable for prediction 

for(i in levels(Aa$card)){ 
    newdat <- subset(Aa, subset=card==i) 
    newdat$pred <- predict(ModelFit[[i]], newdata=newdat,type="response") 
    Aa$pred[match(rownames(newdat), rownames(Aa))] <- newdat$pred 
} 

Aa$pred.round <- round(Aa$pred) # a rounded prediction 
Aa 

La sortie:

> Aa 
    amount cat1 cat2 card delay   pred pred.round 
1  1 u p a  0 1.170226e-09   0 
2  2 x o b  1 1.000000e+00   1 
3  1 x o c  0 2.143345e-11   0 
4  2 w m a  0 1.170226e-09   0 
5  1 v n c  0 2.143345e-11   0 
6  1 x p b  0 5.826215e-11   0 
7  2 u o a  1 5.000000e-01   0 
8  2 x o c  0 2.143345e-11   0 
9  1 w m b  0 5.826215e-11   0 
10  1 w n a  0 1.170226e-09   0 
11  1 w p b  0 5.826215e-11   0 
12  2 w o c  1 1.000000e+00   1 
13  2 u o a  0 5.000000e-01   0 
14  2 u m c  0 2.143345e-11   0 
15  1 w n a  0 1.170226e-09   0 
+0

Merci Marc! J'ai pris le temps de vérifier avec mon concept que j'ai introduit "NA" pour tous les nouveaux niveaux de variables "cat2" de newdataset (pour prédire), il fonctionne bien pour les petites. Laissez-moi vérifier mon grand ensemble de données aussi! à votre santé! – corps