-1

I want to achieve a GAM plot that looks like this enter image description here

Image from https://stats.stackexchange.com/questions/179947/statistical-differences-between-two-hourly-patterns/446048#446048

How can I accomplish this?

Model is

model = gam(y ~ s(t) + g, data = d)
nerd
  • 473
  • 5
  • 15

2 Answers2

4

The general way to do this is to compute model estimates (fitted values) over the range of the covariate(s) of interest for each group. The reproducible example below illustrates once way to do this using {mgcv} to fit the GAM and my {gratia} package for some helper functions to facilitate the process.

library("gratia")
library("mgcv")
library("ggplot2")

eg_data <- data_sim("eg4", n = 400,  dist = "normal", scale = 2, seed = 1)
m <- gam(y ~ s(x2) + fac, data = eg_data, method = "REML")

ds <- data_slice(m, x2 = evenly(x2, n = 100), fac = evenly(fac))
fv <- fitted_values(m, data = ds)

The last line gets you fitted values from the model at the covariate combinations specified in the data slice:

> fv                                                                          
# A tibble: 300 × 6
        x2 fac   fitted    se   lower   upper
     <dbl> <fct>  <dbl> <dbl>   <dbl>   <dbl>
 1 0.00131 1     -1.05  0.559 -2.15    0.0412
 2 0.00131 2     -3.35  0.563 -4.45   -2.25  
 3 0.00131 3      1.13  0.557  0.0395  2.22  
 4 0.0114  1     -0.849 0.515 -1.86    0.160 
 5 0.0114  2     -3.14  0.519 -4.16   -2.13  
 6 0.0114  3      1.34  0.513  0.332   2.34  
 7 0.0215  1     -0.642 0.474 -1.57    0.287 
 8 0.0215  2     -2.94  0.480 -3.88   -2.00  
 9 0.0215  3      1.54  0.473  0.616   2.47  
10 0.0316  1     -0.437 0.439 -1.30    0.424 
# … with 290 more rows
# ℹ Use `print(n = ...)` to see more rows

This object is in a form suitable for plotting with ggplot():

fv |>
  ggplot(aes(x = x2, y = fitted, colour = fac)) +
  geom_point(data = eg_data, mapping = aes(y = y), size = 0.5) +
  geom_ribbon(aes(x = x2, ymin = lower, ymax = upper, fill = fac,
                  colour = NULL),
  alpha = 0.2) +
  geom_line()

which produces

enter image description here

You can enhance and/or modify this using your ggplot skills.

The basic point with this model is that you have a common smooth effect of a covariate (here x2) plus group means (for the factor fac). Hence the curves are "parallel".

Note that there's a lot of variation around the estimated curves in this model because the simulated data are from a richer model with group-specific smooths and smooth effects of other covariates.

Gavin Simpson
  • 170,508
  • 25
  • 396
  • 453
-1

gg.bs30 <- ggplot(data,aes(x=Predictor,y=Output,col=class))+geom_point()+
  geom_smooth(method='gam',formula=y ~ splines::bs(x, 30)) + facet_grid(class ~.)
print(gg.bs30)

Code from -> https://github.com/mariocastro73/ML2020-2021/blob/master/scripts/gams-with-ggplot-classes.R

nerd
  • 473
  • 5
  • 15