10  Modelos de variable positiva y continua

10.1 Modelado de datos continuos positivos

En muchos problemas la variable respuesta es continua y estrictamente positiva; por ejemplo, biomasa de follaje o diámetros arbóreos. Estas variables suelen presentar asimetría a la derecha, ya que el límite en cero comprime la cola izquierda, y muestran además una varianza que crece con la media: cuando \(\mu\to0\) la varianza tiende a cero, y para valores grandes de \(\mu\) la varianza aumenta.

Para capturar este comportamiento creciente de la varianza, los modelos lineales generalizados (GLM) emplean funciones de varianza de la forma \(V(\mu)=\mu^p\). En particular:

  • \(V(\mu)=\mu^2\) conduce a la distribución gamma, adecuada cuando el coeficiente de variación es constante.
  • \(V(\mu)=\mu^3\) conduce a la distribución inversa gaussiana, útil cuando la cola derecha es aún más pesada.

En R, estos modelos se ajustan con

family = Gamma(link=…)         # para GLM gamma  
family = inverse.gaussian(link=…)  # para GLM inverso-gaussiano

10.1.1 Ejemplo: Biomasa de follaje en Tilia cordata

Un estudio sobre robles pequeños obtuvo una muestra de biomasa de follaje (\(y\)), el diámetro a la altura del pecho (DBH, \(d\)), la edad y el origen de cada árbol (coppice, natural, plantado). Biológicamente, la biomasa del follaje está relacionada con el área de la copa, aproximadamente proporcional a \(\pi d^2\). Por tanto, una transformación logarítmica sugiere el modelo

\[ \log(y)\;=\;\beta_0 + 2\,\log(d)\;+\;\beta_2\,\text{Age} + \varepsilon, \]

con una distribución de error gamma o inverso gaussiana para reflejar el aumento de varianza con la media.

Al graficar \(\log(y)\) contra \(\log(d)\) y contra la edad, se observa una relación lineal en la escala log–log junto con heterocedasticidad creciente. El efecto del factor Origin es menos evidente, aunque podría incluirse como covariable categórica. Estos hallazgos apoyan el uso de un GLM gamma (o inverso-gaussiano si la cola derecha es muy pesada), que garantiza respuestas positivas y una varianza proporcional a \(\mu^2\) (o \(\mu^3\)) acorde con la dispersión observada.

library(GLMsData); data(lime); str(lime)
'data.frame':   385 obs. of  4 variables:
 $ Foliage: num  0.1 0.2 0.4 0.6 0.6 0.8 1 1.4 1.7 3.5 ...
 $ DBH    : num  4 6 8 9.6 11.3 13.7 15.4 17.8 18 22 ...
 $ Age    : int  38 38 46 44 60 56 72 74 68 79 ...
 $ Origin : Factor w/ 3 levels "Coppice","Natural",..: 2 2 2 2 2 2 2 2 2 2 ...
# Plot Foliage against DBH
plot(Foliage ~ DBH, type="n", las=1,
    xlab="DBH (in cm)", ylab="Foliage biomass (in kg)",
    ylim = c(0, 15), xlim=c(0, 40), data=lime)
points(Foliage ~ DBH, data=subset(lime, Origin=="Coppice"),
    pch=1)
points(Foliage ~ DBH, data=subset(lime, Origin=="Natural"),
    pch=2)
points(Foliage ~ DBH, data=subset(lime, Origin=="Planted"),
    pch=3)
legend("topleft", pch=c(1, 2, 3),
        legend=c("Coppice", "Natural","Planted"))

# Plot Foliage against DBH, on log scale
plot( log(Foliage) ~ log(DBH), type="n", las=1,
    xlab="log of DBH (in cm)", ylab="log of Foliage biomass (in kg)",
    ylim = c(-5, 3), xlim=c(0, 4), data=lime)
points( log(Foliage) ~ log(DBH), data=subset(lime, Origin=="Coppice"),
    pch=1)
points( log(Foliage) ~ log(DBH), data=subset(lime, Origin=="Natural"),
    pch=2)
points( log(Foliage) ~ log(DBH), data=subset(lime, Origin=="Planted"),
    pch=3)

