La siguiente pregunta se basa en la discusión encontrada 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 (MAG) 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 principales preguntas son: ¿algunos de estos modelos están mal, o son simplemente 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 usar un conjunto de datos con espectros de color para las 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 de la figura de arriba representa el espectro de color medio predicho para cada lugar con un GAM de forma separada density~s(wl)
basado en muestras de ~10 flores. Las áreas grises representan el 95% de CI para cada GAM.
Mi objetivo final es modelar el efecto (potencialmente interactivo) de Taxon
y la longitud de onda wl
sobre la reflectancia (denominada density
en el código y el conjunto de datos) mientras se contabilizan Locality
como un efecto aleatorio en un GAM de efecto mixto. Por el momento no voy a añadir la parte del efecto mixto a mi plato, que ya está bastante lleno con tratar de entender cómo modelar las interacciones.
Empezaré con la más simple de las tres GAM interactivas:
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 colocan diferentes estrías para cada especie. Es un poco confuso tener una parte paramétrica en el resumen de las GAM, que no son paramétricas. @IsabellaGhement explica:
Si miras las gráficas de los efectos suaves estimados (smooths) correspondiente a su primer modelo, notará que son centrado en el cero. Así que tienes que "cambiar" esos alisados (si el intercepción estimada es positiva) o hacia abajo (si la intercepción estimada es negativo) para obtener las funciones suaves que pensabas que eras estimando. En otras palabras, necesitas añadir la intercepción estimada a las facilidades para llegar a lo que realmente quieres. Para su primer modelo, el Se supone que el "cambio" es el mismo para ambos tipos de lisos.
Sigamos 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 me cuesta 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 más o menos lo mismo que para gam.interaction1
pero ahora hay tres estimaciones para términos suaves, que no puedo interpretar.
Gracias de antemano a todos los que se tomen el tiempo de ayudarme a entender las diferencias entre los tres modelos.
3 votos
¡Qué post tan bonito, Marco! Si observas los gráficos de los efectos suaves estimados (smooths) correspondientes a tu primer modelo, te darás cuenta de que están centrados en cero. Así que tienes que "desplazar" esos efectos suaves hacia arriba (si el intercepto estimado es positivo) o hacia abajo (si el intercepto estimado es negativo) para obtener las funciones suaves que pensabas que estabas estimando. En otras palabras, hay que añadir el intercepto estimado a los suavizados para obtener lo que realmente se quiere. Para su primer modelo, se supone que el "desplazamiento" es el mismo para ambos suavizados.
1 votos
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 al post de Gavin Simpson sugiere que así es como él establece modelos de este tipo. También parece utilizar el mismo valor de k para los efectos suaves en el modelo. Normalmente, si se incluye un término de interacción entre dos variables predictoras, se deben incluir también los efectos principales de esas variables.
0 votos
Así que yo descartaría tu primer modelo, ya que omite el efecto principal de Taxon. Sólo tiene que utilizar la sugerencia de Gavin para obtener los efectos principales y los efectos de interacción que necesita (recordando que los suavizados producidos por el modelo se centran en 0 por defecto y necesitan ser "desplazados" hacia arriba o hacia abajo dependiendo del término o términos de intercepción).
0 votos
Hola @IsabellaGhement y gracias por tu comentario. ¿Cómo interpretarías el hecho de que summary(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 el efecto de wl en la función de suavización de y (densidad en mi caso) independientemente del taxón? ¿Se calcula simplemente ajustando la densidad ~ s(wl)? Ejecuto dicho modelo y estima un coeficiente paramétrico muy cercano a la media del coeficiente paramétrico de las dos especies, y los edf asociados son muy cercanos a los de s(wl) dados por summary(gam.interaction2).
0 votos
En mi opinión, el camino correcto es el tercero y conlleva el concepto de marginalidad. El modelo se construye de lo simple a lo complejo, de modo que incluye los efectos principales (factor y suave), y luego la interacción. Esta forma permite inspeccionar su significación. El efecto de cada variable + interacción se descompone. Es lo más fácil de entender. La primera curva muestra el efecto común de la variable wl y la segunda y la tercera las interacciones de wl y el taxón. Como puede ver, son bastante simples en comparación con las opciones anteriores.
0 votos
Si por "tercera vía" te refieres a
gam3
entonces eso está mal (elby
Los suavizados están centrados, por lo que se necesitan los términos paramétricos). Si te refieres a la tercera forma que muestra el PO en la respuesta ampliada, entonces estoy de acuerdo contigo hasta cierto punto, aunque ahora tenemos que lidiar con problemas de identificabilidad; los suavizados múltiples dewl
causan problemas en muchos casos, lo que significa que hay que añadir alguna contracción adicional. Elgam1
También está bien el enfoque. En este caso, sugeriría utilizar elgam1
enfoque, aumentandok
si es necesario, y el manejo de laSampleID
cuestión como describo en mi respuesta más abajo.4 votos
Mis colegas y yo tenemos un artículo en prensa (preimpresión aquí) que entra en un lote de detalles sobre estas cuestiones. Puede que te resulte útil tanto para entender la gama de modelos que se pueden montar como para elegir entre ellos. Para mí, creo que todo lo que necesitas aquí es
gam1
más algo para elSampleID
Además, hay que hacer algo con el problema de la varianza no constante; estos datos no parecen ser gaussianos distribuidos condicionalmente debido al límite inferior.