Una variable aleatoria es una función que asigna un número real a cada resultado en el espacio muestral de un experimento aleatorio.
Pueden tomar un número finito o infinito numerable de valores.
# Espacio muestral: {CC, CS, SC, SS}
# Variable X: número de caras
x <- c(0, 1, 2)
prob <- c(1/4, 1/2, 1/4)
# Crear tabla de distribución
data.frame(
"Número de caras" = x,
"Probabilidad" = prob,
check.names = FALSE
) %>%
gt() %>%
tab_header(title = "Tabla 1. Distribución del número de caras en dos lanzamientos")| Tabla 1. Distribución del número de caras en dos lanzamientos | |
| Número de caras | Probabilidad |
|---|---|
| 0 | 0.25 |
| 1 | 0.50 |
| 2 | 0.25 |
Pueden tomar cualquier valor en un intervalo de números reales.
Ejemplo: Altura de una persona, peso, tiempo, etc.
La expectativa matemática de una variable aleatoria discreta X es:
\[\mu = E(X) = \sum x \cdot P(X = x)\]
# Ejemplo: Lanzamiento de un dado legal
x_dado <- 1:6
prob_dado <- rep(1/6, 6)
# Calcular expectativa
expectativa <- sum(x_dado * prob_dado)Expectativa del lanzamiento de un dado: 3.5
Gráficamente, la distribución es:
# Gráfica de la distribución
ggplot(data.frame(x = x_dado, p = prob_dado), aes(x = x, y = p)) +
geom_bar(stat = "identity", fill = "steelblue", alpha = 0.7) +
labs(x = "Valor del Dado", y = "Probabilidad") +
theme_minimal()FIGURA 1. Distribución de probabilidad del lanzamiento de un dado “legal”. Dado “legal” significa que tiene seis caras numeradas del 1 al 6, y cada cara tiene la misma probabilidad de salir.
Interpretación: El resultado esperado al lanzar un dado es 3.5, que no es un valor que pueda salir en un solo lanzamiento, pero es el valor promedio a largo plazo si se lanzan muchos dados. Por extensión, el valor esperado de un conjunto de números con igual probabilidad, es la media de los números.
En este juego ganas según la carta que saques de una baraja estándar de 52 cartas:
Si tienes que apostar $1 para jugar, ¿cuál es la expectativa de tu ganancia en el juego? ¿Vale la pena jugar?
Tememos que calcular las probabilidades de cada evento:
TABLA 2. Eventos, ganancias y probabilidades en un
juego de cartas.
| Evento | Ganancia | Probabilidad |
|---|---|---|
| No ganar | $0 | 35/52 |
| Sacar un corazón | $1 | 12/52 |
| Sacar un as | $5 | 4/52 |
| Sacar el rey de espadas | $10 | 1/52 |
# Definir ganancias y probabilidades
ganancias <- c(0, 1, 5, 10)
probabilidades <- c(35/52, 12/52, 4/52, 1/52)
# Calcular expectativa
expectativa_juego <- sum(ganancias * probabilidades)
# Crear tabla
data.frame(
"Ganancia" = paste("$", ganancias),
"Probabilidad" = round(probabilidades, 3),
"Contribución" = round(ganancias * probabilidades, 3),
check.names = FALSE
) %>%
gt() %>%
tab_header(title = "TABLA 3. Expectativa del Juego de Cartas") %>%
grand_summary_rows(
columns = "Contribución",
fns = list(Expectativa = ~sum(.))
)| TABLA 3. Expectativa del Juego de Cartas | |||
| Ganancia | Probabilidad | Contribución | |
|---|---|---|---|
| $ 0 | 0.673 | 0.000 | |
| $ 1 | 0.231 | 0.231 | |
| $ 5 | 0.077 | 0.385 | |
| $ 10 | 0.019 | 0.192 | |
| Expectativa | — | — | 0.808 |
Expectativa del juego: $ 0.81
EJERCICIO 1. ¿Cuál es la esperanza o expectativa matemática (valor esperado) del número de mutaciones por bacteria en una generación?
Datos:
| Número de Mutaciones | Probabilidad |
|---|---|
| 0 | 0.6 |
| 1 | 0.2 |
| 2 | 0.15 |
| 3 | 0.05 |
Una distribución de probabilidad describe cómo se distribuyen los valores de una variable aleatoria y las probabilidades asociadas a esos valores.
La distribución binomial describe el número de éxitos k en una secuencia de n ensayos independientes, donde cada ensayo tiene:
\[P(X = k) = \binom{n}{k} p^k (1-p)^{n-k}\]
donde:
dbinom(k, n, p): función de probabilidad exacta: Calcula la probabilidad de obtener exactamente k éxitos en n ensayos.pbinom(k, n, p): función de distribución acumulada: Calcula la probabilidad acumulada de obtener hasta (e incluyendo) un cierto número de éxitos (k) en un experimento binomial.
qbinom(pac, n, p): función cuantil: Calcula el número mínimo de éxitos necesarios para alcanzar una probabilidad acumulada dada (pac) en un experimento binomial.rbinom(m, n, p): números aleatorios simulados: Genera m números aleatorios siguiendo una distribución binomial.
Tirar un dado 10 veces. ¿Probabilidad de obtener exactamente 4 veces el número 6?
Probabilidad de exactamente 4 seises: 0.0543
Gráficamente, la distribución es:
# Gráfica de la distribución
x <- 0:10
y <- dbinom(x, n, p)
ggplot(data.frame(x = x, y = y), aes(x = x, y = y)) +
geom_point(size = 3, color = "blue") +
geom_segment(aes(xend = x, yend = 0), linetype = "dashed") +
geom_point(data = data.frame(x = k, y = dbinom(k, n, p)),
size = 4, color = "red") +
scale_x_continuous(breaks = 0:10) +
labs(
x = "Número de veces que sale 6",
y = "Probabilidad") +
theme_minimal()FIGURA 3. Distribución binomial del número de veces que sale 6 al lanzar un dado 10 veces. El punto rojo indica la probabilidad de obtener exactamente 4 seises.
¿Probabilidad de obtener al menos 4 seises?
Probabilidad de al menos 4 seises: 0.0697
El gen de fibrosis quística es autosómico recesivo. Si dos portadores
heterocigotos tienen hijos, el riesgo de un bebé homocigoto con FQ es
0.25.
¿Cuál es la probabilidad de que en una familia con 3 hijos, 2 o más
tengan FQ?
n_hijos <- 3
p_fc <- 0.25
# ¿Probabilidad de 2 o más afectados?
prob_2_o_mas <- pbinom(1, n_hijos, p_fc, lower.tail = FALSE)Probabilidad de 2 o más afectados: 0.1562
Ahora, si consideramos 100 familias con 3 hijos cada una, ¿cuál es la probabilidad de encontrar exactamente 20 familias con 2 o más afectados?
# Ahora, de 100 familias con 3 hijos, ¿probabilidad de encontrar exactamente 20
# familias con 2 o más afectados?
n_familias <- 100
k_familias <- 20
p_familia <- prob_2_o_mas
prob_20_familias <- dbinom(k_familias, n_familias, p_familia)Probabilidad de exactamente 20 familias: 0.0504
Gráfica de la distribución binomial para 100 familias:
x_fam <- 0:40
y_fam <- dbinom(x_fam, n_familias, p_familia)
ggplot(data.frame(x = x_fam, y = y_fam), aes(x = x, y = y)) +
geom_bar(stat = "identity", fill = "lightblue", alpha = 0.7, width = 0.6) +
geom_point(data = data.frame(x = k_familias, y = dbinom(k_familias, n_familias, p_familia)),
size = 4, color = "red") +
labs(
x = "Número de familias con 2 o más afectados",
y = "Probabilidad") +
theme_minimal()FIGURA 4. Distribución binomial del número de familias de tres hijos con 2 o más afectados por fibrosis quística en 100 familias. El punto rojo indica la probabilidad de encontrar exactamente 20 familias con 2 o más afectados.
EJERCICIO 2. Un microbiólogo analiza 12 aislamientos bacterianos para detectar resistencia a un antibiótico específico. Estudios previos muestran que la probabilidad de que un aislamiento sea resistente es el 30%.
La distribución de Poisson describe el número de eventos que ocurren en un intervalo fijo de tiempo o espacio, con una tasa promedio conocida.
\[P(X = k) = \frac{\lambda^k e^{-\lambda}}{k!}\]
donde:
dpois(k, lambda): función de probabilidadppois(k, lambda): función de distribución
acumuladaUna oficina recibe 5 llamadas por hora en promedio. ¿Probabilidad de recibir exactamente 3 llamadas?
Probabilidad de exactamente 3 llamadas: 0.1404
# Gráfica de la distribución
x <- 0:15
y <- dpois(x, lambda)
ggplot(data.frame(x = x, y = y), aes(x = x, y = y)) +
geom_point(size = 3, color = "blue") +
geom_line(color = "blue") +
geom_point(data = data.frame(x = k, y = dpois(k, lambda)),
size = 4, color = "red") +
labs(
x = "Número de llamadas",
y = "Probabilidad") +
theme_minimal()FIGURA 5. Distribución de Poisson con λ = 5. El punto rojo indica la probabilidad de recibir exactamente 3 llamadas en una hora.
# Datos observados
plantulas <- 0:10
frecuencia <- c(35, 20, 50, 10, 3, 1, 0, 0, 0, 1, 0)
# Calcular lambda
lambda_obs <- sum(plantulas * frecuencia) / sum(frecuencia)Lambda estimado: 1.467
# Frecuencias esperadas según Poisson
n_total <- sum(frecuencia)
freq_esperada <- dpois(plantulas, lambda_obs) * n_total
# Crear tabla comparativa
comparacion <- data.frame(
"Plántulas" = plantulas,
"Observado" = frecuencia,
"Esperado (Poisson)" = round(freq_esperada, 1),
check.names = FALSE
)
comparacion %>%
gt() %>%
tab_header(title = "TABLA 3. Comparación: Datos Observados vs Distribución de Poisson")| TABLA 3. Comparación: Datos Observados vs Distribución de Poisson | ||
| Plántulas | Observado | Esperado (Poisson) |
|---|---|---|
| 0 | 35 | 27.7 |
| 1 | 20 | 40.6 |
| 2 | 50 | 29.8 |
| 3 | 10 | 14.6 |
| 4 | 3 | 5.3 |
| 5 | 1 | 1.6 |
| 6 | 0 | 0.4 |
| 7 | 0 | 0.1 |
| 8 | 0 | 0.0 |
| 9 | 1 | 0.0 |
| 10 | 0 | 0.0 |
# Gráfica comparativa
data_frame <- data.frame(
x = plantulas,
Observado = frecuencia,
Poisson = freq_esperada
)
ggplot(data_frame, aes(x = x)) +
geom_bar(aes(y = Observado), stat = "identity",
fill = "lightblue", alpha = 0.7, width = 0.6) +
geom_line(aes(y = Poisson), color = "red", size = 1.2) +
geom_point(aes(y = Poisson), color = "red", size = 3) +
labs(
x = "Número de Plántulas por Parcela",
y = "Frecuencia") +
theme_minimal()FIGURA 6. Comparación entre las frecuencias observadas y las esperadas según una distribución de Poisson con λ = 1.4666667 (línea roja).
Para evaluar si los datos siguen una distribución de Poisson, se puede realizar una prueba de bondad de ajuste chi-cuadrado.
# Prueba chi-cuadrado
chisq_test <- chisq.test(frecuencia, p = freq_esperada/n_total, rescale.p = TRUE)
chisq_test##
## Chi-squared test for given probabilities
##
## data: frecuencia
## X-squared = 444.67, df = 10, p-value < 2.2e-16
if (chisq_test$p.value < 0.05) {
cat("Se rechaza H0: Los datos NO siguen una distribución de Poisson")
} else {
cat("No se rechaza H0: Los datos siguen una distribución de Poisson")
}## Se rechaza H0: Los datos NO siguen una distribución de Poisson
En un experimento, el número medio de infecciones por bacteriófagos es 2 por hora. ¿Probabilidad de 3 o más infecciones?
lambda_bac <- 2
x <- 3
# P(X >= 3) = 1 - P(X <= 2)
prob_3_o_mas <- ppois(2, lambda_bac, lower.tail = FALSE)
cat("Probabilidad de 3 o más infecciones:", round(prob_3_o_mas, 3))## Probabilidad de 3 o más infecciones: 0.323
Probabilidad de 3 o más infecciones: 0.323
# Gráfica
x_vals <- 0:10
y_vals <- dpois(x_vals, lambda_bac)
ggplot(data.frame(x = x_vals, y = y_vals), aes(x = x, y = y)) +
geom_point(aes(color = x >= 3), size = 3, show.legend = FALSE) +
geom_segment(aes(xend = x, yend = 0, color = x >= 3), show.legend = FALSE) +
scale_color_manual(values = c("blue", "red")) +
labs(title = "Distribución de Poisson - Bacteriófagos (λ = 2)",
x = "Número de infecciones",
y = "Probabilidad") +
theme_minimal()FIGURA 7. Distribución de Poisson con λ = 2. El área en rojo indica la probabilidad de 3 o más infecciones.
La distribución normal es una distribución continua con forma de campana, unimodal y simétrica.
\[f(x) = \frac{1}{\sigma \sqrt{2\pi}} e^{-\frac{(x - \mu)^2}{2\sigma^2}}\]
La distribución normal estándar es una distribución normal con:
Media = 0, Desviación estándar = 1: N(0,1)
Para convertir una variable normal X en una variable Z con distribución normal estándar, se usa la fórmula:
\[Z = \frac{X - \mu}{\sigma}\]
dnorm(x, mean, sd): función de densidadpnorm(x, mean, sd): función de distribución
acumuladaqnorm(prob, mean, sd): función cuantil# Simular datos con distribución normal
set.seed(123)
datos_glucosa <- rnorm(1000, mean = 120, sd = 30)
# Histograma con curva de densidad
ggplot(data.frame(x = datos_glucosa), aes(x = x)) +
geom_histogram(aes(y = ..density..), bins = 30,
fill = "lightblue", color = "black", alpha = 0.7) +
geom_density(color = "red", size = 1.2) +
stat_function(fun = dnorm, args = list(mean = 120, sd = 30),
color = "blue", size = 1.2, linetype = "dashed") +
labs(
x = "Glucosa", y = "Densidad") +
theme_minimal()FIGURA 8. Histograma de niveles de glucosa con curva de densidad estimada (línea roja) y distribución normal teórica, N(120,30) (línea azul discontinua).
## P(Z < 1.5) = 0.9332
##
## P(Z > 1.5) = 0.0668
##
## P(-1 < Z < 0.5) = 0.5328
# Gráfica de P(Z < 1.5)
ggplot(data.frame(x = c(-3, 3)), aes(x)) +
stat_function(fun = dnorm, size = 1.2) +
stat_function(fun = dnorm, xlim = c(-3, 1.5),
geom = "area", fill = "blue", alpha = 0.5) +
geom_vline(xintercept = 1.5, linetype = "dashed", color = "red") +
labs(
x = "Z", y = "f(Z)") +
theme_minimal()FIGURA 9. Distribución normal estándar con la región P(Z < 1.5) sombreada en azul y la línea roja indica el valor Z = 1.5.
# Gráfica de P(Z > 1.5)
ggplot(data.frame(x = c(-3, 3)), aes(x)) +
stat_function(fun = dnorm, size = 1.2) +
stat_function(fun = dnorm, xlim = c(1.5, 3),
geom = "area", fill = "blue", alpha = 0.5) +
geom_vline(xintercept = 1.5, linetype = "dashed", color = "red") +
labs(
x = "Z", y = "f(Z)") +
theme_minimal()FIGURA 10. Distribución normal estándar con la región P(Z > 1.5) sombreada en azul y la línea roja indica el valor Z = 1.5.
# Gráfica de P(-1 < Z < 0.5)
ggplot(data.frame(x = c(-3, 3)), aes(x)) +
stat_function(fun = dnorm, size = 1.2) +
stat_function(fun = dnorm, xlim = c(-1, 0.5),
geom = "area", fill = "blue", alpha = 0.5) +
geom_vline(xintercept = -1, linetype = "dashed", color = "red") +
geom_vline(xintercept = 0.5, linetype = "dashed", color = "red") +
labs(
x = "Z", y = "f(Z)") +
theme_minimal()FIGURA 11. Distribución normal estándar con la región P(-1 < Z < 0.5) sombreada en azul y las líneas rojas indican los valores Z = -1 y Z = 0.5.
Nila obtuvo 1800 en el SAT (μ = 1500, σ = 300) y Sean obtuvo 24 en el ACT (μ = 21, σ = 5). ¿Quién tuvo mejor puntuación relativa?
Usaremos Z-scores y percentiles para comparar.
# Datos
mu_sat <- 1500; sigma_sat <- 300; x_sat <- 1800
mu_act <- 21; sigma_act <- 5; x_act <- 24
# Cálculo de Z-scores
z_sat <- (x_sat - mu_sat) / sigma_sat
z_act <- (x_act - mu_act) / sigma_act
cat("Z-score SAT:", z_sat)## Z-score SAT: 1
##
## Z-score ACT: 0.6
# Percentiles
p_sat <- pnorm(x_sat, mean = mu_sat, sd = sigma_sat)
p_act <- pnorm(x_act, mean = mu_act, sd = sigma_act)
cat("\nPercentil SAT:", round(p_sat * 100, 1), "%")##
## Percentil SAT: 84.1 %
##
## Percentil ACT: 72.6 %
if (z_sat > z_act) {
cat("\n\nNila (SAT) obtuvo mejor puntuación relativa")
} else {
cat("\n\nSean (ACT) obtuvo mejor puntuación relativa")
}##
##
## Nila (SAT) obtuvo mejor puntuación relativa
Para 487 semillas con μ = 10.15 mm y σ = 1.60 mm, ¿cuántas tienen longitud > 11 mm?
n_semillas <- 487
mu_semillas <- 10.15
sigma_semillas <- 1.60
x_limite <- 11
# Probabilidad de X > 11
prob_mayor_11 <- pnorm(x_limite, mu_semillas, sigma_semillas, lower.tail = FALSE)
# Número esperado de semillas
n_esperado <- n_semillas * prob_mayor_11
cat("Probabilidad P(X > 11) =", round(prob_mayor_11, 4))## Probabilidad P(X > 11) = 0.2976
##
## Número esperado de semillas > 11 mm: 145
# Queremos el percentil que deje 100 semillas arriba
percentil_objetivo <- (n_semillas - 100) / n_semillas
# Valor crítico
valor_critico <- qnorm(percentil_objetivo, mu_semillas, sigma_semillas)
cat("Percentil objetivo:", round(percentil_objetivo * 100, 1), "%")## Percentil objetivo: 79.5 %
##
## Tamaño mínimo para las 100 más grandes: 11.47 mm
EJERCICIO 3. La presión arterial sistólica (PAS) en adultos sanos sigue una distribución aproximadamente normal, con una media (μ) de 120 mmHg y una desviación estándar (σ) de 15 mmHg.
Preguntas:
Cuando n es grande y np ≥ 5 y n(1-p) ≥ 5, la binomial se aproxima a la normal.
Un fabricante de bombillas afirma que el 95% duran más de 1000 horas. En una muestra de 100 bombillas, 90 duraron más de 1000 horas. ¿Es esta evidencia suficiente para rechazar la afirmación del fabricante al nivel α = 0.05?
# Ejemplo: Fabricante de bombillas
n <- 100
p <- 0.95
p_hat <- 0.90
alpha <- 0.05
# Verificar condiciones
cat("np =", n*p, "n(1-p) =", n*(1-p))## np = 95 n(1-p) = 5
# Estadístico Z
Z <- (p_hat - p) / sqrt(p * (1 - p) / n)
Z_alpha <- qnorm(alpha)
cat("\nZ =", round(Z, 3))##
## Z = -2.294
##
## Z_alpha = -1.645
# Decisión
if (Z < Z_alpha) {
cat("\nRechazamos H0: La afirmación del fabricante es falsa")
} else {
cat("\nNo rechazamos H0")
}##
## Rechazamos H0: La afirmación del fabricante es falsa
Gráfica de la Aproximación
# Gráfica de la distribución binomial y su aproximación normal
x_binom <- 0:100
y_binom <- dbinom(x_binom, n, p)
y_norm <- dnorm(x_binom, mean = n*p, sd = sqrt(n*p
*(1-p)))
data_frame <- data.frame(
x = x_binom,
Binomial = y_binom,
Normal = y_norm
)
ggplot(data_frame, aes(x = x)) +
geom_bar(aes(y = Binomial), stat = "identity",
fill = "lightblue", alpha = 0.7, width = 0.6) +
geom_line(aes(y = Normal), color = "red", size = 0.5) +
geom_point(aes(y = Normal), color = "red", size = 1) +
labs(
x = "Número de éxitos",
y = "Probabilidad / Densidad") +
scale_x_continuous(limits = c(60, 100)) +
theme_minimal() +
# marcar 90 éxitos
geom_vline(xintercept = 90, linetype = "dashed", color = "darkgreen") +
annotate("text", x = 90, y = max(y_binom)*0.8, label = "90 de 100",
color = "darkgreen", angle = 90, vjust = -0.5)FIGURA 12. Comparación entre la distribución binomial (barras azules) y su aproximación normal (línea roja) para n = 100 y p = 0.95. La línea verde discontinua indica 90 éxitos.
data.frame(
"Distribución" = c("Binomial", "Poisson", "Normal"),
"Tipo" = c("Discreta", "Discreta", "Continua"),
"Parámetros" = c("n, p", "λ", "μ, σ"),
"Aplicación" = c("Éxitos en n ensayos", "Eventos raros", "Mediciones continuas"),
check.names = FALSE
) %>%
gt() %>%
tab_header(title = "Resumen de Distribuciones de Probabilidad")| Resumen de Distribuciones de Probabilidad | |||
| Distribución | Tipo | Parámetros | Aplicación |
|---|---|---|---|
| Binomial | Discreta | n, p | Éxitos en n ensayos |
| Poisson | Discreta | λ | Eventos raros |
| Normal | Continua | μ, σ | Mediciones continuas |
Las distribuciones de probabilidad son herramientas fundamentales en bioestadística:
Cada distribución tiene sus condiciones de aplicación específicas y sus funciones en R correspondientes para cálculos y visualizaciones.