# Plot Foliage against Age
plot(Foliage ~ Age, type="n", las=1,
    xlab="Age (in years)", ylab="Foliage biomass (in kg)",
    ylim = c(0, 15), xlim=c(0, 150), data=lime)
points(Foliage ~ Age, data=subset(lime, Origin=="Coppice"), pch=1)
points(Foliage ~ Age, data=subset(lime, Origin=="Natural"), pch=2)
points(Foliage ~ Age, data=subset(lime, Origin=="Planted"), pch=3)

# Plot Foliage against Origin
plot( Foliage ~ Origin, data=lime, ylim=c(0, 15),
        las=1, ylab="Foliage biomass (in kg)")

10.2 La distribución Gamma

La distribución Gamma es una opción habitual para modelar variables continuas positivas con asimetría a la derecha y varianza creciente con la media. Su función de densidad, en la parametrización habitual, es

\[ \mathcal{P}(y;\alpha,\beta) =\frac{y^{\alpha-1}e^{-y/\beta}}{\Gamma(\alpha)\,\beta^\alpha},\quad y>0, \]

con \(\mathrm{E}[y]=\alpha\beta\) y \(\operatorname{Var}[y]=\alpha\beta^2\). Para usarla en un GLM se reparametriza en términos de la media \(\mu\) y un parámetro de dispersión \(\phi>0\) mediante

\[ \alpha=\frac1\phi,\qquad \beta=\mu\,\phi, \]

obteniendo la densidad

\[ \mathcal{P}(y;\mu,\phi) =\Bigl(\tfrac{y}{\phi\mu}\Bigr)^{1/\phi}\frac{1}{y} \exp\Bigl(-\tfrac{y}{\phi\mu}\Bigr)\frac1{\Gamma(1/\phi)}, \]

y una función de varianza

\[ V(\mu)=\mu^2, \]

lo que implica un coeficiente de variación constante. La devianza unitaria queda

\[ d(y,\mu)=2\Bigl[-\log\tfrac{y}{\mu}+\tfrac{y-\mu}{\mu}\Bigr], \]

