Notas sobre R

Deben tener previamente descargados los siguientes paquetes:

library(readxl)
## Warning: package 'readxl' was built under R version 4.0.2
library(knitr)
library(dplyr)
library(DT)
library(EnvStats)

También deben descargar en su directorio (“folder”) de trabajo, el archivo mod_empiricos.xlsx que se encuentra en la carpeta del tema.

Modelos empíricos


Modelos de Regresión

Regresión Lineal Simple

Ejemplo 1: Infección con malaria: número de parásitos en 1 ml de sangre en niños de diversas edades.

malaria <- read_excel("mod_empiricos.xlsx", 
    sheet = "malaria")
#creando una tabla elegante
datatable(malaria,
          filter = 'top', options = list(
            pageLength = 15, autoWidth = TRUE
          ))
#si no funciona el anterior, algo más sencillo
kable(malaria)
age number
12 730
8 143
16 2275
8 37
11 535
10 465
12 690
13 826
15 1340
14 1580
14 1340
15 1925
15 2662

##Modelo básico Supongamos que hay una variable cuantitativa \(X\) que nos puede dar información de \(Y\), entonces podemos explicar el valor esperado de \(Y\) (\(\mu_{Y|X}\)), en su más simple expresión, utilizando la siguiente ecuación:

\[\mu_{Y|X} = \beta_0 +\beta_1X\qquad(1)\] Y en su forma operativa, tenemos la siguiente ecuación para un modelo de regresión lineal simple:

\[y_i = \beta_0 + \beta_1x_i + e_i\qquad(2)\] donde:

\(y_i\) indica el valor específico de \(Y\) para el i-ésimo dato
\(\beta_0\) indica el valor esperado de \(Y\) cuando \(X = 0\) (intercepto de la regresión)
\(\beta_1\) indica el parámetro asociado a la variable predictora \(X\) (pendiente de la regresión); representa el cambio en el valor esperado de \(Y\) por unidad de cambio de \(X\)
\(x_i\) indica el valor específico de \(X\) para el i-ésimo dato
\(e_i\) indica el error aleatorio para el i-ésimo dato


###EJERCICIO 1: Representación gráfica de datos y definición de variables Volviendo a los datos de malaria en niños, nos preguntamos que relación existe entre la edad de los niños y el nivel de infección en la sangre, con el parásito.

número de parásitos en la sangre (\(Y\)) = número de parásitos al nacer \(\beta_0\) + cambio en número de parásitos por unidad de edad (\(\beta_1\)) x edad (\(X\))

no escribimos el error esperado, pero sabemos que está contenido en el modelo, como desviación (aleatoria e independiente) del verdadero valor de \(Y\) dado el valor de \(X\)


##Gráfica de los datos

plot(malaria$age, malaria$number, type = "p",
     xlim = c(7,17),
     xlab = "Edad (años)", 
     ylab = "Número de parásitos en 1 ml de sangre", 
     asp = NA)


##Supuestos para la regresión lineal El procedimiento de regresión lineal asume que se cumplen algunos supuestos:


Pruebas de supuestos

Prueba de normalidad: Q-Q plot y Shapiro-Wilk

#Q-Q plot para las variables
qqPlot(malaria$age, add.line = TRUE, points.col = "blue", line.col = "red")

qqPlot(malaria$number, add.line = TRUE, points.col = "blue", line.col = "red")

#prueba de Shapiro-Wilk
shapiro.test(malaria$age)
## 
##  Shapiro-Wilk normality test
## 
## data:  malaria$age
## W = 0.91503, p-value = 0.2148
shapiro.test(malaria$number)
## 
##  Shapiro-Wilk normality test
## 
## data:  malaria$number
## W = 0.94677, p-value = 0.5503

Prueba de homocedasticidad

Para probar si la varianza de los residuales es constante, es decir que poseen homocedasticidad, utilizamos la prueba Goldfeld-Quandt, con una \(H_0:igualdad\:de\:varianza\), entre dos grupos de valores de residuales.

#Goldfeld-Quandt test
#Ho: varianzas iguales entre grupos de datos (baja y alta edad)
library(lmtest)
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
gqtest(lm(formula = number ~ age, data = malaria))
## 
##  Goldfeld-Quandt test
## 
## data:  lm(formula = number ~ age, data = malaria)
## GQ = 3.6893, df1 = 5, df2 = 4, p-value = 0.115
## alternative hypothesis: variance increases from segment 1 to 2

Estimación de los parámetros del modelo

Usaremos el método de los cuadrados-mínimos (‘least-squares’) para estimar los parámetros del modelo. Este método se basa en encontrar los parámetros \(\beta_0\) y \(\beta_1\) que minimicen la siguiente función:

\[S(\beta_0, \beta_1) = \sum {e_i}^2 = \sum (y_i - \beta_0 - \beta_1x_i)^2\]


Estimados de los parámetros de la regresión lineal simple

Usando el procedimiento lm en R podemos estimar los parámetros del modelo.

