Diversi modi di modellare le interazioni tra predittori continui e categorici in GAM


8

La seguente domanda si basa sulla discussione trovata in questa pagina . Data una variabile di risposta y, una variabile esplicativa continua xe un fattore fac, è possibile definire un General Additive Model (GAM) con un'interazione tra xe facusando l'argomento by=. Secondo il file di aiuto ?gam.models nel pacchetto R mgcv, questo può essere realizzato come segue:

gam1 <- gam(y ~ fac +s(x, by = fac), ...)

@GavinSimpson qui suggerisce un approccio diverso:

gam2 <- gam(y ~ fac +s(x) +s(x, by = fac, m=1), ...)

Ho giocato con un terzo modello:

gam3 <- gam(y ~ s(x, by = fac), ...)

Le mie domande principali sono: alcuni di questi modelli sono sbagliati o sono semplicemente diversi? In quest'ultimo caso, quali sono le loro differenze? Sulla base dell'esempio di cui parlerò di seguito, penso di poter comprendere alcune delle loro differenze, ma mi manca ancora qualcosa.

Ad esempio, userò un set di dati con spettri di colore per fiori di due diverse specie di piante misurati in posizioni diverse.

rm(list=ls())
# install.packages("RCurl")
library(RCurl) # allows accessing data from URL
df <- read.delim(text=getURL("https://raw.githubusercontent.com/marcoplebani85/datasets/master/flower_color_spectra.txt"))
library(mgcv)

Per chiarezza, ogni riga nella figura sopra rappresenta lo spettro cromatico medio previsto per ogni posizione con una GAM di forma separata density~s(wl)basata su campioni di ~ 10 fiori. Le aree grigie rappresentano il 95% di CI per ogni GAM.

Il mio obiettivo finale è quello di modellare l'effetto (potenzialmente interattivo) Taxone la lunghezza d'onda wlsulla riflettanza (indicata come densitynel codice e nel set di dati), tenendo conto Localitycome un effetto casuale in una GAM ad effetti misti. Per il momento non aggiungerò la parte con effetti misti al mio piatto, che è già abbastanza pieno nel cercare di capire come modellare le interazioni.

Inizierò con il più semplice dei tre giochi interattivi:

gam.interaction0 <- gam(density ~ s(wl, by = Taxon), data = df) 
# common intercept, different slopes
plot(gam.interaction0, pages=1)

inserisci qui la descrizione dell'immagine

summary(gam.interaction0)

produce:

Family: gaussian 
Link function: identity 

Formula:
density ~ s(wl, by = Taxon)

Parametric coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  28.3490     0.1693   167.4   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

Approximate significance of smooth terms:
                      edf Ref.df     F p-value    
s(wl):TaxonSpeciesA 8.938  8.999 884.3  <2e-16 ***
s(wl):TaxonSpeciesB 8.838  8.992 325.5  <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

R-sq.(adj) =  0.523   Deviance explained = 52.4%
GCV = 284.96  Scale est. = 284.42    n = 9918

La parte parametrica è la stessa per entrambe le specie, ma per ogni specie sono montate spline diverse. È un po 'confuso avere una parte parametrica nel riepilogo dei GAM, che non sono parametrici. @IsabellaGhement spiega:

Se osservi i grafici degli effetti di smooth (stimoli) stimati corrispondenti al tuo primo modello, noterai che sono centrati su zero. Pertanto, per ottenere le funzioni uniformi che pensavi di stimare, devi "spostare" quelle uniformi (se l'intercetta stimata è positiva) o verso il basso (se l'intercetta stimata è negativa). In altre parole, è necessario aggiungere l'intercetta stimata ai smooth per ottenere ciò che si desidera veramente. Per il tuo primo modello, si presume che lo "spostamento" sia lo stesso per entrambi i livelli.

Andare avanti:

gam.interaction1 <- gam(density ~ Taxon +s(wl, by = Taxon, m=1), data = df)
plot(gam.interaction1,pages=1)

