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.
fuente
gam1
más algo para elSampleID
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.Respuestas:
gam1
ygam2
están bien son modelos diferentes, aunque intentan hacer lo mismo, que son suavizaciones específicas del grupo de modelos.La
gam1
formahace esto al estimar un suavizador separado para cada nivel de
f
(suponiendo quef
sea un factor estándar), y de hecho, también se estima un parámetro de suavidad separado para cada suavizado.La
gam2
formalogra el mismo objetivo que
gam1
(de modelar la relación fluida entrex
yy
para cada nivel def
) pero lo hace estimando un efecto suave global o promedio dex
ony
(els(x)
término) más un término de diferencia suave (el segundos(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
formarestá 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 laY en cada uno de los grupos definidos por Y para el grupo actual y la media general (modelo de intercepción), más el buen efecto de Y .
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 def
. 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 basex
(como se confunde con la intercepción del modelo) ahora es responsable de modelar tanto la diferencia en la media dex
sobreSin embargo, ninguno de estos modelos es apropiado para sus datos; ignorando por ahora la distribución incorrecta de la respuesta (
density
no puede ser negativa y hay un problema de heterogeneidad que un no gaussianofamily
solucionaría o resolvería), no ha tenido en cuenta la agrupación por flor (SampleID
en su conjunto de datos).Si su objetivo es modelar
Taxon
curvas específicas, un modelo de la forma sería un punto de partida:donde agregué un efecto aleatorio
SampleID
y aumenté el tamaño de la expansión de base para losTaxon
suavizados específicos.Este modelo,
m1
modela las observaciones como resultado de unwl
efecto suave dependiendo de la especie (Taxon
) de la que proviene la observación (elTaxon
término paramétrico solo establece la mediadensity
para 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 lasTaxon
curvas 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 delTaxon
que proviene la flor individual.Otra versión de este modelo es la
gam2
forma de arriba pero con un efecto aleatorio agregadoEste 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
k
es potencialmente demasiado bajo para lasTaxon
curvas 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
Taxon
curvas 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 queremosTaxon
curvas específicas, pero también queremos tener un suavizado separado para cada unaSampleID
, pero a diferencia de losby
suavizados, sugeriría que inicialmente desee que todas esasSampleID
curvas 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
Tenga en cuenta que he aumentado
k
aquí, en caso de que necesitemos más ondulación en los suavizadosTaxon
específicos. Todavía necesitamos elTaxon
efecto 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
m3
se compara con los otros dos, aunque utiliza un orden de magnitud más grados de libertadSi observamos los suavizados de este modelo, obtenemos una mejor idea de cómo se ajustan los datos:
(Tenga en cuenta que esto se produjo utilizando
draw(m3)
ladraw()
función de mi paquete gratia . Los colores en el diagrama inferior izquierdo son irrelevantes y no ayudan aquí).Cada
SampleID
curva ajustada se construye a partir de la intersección o el término paramétricoTaxonSpeciesB
más uno de los dosTaxon
suavizados específicos, dependiendo de a qué perteneceTaxon
cada unoSampleID
, más su propioSampleID
suavizado 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:
Pero estoy teniendo problemas con este modelo en este momento, lo que podría indicar que es demasiado complejo con múltiples suavidades
wl
incluidas.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 retienes(wl)
es un suave que representará el nivel de referencias(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
,pero la interpretación es diferente; el primero
s(wl)
se referiráTaxonA
y el suave implicado pors(wl, by = fTaxon)
será una diferencia suave entre el suave paraTaxonA
y el deTaxonB
.fuente
SampleID
es un espectrograma de una sola flor, cada uno de una planta diferente, por lo que no creoSampleID
que deba especificarse como aleatorio (pero corrígeme si me equivoco). De hecho, he usado un modelo similar al suyom3
con unTaxon
factor 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!SampleID
como 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 elbs = 're'
"suave" que mencioné anteriormente en la respuesta.m3
confamily = Gamma(link = 'log')
ofamily = 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.Esto es lo que Jacolien van Rij escribe en su página de tutorial:
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.
fuente