La distribución t de Student es una familia de distribuciones simétricas alrededor de cero, caracterizadas por un parámetro llamado grados de libertad (df). Esta distribución es fundamental cuando:
A medida que los grados de libertad aumentan, la distribución t se aproxima a la distribución normal estándar.
La distribución t se define por la siguiente función de densidad:
\[f(t) = \frac{\Gamma\left(\frac{df + 1}{2}\right)}{\sqrt{df \pi} \, \Gamma\left(\frac{df}{2}\right)} \left(1 + \frac{t^2}{df}\right)^{-\frac{df + 1}{2}}\]
donde:
- \(\Gamma\) es la función gamma
- \(df\) son los grados de libertad
La distribución t fue desarrollada por William Sealy Gosset bajo el seudónimo “Student” en 1908., por eso se le conoce como distribución t de Student.
# Crear datos para la comparación
x <- seq(-4, 4, length.out = 100)
t_data <- data.frame(x = x) %>%
mutate(
normal = dnorm(x),
t2 = dt(x, df = 2),
t5 = dt(x, df = 5),
t30 = dt(x, df = 30)
)
# Convertir a formato largo
t_data_long <- t_data %>%
pivot_longer(cols = c(t2, t5, t30),
names_to = "df",
values_to = "density") %>%
mutate(df = factor(df,
levels = c("t2", "t5", "t30"),
labels = c("2 df", "5 df", "30 df")))
# Gráfica
ggplot(t_data_long, aes(x = x, y = density, color = df)) +
geom_line(size = 1) +
geom_line(aes(y = normal), linetype = "dashed",
color = "black", size = 1) +
labs(x = "Valor",
y = "Densidad",
caption = "Línea discontinua negra: Distribución Normal Estándar") +
scale_color_manual(values = c("blue", "red", "green")) +
theme_minimal() +
theme(legend.title = element_blank(),
plot.title = element_text(hjust = 0.5, face = "bold"))Figura 1. Distribución Normal vs Distribución t. A medida que los grados de libertad aumentan, la distribución t se aproxima a la distribución normal estándar (línea negra entrecortada.
A menudo, necesitamos hacer inferencias sobre la media de una población basándonos en una muestra. Cuando la desviación estándar poblacional es desconocida y el tamaño de muestra es pequeño, utilizamos la distribución t de Student. .
A continuación se presentan los pasos para realizar inferencias con una muestra utilizando la distribución t y compararemos la media muestral con un valor hipotético de la media poblacional.
El estadístico t se calcula como:
\[t = \frac{\bar{x} - \mu_0}{s/\sqrt{n}}\]
donde:
El intervalo de confianza al nivel \((1-\alpha)\) para la media poblacional \(\mu\) es:
\[\bar{x} \pm t_{\alpha/2, n-1} \cdot \frac{s}{\sqrt{n}}\]
donde \(t_{\alpha/2, n-1}\) es el valor crítico de la distribución t con \(n-1\) grados de libertad.
Tenemos una muestra de 10 pacientes con concentraciones de un biomarcador en orina (mg/dL). Queremos probar si la media muestral es significativamente mayor de 2.0 mg/dL.
# Datos de la muestra
concentracion <- c(2.5, 2.7, 2.6, 2.4, 2.8, 2.9, 3.0, 2.3, 2.4, 2.5)
# Estadísticas descriptivas
n <- length(concentracion)
media <- mean(concentracion)
desv_std <- sd(concentracion)
# Prueba t
mu_0 <- 2.0
alpha <- 0.05
resultado_t <- t.test(concentracion, mu = mu_0, alternative = "greater")Resultados del Análisis:
Tamaño de muestra: 10
Media muestral: 2.61
Desviación estándar: 0.233
=== PRUEBA DE HIPÓTESIS ===
H₀: μ = 2.0 mg/dL
Hₐ: μ > 2.0 mg/dL
Estadístico t: 8.2755
Valor p: 8.436e-06
Grados de libertad: 9
Decisión: Rechazar H₀ (α = 0.05)
Conclusión: Hay evidencia significativa de que la media es mayor que 2.0
mg/dL
# Calcular intervalo de confianza del 95%
t_critico <- qt(1 - alpha/2, df = n - 1)
error_std <- desv_std / sqrt(n)
ic_inferior <- media - t_critico * error_std
ic_superior <- media + t_critico * error_stdIntervalo de Confianza del 95%:
[ 2.443, 2.777 ]
# Crear distribución t
x_t <- seq(media - 4 * error_std, media + 4 * error_std, length.out = 100)
t_density <- dt((x_t - media) / error_std, df = n - 1) / error_std
t_data_plot <- data.frame(x = x_t, density = t_density)
ggplot(t_data_plot, aes(x = x, y = density)) +
geom_line(size = 1, color = "blue") +
geom_vline(xintercept = media, linetype = "dashed",
color = "red", size = 1) +
geom_vline(xintercept = ic_inferior, linetype = "dashed",
color = "darkgreen", size = 1) +
geom_vline(xintercept = ic_superior, linetype = "dashed",
color = "darkgreen", size = 1) +
geom_area(data = t_data_plot %>%
filter(x >= ic_inferior & x <= ic_superior),
aes(y = density), fill = "lightblue", alpha = 0.5) +
labs(x = "Concentración (mg/dL)",
y = "Densidad") +
annotate("text", x = media, y = max(t_density) * 1.1,
label = paste("Media =", round(media, 2)), color = "red") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, face = "bold"))Figura 2. Distribución t con IC del 95%. La línea roja indica la media muestral, las líneas verdes los límites del intervalo de confianza.
Muestras pareadas se utilizan cuando las observaciones en una muestra están emparejadas con observaciones en otra muestra o consigo misma en el tiempo, como en estudios antes y después o estudios de gemelos. En este caso, analizamos las diferencias entre las parejas.
Para datos pareados, trabajamos con las diferencias:
\[t = \frac{\bar{d}}{s_d/\sqrt{n}}\]
donde:
- \(\bar{d}\) = media de las
diferencias
- \(s_d\) = desviación estándar de las
diferencias
- \(n\) = número de pares
\[\bar{d} \pm t_{\alpha/2, n-1} \cdot \frac{s_d}{\sqrt{n}}\]
Datos de concentración de PM2.5 en seis ciudades antes y después de un programa de reducción de emisiones.
# Datos de PM2.5
pm25_data <- read.csv("pm25-antes-despues.csv")
# Crear diferencia con mutate
pm25_data <- pm25_data %>%
mutate(diferencia = antes - despues)
# Tabla de datos
pm25_data %>%
gt() %>%
tab_header(
title = "Concentración de PM2.5 (μg/m³) Antes y Después del Programa"
) %>%
fmt_number(columns = c(antes, despues, diferencia), decimals = 1) %>%
cols_label(
ciudad = "Ciudad",
antes = "Antes",
despues = "Después",
diferencia = "Diferencia"
)| Concentración de PM2.5 (μg/m³) Antes y Después del Programa | |||
| Ciudad | Antes | Después | Diferencia |
|---|---|---|---|
| Ciudad_1 | 35.2 | 30.5 | 4.7 |
| Ciudad_2 | 40.1 | 32.8 | 7.3 |
| Ciudad_3 | 38.5 | 33.1 | 5.4 |
| Ciudad_4 | 42.0 | 35.0 | 7.0 |
| Ciudad_5 | 39.7 | 34.2 | 5.5 |
| Ciudad_6 | 41.3 | 41.0 | 0.3 |
# Estadísticas de las diferencias
estadisticas_pareado <- data.frame(
Media_diferencia = mean(pm25_data$diferencia),
DE_diferencia = sd(pm25_data$diferencia),
n = length(pm25_data$diferencia)
)
estadisticas_pareado %>%
gt() %>%
tab_header(title = "Estadísticas de las Diferencias") %>%
fmt_number(columns = c(Media_diferencia, DE_diferencia), decimals = 3) %>%
cols_label(
Media_diferencia = "Media (Antes - Después)",
DE_diferencia = "Desviación Estándar",
n = "n"
)| Estadísticas de las Diferencias | ||
| Media (Antes - Después) | Desviación Estándar | n |
|---|---|---|
| 5.033 | 2.525 | 6 |
# Prueba t pareada (unilateral: antes > después)
resultado_pareado <- t.test(pm25_data$antes, pm25_data$despues,
paired = TRUE,
alternative = "greater")=== PRUEBA t PAREADA ===
H₀: μd = 0 (no hay reducción)
Hₐ: μd > 0 (hay reducción)
Estadístico t: 4.8832
Valor p: 0.00227
Grados de libertad: 5
IC 95%: [ 2.956, Inf]
Decisión: Rechazar H₀
Conclusión: Hay evidencia significativa de reducción en PM2.5
# Preparar datos para gráfica
pm25_long <- data.frame(
ciudad = rep(1:6, 2),
momento = rep(c("Antes", "Después"), each = 6),
concentracion = c(pm25_data$antes, pm25_data$despues)
)
ggplot(pm25_long, aes(x = momento, y = concentracion, group = ciudad)) +
geom_line(color = "gray60", size = 0.8) +
geom_point(aes(color = momento), size = 3) +
scale_color_manual(values = c("Antes" = "red", "Después" = "blue")) +
labs(x = "Momento",
y = "Concentración PM2.5 (μg/m³)",
color = "Momento") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, face = "bold"),
legend.position = "none")Figura 3. Perfiles individuales mostrando el cambio en concentración de PM2.5 para cada ciudad.
Se utiliza para comparar las medias de dos poblaciones que se suponen independientes. Es fundamental verificar los supuestos de normalidad y homogeneidad de varianzas antes de aplicar la prueba t.
Cuando las varianzas son iguales (pooled):
\[t = \frac{\bar{x}_1 - \bar{x}_2}{\sqrt{\frac{s_1^2}{n_1} + \frac{s_2^2}{n_2}}}\]
donde:
- \(\bar{x}_1\), \(\bar{x}_2\) = medias muestrales
- \(s_1^2\), \(s_2^2\) = varianzas muestrales
- \(n_1\), \(n_2\) = tamaños de las muestras
Los grados de libertad son: \(df = n_1 + n_2 - 2\)
Cuando las varianzas no son iguales:
\[t = \frac{\bar{x}_1 - \bar{x}_2}{\sqrt{\frac{s_1^2}{n_1} + \frac{s_2^2}{n_2}}}\]
con grados de libertad ajustados (fórmula de Welch-Satterthwaite): \[df = \frac{\left(\frac{s_1^2}{n_1} + \frac{s_2^2}{n_2}\right)^2}{\frac{\left(\frac{s_1^2}{n_1}\right)^2}{n_1 - 1} + \frac{\left(\frac{s_2^2}{n_2}\right)^2}{n_2 - 1}}\]
\[(\bar{x}_1 - \bar{x}_2) \pm t_{\alpha/2} \cdot \sqrt{\frac{s_1^2}{n_1} + \frac{s_2^2}{n_2}}\]
Comparación de niveles de insulina entre personas con y sin diabetes tipo II.
# Nota: Este código requiere el archivo diabetes.csv
# Cargar y preparar datos
diabetes <- read.csv("diabetes.csv")
diabetes <- diabetes[diabetes$Insulin != 0, ]
insulina_data <- data.frame(
insulina = diabetes$Insulin,
diabetes = factor(diabetes$Outcome,
levels = c(0, 1),
labels = c("sin diabetes", "con diabetes"))
)estadisticas_grupos <- insulina_data %>%
group_by(diabetes) %>%
summarise(
Media = mean(insulina),
Mediana = median(insulina),
DE = sd(insulina),
n = n()
)
estadisticas_grupos %>%
gt() %>%
tab_header(
title = "Estadísticas Descriptivas: Niveles de Insulina por Grupo"
) %>%
fmt_number(columns = c(Media, Mediana, DE), decimals = 1) %>%
cols_label(
diabetes = "Grupo",
Media = "Media",
Mediana = "Mediana",
DE = "Desviación Estándar",
n = "n"
)| Estadísticas Descriptivas: Niveles de Insulina por Grupo | ||||
| Grupo | Media | Mediana | Desviación Estándar | n |
|---|---|---|---|---|
| sin diabetes | 130.3 | 102.5 | 102.5 | 264 |
| con diabetes | 206.8 | 169.5 | 132.7 | 130 |
ggplot(insulina_data, aes(x = diabetes, y = insulina, fill = diabetes)) +
geom_boxplot(alpha = 0.7, outlier.colour = "red", outlier.size = 2) +
stat_summary(fun = mean, geom = "point",
shape = 18, size = 4, color = "blue") +
labs(x = "Grupo",
y = "Insulina (μU/mL)",
caption = "Puntos azules: media; Línea horizontal: mediana; Puntos rojos: outliers") +
scale_fill_manual(values = c("lightblue", "lightcoral")) +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5, face = "bold"),
legend.position = "none")Figura 4. Comparación de niveles de insulina entre grupos.
# Prueba de normalidad para cada grupo de diabetes
shapiro_sin <- shapiro.test(insulina_data$insulina[insulina_data$diabetes == "sin diabetes"])
shapiro_con <- shapiro.test(insulina_data$insulina[insulina_data$diabetes == "con diabetes"])
cat("=== PRUEBA DE NORMALIDAD (Shapiro-Wilk) ===\n")## === PRUEBA DE NORMALIDAD (Shapiro-Wilk) ===
cat("Sin diabetes - W:", round(shapiro_sin$statistic, 4),
", p-valor:", format.pval(shapiro_sin$p.value, digits = 4), "\n")## Sin diabetes - W: 0.7707 , p-valor: < 2.2e-16
cat("Con diabetes - W:", round(shapiro_con$statistic, 4),
", p-valor:", format.pval(shapiro_con$p.value, digits = 4), "\n\n")## Con diabetes - W: 0.826 , p-valor: 4.192e-11
resultado_t_igual <- t.test(insulina ~ diabetes,
data = insulina_data,
var.equal = TRUE)
cat("=== PRUEBA T (Varianzas Iguales) ===\n")## === PRUEBA T (Varianzas Iguales) ===
## Estadístico t: -6.3054
## Valor p: 7.755e-10
## Grados de libertad: 392
cat("IC 95%: [", round(resultado_t_igual$conf.int[1], 2), ",",
round(resultado_t_igual$conf.int[2], 2), "]\n\n")## IC 95%: [ -100.43 , -52.69 ]
resultado_welch <- t.test(insulina ~ diabetes,
data = insulina_data,
var.equal = FALSE)
cat("=== PRUEBA T DE WELCH (Varianzas Desiguales) ===\n")## === PRUEBA T DE WELCH (Varianzas Desiguales) ===
## Estadístico t: -5.7833
## Valor p: 2.672e-08
## Grados de libertad: 207.14
cat("IC 95%: [", round(resultado_welch$conf.int[1], 2), ",",
round(resultado_welch$conf.int[2], 2), "]\n\n")## IC 95%: [ -102.66 , -50.46 ]
if(resultado_welch$p.value < 0.05) {
cat("Decisión: Rechazar H₀\n")
cat("Conclusión: Hay diferencia significativa entre los grupos\n")
} else {
cat("Decisión: No rechazar H₀\n")
}## Decisión: Rechazar H₀
## Conclusión: Hay diferencia significativa entre los grupos
| Guía para Selección de Pruebas Estadísticas | ||
| Situación | Prueba Recomendada | Supuestos Principales |
|---|---|---|
| Una muestra, n < 30 | t de Student (una muestra) | Normalidad |
| Una muestra, n ≥ 30 | t de Student o Z | TLC aplica |
| Datos pareados | t pareada | Normalidad de diferencias |
| Dos muestras, varianzas iguales | t de Student (dos muestras) | Normalidad, homogeneidad de varianzas |
| Dos muestras, varianzas desiguales | t de Welch | Normalidad |
| Datos no normales | Pruebas no paramétricas (Wilcoxon, Mann-Whitney) | Ninguno (distribución libre) |
t.test(): Pruebas t (una muestra, pareada, dos
muestras)wilcox.test(): Pruebas de Wilcoxon y Mann-Whitneyvar.test(): Prueba F para igualdad de varianzasleveneTest(): Prueba de Levene (paquete
car)shapiro.test(): Prueba de normalidad de
Shapiro-Wilk