3 Árboles de regresión distribucionales

Los árboles de regresión distribucionales fueron propuestos en Schlosser et al. (2019) y Schlosser (2020). Esta nueva propuesta unifica dos aproximaciones de modelación:

  • Data modeling.
  • Algorithmic modeling.

Abajo una comparación entre un árbol de regresión y un árbol de regresión distribucional.

Videos útiles

Paquete disttree

distree propuesto por Schlosser et al. (2021) es un paquete de R para ajustar árboles y bosques de regresión distribucionales basado en la estimación de máxima verosimilitud de parámetros para familias de distribución específicas. Para instalar el paquete puedes usar el siguiente código.

install.packages("disttree", repos="http://R-Forge.R-project.org")

Para crear un árbol de regresión distribucional se usa la función disttree que tiene la siguiente estructura.

disttree(formula, data, subset, na.action = na.pass, weights, offset,
           cluster, family = NO(), control = disttree_control(...), 
           converged = NULL, scores = NULL, doFit = TRUE, ...)

El argumento family se utiliza para indicar la distribución estadística que se asume para la variable respuesta \(Y\). Se puede elegir cualquier distribución de gamlss de Stasinopoulos and Rigby (2024) o cualquier distribución de los paquetes RelDists de Hernandez et al. (2024), RealDists de Hernandez-Barajas and Marmolejo-Ramos (2024) y DiscreteDists de Hernandez-Barajas et al. (2024).

Una pregunta frecuente es ¿cómo selecciono la distribución que mejor explica el patrón de mi variable respuesta \(Y\)?

Para encontrar las distribuciones que mejor explican a \(Y\) se puede utilizar el procedimiento mostrado en este documento.

Ejemplo

Este ejemplo está basado en la figura 1.2 de la disertación de Schlosser (2020). Aquí vamos a tener una variable respuesta \(Y\) con distribución normal pero que depende de la variable auxiliar \(X\).

\[\begin{equation*} Y = \begin{cases} N(\mu=5, \sigma=1) \, \text{si $x < 0.4$,} \\ N(\mu=12, \sigma=2) \, \text{si $0.4 \leq x \leq 0.8$,} \\ N(\mu=0, \sigma=0.5) \, \text{si $x > 0.8$}. \end{cases} \end{equation*}\]

El siguiente código sirve para simular los datos.

n <- 500
set.seed(12345) 
{
  x <- runif(n=n)
  y <- numeric(n)
  y[x < 0.4]            <- rnorm(n=sum(x < 0.4),            mean=5, sd=1)
  y[x >+ 0.4 & x < 0.8] <- rnorm(n=sum(x >+ 0.4 & x < 0.8), mean=12, sd=2)
  y[x >= 0.8]           <- rnorm(n=sum(x >= 0.8),           mean=0, sd=0.5)
}

datos <- data.frame(y=y, x=x)
plot(x=x, y=y, ylim=c(-5, 20))

Vamos ahora a crear el árbol distribucional con family=NO.

library(disttree)
mod <- disttree(y ~ x, data=datos, family=NO)
plot(mod)

¿Cuál será el valor estimado de \(Y\) para tres nuevos objetos que tiene valor de \(x=0.35\), \(x=0.47\) y \(x=0.89\) respectivamente?

new_data <- data.frame(x=c(0.35, 0.47, 0.89))
predicciones <- predict(mod, newdata=new_data)
predicciones
##            mu     sigma
## 1  5.06589704 0.9170597
## 2 12.03236756 1.9684436
## 3  0.02094238 0.5654369

Ejemplo

Este ejemplo se parece el ejemplo inicial, sólo que aquí la variable respuesta \(Y\) va a tener distribución FWE (Flexible Weibull Extension) y vamos a construir tres árboles distribucionales con familia NO, FWE y WEI. El objetivo es saber si disttree logra indicarnos cuál árbol distribucional es el más apropiado.

El modelo del cuál vamos a generar los datos es el siguiente:

\[\begin{equation*} Y = \begin{cases} FWE(\mu=0.7, \sigma=1) \, \text{si $x < 0.4$,} \\ FWE(\mu=0.4, \sigma=2) \, \text{si $0.4 \leq x \leq 0.8$,} \\ FWE(\mu=0.5, \sigma=0.5) \, \text{si $x > 0.8$}. \end{cases} \end{equation*}\]

El código para simular los datos es el siguiente:

library(RelDists) # Para usar la distribucion FWE

n <- 1500
set.seed(12378)
{
  x <- runif(n=n)
  y <- numeric(n)
  y[x < 0.4]            <- rFWE(n=sum(x < 0.4),           mu=0.7, sigma=1)
  y[x >+ 0.4 & x < 0.8] <- rFWE(n=sum(x > 0.4 & x < 0.8), mu=0.4, sigma=2)
  y[x >= 0.8]           <- rFWE(n=sum(x >= 0.8),          mu=0.5, sigma=0.5)
}

