Introducción

En este documento se presentan ejemplos de pruebas de hipótesis utilizando R.

Algunos ejemplos incluyen:

Paquetes necesarios

# Cargar paquetes necesarios
library(tidyverse)
library(gt)
library(magrittr)

Datos a utilizar

Vamos a utilizar el conjunto de datos de diabetes, que contiene información sobre pacientes (mujeres de la etnia Pima) diagnosticadas (Outcome) con o sin diabetes (1 o 0, respectivamente). El conjunto de datos incluye variables como el número de embarazos, niveles de glucosa, presión arterial, grosor de la piel, insulina, índice de masa corporal (BMI), función del pedigrí diabético y edad.

# Cargar datos desde archivo .csv
diabetes <- read.csv("diabetes.csv")

# Estructura de los datos
str(diabetes)
## 'data.frame':    768 obs. of  9 variables:
##  $ Pregnancies             : int  6 1 8 1 0 5 3 10 2 8 ...
##  $ Glucose                 : int  148 85 183 89 137 116 78 115 197 125 ...
##  $ BloodPressure           : int  72 66 64 66 40 74 50 0 70 96 ...
##  $ SkinThickness           : int  35 29 0 23 35 0 32 0 45 0 ...
##  $ Insulin                 : int  0 0 0 94 168 0 88 0 543 0 ...
##  $ BMI                     : num  33.6 26.6 23.3 28.1 43.1 25.6 31 35.3 30.5 0 ...
##  $ DiabetesPedigreeFunction: num  0.627 0.351 0.672 0.167 2.288 ...
##  $ Age                     : int  50 31 32 21 33 30 26 29 53 54 ...
##  $ Outcome                 : int  1 0 1 0 1 0 1 0 1 1 ...

Renombrar columnas

# Renombrar columnas para facilitar el uso
diabetes_n <- diabetes %>%
  rename(
    preg = Pregnancies,
    gluc = Glucose,
    blpr = BloodPressure,
    skin = SkinThickness,
    insu = Insulin,
    bmi = BMI,
    pedi = DiabetesPedigreeFunction,
    age = Age,
    diag = Outcome
  )
str(diabetes_n)
## 'data.frame':    768 obs. of  9 variables:
##  $ preg: int  6 1 8 1 0 5 3 10 2 8 ...
##  $ gluc: int  148 85 183 89 137 116 78 115 197 125 ...
##  $ blpr: int  72 66 64 66 40 74 50 0 70 96 ...
##  $ skin: int  35 29 0 23 35 0 32 0 45 0 ...
##  $ insu: int  0 0 0 94 168 0 88 0 543 0 ...
##  $ bmi : num  33.6 26.6 23.3 28.1 43.1 25.6 31 35.3 30.5 0 ...
##  $ pedi: num  0.627 0.351 0.672 0.167 2.288 ...
##  $ age : int  50 31 32 21 33 30 26 29 53 54 ...
##  $ diag: int  1 0 1 0 1 0 1 0 1 1 ...

Prueba de una muestra

En la prueba de hipótesis de una muestra, se compara la media de una muestra con un valor específico. En nuestro caso vamos a comparar la media de la glucosa con un valor de referencia, que indique la posibilidad que la persona tiene diabetes.

Nuestra hipótesis nula es que la media de glucosa es igual a 100 mg/dL, y la alternativa es que la media de glucosa es mayor a 100 mg/dL:

\(H_0: \mu <= 100\)
\(H_a: \mu > 100\)

Vamos a realizar la prueba t de Student para una muestra:

# Filtrar los datos para eliminar valores de glucosa cero
diabetes_ng <- diabetes_n %>%
  filter(gluc != 0)