y, por la aproximación saddlepoint, la suma ponderada de estas devianzas unitarias sigue \(\chi^2_{n-p'}\) aproximadamente. El enlace canónico es el recíproco \(\eta=1/\mu\), aunque en la práctica suele usarse el enlace log para garantizar \(\mu>0\) y lograr interpretaciones multiplicativas de los coeficientes.

Ejemplo

Para comprobar que \(V(\mu)\approx\mu^2\), se agrupan las observaciones de biomasa de follaje por edad y origen, y se calculan medias y varianzas de cada grupo. Luego se grafica \(\log(\text{varianza})\) frente a \(\log(\text{media})\) y se ajusta una recta:

library(GLMsData); data(lime)

# Definir grupos de edad
lime$AgeGrp <- cut(lime$Age, breaks=4)

# Calcular medias y varianzas por grupo y origen
vr <- with(lime, tapply(Foliage, list(AgeGrp, Origin), var))
mn <- with(lime, tapply(Foliage, list(AgeGrp, Origin), mean))

# Gráfico log(varianza) vs. log(media)
plot(log(vr) ~ log(mn), las=1, pch=19,
     xlab="log(media de grupo)", ylab="log(varianza de grupo)")

# Ajuste de regresión lineal en escala log-log
mf.lm <- lm(c(log(vr)) ~ c(log(mn)))
abline(coef(mf.lm), lwd=2)

El coeficiente de la pendiente resulta cercano a 1.7, muy próximo a 2, lo que confirma que

\[ \log(\operatorname{Var})\approx2\,\log(\mathrm{E}[y]) \quad\Longrightarrow\quad V(\mu)\propto\mu^2, \]

respaldando así el uso de un GLM Gamma para modelar la biomasa de follaje.

10.3 La distribución gaussiana inversa

La distribución gaussiana inversa es otra opción para modelar datos continuos positivos con asimetría más marcada que la Gamma. Su función de densidad, en la parametrización de GLM con media \(\mu>0\) y dispersión \(\phi>0\), es

\[ \mathcal{P}(y;\mu,\phi) =(2\pi y^3\phi)^{-1/2} \exp\!\Bigl\{-\tfrac1{2\phi}\,\tfrac{(y-\mu)^2}{y\mu^2}\Bigr\},\quad y>0. \]

10.3.1 Función de varianza y enlace

La función de varianza es

\[ V(\mu)=\mu^3, \]

lo que traduce una varianza que crece aún más rápido con la media. El enlace canónico es \(\eta=\mu^{-2}\), aunque en la práctica suele emplearse el enlace logarítmico u otros que garanticen \(\mu>0\) y faciliten la interpretación (por ejemplo, efectos multiplicativos).

10.3.2 Devianza unitaria y ajuste

La devianza unitaria queda dada por

\[ d(y,\mu)=\frac{(y-\mu)^2}{y\,\mu^2}\,, \]

y la suma ponderada de estas devianzas, \(D(y,\hat\mu)=\sum w_i,d(y_i,\hat\mu_i)\), sigue exactamente una \(\chi^2_{n-p'}\) porque para la inversa gaussiana la aproximación de punto silla es exacta. Por tanto, los tests de ajuste y las comparaciones análogas a \(F\)-tests (cuando \(\phi\) es estimada) mantienen su validez sin aproximaciones adicionales.

10.4 Funciones de enlace

En los GLM basados en distribuciones Gamma e inversa gaussiana, es esencial elegir un enlace que garantice \(\mu>0\) y aporte interpretabilidad. R admite para ambas familias los enlaces “log” (\(\eta=\log\mu\)), “identity” (\(\eta=\mu\)) e “inverse” (\(\eta=1/\mu\)), así como el enlace canónico “1/mu^2” para la inversa gaussiana.

En el ejemplo anterior, se procede así:

  1. Enlace logarítmico (el habitual), que permite ajustar sin problemas:
   lime.log <- glm(Foliage ~ Origin * log(DBH),
                   family = Gamma(link = "log"),
                   data = lime)
  1. Enlaces inverso e identidad, que provocan errores de convergencia incluso suministrando valores iniciales desde el modelo logarítmico:

    lime.inv <- update(lime.log, family = Gamma(link="inverse"),
                       mustart = fitted(lime.log))
    # Error: no valid set of coefficients has been found
    
    lime.id <- update(lime.log, family = Gamma(link="identity"),
                      mustart = fitted(lime.log))
    # Error: no valid set of coefficients has been found

    Estos fallos indican que esos enlaces no son adecuados dada la forma de los datos.

  2. Diagnósticos del modelo log-link, utilizando residuos estandarizados, de trabajo, cuantílicos y distancia de Cook:

    library(statmod)
    
    # Residuos estandarizados vs. log(valores ajustados)
    plot(rstandard(lime.log) ~ log(fitted(lime.log)),
         main="Enlace log", las=1,
         xlab="Log de valores ajustados",
         ylab="Residuos estandarizados")

    # Residuos de trabajo + predictor lineal vs. predictor lineal
    eta.log <- lime.log$linear.predictor
    plot(resid(lime.log, type="working") + eta.log ~ eta.log,
         las=1, ylab="Residuos de trabajo",
         xlab="Predictor lineal, η")

    # Q–Q de residuos cuantílicos
    qqnorm(qr1 <- qresid(lime.log), las=1); qqline(qr1)

    # Distancia de Cook
    plot(cooks.distance(lime.log), type="h",
         main="Distancia de Cook",
         ylab="Cook's distance", las=1)

    Aunque aparecen algunos residuos elevados y valores de Cook relativamente altos, ninguna observación resulta influyente según los umbrales estándar. Por tanto, el enlace log se muestra adecuado para este conjunto de datos.

10.5 Estimación del parámetro de dispersión

10.5.1 Caso Gamma

En los GLM con Gamma, el parámetro de dispersión \(\phi\) no tiene una estimación de máxima verosimilitud en forma cerrada: debe resolverse numéricamente la ecuación

\[ D(y,\hat\mu) \;=\; -2\sum_{i=1}^n w_i\log\phi \;-\;\sum_{i=1}^n w_i\log w_i \;+\;\sum_{i=1}^n w_i\,\psi\bigl(w_i/\phi\bigr), \]

donde \(\psi\) es la digamma. Por simplicidad y robustez ante valores pequeños de \(y_i\), se usan dos estimadores alternativos:

  • Estimador de Pearson \(\bar\phi = \frac{1}{n-p'}\sum_{i=1}^n\frac{w_i\,(y_i-\hat\mu_i)^2}{\hat\mu_i^2}.\)
  • Media de desviancia \(\tilde\phi = \frac{D(y,\hat\mu)}{n-p'}.\)

En el Ejemplo, aplicado al modelo lime.log (datos de árboles de lima), obtenemos:

phi.md      <- deviance(lime.log) / df.residual(lime.log)
phi.pearson <- summary(lime.log)$dispersion
c("Mean deviance" = phi.md,
  "Pearson"       = phi.pearson)
Mean deviance       Pearson 
    0.4028747     0.5443774 

El MLE numérico resulta \(\hat\phi_{\rm mle}\approx0.3736\).

10.5.1.1 Análisis de devianza con pruebas \(F\)

Dado que \(\phi\) se estima, las comparaciones anidadas se basan en la prueba \(F\). En el ejemplo anterior, la tabla de anova de lime.log es, p. ej.:

round(anova(lime.log, test="F"), 3)
Analysis of Deviance Table

Model: Gamma, link: log

Response: Foliage

Terms added sequentially (first to last)

                Df Deviance Resid. Df Resid. Dev       F Pr(>F)    
NULL                              384     508.48                   
Origin           2    19.89       382     488.59  18.272 <2e-16 ***
log(DBH)         1   328.01       381     160.58 602.535 <2e-16 ***
Origin:log(DBH)  2     7.89       379     152.69   7.247  0.001 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

que arroja valores de \(F\) y \(P<2\times10^{-16}\) para los efectos de Origin, \(\log(\mathrm{DBH})\) y su interacción, tanto usando la estimación de Pearson como la de media de devianza.

En todos los casos, las conclusiones sobre qué términos incluir en el modelo son prácticamente idénticas, confirmando la solidez del procedimiento frente a la elección del estimador de \(\phi\).

10.5.2 Caso Gaussiana Inversa

En los GLM con distribución gaussiana inversa, el estimador de máxima verosimilitud de la dispersión tiene la forma cerrada

\[ \hat\phi_{\rm mle} \;=\; \frac{D(y,\hat\mu)}{n}\,, \]

siendo \(D(y,\hat\mu)\) la desviancia residual y \(n\) el número de observaciones. Como este estimador está sesgado a la baja, se suele preferir el estimador de devianza media

\[ \tilde\phi \;=\; \frac{D(y,\hat\mu)}{n-p'}\,, \]

que coincide casi exactamente con el estimador de perfil modificado y resulta prácticamente insesgado cuando los datos tienen buena precisión. De manera análoga al caso Gamma, el estimador de Pearson

\[ \bar\phi \;=\; \frac{1}{n-p'}\sum_{i=1}^n\frac{w_i\,(y_i-\hat\mu_i)^2}{\hat\mu_i^{3}} \]

es más robusto en presencia de valores muy pequeños o redondeados, y por ello R lo emplea por defecto.

# Ajuste de un modelo Inversa Gaussiana
lime.iG <- glm(
  Foliage ~ Origin * log(DBH),
  family = inverse.gaussian(link="log"),
  data   = lime
)

# Cálculo de los tres estimadores de phi
phi.iG.mle     <- deviance(lime.iG) / length(lime$Foliage)
phi.iG.md      <- deviance(lime.iG) / df.residual(lime.iG)
phi.iG.pearson <- summary(lime.iG)$dispersion

c(
  "MLE"       = phi.iG.mle,
  "Mean dev." = phi.iG.md,
  "Pearson"   = phi.iG.pearson
)
      MLE Mean dev.   Pearson 
 1.056659  1.073387  1.255992 

Por último, comparar el AIC de este modelo con el del GLM Gamma muestra que el modelo Gamma ajusta mejor:

c(
  "Gamma:"       = AIC(lime.log),
  "Inv. Gauss.:" = AIC(lime.iG)
)
      Gamma: Inv. Gauss.: 
    750.3267    1089.5297