01 · Punto de partida
Si ya sabés una parte, no la simules
Para ∫₀¹ e^x, la recta x ya explica casi todo (correlación ~0,97). La idea: estimar Y − b·(C − E[C]) en vez de Y. La parte conocida se resta analítica y solo el residuo tiembla.
Con ρ = 0,97 el factor es 1/(1−ρ²) ≈ 17×: de 17 000 a 1 000 réplicas.
- ¿Qué C correlacionada tiene media conocida?
- ¿Cuánto vale ρ?
- ¿Qué b óptimo uso?
- ¿Cuánto cae la varianza?
02 · Definición
Corregir con correlación
Control C
Variable barata con media exacta: x en (0,1) → 1/2, indicadora con p conocida.
ρ
Correlación Y–C: manda el ahorro. ρ = 0,7 ⇒ 2×; ρ = 0,95 ⇒ 10×.
b*
Peso óptimo Cov(Y,C)/Var(C), estimado del piloto. Ni 0 ni 1 a ojo.
| ρ | Factor | Lectura |
|---|---|---|
| 0,5 | 1,3× | Apenas paga |
| 0,7 | 2,0× | Ya conviene |
| 0,9 | 5,3× | Buen control |
| 0,97 | 17× | e^x con control x |
03 · Algoritmo
- 1Piloto conjunto.
Simular (Y, C) juntas con los mismos U y estimar Cov y Var(C).
- 2Calcular b*.
b* = Cov/Var(C). Guardarlo: es parte del estimador.
- 3Promediar Y*.
Media de Y − b*·(C − E[C]) con su s. Insesgado si E[C] es exacta.
- Mismos U
- Y y C deben salir del mismo sorteo: si no, ρ = 0 y no hay corrección.
- E[C] exacta
- Si la media del control es aproximada, se mete sesgo. Solo controles exactos.
- Múltiples
- Se combinan con regresión múltiple. De a uno y midiendo.
04 · Ejemplos
- 1e^x con x.
E[x] = 1/2, ρ ≈ 0,97 ⇒ ~17×. El ejemplo del laboratorio.
- 2x² con x.
ρ ≈ 0,97 también: la recta explica la parábola.
- 3Inventario con demanda.
Control = demanda (media conocida): corrige la ganancia que la sigue.
05 · Representación en Python
Corregir e^x con x en 10 líneas
Python en tu navegador. El piloto da b*; la final corrige.
import random
import math
import statistics
N = 8000
ys, cs = [], []
for _ in range(N):
u = random.random()
ys.append(math.exp(u))
cs.append(u)
mc = sum(cs) / N
vc = statistics.pvariance(cs)
cov = sum((y-sum(ys)/N)*(c-mc) for y, c in zip(ys, cs)) / N
b = cov / vc
aj = [y - b*(c-0.5) for y, c in zip(ys, cs)]
print("b*:", round(b, 3))
print("s crudo:", round(statistics.pstdev(ys), 4))
print("s control:", round(statistics.pstdev(aj), 4))
06 · Exploración
Laboratorio: la recta explica la curva
Cada punto es (x, e^x). La recta amarilla es la regresión (pendiente b*): lo que está sobre la recta es residuo. A más alineados, más ahorro.
Restar lo predecible
Y* = e^U − b·(U − 1/2)
Tocá «Corregir» para ajustar.
Nube fina = ρ alto = residuo chico. Si la nube fuera gorda, el control no explica y no ahorra.
Preguntas para explorar
- ¿ρ ronda 0,97 y el factor 15–20?
- ¿Por qué Y y C deben salir del mismo U?
- ¿Qué control usarías para x²?
Ver respuestas sugeridas
- Sí, estable con N: la recta casi pasa por los puntos.
- La correlación vive del pareo: con U distintos, ρ = 0.
- x también (E = 1/2): ρ ≈ 0,97. La recta explica la parábola.
07 · Comprensión
Confusiones frecuentes
«Cualquiera con media conocida sirve»
Solo si está correlacionada (ρ > 0,7). Sin correlación no corrige nada.
«b = 1 siempre»
b* = Cov/Var: con b = 1 a ojo podés aumentar la varianza.
«E[C] aproximada vale»
No: mete sesgo b·error. Solo medias exactas.
«Más controles siempre mejor»
Cada b estimado mete ruido. Dos buenos valen; cinco ruidosos empeoran.
08 · Práctica guiada
Ejercicios con Python
Ejercicio 1: ρ de e^x con x
Calculá ρ y el factor teórico.
import random
import math
import statistics
N = 8000
ys = []
cs = []
for _ in range(N):
u = random.random()
ys.append(math.exp(u)); cs.append(u)
my, mc = sum(ys)/N, sum(cs)/N
cov = sum((y-my)*(c-mc) for y, c in zip(ys, cs))/N
rho = cov/(statistics.pstdev(ys)*statistics.pstdev(cs))
print(round(rho, 3), round(1/(1-rho**2), 1))
Ver solución razonada
ρ ≈ 0,97, factor ≈ 17. La recta explica el 94% de la varianza.
Ejercicio 2: estimar con control
Estimá ∫₀¹ e^x con y sin control y compará SE.
import random
import math
import statistics
N = 5000
ys, cs = [], []
for _ in range(N):
u = random.random()
ys.append(math.exp(u)); cs.append(u)
b = sum((y-sum(ys)/N)*(c-sum(cs)/N) for y, c in zip(ys, cs))/sum((c-sum(cs)/N)**2 for c in cs)
aj = [y-b*(c-0.5) for y, c in zip(ys, cs)]
print("crudo:", round(statistics.pstdev(ys)/math.sqrt(N), 4))
print("control:", round(statistics.pstdev(aj)/math.sqrt(N), 4))
Ver solución
~0,007 vs ~0,0017: 4× menos error, 17× menos N equivalente.
Ejercicio 3: mal control
Usá como control un U independiente y mostrá que no ahorra.
Ver una posible respuesta
import random
import math
import statistics
N = 5000
ys = [math.exp(random.random()) for _ in range(N)]
cs = [random.random() for _ in range(N)] # otro U: rho = 0
my, mc = sum(ys)/N, sum(cs)/N
cov = sum((y-my)*(c-mc) for y, c in zip(ys, cs))/N
print("cov ~", round(cov, 4), "(debería ~0)")
Cov ≈ 0 ⇒ b* ≈ 0 ⇒ sin ahorro. El pareo lo es todo.
09 · Síntesis
Ideas para recordar
- Y* = Y − b*(C − E[C]) con b* = Cov/Var(C).
- Factor = 1/(1−ρ²): ρ manda, no el ingenio.
- Mismos U para Y y C; E[C] exacta; b* del piloto.
- ρ > 0,7 para que pague; ρ ≈ 0,97 ⇒ 17×.
- e^x con x es el ejemplo canónico.
En el próximo tema partiremos el dominio: el muestreo estratificado.