La question suivante s'appuie sur la discussion trouvée sur cette page . Étant donné une variable de réponse y
, une variable explicative continue x
et un facteur fac
, il est possible de définir un modèle additif général (GAM) avec une interaction entre x
et en fac
utilisant l'argument by=
. Selon le fichier d'aide ?gam.models
du package R mgcv
, cela peut être accompli comme suit:
gam1 <- gam(y ~ fac +s(x, by = fac), ...)
@GavinSimpson suggère ici une approche différente:
gam2 <- gam(y ~ fac +s(x) +s(x, by = fac, m=1), ...)
Je joue avec un troisième modèle:
gam3 <- gam(y ~ s(x, by = fac), ...)
Mes principales questions sont: certains de ces modèles sont-ils tout simplement faux, ou sont-ils simplement différents? Dans ce dernier cas, quelles sont leurs différences? Sur la base de l'exemple que je vais discuter ci-dessous, je pense que je pourrais comprendre certaines de leurs différences, mais il me manque encore quelque chose.
À titre d'exemple, je vais utiliser un ensemble de données avec des spectres de couleurs pour les fleurs de deux espèces végétales différentes mesurées à différents endroits.
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)
Pour plus de clarté, chaque ligne de la figure ci-dessus représente le spectre de couleur moyen prévu pour chaque emplacement avec un GAM de forme distinct density~s(wl)
basé sur des échantillons de ~ 10 fleurs. Les zones grises représentent 95% CI pour chaque GAM.
Mon objectif final est de modéliser l'effet (potentiellement interactif) Taxon
et la longueur wl
d' onde sur la réflectance (appelés density
dans le code et l'ensemble de données) tout en tenant compte Locality
d'un effet aléatoire dans un GAM à effets mixtes. Pour le moment, je n'ajouterai pas la partie effet mixte à mon assiette, qui est déjà suffisamment complète pour essayer de comprendre comment modéliser les interactions.
Je vais commencer par le plus simple des trois GAM interactifs:
gam.interaction0 <- gam(density ~ s(wl, by = Taxon), data = df)
# common intercept, different slopes
plot(gam.interaction0, pages=1)
summary(gam.interaction0)
Produit:
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 partie paramétrique est la même pour les deux espèces, mais des splines différentes sont adaptées pour chaque espèce. C'est un peu déroutant d'avoir une partie paramétrique dans le résumé des GAM, qui sont non paramétriques. @IsabellaGhement explique:
Si vous regardez les tracés des effets lisses estimés (lissages) correspondant à votre premier modèle, vous remarquerez qu'ils sont centrés sur zéro. Vous devez donc `` déplacer '' ces lissages vers le haut (si l'ordonnée à l'origine estimée est positive) ou vers le bas (si l'ordonnée à l'origine estimée est négative) pour obtenir les fonctions lisses que vous pensiez estimer. En d'autres termes, vous devez ajouter l'interception estimée aux lissages pour obtenir ce que vous voulez vraiment. Pour votre premier modèle, le «décalage» est supposé être le même pour les deux lissages.
Passons à autre chose:
gam.interaction1 <- gam(density ~ Taxon +s(wl, by = Taxon, m=1), data = df)
plot(gam.interaction1,pages=1)
summary(gam.interaction1)
Donne:
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
Désormais, chaque espèce a également sa propre estimation paramétrique.
Le modèle suivant est celui que j'ai du mal à comprendre:
gam.interaction2 <- gam(density ~ Taxon + s(wl) + s(wl, by = Taxon, m=1), data = df)
plot(gam.interaction2, pages=1)
Je n'ai aucune idée claire de ce que ces graphiques représentent.
summary(gam.interaction2)
Donne:
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 partie paramétrique de gam.interaction2
est à peu près la même que pour gam.interaction1
, mais maintenant il y a trois estimations pour les termes lisses, que je ne peux pas interpréter.
Merci d'avance à tous ceux qui prendront le temps de m'aider à comprendre les différences entre les trois modèles.
gam1
plus quelque chose pour l' SampleID
effet plus vous devez faire quelque chose pour résoudre le problème de variance non constante; Ces données ne semblent pas être gaussiennes distribuées conditionnellement en raison de la borne inférieure.