Generación de Variables Aleatorias · Tema 30

Muestreo con reemplazo

Bootstrap y remuestreo con reposición: índices iid, error estándar e intervalos sin fórmulas.

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.

63%

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.

B↔IC

Bootstrap

B remuestras ⇒ B valores del estadístico: su desvío es el error estándar y sus percentiles, el intervalo de confianza.

Con n = 10 y m = 10: lo que deja el reemplazo.
HechoValorLectura
P(3 nunca sale)0,9¹⁰ ≈ 0,349Cada dato falta en ~1 de cada 3 remuestras
Distintos esperados≈ 6,5 de 1063–65 % de la muestra original
SE de la medias/√10Se 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

datos n→B × remuestra→SE · IC
  1. 1
    Intervalos sin fórmulas.

    Media, mediana o percentil con IC por percentiles bootstrap cuando la teoría no alcanza.

  2. 2
    Validación de modelos.

    Estabilidad de un estimador ante perturbaciones de la muestra de entrenamiento.

  3. 3
    Bagging.

    Promediar modelos entrenados en remuestras: la varianza cae con el promedio.

  4. 4
    Tests 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.

EXPERIMENTO 30

Bootstrap de la media

m índices iid en {0…9}, B réplicas

Los resultados numéricos aparecen debajo.
Media boot5,700
Teórica 5,75,700
SE boot0,567
Teórico s/√m0,567

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

  1. Con m = 10, ¿SE teórico? Leelo en el panel.
  2. Duplicá m a 20. ¿El SE cae como 1/√m?
  3. Bajá B a 200. ¿La forma se vuelve ruidosa aunque el SE resista?
Ver respuestas sugeridas
  1. s/√10 ≈ 0,567 con s ≈ 1,792.
  2. Sí: 0,567/√2 ≈ 0,40. El que afina es m, no B.
  3. 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.