inserisci qui la descrizione dell'immagine

summary(gam.interaction1)

dà:

Family: gaussian 
Link function: identity 

Formula:
density ~ Taxon + s(wl, by = Taxon, m = 1)

Parametric coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)    40.3132     0.1482   272.0   <2e-16 ***
TaxonSpeciesB -26.0221     0.2186  -119.1   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

Approximate significance of smooth terms:
                      edf Ref.df    F p-value    
s(wl):TaxonSpeciesA 7.978      8 2390  <2e-16 ***
s(wl):TaxonSpeciesB 7.965      8  879  <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

R-sq.(adj) =  0.803   Deviance explained = 80.3%
GCV = 117.89  Scale est. = 117.68    n = 9918

Ora, ogni specie ha anche una propria stima parametrica.

Il prossimo modello è quello che ho difficoltà a capire:

gam.interaction2 <- gam(density ~ Taxon + s(wl) + s(wl, by = Taxon,  m=1), data = df)
plot(gam.interaction2, pages=1)

inserisci qui la descrizione dell'immagine

Non ho idea chiara di cosa rappresentino questi grafici.

summary(gam.interaction2)

dà:

Family: gaussian 
Link function: identity 

Formula:
density ~ Taxon + s(wl) + s(wl, by = Taxon, m = 1)

Parametric coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)    40.3132     0.1463   275.6   <2e-16 ***
TaxonSpeciesB -26.0221     0.2157  -120.6   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

Approximate significance of smooth terms:
                      edf Ref.df     F p-value    
s(wl)               8.940  8.994 30.06  <2e-16 ***
s(wl):TaxonSpeciesA 8.001  8.000 11.61  <2e-16 ***
s(wl):TaxonSpeciesB 8.001  8.000 19.59  <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

R-sq.(adj) =  0.808   Deviance explained = 80.8%
GCV = 114.96  Scale est. = 114.65    n = 9918

La parte parametrica di gam.interaction2è più o meno la stessa di per gam.interaction1, ma ora ci sono tre stime per termini uniformi, che non posso interpretare.

Grazie in anticipo a chiunque si prenderà il tempo per aiutarmi a capire le differenze tra i tre modelli.


2
Che bel post, Marco! Se osservi i grafici degli effetti di smooth (stimoli) stimati corrispondenti al tuo primo modello, noterai che sono centrati su zero. Pertanto, per ottenere le funzioni uniformi che pensavi di stimare, devi "spostare" quelle uniformi (se l'intercetta stimata è positiva) o verso il basso (se l'intercetta stimata è negativa). In altre parole, è necessario aggiungere l'intercetta stimata ai smooth per ottenere ciò che si desidera veramente. Per il tuo primo modello, si presume che lo "spostamento" sia lo stesso per entrambi i livelli.
Isabella Ghement,

1
Quando specifichi il tuo modello, mi sembra che dovresti avere un effetto principale per Taxon, un effetto principale (regolare) per wl e un'interazione (regolare) tra Taxon e wl. Il link al post di Gavin Simpson suggerisce che è così che crea modelli di questo tipo. Sembra anche usare lo stesso valore di k per gli effetti fluidi nel modello. Di solito, se si include un termine di interazione tra due variabili predittive, è necessario includere anche gli effetti principali per tali variabili.
Isabella Ghement,

Quindi scarterei il tuo primo modello, poiché omette l'effetto principale di Taxon. Usa il suggerimento di Gavin per ottenere i principali effetti e gli effetti di interazione di cui hai bisogno (ricordando che i smoothing prodotti dal modello sono centrati su 0 per impostazione predefinita e devono essere "spostati" su o giù a seconda dei termini dell'intercetta.
Isabella Ghement,

