Actividad Integradora: Análisis de Probabilidades y Distribuciones en Datos de Investigación

Bioestadística Médica — Evaluación del Período II

Author

Giovanni Francisco Guevara, MD. MPH, Ph.D(c) Cátedra de Bioestadística — Escuela de Medicina, UJMD

Published

October 19, 2026

1. Presentación y Objetivos de la Actividad

Contexto General

A lo largo del Segundo Período de Bioestadística hemos explorado cómo gestionar la incertidumbre y modelar fenómenos biomédicos mediante la teoría de probabilidades. Esta Actividad Integradora tiene como propósito que cada subgrupo aplique los conceptos teóricos (probabilidad frecuentista, probabilidad condicional, regla de adición, independencia, distribución binomial y distribución normal) analizando directamente la base de datos de su propio proyecto de investigación (desarrollado en los informes grupales).

Objetivos de Aprendizaje

  1. Calcular e interpretar probabilidades empíricas simples, uniones e intersecciones a partir de variables categóricas de su estudio.
  2. Evaluar la independencia probabilística y calcular probabilidades condicionales asociadas a factores de riesgo o condiciones de salud.
  3. Modelar eventos dicotómicos discretos mediante la Distribución Binomial (\(B(n, p)\)) empleando funciones nativas de R (dbinom, pbinom).
  4. Evaluar el comportamiento de variables continuas mediante la Distribución Normal (\(N(\mu, \sigma)\)), estandarización con Puntajes \(Z\) (pnorm, scale) y diagnósticos gráficos de normalidad.
  5. Comunicar hallazgos biomédicos con rigor científico integrando código reproducible, tablas formateadas y gráficos en Quarto (.qmd).

2. Instrucciones para la Entrega en Formato Quarto (.qmd)

Cada subgrupo deberá trabajar en RStudio utilizando un documento Quarto (.qmd). Debe completar los bloques de código y redactar las interpretaciones epidemiológico-clínicas correspondientes.

  • Formatos soportados: El documento se puede compilar libremente a HTML, PDF (vía LaTeX o Typst) o MS Word según las necesidades de entrega.
  • Archivos a entregar: Documento fuente .qmd junto con el informe compilado (.html o .pdf).
  • Datos a utilizar: La base de datos depurada de su informe grupal (formatos .csv o .xlsx).

3. Bloque 1: Carga de Datos y Probabilidad Empírica Simple

3.1 Carga y Limpieza de la Base de Datos

Carguen la base de datos de su estudio. A modo de ejemplo, utilizaremos un conjunto de datos simulado basado en las variables típicas registradas en los informes (Edad, Sexo, IMC, Presión Arterial Sistólica, Nivel de Actividad Física, Automedicación, Calidad de Sueño).

# NOTA PARA EL ESTUDIANTE: Reemplace las siguientes líneas por la carga de su base real
# Ejemplo: datos_estudio <- read_csv("mi_base_de_datos.csv")

set.seed(2026)
n_estudiantes <- 120

datos_estudio <- tibble(
  id = 1:n_estudiantes,
  sexo = sample(c("Femenino", "Masculino"), n_estudiantes, replace = TRUE, prob = c(0.60, 0.40)),
  edad = round(rnorm(n_estudiantes, mean = 20.5, sd = 1.8)),
  imc = round(rnorm(n_estudiantes, mean = 24.8, sd = 3.5), 1),
  pas = round(rnorm(n_estudiantes, mean = 118, sd = 10)),
  automedicacion = sample(c("Sí", "No"), n_estudiantes, replace = TRUE, prob = c(0.65, 0.35)),
  actividad_fisica = sample(c("Baja", "Moderada", "Alta"), n_estudiantes, replace = TRUE, prob = c(0.40, 0.35, 0.25)),
  mala_calidad_sueno = sample(c("Sí", "No"), n_estudiantes, replace = TRUE, prob = c(0.55, 0.45))
) %>% 
  mutate(
    categoria_imc = case_when(
      imc < 18.5 ~ "Bajo peso",
      imc >= 18.5 & imc < 25 ~ "Normal",
      imc >= 25 & imc < 30 ~ "Sobrepeso",
      imc >= 30 ~ "Obesidad"
    )
  )

