Diferentes formas de modelar interacciones entre predictores continuos y categóricos en GAM

8

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 xy un factor fac, es posible definir un Modelo Aditivo General (GAM) con una interacción entre xy facusando 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) Taxony la longitud wlde onda en la reflectancia (referido como densityen el código y el conjunto de datos) mientras que considero Localitycomo 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)

ingrese la descripción de la imagen aquí

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)

ingrese la descripción de la imagen aquí

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)

ingrese la descripción de la imagen aquí

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.interaction2es 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.

Marco Plebani
fuente
2
¡Qué hermosa publicación, Marco! 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' esas suavizaciones 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 suaves.
Isabella Ghement
1
Al especificar su modelo, me parece que debería tener un efecto principal para Taxon, un efecto principal (suave) para wl y una interacción (suave) entre Taxon y wl. El enlace a la publicación de Gavin Simpson sugiere que así es como configura modelos de este tipo. También parece usar el mismo valor de k para los efectos suaves en el modelo. Por lo general, si incluye un término de interacción entre dos variables predictoras, también debe incluir los efectos principales para esas variables.
Isabella Ghement
Así que descartaría su primer modelo, ya que omite el efecto principal de Taxon. Simplemente use la sugerencia de Gavin para obtener los efectos principales y los efectos de interacción que necesita (al tiempo que recuerda que los suavizados producidos por el modelo están centrados en 0 de forma predeterminada y deben 'desplazarse' hacia arriba o hacia abajo según los términos de intercepción.
Isabella Ghement
Hola @IsabellaGhement y gracias por tus comentarios. ¿Cómo interpretaría el hecho de que el resumen (gam.interaction2) produce una estimación de significación para s (wl) en relación con cada especie pero también una para s (wl) no vinculada a ninguna de las especies? ¿Es ese el efecto de wl en la función de suavizado de y (densidad en mi caso) independientemente de Taxon? ¿Se calcula simplemente ajustando la densidad ~ s (wl)? Ejecuto dicho modelo y estima un coeff paramétrico. muy cerca de la media del coeff paramétrico. de las dos especies, y los edf asociados están muy cerca de los de s (wl) dados por el resumen (gam.interaction2).
Marco Plebani
1
Los colegas y yo tenemos un artículo en prensa (preimpresión aquí) que entra en muchos detalles sobre estos temas. Tal vez le resulte útil tanto para conocer la gama de modelos que se pueden instalar como para elegir entre ellos. Para mí, creo que todo lo que necesita aquí es gam1 más algo para el SampleIDefecto 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.
Gavin Simpson

Respuestas:

1

gam1y gam2están bien son modelos diferentes, aunque intentan hacer lo mismo, que son suavizaciones específicas del grupo de modelos.

La gam1forma

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

hace esto al estimar un suavizador separado para cada nivel de f(suponiendo que fsea ​​un factor estándar), y de hecho, también se estima un parámetro de suavidad separado para cada suavizado.

La gam2forma

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

logra el mismo objetivo que gam1(de modelar la relación fluida entre xy ypara cada nivel de f) pero lo hace estimando un efecto suave global o promedio de xon y(el s(x)término) más un término de diferencia suave (el segundo s(x, by = f, m = 1)término). Como la penalización aquí está en la primera derivada ( 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) `) refleja una desviación del efecto global o promedio.

gam3 formar

y ~ s(x, by = f)

está mal independientemente de lo bien que pueda encajar en una situación particular. La razón por la que digo que está mal es que cada suavizado especificado por la s(x, by = f)parte se centra en cero debido a la restricción de suma a cero impuesta para la identificabilidad del modelo. Como tal, no hay nada en el modelo que explique la media deYen cada uno de los grupos definidos por f. Solo existe la media general dada por la intercepción del modelo. Esto significa que ahora el más suave, que está centrado en torno a cero y que ha tenido la función de base plana eliminada de la expansión de la base x(como se confunde con la intercepción del modelo) ahora es responsable de modelar tanto la diferencia en la media deYpara el grupo actual y la media general (modelo de intercepción), más el buen efecto de xsobreY.

Sin embargo, ninguno de estos modelos es apropiado para sus datos; ignorando por ahora la distribución incorrecta de la respuesta ( densityno puede ser negativa y hay un problema de heterogeneidad que un no gaussiano familysolucionaría o resolvería), no ha tenido en cuenta la agrupación por flor ( SampleIDen su conjunto de datos).

Si su objetivo es modelar Taxoncurvas específicas, un modelo de la forma sería un punto de partida:

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

donde agregué un efecto aleatorio SampleIDy aumenté el tamaño de la expansión de base para los Taxonsuavizados específicos.

Este modelo, m1modela las observaciones como resultado de un wlefecto suave dependiendo de la especie ( Taxon) de la que proviene la observación (el Taxontérmino paramétrico solo establece la media densitypara cada especie y se necesita como se discutió anteriormente), más una intercepción aleatoria. En conjunto, las curvas para flores individuales surgen de versiones desplazadas de las Taxoncurvas específicas, con la cantidad de desplazamiento dada por la intercepción aleatoria. Este modelo supone que todos los individuos tienen la misma forma de liso que el liso para el particular del Taxonque proviene la flor individual.

Otra versión de este modelo es la gam2forma de arriba pero con un efecto aleatorio agregado

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

Este modelo se ajusta mejor, pero no creo que esté resolviendo el problema en absoluto, ver más abajo. Una cosa que creo que sugiere es que el valor predeterminado kes potencialmente demasiado bajo para las Taxoncurvas específicas en estos modelos . Todavía hay mucha variación suave residual que no estamos modelando si nos fijamos en los gráficos de diagnóstico.

Es muy probable que este modelo sea demasiado restrictivo para sus datos; Algunas de las curvas en su diagrama de los suavizados individuales no parecen ser versiones simples desplazadas de las Taxoncurvas promedio. Un modelo más complejo permitiría también suavizaciones específicas para cada individuo. Tal modelo puede estimarse utilizando la base de interacciónfs o factor-liso . Todavía queremos Taxoncurvas específicas, pero también queremos tener un suavizado separado para cada una SampleID, pero a diferencia de los bysuavizados, sugeriría que inicialmente desee que todas esas SampleIDcurvas específicas tengan la misma ondulación. En el mismo sentido que la intersección aleatoria que incluimos anteriormente, elfs base agrega una intercepción aleatoria, pero también incluye una spline "aleatoria" (uso las comillas de miedo como en una interpretación bayesiana del GAM, todos estos modelos son solo variaciones de efectos aleatorios).

Este modelo se ajusta a sus datos como

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

Tenga en cuenta que he aumentado kaquí, en caso de que necesitemos más ondulación en los suavizados Taxonespecíficos. Todavía necesitamos el Taxonefecto paramétrico por las razones explicadas anteriormente.

Ese modelo tarda mucho tiempo en ajustarse a un solo núcleo gam(); bam()lo más probable es que sea mejor para ajustar este modelo, ya que aquí hay una cantidad relativamente grande de efectos aleatorios.

Si comparamos estos modelos con una versión de AIC corregida por selección de parámetros de suavidad, vemos cuán dramáticamente mejor este último modelo m3se compara con los otros dos, aunque utiliza un orden de magnitud más grados de libertad

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

Si observamos los suavizados de este modelo, obtenemos una mejor idea de cómo se ajustan los datos:

ingrese la descripción de la imagen aquí

(Tenga en cuenta que esto se produjo utilizando draw(m3)la draw()función de mi paquete gratia . Los colores en el diagrama inferior izquierdo son irrelevantes y no ayudan aquí).

Cada SampleIDcurva ajustada se construye a partir de la intersección o el término paramétrico TaxonSpeciesBmás uno de los dos Taxonsuavizados específicos, dependiendo de a qué pertenece Taxoncada uno SampleID, más su propio SampleIDsuavizado específico.

Tenga en cuenta que todos estos modelos siguen siendo incorrectos, ya que no tienen en cuenta la heterogeneidad; Los modelos gamma o Tweedie con un enlace de registro serían mis opciones para llevar esto más lejos. Algo como:

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

Pero estoy teniendo problemas con este modelo en este momento, lo que podría indicar que es demasiado complejo con múltiples suavidades wlincluidas.

Una forma alternativa es utilizar el enfoque de factor ordenado, que realiza una descomposición similar a ANOVA en los suavizados:

  • Taxon término paramétrico se retiene
  • s(wl)es un suave que representará el nivel de referencia
  • s(wl, by = Taxon)tendrá una diferencia separada suave para cada otro nivel. En su caso, solo tendrá uno de estos.

Este modelo está equipado como 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')

pero la interpretación es diferente; el primero s(wl)se referirá TaxonAy el suave implicado por s(wl, by = fTaxon)será una diferencia suave entre el suave para TaxonAy el de TaxonB.

Gavin Simpson
fuente
¡Gracias! Mi siguiente pregunta habría sido "¿pero por qué los resúmenes difieren si un factor está ordenado o no?" pero me ganaste, gracias por eso también. En mi conjunto de datos, cada uno SampleIDes un espectrograma de una sola flor, cada uno de una planta diferente, por lo que no creo SampleIDque deba especificarse como aleatorio (pero corrígeme si me equivoco). De hecho, he usado un modelo similar al suyo m3con un Taxonfactor ordenado, pero que especifica + s(Locality, bs="re") + s(Locality, wl, bs="re")como aleatorio. Analizaré los problemas que plantea sobre la distribución de los residuos y la heterocedasticidad. ¡Salud!
Marco Plebani
Todavía incluiría SampleIDcomo aleatoria los datos de una sola flor que probablemente estén relacionados y más si la función completa se relaciona con la flor, por lo que, en cierto sentido, las funciones (suaves) son aleatorias. También podría necesitar un efecto aleatorio simple para la planta si hubiera varias flores por planta y múltiples plantas por taxón en el estudio (use el bs = 're'"suave" que mencioné anteriormente en la respuesta.
Gavin Simpson,
Cuando traté de encajar m3con family = Gamma(link = 'log')o family = tw()me estaba poniendo problemas reales con mgcv no ser capaz de encontrar buenos valores de partida y otros errores que causan mgcv a mierda, que no he llegado a la parte inferior de todavía. Ciertamente, a partir de los datos que proporcionó, un modelo gaussiano no es correcto. Obtuve un gaussiano con un enlace de registro que encaja y me ayudó, pero tampoco captura toda la heterogeneidad.
Gavin Simpson
0

Esto es lo que Jacolien van Rij escribe en su página de tutorial:

Cómo configurar la interacción depende del tipo de predictor de agrupación:

  • con factor incluyen diferencia de intercepción: Group + s(Time, by=Group)
  • con factor ordenado incluyen la diferencia de intersección y la referencia suave: Group + s(Time) + s(Time, by=Group)
  • con predictor binario incluye referencia suave: s(Time) + s(Time, by=IsGroupChildren)

Las variables categóricas deben especificarse como factores, factores ordenados o factores binarios con las funciones R apropiadas. Para comprender cómo interpretar los resultados y lo que cada modelo puede y no puede decirnos, consulte la página del tutorial de Jacolien van Rij directamente. Su tutorial también explica cómo ajustar los GAM de efectos mixtos. Para comprender el concepto de interacciones en el contexto de los GAM, esta página de tutorial de Peter Laurinec también es útil. Ambas páginas proporcionan mucha más información para ejecutar GAM correctamente en diferentes escenarios.

Marco Plebani
fuente