Ciao @IsabellaGhement e grazie per il tuo feedback. Come interpreteresti il ​​fatto che il sommario (gam.interaction2) produce una stima della significatività per s (wl) relativa a ciascuna specie ma anche una per s (wl) non collegata ad alcuna specie? È l'effetto di wl sulla funzione di smoothing di y (densità nel mio caso) indipendentemente da Taxon? Viene calcolato semplicemente adattando la densità ~ s (wl)? Corro questo modello e stima un coef parametrico. molto vicino alla media del coefficiente parametrico. delle due specie e gli edf associati sono molto simili a quelli di s (wl) forniti dal sommario (gam.interaction2).
Marco Plebani,

1
I colleghi e io abbiamo un articolo in stampa (prestampa qui) che fornisce molti dettagli su questi temi. Potresti trovare utile sia per il Grokking che la gamma di modelli che possono essere montati e come scegliere tra di essi. Per me, penso che tutto ciò di cui hai bisogno qui sia qualcosa in gam1 più per l' SampleIDeffetto e in più devi fare qualcosa per il problema della varianza non costante; Questi dati non sembrano essere distribuiti in modo condizionale gaussiano a causa del limite inferiore.
Gavin Simpson,

Risposte:


1

gam1e gam2vanno bene; sono modelli diversi, anche se stanno provando a fare la stessa cosa, ovvero smooths specifici del gruppo di modelli.

Il gam1modulo

y ~ f + s(x, by = f)

lo fa stimando una distinta più distinta per ogni livello di f(supponendo che fsia un fattore standard) e, in effetti, viene stimato anche un parametro di levigatezza separato per ogni levigatura.

Il gam2modulo

y ~ f + s(x) + s(x, by = f, m = 1)