# Vista previa de los datos
head(datos_estudio) %>% 
  kbl(caption = "Tabla 1. Muestra inicial de datos de la cohorte de estudiantes") %>% 
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"))
Tabla 1. Muestra inicial de datos de la cohorte de estudiantes
id sexo edad imc pas automedicacion actividad_fisica mala_calidad_sueno categoria_imc
1 Masculino 20 22.1 117 No Moderada No Normal
2 Femenino 21 29.4 116 No Moderada No Sobrepeso
3 Femenino 20 25.7 109 Sí Alta No Sobrepeso
4 Femenino 20 28.3 128 No Baja Sí Sobrepeso
5 Femenino 17 25.6 110 No Moderada No Sobrepeso
6 Femenino 20 26.9 110 Sí Alta No Sobrepeso

3.2 Estimación de Probabilidades Frecuentistas

A partir de su muestra (\(n = 120\)), estimen las siguientes probabilidades marginales:

  1. Probabilidad de seleccionar al azar a un estudiante con el evento \(A\) (ej. Automedicación): \(P(A)\).
  2. Probabilidad de seleccionar a un estudiante con el evento \(B\) (ej. Mala calidad de sueño): \(P(B)\).
# Cálculo de frecuencias y probabilidades
n_total <- nrow(datos_estudio)

# Evento A: Automedicación == "Sí"
n_A <- sum(datos_estudio$automedicacion == "Sí")
p_A <- n_A / n_total

# Evento B: Mala calidad de sueño == "Sí"
n_B <- sum(datos_estudio$mala_calidad_sueno == "Sí")
p_B <- n_B / n_total

# Resultados formateados
tibble(
  Evento = c("Automedicación (A)", "Mala Calidad de Sueño (B)"),
  Frecuencia_n = c(n_A, n_B),
  Tamaño_Muestra_N = c(n_total, n_total),
  Probabilidad_Empírica = c(round(p_A, 4), round(p_B, 4))
) %>% 
  kbl(caption = "Tabla 2. Probabilidades empíricas de eventos simples") %>% 
  kable_styling(bootstrap_options = "striped")
Tabla 2. Probabilidades empíricas de eventos simples
Evento Frecuencia_n Tamaño_Muestra_N Probabilidad_Empírica
Automedicación (A) 75 120 0.625
Mala Calidad de Sueño (B) 60 120 0.500

Pregunta de Reflexión 1: Interpreten clínicamente los valores obtenidos de \(P(A)\) y \(P(B)\). ¿Representan estos valores parámetros poblacionales o estadísticos muestrales? Expliquen brevemente la Ley de los Grandes Números en este contexto.


4. Bloque 2: Probabilidad Condicional, Intersección e Independencia

4.1 Construcción de la Tabla de Contingencia (\(2 \times 2\))

Construyan una tabla cruzada entre dos variables cualitativas de su estudio (por ejemplo, Nivel de Actividad Física o Mala Calidad de Sueño frente a Automedicación o Categoría de IMC).

tabla_cruzada <- table(datos_estudio$mala_calidad_sueno, datos_estudio$automedicacion)
rownames(tabla_cruzada) <- c("Sueño Adecuado (No)", "Mala Calidad Sueño (Sí)")
colnames(tabla_cruzada) <- c("Automedica: No", "Automedica: Sí")

# Mostrar tabla con totales marginales
addmargins(tabla_cruzada) %>% 
  kbl(caption = "Tabla 3. Tabla de contingencia entre Calidad de Sueño y Automedicación") %>% 
  kable_styling(bootstrap_options = c("bordered", "hover"))
Tabla 3. Tabla de contingencia entre Calidad de Sueño y Automedicación
Automedica: No Automedica: Sí Sum
Sueño Adecuado (No) 25 35 60
Mala Calidad Sueño (Sí) 20 40 60
Sum 45 75 120

