A pergunta a seguir se baseia na discussão encontrada nesta página . Dada uma variável de resposta y
, uma variável explicativa contínua x
e um fator fac
, é possível definir um Modelo Aditivo Geral (GAM) com uma interação entre x
e fac
usando o argumento by=
. De acordo com o arquivo de ajuda ?gam.models
no pacote R mgcv
, isso pode ser feito da seguinte maneira:
gam1 <- gam(y ~ fac +s(x, by = fac), ...)
O @GavinSimpson aqui sugere uma abordagem diferente:
gam2 <- gam(y ~ fac +s(x) +s(x, by = fac, m=1), ...)
Eu tenho brincado com um terceiro modelo:
gam3 <- gam(y ~ s(x, by = fac), ...)
Minhas principais perguntas são: alguns desses modelos estão errados ou são simplesmente diferentes? Neste último caso, quais são suas diferenças? Baseado no exemplo que discutirei abaixo, acho que consegui entender algumas das diferenças, mas ainda estou perdendo alguma coisa.
Como exemplo, vou usar um conjunto de dados com espectros de cores para flores de duas espécies diferentes de plantas medidas em locais diferentes.
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 maior clareza, cada linha da figura acima representa o espectro médio de cores previsto para cada local com um GAM separado, com density~s(wl)
base em amostras de ~ 10 flores. As áreas cinzas representam 95% de IC para cada GAM.
Meu objetivo final é modelar o efeito (potencialmente interativo) Taxon
e o comprimento wl
de onda na refletância (referidos density
no código e no conjunto de dados), enquanto consideramos Locality
um efeito aleatório em um GAM de efeito misto. No momento, não adicionarei a parte de efeito misto ao meu prato, que já está cheio o suficiente com a tentativa de entender como modelar interações.
Começarei com o mais simples dos três GAMs interativos:
gam.interaction0 <- gam(density ~ s(wl, by = Taxon), data = df)
# common intercept, different slopes
plot(gam.interaction0, pages=1)
summary(gam.interaction0)
Produz:
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
A parte paramétrica é a mesma para as duas espécies, mas splines diferentes são ajustados para cada espécie. É um pouco confuso ter uma parte paramétrica no resumo dos GAMs, que não são paramétricos. @IsabellaGhement explica:
Se você observar as plotagens dos efeitos suaves estimados correspondentes ao seu primeiro modelo, notará que eles estão centralizados em torno de zero. Portanto, você precisa 'mudar' essas suavizações (se a interceptação estimada for positiva) ou para baixo (se a interceptação estimada for negativa) para obter as funções suaves que você pensava estar estimando. Em outras palavras, você precisa adicionar a interceptação estimada aos suaves para obter o que realmente deseja. Para o seu primeiro modelo, o 'turno' é assumido como sendo o mesmo para os dois suaves.
Se movendo:
gam.interaction1 <- gam(density ~ Taxon +s(wl, by = Taxon, m=1), data = df)
plot(gam.interaction1,pages=1)
summary(gam.interaction1)
Dá:
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
Agora, cada espécie também tem sua própria estimativa paramétrica.
O próximo modelo é o que tenho problemas para entender:
gam.interaction2 <- gam(density ~ Taxon + s(wl) + s(wl, by = Taxon, m=1), data = df)
plot(gam.interaction2, pages=1)
Não tenho uma ideia clara do que esses gráficos representam.
summary(gam.interaction2)
Dá:
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
A parte paramétrica de gam.interaction2
é quase a mesma que para gam.interaction1
, mas agora existem três estimativas para termos suaves, que não posso interpretar.
Agradeço antecipadamente a qualquer um que dedique algum tempo para me ajudar a entender as diferenças nos três modelos.
gam1
mais algo para o SampleID
efeito, mais você precisa fazer algo sobre o problema de variação não constante; Esses dados não parecem ser gaussianos condicionalmente distribuídos por causa do limite inferior.