01 · Punto de partida
Medir la duda con los propios datos
¿Qué tan firme es esa media de 10 mediciones? ¿Y esa mediana? Sin suponer normalidad, el bootstrap remuestrea los datos observados con reemplazo miles de veces: la dispersión de las réplicas estima la incertidumbre del estadístico.
El motor es mínimo: m índices iid uniformes en {0,…,n−1} (Tema 17). Cada elemento puede repetirse o faltar; esa es la gracia, no un defecto.
- ¿Por qué cada extracción es iid con P = 1/n?
- ¿Qué fracción de datos originales cae en cada remuestra?
- ¿Cómo salen el error estándar y el intervalo del histograma?
- ¿Cuándo el bootstrap miente?
02 · Definición
Índices iid y conteos multinomiales
P(I = i) = 1/n en cada extracción, independiente de las demás. El vector de conteos de una remuestra de tamaño m es Multinomial(m; 1/n,…,1/n): E[conteoᵢ] = m/n. Con m = n, P(i nunca sale) = (1−1/n)^n ≈ 1/e ≈ 0,368.
Índice iid
int(n·U) por extracción (Tema 17). Repetir m veces: O(m), sin estado entre extracciones.
Fracción visible
Con m = n, cada remuestra trae ≈ 63,2 % de datos distintos y repite el resto. El 36,8 % ausente es la firma del reemplazo.
Bootstrap
B remuestras ⇒ B valores del estadístico: su desvío es el error estándar y sus percentiles, el intervalo de confianza.
| Hecho | Valor | Lectura |
|---|---|---|
| P(3 nunca sale) | 0,9¹⁰ ≈ 0,349 | Cada dato falta en ~1 de cada 3 remuestras |
| Distintos esperados | ≈ 6,5 de 10 | 63–65 % de la muestra original |
| SE de la media | s/√10 | Se achica con √m, no con B |
03 · Anatomía
Tamaño, réplicas y límites
- Tamaño m = n estándar
- La remuestra imita a la muestra original: mismo n, mismo estadístico. m distinto de n estima otro escenario (útil, pero ya no es el bootstrap clásico).
- Réplicas B ≥ 1000
- B = 2000–10000 estabiliza percentiles; B chica mueve los bordes del intervalo. B no achica el error estándar: eso lo hace m.
- Costo O(B·m)
- Cada réplica gasta m uniformes. Con B = 5000 y m = 100 son 500 000 sorteos: vectorizar índices de una vez.
- Cuándo falla
- n minúscula, extremos (máximos), datos dependientes en el tiempo: ahí el iid con reemplazo rompe la estructura y el intervalo miente.
Con reemplazo
Bootstrap: repite y omite
Imita el muestreo de la población. La variabilidad entre réplicas es la información.
Sin reemplazo
Subconjunto: ni repite ni omite de más
Cada dato sale a lo sumo una vez: otro diseño, para otro problema. (Tema 31)
04 · Para qué remuestrear
De la muestra al intervalo
- 1Intervalos sin fórmulas.
Media, mediana o percentil con IC por percentiles bootstrap cuando la teoría no alcanza.
- 2Validación de modelos.
Estabilidad de un estimador ante perturbaciones de la muestra de entrenamiento.
- 3Bagging.
Promediar modelos entrenados en remuestras: la varianza cae con el promedio.
- 4Tests por permutación.
Prima del remuestreo con otra hipótesis: reasignar etiquetas en vez de repetir datos.
05 · Representación en Python
Bootstrap de la media con IC
Datos fijos, B remuestras de tamaño n: media bootstrap, error estándar y percentiles 2,5–97,5.
Python en tu navegador. Bajá B a 200: el intervalo baila; subilo a 5000 y se clava.
import random
random.seed(260)
datos = [4, 6, 5, 8, 3, 7, 6, 5, 9, 4]
n = len(datos)
xbar = sum(datos) / n
s = (sum((x - xbar) ** 2 for x in datos) / n) ** 0.5
B, m = 3000, n
def remuestra(m):
return [datos[int(n * random.random())] for _ in range(m)]
medias = sorted(sum(remuestra(m)) / m for _ in range(B))
mb = sum(medias) / B
se = (sum((v - mb) ** 2 for v in medias) / B) ** 0.5
print("media datos:", round(xbar, 3), "boot:", round(mb, 3))
print("SE boot:", round(se, 3), "vs", round(s / m ** 0.5, 3))
print("IC95:", round(medias[int(0.025*B)], 2), round(medias[int(0.975*B)], 2))
Media ≈ 5,7, SE ≈ 0,57 e IC95 ≈ [4,6; 6,8]. Si el SE da ≈ 0, el remuestreo está devolviendo siempre la misma muestra.
06 · Exploración
Laboratorio: medias que acampanan
Movete m y B sobre los datos [4,6,5,8,3,7,6,5,9,4] (media 5,7). Las barras son las B medias bootstrap en 20 bines; los rombos, la aproximación normal con s/√m. Con m chica la campana es ancha; con m grande se afina.
Bootstrap de la media
m índices iid en {0…9}, B réplicas
Con m 10 y B 2000, SE ≈ 0,57.
20 bines en [3,9] vs campana N(5,7; s/√m). Probá m = 3 (ancha) y m = 20 (fina).
Preguntas para explorar
- Con m = 10, ¿SE teórico? Leelo en el panel.
- Duplicá m a 20. ¿El SE cae como 1/√m?
- Bajá B a 200. ¿La forma se vuelve ruidosa aunque el SE resista?
Ver respuestas sugeridas
- s/√10 ≈ 0,567 con s ≈ 1,792.
- Sí: 0,567/√2 ≈ 0,40. El que afina es m, no B.
- Sí: con B = 200 cada bin tiene ~10 réplicas y el histograma baila; el SE igual ronda porque usa las 200.
07 · Comprensión
Confusiones frecuentes
«Más B achica el intervalo»
B estabiliza los bordes pero el ancho lo manda s/√m. B = 100 000 con m = 10 no achica nada.
«Sin reemplazo es lo mismo»
Sin reemplazo y m = n devuelve siempre los mismos datos: varianza cero, intervalo inútil. El reemplazo es esencial.
«Vale para máximos»
El bootstrap del máximo es sesgado y discreto: las réplicas nunca superan el máximo observado. Para extremos, otra teoría.
«Remuestreo arregla n = 5»
Con n minúscula el plug-in es pobre: B réplicas de 5 datos repiten la misma pobreza con buena letra.
08 · Práctica guiada
Ejercicios con Python
Ejercicio 1: IC de la media
Datos del tema, B = 5000, m = 10 (semilla 261): estimá el IC95 por percentiles (≈ [4,6; 6,8]).
import random
random.seed(261)
datos = [4, 6, 5, 8, 3, 7, 6, 5, 9, 4]
n, B, m = len(datos), 5000, 10
medias = sorted(sum(datos[int(n*random.random())] for _ in range(m))/m
for _ in range(B))
print(round(medias[int(0.025*B)], 2), round(medias[int(0.975*B)], 2))
Ver solución razonada
≈ [4,6; 6,8] (típicamente ±0,1 en cada borde con B = 5000). Con B = 200 los bordes bailan ±0,3.
Ejercicio 2: el 63,2 % visible
Con n = m = 10 y 3000 réplicas, contá distintos por remuestra: la media debe rondar 6,5.
import random
random.seed(262)
n, m, B = 10, 10, 3000
dist = [len({int(n*random.random()) for _ in range(m)}) for _ in range(B)]
print(round(sum(dist)/B, 2), "vs", round(n*(1-(1-1/n)**m), 2))
Ver solución
≈ 6,51. Es la firma del reemplazo: ~2/3 visibles, ~1/3 ausentes en cada réplica.
Ejercicio 3: m manda, B acompaña
Compará el SE bootstrap con m = 5 y m = 20 (B = 3000): debe escalar como 1/√m.
Ver una posible respuesta
import random
random.seed(263)
datos = [4, 6, 5, 8, 3, 7, 6, 5, 9, 4]
n, B = len(datos), 3000
for m in [5, 20]:
medias = [sum(datos[int(n*random.random())] for _ in range(m))/m
for _ in range(B)]
mb = sum(medias)/B
se = (sum((v-mb)**2 for v in medias)/B) ** 0.5
print("m =", m, round(se, 3))
≈ 0,80 con m = 5 y ≈ 0,40 con m = 20: la mitad justa, como 1/√m manda.
09 · Síntesis
Ideas para recordar
- Remuestra = m índices iid U{0,…,n−1}: O(m), con repetición.
- Bootstrap: B réplicas ⇒ SE (desvío) e IC (percentiles).
- El ancho lo manda m (1/√m); B solo estabiliza.
- Fracción visible ≈ 63,2 % con m = n.
- No vale para extremos, n minúscula ni datos dependientes.
En el próximo tema prohibimos repetir: muestreo sin reemplazo.