# Prueba t de Student para una muestra
t_test_result <- t.test(diabetes_ng$gluc, mu = 100, alternative = "greater")
t_test_result
## 
##  One Sample t-test
## 
## data:  diabetes_ng$gluc
## t = 19.618, df = 762, p-value < 2.2e-16
## alternative hypothesis: true mean is greater than 100
## 95 percent confidence interval:
##  119.8662      Inf
## sample estimates:
## mean of x 
##  121.6868
# Extracting the t, df, p-value, confidence interval, and mean to a gt table
t_test_summary <- data.frame(
  t_value = t_test_result$statistic,
  df = t_test_result$parameter,
  p_value = t_test_result$p.value,
  conf_int_lower = t_test_result$conf.int[1],
  conf_int_upper = t_test_result$conf.int[2],
  mean = t_test_result$estimate
)
t_test_summary %>%
  gt() %>%
  tab_header(
    title = "TABLA 1. Resumen de la prueba t de Student para la media de glucosa vs. el nivel de referencia de 100 mg/dL"
  ) %>%
  cols_label(
    t_value = "Valor t",
    df = "Grados de Libertad",
    p_value = "Valor p",
    conf_int_lower = "Límite Inferior IC",
    conf_int_upper = "Límite Superior IC",
    mean = "Media"
  ) %>%
  fmt_number(
    columns = c(t_value, df, conf_int_lower, conf_int_upper, mean),
    decimals = 1
  )
TABLA 1. Resumen de la prueba t de Student para la media de glucosa vs. el nivel de referencia de 100 mg/dL
Valor t Grados de Libertad Valor p Límite Inferior IC Límite Superior IC Media
19.6 762.0 5.591421e-70 119.9 Inf 121.7

Histograma de la variable glucosa con intervalo de confianza

# Histograma de la variable glucosa con líneas verticales marcando la media y el intervalo de confianza
ggplot(diabetes_ng, aes(x = gluc)) +
  geom_histogram(binwidth = 10, fill = "lightblue", color = "black") +
  geom_vline(aes(xintercept = t_test_result$estimate), color = "red", linetype = "solid") +
  geom_vline(aes(xintercept = t_test_result$conf.int[1]), color = "darkblue", linetype = "solid", linewidth = 1) +
  geom_vline(aes(xintercept = t_test_result$conf.int[2]), color = "darkblue", linetype = "dashed", linewidth = 1) +
  labs(x = "Glucosa (mg/dL)",
       y = "Frecuencia") +
  theme_minimal()

Figura 1. Histograma de la variable glucosa con líneas verticales que indican la media (roja) y el intervalo de confianza (azul).

Interpretación:

  • El valor t es positivo, lo que indica que la media de glucosa es mayor que el valor de referencia.
  • El valor p es menor que 0.05, lo que indica que hay evidencia suficiente para rechazar la hipótesis nula.
  • El intervalo de confianza no incluye el valor de referencia, lo que refuerza la conclusión de que la media de glucosa es significativamente mayor que 100 mg/dL.

EJERCICIO:

  1. Realiza una prueba de hipótesis para la variable bmi (índice de masa corporal) comparando su media con un valor de referencia de 25.

Prueba de dos muestras

En la prueba de hipótesis de dos muestras, se comparan las medias de dos grupos independientes. Vamos a comparar la media de glucosa entre dos grupos: pacientes diagnosticados con diabetes (diag = 1) y pacientes no diagnosticados (diag = 0).

Nuestra hipótesis nula es que las medias de glucosa son iguales entre los dos grupos, y la alternativa es que son diferentes: \(H_0: \mu_1 = \mu_2\)
\(H_a: \mu_1 \neq \mu_2\)

Vamos a realizar la prueba t de Student para dos muestras independientes:

# Filtrar los datos para eliminar valores de glucosa cero
diabetes_ng <- diabetes_n %>%
  filter(gluc != 0)

# Prueba t de Student para dos muestras independientes
t_test_2_samples <- t.test(gluc ~ diag, data = diabetes_ng, var.equal = TRUE)
t_test_2_samples
## 
##  Two Sample t-test
## 
## data:  gluc by diag
## t = -15.701, df = 761, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
## 95 percent confidence interval:
##  -35.63610 -27.71527
## sample estimates:
## mean in group 0 mean in group 1 
##        110.6439        142.3195
# Extraer el valor t, df, valor p, intervalo de confianza y medias a una tabla gt, usando 1 decimal para los valores
t_test_2_samples_summary <- data.frame(
  t_value = t_test_2_samples$statistic,
  df = t_test_2_samples$parameter,
  p_value = t_test_2_samples$p.value,
  conf_int_lower = t_test_2_samples$conf.int[1],
  conf_int_upper = t_test_2_samples$conf.int[2],
  mean_diag_0 = mean(diabetes_ng$gluc[diabetes_ng$diag == 0]),
  mean_diag_1 = mean(diabetes_ng$gluc[diabetes_ng$diag == 1])
)
t_test_2_samples_summary %>%
  gt() %>%
  tab_header(
    title = "TABLA 2. Resumen de la prueba t de Student para la media de glucosa entre grupos diagnosticados (1) y no diagnosticados (0) con diabetes"
  ) %>%
  cols_label(
    t_value = "Valor t",
    df = "Grados de Libertad",
    p_value = "Valor p",
    conf_int_lower = "Límite Inferior IC",
    conf_int_upper = "Límite Superior IC",
    mean_diag_0 = "Media (diag = 0)",
    mean_diag_1 = "Media (diag = 1)"
  ) %>%
  fmt_number(
    columns = c(t_value, df, conf_int_lower, conf_int_upper, mean_diag_0, mean_diag_1),
    decimals = 1
  )
