tnbang
tnbang

Reputation: 39

How to plot 3 models in one Figure in R?

I'm new with R and I have fit 3 models for my data as follows:

Model 1: y = a(x) + b

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

Model 2: y = a(x)2 + b(x) + c

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

Model 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)

Now I would like to plot all these three models in R but I could not find the way to do it, can you please help me? I have tried with the first two models as follow and it work but I don't know how to add the Model 3 on it:

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()

I also would like to add a legend which show 3 different colours or types of lines/curves for the 3 models as well. Can you please guide me how to make it in the figure?

Upvotes: 2

Views: 890

Answers (1)

Adam Quek
Adam Quek

Reputation: 7163

Using iris as a dummy set to represent the three models:

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

Upvotes: 1

Related Questions