4.2 Cálculo de la Intersección y Regla de Adición

Calculen: * Intersección \(P(A \cap B)\): Probabilidad de presentar ambos eventos simultáneamente. * Unión \(P(A \cup B)\): Probabilidad de presentar al menos uno de los dos eventos.

\[\mathbf{P(A \cup B) = P(A) + P(B) - P(A \cap B)}\]

n_interseccion <- tabla_cruzada["Mala Calidad Sueño (Sí)", "Automedica: Sí"]
p_interseccion <- n_interseccion / n_total

p_union <- p_A + p_B - p_interseccion

cat("Probabilidad de Intersección P(A ∩ B):", round(p_interseccion, 4), "\n")
Probabilidad de Intersección P(A ∩ B): 0.3333 
cat("Probabilidad de Unión P(A ∪ B):", round(p_union, 4), "\n")
Probabilidad de Unión P(A ∪ B): 0.7917 

4.3 Evaluación de Independencia Probabilística

Escriban el código para calcular la Probabilidad Condicional:

\[\mathbf{P(A | B) = \frac{P(A \cap B)}{P(B)}}\]

Evalúen si los eventos son independientes comparando si \(P(A | B) = P(A)\) o si \(P(A \cap B) = P(A) \cdot P(B)\).

p_A_dado_B <- p_interseccion / p_B
p_producto_indep <- p_A * p_B

cat("P(Automedicación | Mala Calidad Sueño) =", round(p_A_dado_B, 4), "\n")
P(Automedicación | Mala Calidad Sueño) = 0.6667 
cat("P(Automedicación) Marginal =", round(p_A, 4), "\n")
P(Automedicación) Marginal = 0.625 
cat("Producto P(A) * P(B) =", round(p_producto_indep, 4), "\n")
Producto P(A) * P(B) = 0.3125 

Pregunta de Reflexión 2: Con base en los resultados anteriores, ¿son los eventos Automedicación y Mala Calidad de Sueño independientes en su muestra? Justifiquen su respuesta desde la perspectiva formal de la probabilidad y discutan su posible significado clínico/epidemiológico.


5. Bloque 3: Modelo Discreto — Distribución Binomial (\(B(n, p)\))

5.1 Definición del Experimento Binomial

Utilicen la prevalencia empírica \(p\) estimada en el Bloque 1 (por ejemplo, la probabilidad de automedicarse \(p = 0.625\)) para modelar un escenario donde se selecciona una muestra aleatoria de \(n = 15\) estudiantes de nuevo ingreso.

Sea \(X \sim \text{Binomial}(n = 15, p = 0.625)\), donde \(X\) representa el número de estudiantes que se automedican.

5.2 Preguntas de Probabilidad Binomial

Resuelvan los siguientes problemas utilizando las funciones dbinom() y pbinom() de R:

  1. Exactamente \(k\) éxitos: ¿Cuál es la probabilidad de que exactamente 8 estudiantes se automediquen?
  2. A lo sumo \(k\) éxitos: ¿Cuál es la probabilidad de que como máximo 5 estudiantes se automediquen? (\(P(X \le 5)\)).
  3. Al menos \(k\) éxitos: ¿Cuál es la probabilidad de que al menos 10 estudiantes se automediquen? (\(P(X \ge 10) = 1 - P(X \le 9)\)).
n_bin <- 15
p_bin <- p_A

# 1. Exactamente 8
p_exacto_8 <- dbinom(x = 8, size = n_bin, prob = p_bin)

# 2. Como máximo 5
p_max_5 <- pbinom(q = 5, size = n_bin, prob = p_bin)

# 3. Al menos 10
p_almenos_10 <- 1 - pbinom(q = 9, size = n_bin, prob = p_bin)

tibble(
  Escenario_Binomial = c("Exactamente 8 estudiantes", "Como máximo 5 estudiantes", "Al menos 10 estudiantes"),
  Expresión_Matemática = c("P(X = 8)", "P(X <= 5)", "P(X >= 10)"),
  Probabilidad_Calculada = c(round(p_exacto_8, 4), round(p_max_5, 4), round(p_almenos_10, 4))
) %>% 
  kbl(caption = "Tabla 4. Probabilidades calculadas bajo el modelo Binomial B(15, p)") %>% 
  kable_styling(bootstrap_options = "striped")
