2017-06-29 6 views
0

Je voudrais ajuster les données et prédire les valeurs y pour une plage x plus large.Prédire pour une plage plus large

laisse supposer que j'ai données 'iris de définir et utiliser les données suivantes pour la prédiction de ce post

library(dplyr) 
cc <- iris %>% 
    group_by(Species) %>% 
    do({ 
    mod <- nlsLM(Sepal.Length ~ k*Sepal.Width/2+U, start=c(k=10,U=5), data = ., trace=F, control = nls.lm.control(maxiter=100)) 
    pred <- predict(mod, newdata =.["Sepal.Width"]) 
    data.frame(., pred) 
    }) 

C'est le terrain de montage

enter image description here

Je veux adapter ces données avec plus large Sepal width gamme telle que

new.range<- data.frame(x=seq(2,10,length.out=20)) 

et modifier le script

pred <- predict(mod, newdata =new.range) 

à tracer new.range raccord

library(ggplot2) 

ggplot(cc,aes(y=Sepal.Length,x=Sepal.Width ,col=factor(Species)))+ 
    geom_point()+ 
    facet_wrap(~Species)+ 
    geom_line(aes(x=new.range,y=pred),size=1) 

Error in (fonction (..., row.names = NULL, check.rows = FALSE, check.names = TRUE,: les arguments impliquent des nombres de lignes: 20, 150

Je ne peux pas comprendre pourquoi obtenir cette Erreur. Je suppose que pred est calculé à partir de new.range alors ils devraient avoir la même longueur?

messages similaires

using-predict-in-nls

trouble-with-predict-function-in-r

predict-maybe-im-not-understanding-it?

+0

Avez-vous besoin d'appeler 'cc $ mod' au lieu de mod? – troh

+0

@troh Quand j'ai essayé cc $ mod, 'Erreur dans prédire (mod, newdata = new.range): objet 'mod' non trouvé' – Alexander

Répondre

1

C'est quelque chose qui permet d'atteindre ce que vous voulez. La cause de votre problème d'origine est que dans votre régression, le nom du prédicteur est Sepal.width pas , et votre prédiction n'utilise pas votre new.range du tout, donc vous devez faire quelque chose comme new.range<- data.frame(Sepal.Width=seq(2,10,length.out=50)) pour faire des prédictions sur votre new.range.

Un autre problème est que vous devez faire la longueur de la new.range à 50, de sorte que la pred et new.range ajustement dans le data.frame d'origine.

Et puis vous pouvez dessiner l'intrigue que vous voulez, notez que le new.range devient Sepal.Width.1.

library(dplyr) 
cc <- iris %>% 
    group_by(Species) %>% 
    do({ 
     mod <- nlsLM(Sepal.Length ~ k*Sepal.Width/2+U, start=c(k=10,U=5), data = ., trace=F, control = nls.lm.control(maxiter=100)) 
     new.range<- data.frame(Sepal.Width=seq(2,10,length.out=50)) 
     pred <- predict(mod, newdata =new.range) 
     # pred <- predict(mod, newdata =.["Sepal.Width"]) 
     data.frame(., new.range, pred) 

    }) 

library(ggplot2) 

ggplot(cc,aes(y=Sepal.Length,x=Sepal.Width ,col=factor(Species)))+ 
    geom_point()+ 
    facet_wrap(~Species)+ 
    geom_line(aes(x=Sepal.Width.1,y=pred),size=1) 
+0

Merci pour la bonne réponse. OTH, Dans mes données réelles, la longueur de chaque groupe est différente! Dans l'ensemble de données «iris», chaque espèce a 50 rangées. C'est bien quand nous définissons length.out = 50. Cependant, dans mes données réelles, il y a des groupes avec la taille de ligne 100 ou 160. Donc je ne peux pas utiliser le même paramètre 'longueur.out' pour eux. Avez-vous des suggestions pour cela? – Alexander

+1

@Alexander De rien. Si la taille de la ligne est différente, vous pouvez remplacer 50 par 'nrow (.)', Ce qui devrait fonctionner. – Consistency

+0

Merci encore. Ça a bien marché! – Alexander