2016-04-29 1 views
2

Bonjour J'utilise le paquet partykit et sa fonction cforest pour adapter un modèle. Je peux également utiliser predict pour prédire en fonction d'une trame de données à plusieurs lignes. Cependant, je ne peux pas prédire sur une base de données avec une ligne.cforest: erreur dans prédire quand newdata est une dataframe à une rangée

require('partykit') 
y <- matrix(rnorm(500*1),nrow=500,ncol=1) 
x <- matrix(rnorm(500*6),nrow=500,ncol=6) 
df <- data.frame(y=y,x=x) 
obj = cforest(y ~ ., data= df) 

#works 
predict(obj,newdata=df) 

# doesn't work 
predict(obj,newdata=df[5,]) 

#this works 
predict(obj,newdata=df[c(5,6),]) 

Le message d'erreur est:

prédire (obj, newdata = df [5,]) Erreur dans le vecteur (mode = "list", longueur = Ncol (w)): invalide ' argument 'length'

Répondre

3

Il semble y avoir un bug dans le code lorsque vous essayez de ne prévoir qu'une seule ligne. La fonction appelée est partykit:::predict.cforest. Et il y a une ligne là-dedans qui dit

return(pw[, match(fnewdata, ids)]) 

mais il devrait être

return(pw[, match(fnewdata, ids), drop=FALSE]) 

Ainsi, vous pouvez soit toujours appeler avec un plus d'une ligne, ou vous pouvez pirater la fonction (ce qui est très , très hacky et dépend de numéros de ligne dans la fonction de sorte qu'il peut se briser à l'avenir - testé avec partykit_1.0-5) comme si

mypredict <- partykit:::predict.cforest 
body(mypredict)[[c(13,3,3,3,8)]] <- quote(return(pw[, match(fnewdata, ids), drop=FALSE])) 
mypredict(obj, newdata=df[6,]) 
#   5 
# 0.04755628 

maintenant, nous avons une nouvelle fonction qui devrait gérer le cas de une ligne correctement

+2

Une solution encore meilleure est de contacter l'un des auteurs de 'partykit' (tout le monde ne regarde pas toujours SO) et leur demander d'ajouter votre correctif. Cet auteur l'a fait maintenant et la version corrigée sera bientôt disponible chez R-Forge: https://R-Forge.R-project.org/R/?group_id=261 Merci d'avoir repéré cela et suggéré la solution! –