R / mgcv: ¿Por qué los productos tensoriales te () y ti () producen superficies diferentes?

11

El mgcvpaquete Rtiene dos funciones para ajustar las interacciones del producto tensorial: te()y ti(). Entiendo la división básica del trabajo entre los dos (ajustar una interacción no lineal versus descomponer esta interacción en efectos principales y una interacción). Lo que no entiendo es por qué te(x1, x2)y ti(x1) + ti(x2) + ti(x1, x2)puede producir resultados (ligeramente) diferentes.

MWE (adaptado de ?ti):

require(mgcv)
test1 <- function(x,z,sx=0.3,sz=0.4) { 
  x <- x*20
 (pi**sx*sz)*(1.2*exp(-(x-0.2)^2/sx^2-(z-0.3)^2/sz^2)+
             0.8*exp(-(x-0.7)^2/sx^2-(z-0.8)^2/sz^2))
}
n <- 500

x <- runif(n)/20;z <- runif(n);
xs <- seq(0,1,length=30)/20;zs <- seq(0,1,length=30)
pr <- data.frame(x=rep(xs,30),z=rep(zs,rep(30,30)))
truth <- matrix(test1(pr$x,pr$z),30,30)
f <- test1(x,z)
y <- f + rnorm(n)*0.2

par(mfrow = c(2,2))

# Model with te()
b2 <- gam(y~te(x,z))
vis.gam(b2, plot.type = "contour", color = "terrain", main = "tensor product")

# Model with ti(a) + ti(b) + ti(a,b)
b3 <- gam(y~ ti(x) + ti(z) + ti(x,z))
vis.gam(b3, plot.type = "contour", color = "terrain", main = "tensor anova")

# Scatterplot of prediction b2/b3
plot(predict(b2), predict(b3))

Las diferencias no son muy grandes en este ejemplo, pero me pregunto por qué debería haber diferencias.

Información de la sesión:

 > devtools::session_info("mgcv")
 Session info
 -----------------------------------------------------------------------------------
 setting  value                       
 version  R version 3.3.1 (2016-06-21)
 system   x86_64, linux-gnu           
 ui       RStudio (0.99.491)          
 language en_US                       
 collate  en_US.UTF-8                 
 tz       <NA>                        
 date     2016-09-13                  

 Packages      ---------------------------------------------------------------------------------------
 package * version date       source        
 lattice   0.20-33 2015-07-14 CRAN (R 3.2.1)
 Matrix    1.2-6   2016-05-02 CRAN (R 3.3.0)
 mgcv    * 1.8-12  2016-03-03 CRAN (R 3.2.3)
 nlme    * 3.1-128 2016-05-10 CRAN (R 3.3.1)
jvh_ch
fuente
44
¿En serio la gente? Si bien la implementación es claramente una cuestión específica de mgcv (no conozco ningún otro software estándar para GAM que permita esta descomposición similar a ANOVA de suavizados bivariados), el problema y la respuesta son claramente estadísticos; los modelos que se están ajustando no son los mismos bajo el capó debido a las matrices de penalización adicionales que surgen al descomponer los términos marginales del componente de "interacción". Esto no es específico de mgcv.
Gavin Simpson
1
@GavinSimpson He planteado una pregunta en Meta sobre la actualidad, o de lo contrario, de esta pregunta
Silverfish

Respuestas:

15

Estos son superficialmente el mismo modelo, pero en la práctica, cuando se ajusta, existen algunas diferencias sutiles. Una diferencia importante es que el modelo con ti()términos está estimando más parámetros de suavidad en comparación con el te()modelo:

> b2$sp
te(x,z)1 te(x,z)2 
3.479997 5.884272 
> b3$sp
    ti(x)     ti(z)  ti(x,z)1  ti(x,z)2 
 8.168742 60.456559  2.370604  2.761823

y esto se debe a que hay más matrices de penalización asociadas con los dos modelos; en el ti()modelo tenemos uno por "término" en comparación con solo dos en el te()modelo, uno por marginal liso.

Veo modelos ti()que se usan para decidir si quiero o . No puedo comparar esos modelos si uso términos, así que los uso . Una vez que he determinado si necesito puedo reajustar el modelo con si lo necesito o con separado para cada efecto marginal si no necesito .y^=β0+s(x,y)y^=β0+s(x)+s(y)te()ti()s(x,y)te()s()s(x,y)

Tenga en cuenta que puede acercar los modelos un poco entre sí mediante el uso de method = "ML"(o "REML", pero no debería comparar los efectos "fijos" a "REML"menos que todos los términos estén totalmente penalizados, lo que por defecto no lo son, pero se diría con select = TRUE).

Gavin Simpson
fuente