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
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)
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)
s() defines smooth terms within gam formula
gam(y ~ s(x), data=df)te() and ti() define tensor product smooth or (only) interaction on in gam formula
gam(y ~ te(x, z), data=df)gam(y ~ ti(x, z), data=df)t2() define alternative (to t2()) tensor product smooths in gam formula
gam(y ~ t2(x, z), data=df)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
fit = gam(y ~ s(x), data=df) `
fit = gam(y ~ s(x, bs="cs"), data=df)
fit = gam(y ~ s(x, bs="ps"), data=df)
fit = gam(y ~ s(x, bs="ad"), data=df)
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?)
10sp (smoothing parameter \(\lambda\)): parametro di penalizzazione della complessità (basso overfitta)
gcv.ubre (Generalized Cross-Validation Un-Biased Risk Estimator)gam(y ~ s(x, k=3), data=df) # basso kgam(y ~ s(x, k=100), data=df) # alto kkgam(y ~ s(x, sp=50), data=df) # alto sp (\(\lambda\))gam(y ~ s(x, sp=0), data=df) # basso sp (\(\lambda\))sp (\(\lambda\))sp (\(\lambda\)) è automaticamente settato per minimizzare il Generalized Cross-Validation Un-Biased Risk Estimatorgam lo prediligagam(y ~ s(x), data=df)gam lo prediligagam lo prediligaQuanto 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)
sp (\(\lambda\)) scelto 🤔L’effetto vero è lineare (N = 40, b = 0.2), dovrebbe essere sp \((\lambda) → \infty\)
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.
Appropriato per i gam?
gam(GCC ~ s(TraitA, by=Gruppo), data=df) # AIC = 3281.452
gam(GCC ~ s(TraitA), data=df) # AIC = 3280.403
Scatter plot, caso B
gam(GCC ~ s(TraitB, sp=0.2, by=Gruppo), data=df) # AIC = 3011.457
gam(GCC ~ s(TraitB, by=Gruppo), data=df) # AIC = 3003.582
gam(GCC ~ s(TraitB), data=df) # AIC = 3007.55
gam(GCC ~ te(TraitB, TraitA, by=Gruppo), data=df) # AIC = 4140.410
gam(GCC ~ te(TraitB, TraitA), data=df) # AIC = 4136.337