TABLA 2. Resumen de la prueba t de Student para la media de glucosa entre grupos diagnosticados (1) y no diagnosticados (0) con diabetes
Valor t Grados de Libertad Valor p Límite Inferior IC Límite Superior IC Media (diag = 0) Media (diag = 1)
−15.7 761.0 2.478289e-48 −35.6 −27.7 110.6 142.3
# Histograma de la variable glucosa por grupo de diagnóstico
ggplot(diabetes_ng, aes(x = gluc, fill = factor(diag))) +
  geom_histogram(binwidth = 10, position = "dodge", alpha = 0.7) +
  labs(x = "Glucosa (mg/dL)",
       y = "Frecuencia",
       fill = "Diagnóstico") +
  theme_minimal()

Figura 2. Histograma de la variable glucosa por grupo de diagnóstico. Las barras representan la frecuencia de glucosa en cada grupo, con diferentes colores para los grupos diagnosticados (1) y no diagnosticados (0) con diabetes.

Interpretación:

EJERCICIO: 1. Realiza una prueba de hipótesis para la variable insu (insulina) comparando su media entre los grupos diagnosticados con diabetes (diag = 1) y no diagnosticados (diag = 0).

Prueba de independencia.

En la prueba de independencia, se evalúa si dos variables categóricas están asociadas o no. Vamos a utilizar la prueba de chi-cuadrado para evaluar la independencia entre el diagnóstico de diabetes (diag) y tres niveles de BMI (bmi), que hemos categorizado en tres grupos: bajo, normal y alto.

Nuestra hipótesis nula es que las dos variables son independientes, y la alternativa es que están asociadas.

# Categorización de BMI en tres grupos
diabetes_bmi <- diabetes_n %>%
  filter(bmi != 0) %>%
  mutate(bmi_cat = case_when(
    bmi <= 25 ~ "Normal",
    TRUE ~ "Alto"
  ))

Tabla de contingencia y prueba de chi-cuadrado:

# Tabla de contingencia
tabla_contingencia <- table(diabetes_bmi$diag, diabetes_bmi$bmi_cat)
tabla_contingencia
##    
##     Alto Normal
##   0  386    105
##   1  259      7
# Tabla de contingencia con proporciones, dos decimales
tabla_contingencia_prop <- round(prop.table(tabla_contingencia, margin = 1), 2)
tabla_contingencia_prop
##    
##     Alto Normal
##   0 0.79   0.21
##   1 0.97   0.03
# Prueba de chi-cuadrado
chi_square_test <- chisq.test(tabla_contingencia)
chi_square_test
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  tabla_contingencia
## X-squared = 46.656, df = 1, p-value = 8.459e-12
# Extracting the chi-squared statistic, df, p-value, and expected counts to a table
chi_square_summary <- data.frame(
  chi_squared = chi_square_test$statistic,
  df = chi_square_test$parameter,
  p_value = chi_square_test$p.value
)
chi_square_summary
##           chi_squared df      p_value
## X-squared    46.65643  1 8.458882e-12
# Gráfico de barras de la tabla de contingencia
ggplot(as.data.frame(tabla_contingencia_prop), aes(x = Var2, y = Freq, fill = factor(Var1))) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(x = "Categoría de BMI",
       y = "Proporción",
       fill = "Diagnóstico") +
  theme_minimal()

Figura 3. Gráfico de barras de la tabla de contingencia entre el diagnóstico de diabetes y las categorías de BMI. Las barras representan la proporción de cada categoría de BMI para los grupos diagnosticados (1) y no diagnosticados (0) con diabetes.

Interpretación:

