01 · Punto de partida
Generar de a pares, no de a una
¿Altura y peso que suben juntos? ¿Dos activos que caen a la vez? ¿Llegadas y servicios acoplados? Generar X e Y por separado las deja independientes: para atarlas hay que construir el par con la correlación ρ pedida.
La receta base es una combinación lineal de dos N(0,1) independientes; la extensión a otras marginales es la cópula gaussiana: atar con normales y transformar cada margen por separado.
- ¿Por qué Y = ρZ₁ + √(1−ρ²)Z₂ tiene corr ρ con X = Z₁?
- ¿Qué forma toma la nube con ρ = 0, 0,7 o −0,8?
- ¿Cómo se lleva ρ a exponenciales o uniformes?
- ¿Correlación alta implica dependencia total?
02 · Definición
Correlación, elipse y cópula
Corr(X,Y) = Cov/σ_Xσ_Y ∈ [−1,1]. Con marginales N(0,1), la nube es una elipse cuyo eje mayor crece con |ρ|: ρ = 0 ⇒ redonda, ρ = ±1 ⇒ recta. La cópula gaussiana ata con (Z₁,Z₂) correlacionadas y mapea Uᵢ = Φ(Zᵢ) a cualquier marginal por inversa.
Mezcla exacta
El peso ρ copia parte de Z₁ en Y; el resto √(1−ρ²)Z₂ completa varianza 1 sin agregar correlación. Cov(X,Y) = ρ por construcción.
Elipse que delata
ρ > 0 alarga la nube en la diagonal ↗; ρ < 0 en ↘. La recta de regresión Y = ρX resume el vínculo lineal.
Cópula gaussiana
Correlacionar en Z y transformar cada margen con su inversa conserva el orden (rank) y lleva ρ a cualquier familia: exponenciales, Weibull, discretas.
| ρ objetivo | Peso √(1−ρ²) | Nube |
|---|---|---|
| 0,0 | 1,00 | Redonda: independencia |
| 0,7 | ≈ 0,71 | Elipse ↗ marcada |
| −0,8 | 0,60 | Elipse ↘ fuerte |
03 · Anatomía
Pesos, bordes y rangos
- Pesos que suman varianza 1
- ρ² + (√(1−ρ²))² = 1: Y queda N(0,1) marginal. Con |ρ| > 1 la raíz es imaginaria: ρ fuera de [−1,1] no es correlación válida.
- Bordes ρ = ±1 y ρ = 0
- ρ = ±1 ⇒ Y = ±X (recta, sin azar propio); ρ = 0 ⇒ Y = Z₂ (independencia). Cerca de ±1, el término √(1−ρ²) pierde precisión: clampear a [−1,1].
- Cópula y ρ deformada
- Tras F⁻¹ la correlación lineal ya no es exactamente ρ (las marginales la atenúan). Para ρ lineal exacto en no normales hay que calibrar; el orden (Spearman) sí se conserva.
- Más de dos variables
- El caso 2D es Cholesky 2×2. Con 3+ variables se usa la matriz completa (Tema 29): aquí el par es el laboratorio.
Combinación lineal
Exacta en normales
Corr muestral → ρ con error ≈ 1/√N. Dos Box-Muller/polar por par, cero rechazo extra.
Mezclar marginales sueltas
Rompe el vínculo
Ordenar o emparejar al azar dos muestras independientes da corr ≈ 0 aunque cada histograma sea perfecto.
04 · Dónde se atan pares
Del par al sistema
- 1Riesgo conjunto.
Activos, siniestros o fallas que se mueven juntos: el ρ mueve la cola conjunta.
- 2Medidas apareadas.
Altura-peso, antes-después, sensor redundante con ruido común.
- 3Cópula a otras marginales.
Exponenciales o discretas atadas por orden: Φ(Z) + inversa de cada margen.
- 4Puente a vectores.
El par 2D es el bloque de Cholesky general y campos correlacionados. (Tema 29)
05 · Representación en Python
Mezcla ρ con auditoría de par
Una función, N pares y tres números: medias ≈ 0, varianzas ≈ 1 y corr ≈ ρ.
Python en tu navegador. Llevá ρ a −0,8: la nube debe girar a ↘.
import random
import math
random.seed(240)
rho, N = 0.7, 8000
w = math.sqrt(max(0.0, 1 - rho * rho))
def par_correlacionado(rho, w):
z1 = random.gauss(0, 1)
z2 = random.gauss(0, 1)
return z1, rho * z1 + w * z2
pares = [par_correlacionado(rho, w) for _ in range(N)]
mx = sum(a for a, _ in pares) / N
my = sum(b for _, b in pares) / N
cov = sum((a-mx)*(b-my) for a, b in pares) / N
vx = sum((a-mx)**2 for a, _ in pares) / N
vy = sum((b-my)**2 for _, b in pares) / N
print("medias:", round(mx, 3), round(my, 3), "vs 0.0")
print("corr:", round(cov / math.sqrt(vx*vy), 3), "vs", rho)
Medias ≈ 0 y corr ≈ 0,7. Si la corr da ≈ ρ², aplicaste el peso dos veces.
06 · Exploración
Laboratorio: la elipse obedece a ρ
Movete ρ con N fijo. Cada punto es un par (X,Y): la recta marca Y = ρX y la nube se alarga con |ρ|. El panel compara la corr muestral con la teórica.
Pares con ρ objetivo
Y = ρ·Z₁ + √(1−ρ²)·Z₂
Con ρ 0,7 y N 3000, elipse ↗ y corr ≈ 0,7.
Dispersión (X,Y) en [−4,4]² con recta Y = ρX. Probá ρ = 0 (redonda), 0,9 (aguja ↗) y −0,8 (aguja ↘).
Preguntas para explorar
- Con ρ = 0,7, ¿corr muestral ≈ 0,7? ¿Medias ≈ 0?
- Llevá ρ a 0. ¿La nube se vuelve redonda? ¿La recta se acuesta?
- Poné ρ = −0,8 con N = 500. ¿La corr muestral baila? ¿Sesgo o ruido?
Ver respuestas sugeridas
- Sí: corr 0,7 ± 0,02 con N = 3000 y medias ≈ 0.
- Sí: independencia ⇒ nube redonda y recta horizontal Y = 0.
- Ruido: el error típico es ≈ (1−ρ²)/√N ≈ 0,016 con N = 3000 y ≈ 0,04 con N = 500.
07 · Comprensión
Confusiones frecuentes
«Sumo ρ·Z₁ sin el segundo término»
Y = ρZ₁ tiene varianza ρ², no 1. Falta √(1−ρ²)Z₂ para completar la varianza sin tocar la covarianza.
«ρ = 0 prueba independencia»
Solo en la normal. Fuera de ella hay dependencias no lineales con corr 0: validar con dispersión, no con un número.
«La cópula conserva ρ lineal»
Conserva el orden; la ρ lineal se atenúa al transformar marginales. Para ρ exacto en no normales hay que calibrar.
«Con N = 200 la corr debe clavar ρ»
El error típico ≈ (1−ρ²)/√N: con N = 200 y ρ = 0,7 es ≈ 0,036. Validar correlaciones con miles.
08 · Práctica guiada
Ejercicios con Python
Ejercicio 1: riesgo apareado ρ = 0,6
ρ = 0,6, N = 8000 (semilla 241): verificá corr ≈ 0,6 y P(X > 1, Y > 1) mayor que bajo independencia (0,025).
import random
import math
random.seed(241)
rho, N = 0.6, 8000
w = math.sqrt(1 - rho**2)
pares = []
for _ in range(N):
z1, z2 = random.gauss(0, 1), random.gauss(0, 1)
pares.append((z1, rho*z1 + w*z2))
mx = sum(a for a,_ in pares)/N
my = sum(b for _,b in pares)/N
cov = sum((a-mx)*(b-my) for a,b in pares)/N
print("corr:", round(cov, 3), "vs 0.6")
print("cola conjunta:", round(sum(1 for a,b in pares if a>1 and b>1)/N, 3), "vs indep 0.025")
Ver solución razonada
Corr ≈ 0,6 y cola conjunta ≈ 0,06–0,08: la correlación multiplica la cola conjunta frente a 0,025 independiente.
Ejercicio 2: ρ negativa que protege
ρ = −0,8, N = 8000: verificá corr ≈ −0,8 y que Var(X+Y) ≈ 2(1+ρ) = 0,4, mucho menor que 2.
import random
import math
random.seed(242)
rho, N = -0.8, 8000
w = math.sqrt(1 - rho**2)
pares = [(z1 := random.gauss(0,1), rho*z1 + w*random.gauss(0,1)) for _ in range(N)]
s = [a+b for a,b in pares]
media = sum(s)/N
print("var suma:", round(sum((x-media)**2 for x in s)/N, 3), "vs 0.4")
Ver solución
≈ 0,4: la anticorrelación cancela varianza. Es la base de coberturas y control variado.
Ejercicio 3: cópula a exponenciales
Atá dos Exp(1) con ρ = 0,7 vía Φ(Z) + inversa, N = 5000: el orden se conserva aunque la ρ lineal se atenúe.
Ver una posible respuesta
import random
import math
random.seed(243)
rho, N = 0.7, 5000
w = math.sqrt(1 - rho**2)
Phi = lambda z: 0.5 * (1 + math.erf(z / math.sqrt(2)))
pares = []
for _ in range(N):
z1, z2 = random.gauss(0, 1), random.gauss(0, 1)
y = rho*z1 + w*z2
pares.append((-math.log(1-Phi(z1)), -math.log(1-Phi(y))))
mx = sum(a for a,_ in pares)/N
cov = sum((a-mx)*(b-sum(b for _,b in pares)/N) for a,b in pares)/N
print("medias ≈ 1:", round(mx, 3))
print("corr atenuada (< 0.7):", round(cov, 3))
Medias ≈ 1 y corr ≈ 0,68: el vínculo sobrevive en el orden aunque la lineal baje un poco.
09 · Síntesis
Ideas para recordar
- Y = ρZ₁ + √(1−ρ²)Z₂: corr exacta ρ con marginales N(0,1).
- La elipse y la recta Y = ρX auditan el par de un vistazo.
- Cópula Φ(Z) + F⁻¹ lleva el vínculo a cualquier marginal.
- ρ = 0 no prueba independencia fuera de la normal.
- Bloque base de Cholesky y vectores del Tema 29.
En el próximo tema escalamos a muchas dimensiones: vectores aleatorios.