rls <- lm(malaria$number ~ malaria$age)
summary(rls)
## 
## Call:
## lm(formula = malaria$number ~ malaria$age)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -458.60 -240.43   46.68  170.79  863.40 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -2342.24     511.05  -4.583 0.000786 ***
## malaria$age   276.06      39.93   6.913 2.54e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 368.7 on 11 degrees of freedom
## Multiple R-squared:  0.8129, Adjusted R-squared:  0.7959 
## F-statistic: 47.79 on 1 and 11 DF,  p-value: 2.544e-05

Y obtener una gráfica de la línea (función) de regresión.

plot(malaria$age, malaria$number,
     xlab = "Edad, años",
     ylab = "Cantidad de parásitos por ml de sangre")
abline(rls)


Examinando el modelo

Residuales

plot(malaria$age,residuals(rls),
     xlab="Edad, años",
     ylab="Residuales")


Intervalo de confianza

library(ggplot2)
ggplot(data=malaria, aes(x=age, y=number)) +
  geom_point(pch=19, color="blue", size=2) +
  geom_smooth(method="lm", color="red", linetype=2) +
  labs(x="Edad, años", y="Cantidad parásitos")
## `geom_smooth()` using formula 'y ~ x'


Mejorando el Modelo RLS

  • Vamos a tratar de mejorar el modelo anterior (curvatura y residuales) utilizando modelos polinomiales y transformaciones.

  • Hay que tener en cuenta que al utilizar estos procedimientos, debemos justificarlo sobre la base de un comportamiento hipotético (fundamentado) en la relación causa-efecto (aunque no se conozca el mecanismo específico).


Regresión Polinomial

Vamos a tratar un modelo cuadrático positivo (\(y = a*x^2 + b*x + c\)). Utilizaremos el procedimiento lm (‘linear model’), pero especificando un modelo cuadrático:

rpol <- lm(number ~ age + I(age^2), data=malaria)
summary(rpol)
## 
## Call:
## lm(formula = number ~ age + I(age^2), data = malaria)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -548.69 -104.06  -16.76   40.90  773.31 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept)  1937.97    2091.37   0.927   0.3759  
## age          -483.20     364.09  -1.327   0.2140  
## I(age^2)       31.99      15.27   2.095   0.0626 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 322.3 on 10 degrees of freedom
## Multiple R-squared:   0.87,  Adjusted R-squared:  0.8439 
## F-statistic: 33.45 on 2 and 10 DF,  p-value: 3.719e-05

Los nuevos residuales:

plot(malaria$age,residuals(rpol),
     xlab="Edad, años",
     ylab="Residuales")


Examinemos la nueva gráfica:

library(readxl)
library(ggplot2)
malaria <- read_excel("mod_empiricos.xlsx", 
    sheet = "malaria")
ggplot(malaria, aes(x = age, y = number)) +
  geom_point(aes(x = age, y = number)) +
  stat_smooth(aes(), method = "lm", formula = y ~ poly(x,2), se =TRUE, size = 1) +
  labs(x="Edad, años", y="Cantidad parásitos")


Exceso de ajuste (‘overfitting’)

En el ejercicio anterior pudimos comprobar que mejoramos el modelo y su ajuste a los datos, utilizando una función polinomial. Si usamos una función cúbica puede mejorar el ajuste general, pero el \(R^2\) ajustado (que depende del número de variables) no necesariamente mejorará, y estaremos sobre-ajustando los datos a un modelo. El problema principal del ‘overfitting’ es cuando no podemos explicar el significado de los términos incorporados al modelo. En este ejemplo, podemos hipotetizar que el componente cuadrático corresponde a un modelo de crecimiento del parásito en la sangre de los niños.


Transformaciones

Otra manera de trabajar con los problemas de desviación de los puntos de una línea recta, falta de normalidad o falta de homocedasticidad, es usar transformaciones:

Transformaciones


EJERCICIO

Abrir un nuevo documento RMarkdown:

    1. Del archivo mod_empiricos.xlsx, importar los datos trigliceridos (circunferencia de la cintura, pulgadas y trigliceridos en sangre, mg/dl, en individuos adultos entre 21 y 79 años).
    1. Formular un modelo de regresión lineal (debe establecer la posible relación causa efecto).
    1. Realizar una gráfica de puntos con las dos variables.
    1. Calcular los coeficientes del modelo de regresión y las estadísticas del mismo.
    1. Graficar los residuales.
    1. Graficar la línea de regresión, con el intervalo de confianza.
    1. Repetir los pasos 4. - 6., utilizando un modelos polinomial.
    1. Comparar y discutir los resultados.
    1. Usar este ejercicio como parte de su primer informe.

Referencias

Shiflet, A. 2014. Introduction to Computational Science, 2nd Edition. Princeton University Press, Princeton, New Jersey, USA.

Suárez, E., Pérez, C.M., Rivera, R., Martínez, M.N. 2017. Applications of Regression Models in Epidemiology. John Wiley & Sons, Inc., Hoboken, New Jersey, USA.