EJERCICIO:

  1. Realiza una prueba de independencia entre el diagnóstico de diabetes (diag) y el número de embarazos (preg), categorizando los embarazos en tres grupos: bajo (0-2), medio (3-5) y alto (6 o más).

Prueba de ANOVA

En la prueba de ANOVA (Análisis de Varianza), se comparan las medias de tres o más grupos independientes. Vamos a comparar la media de glucosa entre tres grupos de edad: jóvenes (21-30 años), adultos (31-50 años) y mayores (51 años o más).

Nuestra hipótesis nula es que las medias de glucosa son iguales entre los tres grupos, y la alternativa es que al menos una media es diferente:

\(H_0: \mu_1 = \mu_2 = \mu_3\)

\(H_a: \text{Al menos una media es diferente}\)

# Categorización de edad en tres grupos
diabetes_age <- diabetes_n %>%
  filter(gluc != 0) %>%
  mutate(age_cat = case_when(
    age <= 30 ~ "Joven",
    age > 30 & age <= 50 ~ "Adulto",
    TRUE ~ "Mayor"
  ))
# Prueba de ANOVA
anova_result <- aov(gluc ~ age_cat, data = diabetes_age)
summary(anova_result)
##              Df Sum Sq Mean Sq F value   Pr(>F)    
## age_cat       2  51122   25561   29.46 4.75e-13 ***
## Residuals   760 659386     868                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Extracting the F-statistic, df, p-value, and means to a table
anova_summary <- data.frame(
  F_value = summary(anova_result)[[1]]$`F value`[1],
  df_between = summary(anova_result)[[1]]$Df[1],
  df_within = summary(anova_result)[[1]]$Df[2],
  p_value = summary(anova_result)[[1]]$`Pr(>F)`[1]
)
anova_summary
##    F_value df_between df_within      p_value
## 1 29.46127          2       760 4.752183e-13
# Crear tabla gt con los resultados de ANOVA usando 1 decimal para los valores
anova_summary %>%
  gt() %>%
  tab_header(
    title = "TABLA 3. Resumen de la prueba ANOVA para la media de glucosa entre grupos de edad"
  ) %>%
  cols_label(
    F_value = "Valor F",
    df_between = "Grados de Libertad (entre grupos)",
    df_within = "Grados de Libertad (dentro de grupos)",
    p_value = "Valor p"
  ) %>%
  fmt_number(
    columns = c(F_value, df_between, df_within),
    decimals = 1
  )
TABLA 3. Resumen de la prueba ANOVA para la media de glucosa entre grupos de edad
Valor F Grados de Libertad (entre grupos) Grados de Libertad (dentro de grupos) Valor p
29.5 2.0 760.0 4.752183e-13
# Gráfico de caja de glucosa por grupo de edad
# Set the order for age_cat
diabetes_age$age_cat <- factor(diabetes_age$age_cat, levels = c("Joven", "Adulto", "Mayor"))

# boxplot 
ggplot(diabetes_age, aes(x = age_cat, y = gluc)) +
  geom_boxplot(outlier.shape = NA, fill = "lightblue", color = "black") +
  geom_jitter(width = 0.2, alpha = 0.5) +
  geom_point(stat = "summary", fun = "mean", color = "red", size = 3) +
  labs(x = "Grupo de Edad",
       y = "Glucosa (mg/dL)") +
  theme_minimal()

Figura 4. Gráfico de caja de glucosa por grupo de edad. Las cajas representan el rango intercuartílico, las líneas horizontales dentro de las cajas representan la mediana, y los puntos rojos indican la media de glucosa en cada grupo de edad.

Interpretación:

Prueba de Tukey

# Prueba post-hoc de Tukey
tukey_result <- TukeyHSD(anova_result)
tukey_result
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = gluc ~ age_cat, data = diabetes_age)
## 
## $age_cat
##                   diff        lwr       upr     p adj
## Joven-Adulto -11.57221 -16.995255 -6.149168 0.0000020
## Mayor-Adulto  13.10439   4.333948 21.874823 0.0013831
## Mayor-Joven   24.67660  16.272745 33.080448 0.0000000
# Convertir el resultado de Tukey a un data frame
tukey_df <- as.data.frame(tukey_result$age_cat)