raggiunge lo stesso obiettivo di gam1(modellare la relazione regolare tra xe yper ogni livello di f) ma lo fa stimando un effetto uniforme globale o medio di xon y(il s(x)termine) più un termine di differenza regolare (il secondo s(x, by = f, m = 1)termine). Poiché la penalità qui è sulla prima derivata ( m = 1) for this difference smoother, it is penalising departure from a flat line, which when added to the global or average smooth term (s (x) `) riflette una deviazione dall'effetto globale o medio.

gam3 modulo

y ~ s(x, by = f)

è errato indipendentemente da quanto bene possa adattarsi a una situazione particolare. Il motivo per cui dico che è sbagliato è che ogni smooth specificato dalla s(x, by = f)parte è centrato su zero a causa del vincolo somma-zero imposto per l'identificabilità del modello. Come tale, non c'è nulla nel modello che rappresenti la media diYin ciascuno dei gruppi definiti da f. Esiste solo la media complessiva fornita dall'intercettazione del modello. Ciò significa che più fluido, che è centrato su zero e che ha rimosso la funzione di base piatta dall'espansione di base x(poiché è confuso con l'intercettazione del modello) è ora responsabile della modellazione della differenza nella media diYper il gruppo corrente e la media complessiva (intercettazione del modello), più l'effetto uniforme di xonY.

Nessuno di questi modelli è appropriato per i tuoi dati; ignorando per ora la distribuzione errata della risposta ( densitynon può essere negativa e c'è un problema di eterogeneità che un non gaussiano familydovrebbe risolvere o risolvere), non hai preso in considerazione il raggruppamento per fiore ( SampleIDnel tuo set di dati).

Se il tuo obiettivo è modellare Taxoncurve specifiche, un modello del modulo sarebbe un punto di partenza:

m1 <- gam(density ~ Taxon + s(wl, by = Taxon, k = 20) + s(SampleID, bs = 're'),
          data = df, method = 'REML')

dove ho aggiunto un effetto casuale SampleIDe aumentato la dimensione dell'espansione di base per gli Taxonsmooth specifici.

Questo modello m1modella le osservazioni come derivanti da un wleffetto uniforme a seconda della specie ( Taxon) da cui deriva l'osservazione (il Taxontermine parametrico imposta semplicemente la media densityper ciascuna specie ed è necessario come discusso sopra), oltre a un'intercettazione casuale. Nel loro insieme, le curve per i singoli fiori derivano da versioni spostate delle Taxoncurve specifiche, con la quantità di spostamento data dall'intercettazione casuale. Questo modello presuppone che tutti gli individui abbiano la stessa forma di liscio data dal liscio per il particolare da Taxoncui proviene il singolo fiore.

Un'altra versione di questo modello è la gam2forma dall'alto ma con un effetto casuale aggiunto

m2 <- gam(density ~ Taxon + s(wl) + s(wl, by = Taxon, m = 1) + s(SampleID, bs = 're'),
          data = df, method = 'REML')

Questo modello si adatta meglio, ma non credo che stia risolvendo affatto il problema, vedi sotto. Una cosa che penso suggerisce è che il valore predefinito kè potenzialmente troppo basso per le Taxoncurve specifiche di questi modelli . Ci sono ancora molte variazioni fluide residue che non stiamo modellando se si guardano i grafici diagnostici.

Questo modello è molto probabilmente troppo restrittivo per i tuoi dati; alcune delle curve nella trama dei singoli smooth non sembrano essere semplici versioni spostate delle Taxoncurve medie. Un modello più complesso consentirebbe anche levigature individuali. Tale modello può essere stimato utilizzando la base di interazione omogeneafs o fattore . Vogliamo ancora Taxoncurve specifiche, ma vogliamo anche avere una levigatura separata per ognuna SampleID, ma a differenza delle bylevigate, suggerirei che inizialmente si desidera che tutte quelle SampleIDcurve specifiche abbiano la stessa oscillazione. Nello stesso senso dell'intercettazione casuale che abbiamo incluso in precedenza, ilfs La base aggiunge un'intercettazione casuale, ma include anche una spline "casuale" (uso le virgolette come nell'interpretazione bayesiana della GAM, tutti questi modelli sono solo variazioni sugli effetti casuali).

Questo modello è adatto per i tuoi dati come

m3 <- gam(density ~ Taxon + s(wl, by = Taxon, k = 20) + s(wl, SampleID, bs = 'fs'), 
          data = df, method = 'REML')

Si noti che kqui ho un aumento , nel caso in cui abbiamo bisogno di una maggiore oscillazione negli smooth Taxonspecifici. Abbiamo ancora bisogno Taxondell'effetto parametrico per le ragioni spiegate sopra.

Questo modello richiede molto tempo per adattarsi a un singolo core con gam()- bam()molto probabilmente sarà meglio adattarlo a questo modello in quanto vi sono un numero relativamente elevato di effetti casuali qui.

Se confrontiamo questi modelli con una versione di AIC corretta dalla selezione dei parametri di scorrevolezza, vediamo quanto sia drammaticamente migliore quest'ultimo modello m3, viene confrontato con gli altri due anche se utilizza un ordine di grandezza più gradi di libertà

> AIC(m1, m2, m3)
          df      AIC
m1  190.7045 67264.24
m2  192.2335 67099.28
m3 1672.7410 31474.80

Se osserviamo i dettagli di questo modello, abbiamo un'idea migliore di come si adattano i dati:

inserisci qui la descrizione dell'immagine

(Nota che questo è stato prodotto usando draw(m3)la draw()funzione del mio pacchetto gratia . I colori nella trama in basso a sinistra sono irrilevanti e non aiutano qui.)

Ciascuna SampleIDcurva adattata è costruita dall'intercettazione o dal termine parametrico TaxonSpeciesBpiù uno dei due Taxonsmooth specifici, a seconda di quale appartiene Taxonciascuno SampleID, più il proprio SampleIDsmooth specifico.

Si noti che tutti questi modelli sono ancora sbagliati in quanto non tengono conto dell'eterogeneità; I modelli gamma o Tweedie con un collegamento log sarebbero le mie scelte per andare oltre. Qualcosa di simile a:

m4 <- gam(density ~ Taxon + s(wl, by = Taxon) + s(wl, SampleID, bs = 'fs'), 
          data = df, method = 'REML', family = tw())

Ma al momento sto riscontrando problemi con questo modello, il che potrebbe indicare che è troppo complesso con più smooths wlinclusi.

Una forma alternativa consiste nell'utilizzare l'approccio del fattore ordinato, che esegue una decomposizione tipo ANOVA sui smooth:

  • Taxon il termine parametrico viene mantenuto
  • s(wl)è un smooth che rappresenterà il livello di riferimento
  • s(wl, by = Taxon)avrà una differenza separata liscia per ogni altro livello. Nel tuo caso ne avrai solo una.

Questo modello è montato come m3,

df <- transform(df, fTaxon = ordered(Taxon))
m3 <- gam(density ~ fTaxon + s(wl) + s(wl, by = fTaxon) +
            s(wl, SampleID, bs = 'fs'), 
          data = df, method = 'REML')

ma l'interpretazione è diversa; il primo s(wl)farà riferimento TaxonAe il liscio implicito s(wl, by = fTaxon)sarà una differenza regolare tra il liscio per TaxonAe quello di TaxonB.


Grazie! La mia prossima domanda sarebbe stata "ma perché i riepiloghi differiscono se un fattore è ordinato o no?" ma mi hai battuto, grazie anche per quello. Nel mio set di dati ciascuno SampleIDè uno spettrogramma di un singolo fiore, ciascuno di una pianta diversa, quindi non credo che SampleIDdebba essere specificato come casuale (ma correggimi se sbaglio). Ho effettivamente usato un modello simile al tuo m3con un Taxonfattore ordinato, ma specificando + s(Locality, bs="re") + s(Locality, wl, bs="re")come casuale. Esaminerò le questioni che sollevi sulla distribuzione dei residui e sull'eteroschedasticità. Saluti!
Marco Plebani,

Includerei comunque SampleIDcome casuale i dati di un singolo fiore che potrebbero essere correlati e moreso se l'intera funzione che si riferisce al fiore, quindi in un certo senso le funzioni (levigate) sono casuali. Potresti anche aver bisogno di un semplice effetto casuale per pianta se nello studio c'erano più fiori per pianta e più piante per taxon (usa il bs = 're'"liscio" di cui ho parlato prima nella risposta.
Gavin Simpson

Quando ho provato a montare m3con family = Gamma(link = 'log')o family = tw()mi è stato sempre problemi reali con mgcv non essere in grado di trovare buoni valori iniziali e altri errori che causano mgcv di merda, che non ho ancora avuto modo di fondo del. Certamente dai dati forniti un modello gaussiano non è corretto. Ho trovato un gaussiano con log link adatto e mi ha aiutato ma non sta nemmeno catturando tutta l'eterogeneità.
Gavin Simpson,

0

Questo è ciò che Jacolien van Rij scrive nella sua pagina tutorial:

Come impostare l'interazione dipende dal tipo di predittore di raggruppamento:

  • con fattore includono la differenza di intercettazione: Group + s(Time, by=Group)
  • con il fattore ordinato includere la differenza di intercettazione e il riferimento liscio: Group + s(Time) + s(Time, by=Group)
  • con predittore binario includere riferimento liscio: s(Time) + s(Time, by=IsGroupChildren)

Le variabili categoriali devono essere specificate come fattori, fattori ordinati o fattori binari con le funzioni R appropriate. Per capire come interpretare gli output e cosa ogni modello può e non può dirci, vedere direttamente la pagina tutorial di Jacolien van Rij . Il suo tutorial spiega anche come adattare i GAM ad effetto misto. Per comprendere il concetto di interazioni nel contesto dei GAM, questa pagina tutorial di Peter Laurinec è utile. Entrambe le pagine forniscono molte ulteriori informazioni per eseguire correttamente i GAM in diversi scenari.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.