2017-10-16 4 views
2

Je suis nouveau avec R et j'ai 3 modèles pour ajustement mes données comme suit:Comment tracer 3 modèles dans une figure dans R?

Modèle 1: y = a (x) + b

lm1 = lm(data$CBI ~ data$dNDVI) 

Modèle 2: y = a (x) 2 + b (x) + c

lm2 <- lm(CBI ~ dNDVI + I(dNDVI^2), data=data) 

Modèle 3: y = x (a | x | + b) -1

lm3 = nls(CBI ~ dNDVI*(a*abs(dNDVI) + b) - 1, start = c(a = 1.5, b = 2.7), data = data) 

maintenant, je voudrais tracer tous ces trois modèles en R mais je ne pouvais pas trouver le moyen de le faire, pouvez-vous s'il vous plaît m'aider? J'ai essayé avec les deux premiers modèles suivent et ça marche mais je ne sais pas comment ajouter le modèle 3 sur elle:

ggplot(data = data, aes(x = dNDVI, y = CBI)) + 
    geom_point() + 
    geom_smooth(method = lm, formula = y ~ x, size = 1, se = FALSE) + 
    geom_smooth(method = lm, formula = y ~ x + I(x^2), size = 1, se = FALSE) + 
    theme_bw() 

Je voudrais également ajouter une légende qui montre 3 couleurs ou types différents des lignes/courbes pour les 3 modèles. Pouvez-vous s'il vous plaît me guider comment le faire dans la figure?

+0

ggplot2 n'a pas de méthode pour tracer 'modèles nls' directement de' geom_smooth' (défilement vers le bas pour "méthode" http : //ggplot2.tidyverse.org/reference/geom_smooth.html). Ajuster le modèle séparément, utiliser une fonction de prédiction pour créer un jeu de données fictif représentant la ligne d'ajustement, puis tracer ces données. –

+1

Merci beaucoup donc je dois d'abord ajuster les modèles séparément puis utiliser geom_lines avec des valeurs prédites correctement? Salutations – tnbang

+0

au moins pour 'lm3', il suffit d'ajouter cette ligne à votre appel' ggplot', les autres devraient correspondre comme vous les avez tracées - cela fonctionne bien maintenant, non? –

Répondre

1

utilisant l'iris comme un ensemble factice pour représenter les trois modèles:

new.dat <- data.frame(Sepal.Length=seq(min(iris$Sepal.Length), 
         max(iris$Sepal.Length), length.out=50)) #new data.frame to predict the fitted values for each model 

m1 <- lm(Petal.Length ~ Sepal.Length, iris) 
m2 <- lm(Petal.Length ~ Sepal.Length + I(Sepal.Length^2), data=iris) 
m3 <- nls(Petal.Length ~ Sepal.Length*(a*abs(Sepal.Length) + b) - 1, 
     start = c(a = 1.5, b = 2.7), data = iris) 

new.dat$m1.fitted <- predict(m1, new.dat) 
new.dat$m2.fitted <- predict(m2, new.dat) 
new.dat$m3.fitted <- predict(m3, new.dat) 

new.dat <- new.dat %>% gather(var, val, m1.fitted:m3.fitted) #stacked format of fitted data of three models (to automatically generate the legend in ggplot) 


ggplot(new.dat, aes(Sepal.Length, val, colour=var)) + 
     geom_line() 

enter image description here

+1

Salut, Adam Quek. Merci beaucoup pour votre aide avec les codes. Je l'essaie maintenant. Cheers – tnbang

+1

Je cours le dernier modèle et trouvé l'erreur comme suit: > lm3 <- nls (CBI ~ dBAI * (a * abs (dBAI) + b)^- 1, + début = c (a = 1.5, b = 2,7), données = données) Erreur dans nls (CBI ~ dBAI * (a * abs (dBAI) + b)^- 1, début = c (a = 1,5, b = 2,7),: gradient singulier J'ai lu tout cet après-midi comment définir les valeurs de départ et essayer des centaines de fois mais je n'ai pas eu de chance pour ça Pensez-vous qu'il y a de toute façon pour corriger ça pls? Merci – tnbang

+1

Voici un post plutôt [informatif] (https://stats.stackexchange.com/questions/160552/why-is-nls-giving-me-singular-gradient-matrix-at-initial-parameter-estimates) Malheureusement, je ne pourrais pas vous aider plus sans savoir quelles sont vos données est sur et ce que vos données la structure/les gammes sont. –