# Gráfico de las diferencias de medias con intervalos de confianza
ggplot(tukey_df, aes(x = reorder(row.names(tukey_df), diff), y = diff)) +
  geom_point() +
  geom_errorbar(aes(ymin = lwr, ymax = upr), width = 0.2) +
  labs(x = "Comparación de Grupos",
       y = "Diferencia de Medias") +
  theme_minimal() +
  coord_flip()

Figura 5. Gráfico de las diferencias de medias entre los grupos de edad con sus intervalos de confianza. Los puntos representan las diferencias de medias, y las barras de error indican los intervalos de confianza.

Interpretación de la prueba de Tukey:
- La prueba de Tukey muestra las diferencias de medias entre los grupos de edad, con intervalos de confianza. - Los puntos representan las diferencias de medias, y las barras de error indican los intervalos de confianza. - Si el intervalo de confianza no incluye cero, indica que hay una diferencia significativa entre los grupos comparados.

EJERCICIO: 1. Realiza una prueba de ANOVA para la variable insu (insulina) entre los grupos de edad: jóvenes (21-30 años), adultos (31-50 años) y mayores (51 años o más).

Prueba de correlación

En la prueba de correlación, se evalúa la relación entre dos variables numéricas. Vamos a evaluar la correlación entre el índice de masa corporal (bmi) y los niveles de glucosa (gluc).

Para evaluar la correlación, vamos a utilizar el coeficiente de correlación de Pearson. Nuestra hipótesis nula es que no hay correlación entre las dos variables, y la alternativa es que hay una correlación:

\(H_0: \rho = 0\) \(H_a: \rho \neq 0\)

# Filtrar los datos para eliminar valores de glucosa y BMI cero
diabetes_bg <- diabetes_n %>%
  filter(gluc != 0 & bmi != 0)

# Calcular el coeficiente de correlación de Pearson
correlation_result <- cor.test(diabetes_bg$bmi, diabetes_bg$gluc, method = "pearson")
correlation_result
## 
##  Pearson's product-moment correlation
## 
## data:  diabetes_bg$bmi and diabetes_bg$gluc
## t = 6.5547, df = 750, p-value = 1.037e-10
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.1640065 0.2992833
## sample estimates:
##       cor 
## 0.2327705
# Extraer el coeficiente de correlación, valor p y número de observaciones a una tabla
correlation_summary <- data.frame(
  correlation = correlation_result$estimate,
  p_value = correlation_result$p.value,
  n = correlation_result$parameter + 2
)
correlation_summary %>%
  gt() %>%
  tab_header(
    title = "TABLA 4. Resumen de la prueba de correlación entre BMI y Glucosa"
  ) %>%
  cols_label(
    correlation = "Coeficiente de Correlación",
    p_value = "Valor p",
    n = "Número de Observaciones"
  ) %>%
  fmt_number(
    columns = c(correlation, n),
    decimals = 2
  )
TABLA 4. Resumen de la prueba de correlación entre BMI y Glucosa
Coeficiente de Correlación Valor p Número de Observaciones
0.23 1.03658e-10 752.00
# Gráfico de dispersión
ggplot(diabetes_bg, aes(x = bmi, y = gluc)) +
  geom_point(alpha = 0.5) +
  labs(x = "Índice de Masa Corporal (BMI)",
       y = "Glucosa (mg/dL)") +
  theme_minimal()

Figura 6. Gráfico de dispersión entre el índice de masa corporal (BMI) y los niveles de glucosa. Los puntos representan las observaciones individuales, y la tendencia sugiere una posible relación entre las dos variables.

Interpretación:

EJERCICIO: 1. Realiza una prueba de correlación entre la presión sanguínea (blpr) y los niveles de glucosa (gluc).

Correlación múltiple

En la correlación múltiple, se evalúa simultáneamente la correlación entre más de dos variables numéricas. Vamos a evaluar la correlación entre las variables del archivo diabetes.

# Seleccionar las variables numéricas
diabetes_numeric <- diabetes_n %>%
  select(gluc, blpr, skin, insu, bmi, pedi, age)
# Filtrar los datos para eliminar valores cero
diabetes_numeric <- diabetes_numeric %>%
  filter_all(all_vars(. != 0))

# Calculate correlation matrix
corr_matrix <- cor(diabetes_numeric)

TABLA 5. Matriz de Correlación entre las variables del estudio de diabetes en la población de mujeres de la etnia Pima.

