Método de Monte Carlo · Tema 27

Variables de control

Corregir con lo conocido: restar lo predecible y promediar solo el resto.

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.

ρ manda el ahorro: factor = 1/(1−ρ²).
ρFactorLectura
0,51,3×Apenas paga
0,72,0×Ya conviene
0,95,3×Buen control
0,9717×e^x con control x

03 · Algoritmo

Piloto→b*→Corregir
  1. 1
    Piloto conjunto.

    Simular (Y, C) juntas con los mismos U y estimar Cov y Var(C).

  2. 2
    Calcular b*.

    b* = Cov/Var(C). Guardarlo: es parte del estimador.

  3. 3
    Promediar 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

  1. 1
    e^x con x.

    E[x] = 1/2, ρ ≈ 0,97 ⇒ ~17×. El ejemplo del laboratorio.

  2. 2
    x² con x.

    ρ ≈ 0,97 también: la recta explica la parábola.

  3. 3
    Inventario 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.

EXPERIMENTO 27

Restar lo predecible

Y* = e^U − b·(U − 1/2)

Los resultados numéricos aparecen debajo.
ρ—
b*—
Factor—
Lectura—

Tocá «Corregir» para ajustar.

Nube fina = ρ alto = residuo chico. Si la nube fuera gorda, el control no explica y no ahorra.

Preguntas para explorar

  1. ¿ρ ronda 0,97 y el factor 15–20?
  2. ¿Por qué Y y C deben salir del mismo U?
  3. ¿Qué control usarías para x²?
Ver respuestas sugeridas
  1. Sí, estable con N: la recta casi pasa por los puntos.
  2. La correlación vive del pareo: con U distintos, ρ = 0.
  3. 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.