---
title: "Actividad Integradora: Análisis de Probabilidades y Distribuciones en Datos de Investigación"
subtitle: "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"
date: "2026-10-19"
format:
html:
theme: flatly
toc: true
toc-depth: 3
toc-location: left
code-fold: false
code-tools: true
df-print: paged
embed-resources: true
pdf:
toc: true
toc-depth: 3
number-sections: true
colorlinks: true
geometry:
- top=25mm
- bottom=25mm
- left=25mm
- right=25mm
typst:
toc: true
toc-depth: 3
number-sections: true
editor: visual
---
```{r}
#| label: setup
#| include: false
knitr::opts_chunk$set(
echo = TRUE,
warning = FALSE,
message = FALSE,
fig.align = "center",
fig.width = 8,
fig.height = 5
)
# Carga de librerías necesarias
library(tidyverse)
library(knitr)
library(kableExtra)
```
## 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).
```{r}
#| label: carga-datos
# 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"))
```
### 3.2 Estimación de Probabilidades Frecuentistas
A partir de su muestra ($n = `r nrow(datos_estudio)`$), 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)$.
```{r}
#| label: probabilidades-simples
# 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")
```
> **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*).
```{r}
#| label: tabla-contingencia
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"))
```
### 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)}$$
```{r}
#| label: probabilidad-union
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")
cat("Probabilidad de Unión P(A ∪ B):", round(p_union, 4), "\n")
```
### 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)$.
```{r}
#| label: probabilidad-condicional
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")
cat("P(Automedicación) Marginal =", round(p_A, 4), "\n")
cat("Producto P(A) * P(B) =", round(p_producto_indep, 4), "\n")
```
> **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 = `r round(p_A, 3)`$) 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 = `r round(p_A, 3)`)$, 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)$).
```{r}
#| label: calculos-binomial
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")
```
### 5.3 Gráfico de la Función de Masa de Probabilidad (FMP)
Grafiquen la distribución de probabilidad discreta de $X$ con `ggplot2`.
```{r}
#| label: grafico-binomial
#| fig.cap: "Figura 1. Distribución de probabilidad Binomial para n = 15 y p empírico."
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()
)
```
------------------------------------------------------------------------
## 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)$.
```{r}
#| label: parametros-normal
# 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")
cat("Desviación Estándar (σ) =", round(sd_pas, 2), "mmHg\n")
```
### 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}$$
```{r}
#| label: estandarizacion-z
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")
cat("Probabilidad acumulada en la cola superior P(X >= 135) =", round(prob_cola_superior, 4), "(", round(prob_cola_superior*100, 2), "%)\n")
```
### 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
```{r}
#| label: histograma-normal
#| fig.cap: "Figura 2. Histograma observacional vs. Curva Normal Teórica de referencia."
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)
```
#### B. Normal Q-Q Plot (Gráfico de Cuantiles Teóricos vs. Empíricos)
```{r}
#| label: qqplot-normal
#| fig.cap: "Figura 3. Normal Q-Q Plot para la variable continua."
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)
```
#### C. Prueba de Hipótesis Formal (Shapiro-Wilk)
```{r}
#| label: shapiro-test
prueba_shapiro <- shapiro.test(datos_estudio$pas)
prueba_shapiro
```
> **Pregunta de Reflexión 3:** Con base en el Histograma, el Q-Q plot y el resultado del test de Shapiro-Wilk ($W = `r round(prueba_shapiro$statistic, 4)`$, $p =`r round(prueba_shapiro$p.value, 4)`$), 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. |