En este documento se presentan ejemplos de pruebas de hipótesis utilizando R.
Algunos ejemplos incluyen:
# Cargar paquetes necesarios
library(tidyverse)
library(gt)
library(magrittr)
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 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 ...
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 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:
EJERCICIO:
bmi
(índice de masa corporal) comparando su media con un valor de referencia
de 25.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
).
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:
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).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 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).
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
).
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
# 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.
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
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:
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.
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 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:
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: