La seguente domanda si basa sulla discussione trovata in questa pagina . Data una variabile di risposta y
, una variabile esplicativa continua x
e un fattore fac
, è possibile definire un General Additive Model (GAM) con un'interazione tra x
e fac
usando 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) Taxon
e la lunghezza d'onda wl
sulla riflettanza (indicata come density
nel codice e nel set di dati), tenendo conto Locality
come 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)
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)
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)
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.
gam1
più per l' SampleID
effetto 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.