##           gluc       blpr      skin      insu       bmi        pedi        age
## gluc 1.0000000  0.2100266 0.1988558 0.5812230 0.2095159  0.14018018 0.34364150
## blpr 0.2100266  1.0000000 0.2325712 0.0985115 0.3044034 -0.01597110 0.30003895
## skin 0.1988558  0.2325712 1.0000000 0.1821991 0.6643549  0.16049853 0.16776114
## insu 0.5812230  0.0985115 0.1821991 1.0000000 0.2263965  0.13590578 0.21708199
## bmi  0.2095159  0.3044034 0.6643549 0.2263965 1.0000000  0.15877104 0.06981380
## pedi 0.1401802 -0.0159711 0.1604985 0.1359058 0.1587710  1.00000000 0.08502911
## age  0.3436415  0.3000389 0.1677611 0.2170820 0.0698138  0.08502911 1.00000000

Significancia (valor p) de la correlación entre las variables:

library(Hmisc)

# Calculate correlation matrix and p-values
corr_results <- rcorr(as.matrix(diabetes_numeric))
p_values <- corr_results$P
p_values[is.na(p_values)] <- 0
corr_matrix <- corr_results$r

TABLA 6. Valores p de la correlación entre las variables del estudio de diabetes.

##              gluc         blpr         skin         insu          bmi
## gluc 0.000000e+00 2.766511e-05 7.363276e-05 0.000000e+00 2.896479e-05
## blpr 2.766511e-05 0.000000e+00 3.256545e-06 5.130229e-02 7.541610e-10
## skin 7.363276e-05 3.256545e-06 0.000000e+00 2.875835e-04 0.000000e+00
## insu 0.000000e+00 5.130229e-02 2.875835e-04 0.000000e+00 5.982104e-06
## bmi  2.896479e-05 7.541610e-10 0.000000e+00 5.982104e-06 0.000000e+00
## pedi 5.430814e-03 7.525931e-01 1.431348e-03 7.044829e-03 1.613288e-03
## age  2.629452e-12 1.346760e-09 8.543557e-04 1.450368e-05 1.677369e-01
##             pedi          age
## gluc 0.005430814 2.629452e-12
## blpr 0.752593093 1.346760e-09
## skin 0.001431348 8.543557e-04
## insu 0.007044829 1.450368e-05
## bmi  0.001613288 1.677369e-01
## pedi 0.000000000 9.273184e-02
## age  0.092731841 0.000000e+00

Visualización de la Matriz de Correlación

# using corrplot package
library(corrplot)
# Plot the correlation matrix with significance levels
corrplot(corr_matrix, method = "color", type = "upper", tl.col = "black", tl.srt = 45, p.mat = p_values, sig.level = 0.05, number.cex = 0.7, cl.pos = "r", na.label = "NS")

Figura 7. Matriz de correlación entre las variables del estudio de diabetes. La escala de colores indica la fuerza y dirección de la correlación entre las variables. Las X indican cuando los valores p resultaron mayores de 0.05 y se consideran no significativas las correlaciones.

Prueba de regresión lineal

En la prueba de regresión lineal, se evalúa la relación entre una variable dependiente o respuesta y una o más variables independientes o predictoras.

Antes de realizar la regresión lineal, es importante tener evidencia de que hay un posible mecanismo causal entre las variables. En nuestro caso, vamos a evaluar la relación entre los niveles de glucosa (gluc) y los niveles de insulina (insu), considerando que la glucosa influye en la producción de insulina en la sangre.

El modelo de regresión lineal es el siguiente:

\(Y = \alpha + \beta X + \epsilon\)

donde \(Y\) es la variable dependiente (glucosa), \(X\) es la variable independiente (insulina), \(\alpha\) es el intercepto, \(\beta\) es el coeficiente de regresión y \(\epsilon\) es el término de error.

Nuestra hipótesis nula es que no hay relación entre las dos variables (pendiente cero), y la alternativa es que hay una relación:

\(H_0: \beta = 0\) \(H_a: \beta \neq 0\)

Primero vamos a graficar la relación entre las dos variables.

# Filtrar los datos para eliminar valores de glucosa e insulina cero
diabetes_ri <- diabetes_n %>%
  filter(gluc != 0 & insu != 0)
# Gráfico de dispersión entre glucosa e insulina
ggplot(diabetes_ri, aes(x = gluc, y = insu)) +
  geom_point(alpha = 0.5) +
  labs(x = "Glucosa (mg/dL)",
       y = "Insulina (μU/mL)") +
  theme_minimal()

