GAM problems

Enrico Toffalini

Età e Tempo: effetti (non)lineari?

Misure ripetute per soggetto, l’età ha ragionevolmente ruolo non-lineare

library(mgcv)

gamm(score ~ s(Age, by=area), random=list(ID=~1), data=d)

Età e Tempo: effetti (non)lineari?

Misure ripetute per soggetto, il tempo potrebbe avere effetto non-lineare

gamm(score ~ s(Age, by=area) + s(Year, by=area), random=list(ID=~1), data=d)

Smoothers

  • s() defines smooth terms within gam formula
    • example: gam(y ~ s(x), data=df)
  • te() and ti() define tensor product smooth or (only) interaction on in gam formula
    • example: gam(y ~ te(x, z), data=df)
    • example: gam(y ~ ti(x, z), data=df)
  • t2() define alternative (to t2()) tensor product smooths in gam formula
    • example: gam(y ~ t2(x, z), data=df)

Basis types

Smoother s() has default argument bs = "tp" (thin plate regression spline), but there are alternative options:

  • "cr": cubic regression spline

  • "cs": cubic regression spline with shrinkage

  • "cc": periodic/cyclic cubic regression spline

  • "ts": for t.p.r.s. with extra shrinkage

  • "ad": adaptive smooth

  • "ps": penalized splines

Basis types

fit = gam(y ~ s(x), data=df) `

Basis types

fit = gam(y ~ s(x, bs="cs"), data=df)

Basis types

fit = gam(y ~ s(x, bs="ps"), data=df)

Basis types

fit = gam(y ~ s(x, bs="ad"), data=df)

Balancing overfitting and underfitting (?)

Due parametri sono regolarti di default da gam ma sembrano particolarmente di interesse per regolare underfitting e overfitting:

  • k (basis dimension): flessibilità dello smoother; numero di basis function (?) (alto overfitta?)
    • default è 10
  • sp (smoothing parameter \(\lambda\)): parametro di penalizzazione della complessità (basso overfitta)
    • aggiustato via ottimizzazione del valore di gcv.ubre (Generalized Cross-Validation Un-Biased Risk Estimator)

gam(y ~ s(x, k=3), data=df) # basso k

gam(y ~ s(x, k=100), data=df) # alto k

Diverso smoothing per diversi valori di k

gam(y ~ s(x, sp=50), data=df) # alto sp (\(\lambda\))

gam(y ~ s(x, sp=0), data=df) # basso sp (\(\lambda\))

Diverso smoothing per diversi valori di sp (\(\lambda\))

sp (\(\lambda\)) è automaticamente settato per minimizzare il Generalized Cross-Validation Un-Biased Risk Estimator

Se l’effetto è lineare, mi aspetto che gam lo prediliga

gam(y ~ s(x), data=df)

Se l’effetto è lineare, mi aspetto che gam lo prediliga

Non sempre! Risultato su 25 iterazioni

Se l’effetto è lineare, mi aspetto che gam lo prediliga

Quanto spesso overfitta? Risultati su 10,000 iterazioni per condizione

Overfitting modesto (\(\lambda < 10\))

         b=0 b=0.2 b=0.5
N = 20  0.40  0.39  0.40
N = 40  0.39  0.40  0.39
N = 80  0.36  0.38  0.37
N = 100 0.37  0.36  0.36
N = 200 0.34  0.34  0.34
N = 500 0.29  0.29  0.29

Overfitting spinto (\(\lambda < 1\))

         b=0 b=0.2 b=0.5
N = 20  0.25  0.26  0.26
N = 40  0.23  0.24  0.23
N = 80  0.21  0.21  0.21
N = 100 0.20  0.20  0.20
N = 200 0.18  0.17  0.18
N = 500 0.14  0.14  0.14

(L’overfitting è tanto maggiore quanto più piccolo è il campione)

Tipica distribuzione dell’sp (\(\lambda\)) scelto 🤔

L’effetto vero è lineare (N = 40, b = 0.2), dovrebbe essere sp \((\lambda) → \infty\)

Esempio: continuità e discontinuità

Casi e controlli in un disturbo del neurosviluppo sono popolazioni separate o parte di un unico continuum dimensionale?

  • Abbiamo casi e controlli che variano sia sul punteggio della sintomatologia clinica che su una rilevante dimensione correlata (GCC). La continuità delle relazioni tra le variabili implicate è segnale che i soggetti si collocano lungo un unico continuum vs siano categorie separate.

  • Questo “approccio” è alla base della taxometric analysis, che però qui è inapplicabile: il base rate del disturbo è troppo basso (<5%) per avere un campione sufficiente senza artificial admixture (canali di reclutamento separati per casi e controlli, che rendono inapplicabile la taxometric analysis).

  • L’indagine diretta della continuità delle relazioni, però, resta possibile. A causa delle proprietà psicometriche degli strumenti, anticipiamo già che le relazioni, pur continue, potrebbero NON essere lineari.

Esempio: continuità e discontinuità

Appropriato per i gam?

Esempio: continuità e discontinuità

gam(GCC ~ s(TraitA, by=Gruppo), data=df) # AIC = 3281.452

Esempio: continuità e discontinuità

gam(GCC ~ s(TraitA), data=df) # AIC = 3280.403

Esempio: continuità e discontinuità

Scatter plot, caso B

Esempio: continuità e discontinuità

gam(GCC ~ s(TraitB, sp=0.2, by=Gruppo), data=df) # AIC = 3011.457

Esempio: continuità e discontinuità

gam(GCC ~ s(TraitB, by=Gruppo), data=df) # AIC = 3003.582

Esempio: continuità e discontinuità

gam(GCC ~ s(TraitB), data=df) # AIC = 3007.55

Esempio: continuità e discontinuità

gam(GCC ~ te(TraitB, TraitA, by=Gruppo), data=df) # AIC = 4140.410

Esempio: continuità e discontinuità

gam(GCC ~ te(TraitB, TraitA), data=df) # AIC = 4136.337