Search code examples
rggplot2lmgam

Plotting multiple lm() models in one plot


I have fitted 6 lm() models and 1 gam() model on the same dataset.

Now I want to plot them all in one plot on top of each other. Can I do this without defining the models again in ggplot?

My case is this

I have

model1 <- lm(y~1, data = data) %>% coef()
model2 <- lm(y~x, data = data) %>% coef()
model3 <- lm(y~abs(x), data = data) %>% coef()
...
model7 <- gam(y~s(x), data = data) %>% coef()

can I feed the stored coefficients of my models to ggplot?

ggplot(data, mapping = aes(x = x, y = y)) +
geom_point() +
geom_abline(model1) +
geom_abline(model2) +
....

Or do Is the only way to plot the model prediction lines to manualy fill out the parameters like this:

ggplot(data, mapping = aes(x = x, y = y)) +  
  geom_point() +  
  geom_abline(intercept = model1[1]) +  
  geom_abline(slope = model2[2], intercept = model2[1]) +  
  geom_abline(slope = model3[2], intercept = model3[1]) +  
  ...

Example code

set.seed(123)
x <- rnorm(50)
y <- rweibull(50,1)
d <- as.data.frame(cbind(x,y))
model1 <- coef(lm(y~1, data = d))
model2 <- coef(lm(y~x, data = d))
model3 <- coef(lm(y~abs(x), data = d))

Including the SE for each line/model and a legend would be welcome as well.


Solution

  • In order for this to work, you really need to save the whole model. So if we assume you have the entire model

    # set.seed(101) used for sample data
    model1 <- lm(y~1, data = d)
    model2 <- lm(y~x, data = d)
    model3 <- lm(y~abs(x), data = d)
    

    We can write a helper function to predict new values from these models over a the given range of x values. Here's such a function

    newvalsforx <- function(x) {
      xrng <- seq(min(x), max(x), length.out=100)
      function(m) data.frame(x=xrng, y=predict(m, data.frame(x=xrng)))
    }
    pred <- newvals(d$x)
    

    This pred() will make predictions from the models over the observed range of x. We can then use these as new data to pass to geom_lines that we can add to a plot. For example

    ggplot(d, aes(x,y)) +
      geom_point() + 
      geom_line(data=pred(model1), color="red") + 
      geom_line(data=pred(model2), color="blue") + 
      geom_line(data=pred(model3), color="green")
    

    This gives me

    multi-predict plot