Figura 8. Gráfico de dispersión entre los niveles de glucosa e insulina. Los puntos representan las observaciones individuales, y la tendencia sugiere una posible relación entre las dos variables.

Ajuste del modelo de regresión lineal

# Ajuste del modelo de regresión lineal
modelo_regresion <- lm(insu ~ gluc, data = diabetes_ri)
summary(modelo_regresion)
## 
## Call:
## lm(formula = insu ~ gluc, data = diabetes_ri)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -270.36  -51.22  -15.03   29.32  541.48 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -118.6430    20.0428  -5.919 7.07e-09 ***
## gluc           2.2389     0.1585  14.122  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 96.75 on 391 degrees of freedom
## Multiple R-squared:  0.3378, Adjusted R-squared:  0.3361 
## F-statistic: 199.4 on 1 and 391 DF,  p-value: < 2.2e-16
# Extraer los coeficientes, valor p y R^2 a una tabla
regression_summary <- data.frame(
  intercept = coef(modelo_regresion)[1],
  slope = coef(modelo_regresion)[2],
  p_value = summary(modelo_regresion)$coefficients[2, 4],
  r_squared = summary(modelo_regresion)$r.squared
)
regression_summary %>%
  gt() %>%
  tab_header(
    title = "TABLA 7. Resumen del modelo de regresión lineal entre glucosa e insulina"
  ) %>%
  cols_label(
    intercept = "Intercepto",
    slope = "Pendiente",
    p_value = "Valor p",
    r_squared = "R^2"
  ) %>%
  fmt_number(
    columns = c(intercept, slope, p_value, r_squared),
    decimals = 3
  )
TABLA 7. Resumen del modelo de regresión lineal entre glucosa e insulina
Intercepto Pendiente Valor p R^2
−118.643 2.239 0.000 0.338
# Gráfico de dispersión con la línea de regresión
ggplot(diabetes_ri, aes(x = gluc, y = insu)) +
  geom_point(alpha = 0.5) +
  geom_smooth(method = "lm", color = "red") +
  labs(x = "Glucosa (mg/dL)",
       y = "Insulina (μU/mL)") +
  theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'

Figura 9. Gráfico de dispersión entre los niveles de glucosa e insulina con la línea de regresión ajustada. La línea roja representa la relación lineal entre las dos variables.

Interpretación:

  • El intercepto es el valor de insulina cuando la glucosa es cero.
  • La pendiente es el cambio esperado en los niveles de insulina por cada unidad de cambio en los niveles de glucosa.
  • El valor p es menor que 0.05, lo que indica que hay evidencia suficiente para rechazar la hipótesis nula de que no hay relación entre las dos variables.
  • El R^2 indica la proporción de la variabilidad en los niveles de insulina que se explica por los niveles de glucosa.

EJERCICIO: 1. Realiza un modelo de regresión lineal entre los niveles de glucosa (gluc) y el índice de masa corporal (bmi), e interpreta los resultados.

Comparación entre dos pendientes

En este caso, vamos a comparar las pendientes de dos grupos: pacientes diagnosticados con diabetes (diag = 1) y pacientes no diagnosticados (diag = 0). Vamos a ajustar un modelo de regresión lineal para cada grupo y comparar las pendientes.

Gráfica de dispersión con líneas de regresión para cada grupo:

# Gráfico de dispersión de glucosa e insulina por diagnóstico de diabetes
scatter_glucosa_insulina <- ggplot(diabetes_ri, aes(x = gluc, y = insu, color = factor(diag))) +
  geom_point(alpha = 0.5) +
  labs(
    x = "Glucosa (mg/dL)",
    y = "Insulina (μU/mL)",
    color = "Diagnóstico"
  ) +
  scale_color_manual(values = c("blue", "red"), labels = c("No Diabetes", "Diabetes")) +
  theme_minimal()
scatter_glucosa_insulina

Figura 10. Gráfico de dispersión entre los niveles de glucosa e insulina por diagnóstico de diabetes. Los puntos representan las observaciones individuales.

Ajuste de modelos de regresión lineal para cada grupo

# Ajuste del modelo de regresión lineal para cada grupo
modelo_regresion_grupos <- diabetes_ri %>%
  group_by(diag) %>%
  do(model = lm(insu ~ gluc, data = .))
