2017-06-21 5 views
2

Je fais un smooth.spline() fit et ensuite une prédiction avec l'ajustement. J'ai le problème que mes nouvelles données ont des NA. Maintenant, j'essaie d'obtenir des NA pour la prédiction aussi. Mais je ne comprends pas ça.prédire newdata avec NA pour smooth.splines

J'ai créé un code reproductible pour illustrer mon problème. Je veux que mes nouvelles données et mes prédictions soient de la même longueur. Je n'ai pas eu ce problème par exemple lors de l'utilisation predict avec un modèle loess. Il met automatiquement NA à y si x est NA. J'ai vu cette question pour la prédiction d'autres modèles (lm, glm, ..) mais les réponses en réglant na.action=na.exclude ne fonctionnent pas pour moi.

x <- c(1:5, NA, 7:12, NA, 15:19, 22:23) 
y <- rnorm(length(x)) 
y[which(is.na(x))] <-NA 
length(y) #20 

x.new <- c(x[1:18],20,21,x[19:20]) 
length(x.new) #22 

spl <- smooth.spline(x=x[!is.na(y)], y=y[!is.na(y)], spar=0.001) 
spl.pr <- predict(spl, x=x.new[!is.na(x.new)], na.action=na.exclude) 
length(spl.pr$y) #20 

Ma commande aussi prédire ne fonctionnera pas si je n'exclus pas NAs droit à l'intérieur du predict Par ex :

> spl.pr <- predict(spl, x=x.new, na.action=na.exclude) 
Error in double(n) : vector size cannot be NA 

J'espère avoir rendu mon problème compréhensible. L'aide sera très appréciée. Merci

Répondre

2

predict se comporte différemment pour différentes classes de modèles. Il n'y a pas de na.action pour stats:::predict.smooth.spline et stats:::predict.smooth.spline.fit. Donc, vous devez prédire à des valeurs non NA seulement.

spl.pr <- rep(NA, length(x.new)) 
spl.pr[!is.na(x.new)] <- predict(spl, x = x.new[!is.na(x.new)])$y 

Notez que spl.pr n'est pas une liste avec $x et $y, mais un vecteur numérique.


Ok je me doutais que. J'étais incertain cependant parce que je n'ai pas reçu un message d'erreur en utilisant na.action = na.exclude dans la commande. Votre façon de procéder recommandée fonctionne bien, merci!

@Katharina Haha, vous n'avez pas erreur parce qu'il ya un argument ... en fonction predict(). Donc, fondamentalement, vous pouvez passer n'importe quel argument non utilisé. Essayez ceci

predict(spl, x = 5, this.answer.is.useful = TRUE) 

Amusez-vous!

+0

Ok, je m'en doutais. Je n'étais pas sûr cependant parce que je n'ai pas reçu un message d'erreur en utilisant 'na.action = na.exclude' dans la commande. Votre façon de procéder recommandée fonctionne bien, merci! (J'ai voté pour votre réponse, malheureusement, elle ne s'affiche pas en public tant que je n'ai pas gagné un certain nombre de badges- 10 Je pense, edit: ça a l'air de marcher maintenant) – Katharina