datos <- data.frame(y=y, x=x)

plot(x=x, y=y)

Ahora vamos a entrenar los tres modelos.

library(disttree)

mod1 <- disttree(y ~ x, data=datos, family=NO)
mod1
## Distributional regression tree (Normal Distribution)
## 
## Model formula:
## y ~ x
## 
## Fitted party:
## [1] root
## |   [2] x <= 0.796
## |   |   [3] x <= 0.39609: n = 580
## |   |              mu     sigma 
## |   |       1.1054738 0.5975482 
## |   |   [4] x > 0.39609: n = 597
## |   |             mu    sigma 
## |   |       1.992311 1.070787 
## |   [5] x > 0.796: n = 323
## |              mu     sigma 
## |       0.9873984 0.7654727 
## 
## Number of inner nodes:    2
## Number of terminal nodes: 3
## Number of parameters per node: 2
## Objective function (negative log-likelihood): 1784.259
mod2 <- disttree(y ~ x, data=datos, family=FWE)
mod2
## Distributional regression tree (Flexible Weibull Extension Distribution)
## 
## Model formula:
## y ~ x
## 
## Fitted party:
## [1] root
## |   [2] x <= 0.7967
## |   |   [3] x <= 0.3891: n = 570
## |   |              mu     sigma 
## |   |       0.7022919 1.0537549 
## |   |   [4] x > 0.3891: n = 608
## |   |              mu     sigma 
## |   |       0.3946878 1.9770320 
## |   [5] x > 0.7967: n = 322
## |              mu     sigma 
## |       0.5131012 0.4805061 
## 
## Number of inner nodes:    2
## Number of terminal nodes: 3
## Number of parameters per node: 2
## Objective function (negative log-likelihood): 1569.568
mod3 <- disttree(y ~ x, data=datos, family=WEI)
mod3
## Distributional regression tree (Weibull Distribution)
## 
## Model formula:
## y ~ x
## 
## Fitted party:
## [1] root
## |   [2] x <= 0.796
## |   |   [3] x <= 0.3891: n = 570
## |   |             mu    sigma 
## |   |       1.245303 1.956514 
## |   |   [4] x > 0.3891: n = 607
## |   |             mu    sigma 
## |   |       2.247237 1.983420 
## |   [5] x > 0.796: n = 323
## |             mu    sigma 
## |       1.075082 1.316364 
## 
## Number of inner nodes:    2
## Number of terminal nodes: 3
## Number of parameters per node: 2
## Objective function (negative log-likelihood): 1614.687

En el resumen de cada modelo podemos ver al final el valor de \(-logLik\), el modelo más apropiado es aquel que tenga el menor valor. Al comparar los indicadores vemos que el modelo mod2 que asume FWE como distribución para \(Y\) es el que tiene el mejor indicador.

plot(mod2)

Los resultados del árbol anterior coinciden con el modelo para los datos simulados.

\[\begin{equation*} Y = \begin{cases} FWE(\mu=0.7, \sigma=1) \, \text{si $x < 0.4$,} \\ FWE(\mu=0.4, \sigma=2) \, \text{si $0.4 \leq x \leq 0.8$,} \\ FWE(\mu=0.5, \sigma=0.5) \, \text{si $x > 0.8$}. \end{cases} \end{equation*}\]

References

Hernandez, Freddy, Olga Usuga, Carmen Patino, Jaime Mosquera, and Amylkar Urrea. 2024. RelDists: Estimation for Some Reliability Distributions. https://ousuga.github.io/RelDists/.
Hernandez-Barajas, Freddy, and Fernando Marmolejo-Ramos. 2024. RealDists: Real Statistical Distributions. https://github.com/fhernanb/RealDists.
Hernandez-Barajas, Freddy, Fernando Marmolejo-Ramos, Jamiu Olumoh, Osho Ajayi, and Olga Usuga-Manco. 2024. DiscreteDists: Discrete Statistical Distributions. https://github.com/fhernanb/DiscreteDists.
Schlosser, Lisa. 2020. “Distributional Trees and Forests.” PhD thesis, University of Innsbruck.
Schlosser, Lisa, Torsten Hothorn, Reto Stauffer, and Achim Zeileis. 2019. Distributional regression forests for probabilistic precipitation forecasting in complex terrain.” The Annals of Applied Statistics 13 (3): 1564–89. https://doi.org/10.1214/19-AOAS1247.
Schlosser, Lisa, Moritz N. Lang, Torsten Hothorn, and Achim Zeileis. 2021. Disttree: Trees and Forests for Distributional Regression. https://R-Forge.R-project.org/projects/partykit/.
Stasinopoulos, Mikis, and Robert Rigby. 2024. Gamlss: Generalized Additive Models for Location Scale and Shape. https://www.gamlss.com/.