# Resumen de los modelos de regresión para cada grupo
modelo_regresion_resumen <- modelo_regresion_grupos %>%
  summarise(
    diag = unique(diag),
    intercept = coef(model)[1],
    slope = coef(model)[2],
    p_value = summary(model)$coefficients[2, 4],
    r_squared = summary(model)$r.squared
  )
modelo_regresion_resumen %>%
  gt() %>%
  tab_header(
    title = "TABLA 8. Resumen de los modelos de regresión lineal por diagnóstico de diabetes"
  ) %>%
  cols_label(
    diag = "Diagnóstico",
    intercept = "Intercepto",
    slope = "Pendiente",
    p_value = "Valor p",
    r_squared = "R^2"
  ) %>%
  fmt_number(
    columns = c(intercept, slope, p_value, r_squared),
    decimals = 3
  )
TABLA 8. Resumen de los modelos de regresión lineal por diagnóstico de diabetes
Diagnóstico Intercepto Pendiente Valor p R^2
0 −155.430 2.567 0.000 0.380
1 −50.164 1.770 0.000 0.158
# Gráfico de dispersión con líneas de regresión para cada grupo
ggplot(diabetes_ri, aes(x = gluc, y = insu, color = factor(diag))) +
  geom_point(alpha = 0.5) +
  geom_smooth(method = "lm", aes(group = diag), se = FALSE) +
  labs(x = "Glucosa (mg/dL)",
       y = "Insulina (μU/mL)",
       color = "Diagnóstico") +
  scale_color_manual(values = c("blue", "red"), labels = c("No Diabetes", "Diabetes")) +
  theme_minimal()

Figura 11. Gráfico de dispersión entre los niveles de glucosa e insulina con líneas de regresión para cada grupo de diagnóstico de diabetes. Las líneas representan la relación lineal entre las dos variables para cada grupo.

Interpretación:

  • Los modelos de regresión lineal para cada grupo muestran las pendientes y los interceptos específicos para pacientes diagnosticados con diabetes y no diagnosticados.
  • Las pendientes indican la relación entre los niveles de glucosa e insulina en cada grupo.
  • El valor p es menor que 0.05 para ambos grupos, lo que indica que hay evidencia suficiente para rechazar la hipótesis nula de que no hay relación entre las dos variables en cada grupo.
  • El R^2 indica la proporción de la variabilidad en los niveles de insulina que se explica por los niveles de glucosa en cada grupo.

Prueba de hipótesis para comparar las pendientes

Para comparar las pendientes de los dos grupos, vamos a realizar una prueba de hipótesis. Nuestra hipótesis nula es que las pendientes son iguales entre los dos grupos, y la alternativa es que son diferentes:

\(H_0: \beta_1 = \beta_2\) \(H_a: \beta_1 \neq \beta_2\)

# Ajuste del modelo de regresión lineal con interacción
modelo_interaccion <- lm(insu ~ gluc * factor(diag), data = diabetes_ri)
# Resumen del modelo de regresión con interacción
summary(modelo_interaccion)
## 
## Call:
## lm(formula = insu ~ gluc * factor(diag), data = diabetes_ri)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -254.46  -53.18  -12.72   29.27  561.61 
## 
## Coefficients:
##                     Estimate Std. Error t value Pr(>|t|)    
## (Intercept)        -155.4299    27.6420  -5.623 3.59e-08 ***
## gluc                  2.5672     0.2422  10.599  < 2e-16 ***
## factor(diag)1       105.2663    50.4224   2.088   0.0375 *  
## gluc:factor(diag)1   -0.7970     0.3737  -2.133   0.0336 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 96.43 on 389 degrees of freedom
## Multiple R-squared:  0.3454, Adjusted R-squared:  0.3404 
## F-statistic: 68.43 on 3 and 389 DF,  p-value: < 2.2e-16

Interpretación del modelo de regresión con interacción:

  • El modelo de regresión con interacción permite evaluar si la relación entre glucosa e insulina varía según el diagnóstico de diabetes.
  • El coeficiente de interacción indica si las pendientes son significativamente diferentes entre los grupos.
  • Si el valor p del coeficiente de interacción (gluc:factor(diag)1) es menor que 0.05, se rechaza la hipótesis nula de que las pendientes son iguales entre los grupos.