La siguiente pregunta se basa en la discusión que se encuentra en esta página . Dada una variable de respuesta y
, una variable explicativa continua x
y un factor fac
, es posible definir un Modelo Aditivo General (GAM) con una interacción entre x
y fac
usando el argumento by=
. De acuerdo con el archivo de ayuda ?gam.models
en el paquete R mgcv
, esto se puede lograr de la siguiente manera:
gam1 <- gam(y ~ fac +s(x, by = fac), ...)
@GavinSimpson aquí sugiere un enfoque diferente:
gam2 <- gam(y ~ fac +s(x) +s(x, by = fac, m=1), ...)
He estado jugando con un tercer modelo:
gam3 <- gam(y ~ s(x, by = fac), ...)
Mis preguntas principales son: ¿algunos de estos modelos son incorrectos o simplemente son diferentes? En el último caso, ¿cuáles son sus diferencias? Basado en el ejemplo que voy a discutir a continuación, creo que podría entender algunas de sus diferencias, pero todavía me falta algo.
Como ejemplo, voy a utilizar un conjunto de datos con espectros de color para flores de dos especies de plantas diferentes medidas en diferentes lugares.
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)
Para mayor claridad, cada línea en la figura de arriba representa el espectro de color medio predicho para cada ubicación con un GAM de forma separado density~s(wl)
basado en muestras de ~ 10 flores. Las áreas grises representan un IC del 95% para cada GAM.
Mi objetivo final es modelar el efecto (potencialmente interactivo) Taxon
y la longitud wl
de onda en la reflectancia (referido como density
en el código y el conjunto de datos) mientras que considero Locality
como un efecto aleatorio en un GAM de efectos mixtos. Por el momento no agregaré la parte de efectos mixtos a mi plato, que ya está lo suficientemente lleno para tratar de entender cómo modelar las interacciones.
Comenzaré con el más simple de los tres GAM interactivos:
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 paramétrica es la misma para ambas especies, pero se ajustan diferentes splines para cada especie. Es un poco confuso tener una parte paramétrica en el resumen de GAM, que no son paramétricos. @IsabellaGhement explica:
Si observa las gráficas de los efectos suaves estimados (suavizados) correspondientes a su primer modelo, notará que están centrados alrededor de cero. Por lo tanto, debe 'desplazar' esos suavizados hacia arriba (si la intersección estimada es positiva) o hacia abajo (si la intersección estimada es negativa) para obtener las funciones uniformes que pensó que estaba estimando. En otras palabras, debe agregar la intercepción estimada a los suavizados para obtener lo que realmente desea. Para su primer modelo, se supone que el 'cambio' es el mismo para ambos suavizados.
Hacia adelante:
gam.interaction1 <- gam(density ~ Taxon +s(wl, by = Taxon, m=1), data = df)
plot(gam.interaction1,pages=1)
summary(gam.interaction1)
Da:
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
Ahora, cada especie también tiene su propia estimación paramétrica.
El siguiente modelo es el que tengo problemas para entender:
gam.interaction2 <- gam(density ~ Taxon + s(wl) + s(wl, by = Taxon, m=1), data = df)
plot(gam.interaction2, pages=1)
No tengo una idea clara de lo que representan estos gráficos.
summary(gam.interaction2)
Da:
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 paramétrica de gam.interaction2
es aproximadamente la misma que para gam.interaction1
, pero ahora hay tres estimaciones para términos suaves, que no puedo interpretar.
Gracias de antemano a cualquiera que se tome el tiempo para ayudarme a comprender las diferencias en los tres modelos.
gam1
más algo para el SampleID
efecto más que necesita hacer algo sobre el problema de la varianza no constante; Estos datos no parecen estar distribuidos condicionalmente gaussianos debido al límite inferior.