Tabla 4. Probabilidades calculadas bajo el modelo Binomial B(15, p)
Escenario_Binomial Expresión_Matemática Probabilidad_Calculada
Exactamente 8 estudiantes P(X = 8) 0.1562
Como máximo 5 estudiantes P(X <= 5) 0.0210
Al menos 10 estudiantes P(X >= 10) 0.4827

5.3 Gráfico de la Función de Masa de Probabilidad (FMP)

Grafiquen la distribución de probabilidad discreta de \(X\) con ggplot2.

df_binomial <- tibble(
  x = 0:n_bin,
  prob = dbinom(0:n_bin, size = n_bin, prob = p_bin)
)

ggplot(df_binomial, aes(x = factor(x), y = prob)) +
  geom_col(fill = "#1D3557", color = "white", alpha = 0.85) +
  geom_text(aes(label = round(prob, 3)), vjust = -0.4, size = 3, color = "#2B2D42") +
  labs(
    title = paste0("Distribución Binomial B(n = 15, p = ", round(p_bin, 3), ")"),
    subtitle = "Modelamiento del número de estudiantes que se automedican",
    x = "Número de estudiantes con el evento (X)",
    y = "Probabilidad P(X = x)"
  ) +
  theme_minimal(base_size = 12) +
  theme(
    plot.title = element_text(face = "bold", color = "#1D3557"),
    panel.grid.minor = element_blank()
  )

Figura 1. Distribución de probabilidad Binomial para n = 15 y p empírico.

6. Bloque 4: Modelo Continuo — Distribución Normal y Estandarización Z

6.1 Selección de la Variable Continua y Estimación de Parámetros

Seleccionen una variable continua clave de su estudio (ej. Índice de Masa Corporal, Presión Arterial Sistólica, MET-minutos/semana o Puntuación de Ansiedad). Asuman temporalmente que sigue un modelo Normal \(X \sim N(\mu = \bar{X}, \sigma = S)\).

# Selección de variable continua: Presión Arterial Sistólica (PAS)
media_pas <- mean(datos_estudio$pas, na.rm = TRUE)
sd_pas <- sd(datos_estudio$pas, na.rm = TRUE)

cat("Media Muestral (µ) =", round(media_pas, 2), "mmHg\n")
Media Muestral (µ) = 117.66 mmHg
cat("Desviación Estándar (σ) =", round(sd_pas, 2), "mmHg\n")
Desviación Estándar (σ) = 10.58 mmHg

6.2 Estandarización Z y Cálculo de Probabilidades

Escriban el código para: 1. Calcular el Puntaje \(Z\) de un paciente hipotético con un valor observacional crítico (ej. \(X = 135 \text{ mmHg}\)). 2. Calcular la probabilidad de encontrar a un estudiante con un valor mayor o igual a \(135 \text{ mmHg}\) (\(P(X \ge 135) = P(Z \ge z_{obs})\)) utilizando pnorm().

\[Z = \frac{X - \mu}{\sigma}\]

valor_obs <- 135
z_score <- (valor_obs - media_pas) / sd_pas

# Probabilidad de cola superior P(X >= 135)
prob_cola_superior <- 1 - pnorm(q = z_score, mean = 0, sd = 1)

cat("Puntaje Z para X =", valor_obs, "mmHg es Z =", round(z_score, 2), "\n")
Puntaje Z para X = 135 mmHg es Z = 1.64 
cat("Probabilidad acumulada en la cola superior P(X >= 135) =", round(prob_cola_superior, 4), "(", round(prob_cola_superior*100, 2), "%)\n")
Probabilidad acumulada en la cola superior P(X >= 135) = 0.0506 ( 5.06 %)

6.3 Evaluaciones Diagnósticas de Normalidad

Para finalizar, evalúen críticamente si la variable continua seleccionada realmente cumple con el supuesto de Distribución Normal en su muestra real.

A. Histograma con Curva Gaussiana Teórica Superpuesta

ggplot(datos_estudio, aes(x = pas)) +
  geom_histogram(aes(y = ..density..), bins = 12, fill = "#1D3557", color = "white", alpha = 0.7) +
  geom_density(color = "#2A9D8F", size = 1) +
  stat_function(
    fun = dnorm,
    args = list(mean = media_pas, sd = sd_pas),
    color = "#E76F51", linetype = "dashed", size = 1.2
  ) +
  labs(
    title = "Evaluación de Normalidad: Presión Arterial Sistólica",
    subtitle = "Comparación entre densidad empírica (verde) y modelo teórico N(µ, σ) (rojo discontinuo)",
    x = "Presión Arterial Sistólica (mmHg)",
    y = "Densidad"
  ) +
  theme_minimal(base_size = 12)

Figura 2. Histograma observacional vs. Curva Normal Teórica de referencia.

B. Normal Q-Q Plot (Gráfico de Cuantiles Teóricos vs. Empíricos)

ggplot(datos_estudio, aes(sample = pas)) +
  stat_qq_line(color = "#E76F51", size = 1, linetype = "dashed") +
  stat_qq(color = "#1D3557", size = 2, alpha = 0.8) +
  labs(
    title = "Normal Q-Q Plot de la Presión Arterial Sistólica",
    subtitle = "Alineación de los puntos observados sobre la diagonal de 45°",
    x = "Cuantiles Teóricos N(0, 1)",
    y = "Cuantiles Muestrales Observados (mmHg)"
  ) +
  theme_minimal(base_size = 12)

Figura 3. Normal Q-Q Plot para la variable continua.

C. Prueba de Hipótesis Formal (Shapiro-Wilk)

prueba_shapiro <- shapiro.test(datos_estudio$pas)
prueba_shapiro

    Shapiro-Wilk normality test

data:  datos_estudio$pas
W = 0.9796, p-value = 0.06537

Pregunta de Reflexión 3: Con base en el Histograma, el Q-Q plot y el resultado del test de Shapiro-Wilk (\(W = 0.9796\), \(p =0.0654\)), concluyan si la variable estudiada sigue una Distribución Normal. Discutan si las probabilidades calculadas mediante \(N(\mu, \sigma)\) en la sección 6.2 son válidas o si se cometió un sesgo al asumir normalidad.


7. Rúbrica de Evaluación de la Actividad (100 Puntos)

Criterio Excelente (100%) Satisfactorio (75%) Inicial (50%)
Bloque 1 & 2: Probabilidades y Contingencia (30 pts) Calcula correctamente \(P(A)\), \(P(B)\), \(P(A \cap B)\), \(P(A \cup B)\) y \(P(A|B)\). Evalúa la independencia formalmente y la interpreta con rigor. Presenta pequeños errores de cálculo o interpretación parcial en la independencia. No calcula las probabilidades condicionales o confunde intersección con unión.
Bloque 3: Modelo Binomial (25 pts) Aplica correctamente dbinom() y pbinom(), responde a todas las preguntas de probabilidad y genera un gráfico claro. Calcula correctamente las probabilidades pero comete errores en el gráfico o la formulación. Confunde la función de densidad discreta con la acumulada.
Bloque 4: Modelo Normal & Normalidad (30 pts) Calcula el Puntaje \(Z\), estimaciones con pnorm(), genera Histograma, Q-Q Plot e interpreta la prueba de Shapiro-Wilk. Genera las gráficas pero no interpreta el Q-Q plot o comete errores menores en la estandarización. No estandariza o no realiza el diagnóstico gráfico de normalidad.
Reproducibilidad y Formato Quarto (15 pts) El documento .qmd compila perfectamente a HTML o PDF, utiliza formato tabular profesional (kbl) y código limpio. Compila pero presenta problemas de formato o falta de orden en las celdas de R. El archivo no compila debido a errores de sintaxis en R.