Generación de Variables Aleatorias · Tema 28

Variables correlacionadas

Dependencia con ρ objetivo: combinación lineal de normales y cópula gaussiana para otras marginales.

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.

ρZ₁+…

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.

Φ→F⁻¹

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.

Mismo método, distinto ρ: la elipse manda.
ρ objetivoPeso √(1−ρ²)Nube
0,01,00Redonda: independencia
0,7≈ 0,71Elipse ↗ marcada
−0,80,60Elipse ↘ 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

Z₁,Z₂→mezcla ρ→X,Y
  1. 1
    Riesgo conjunto.

    Activos, siniestros o fallas que se mueven juntos: el ρ mueve la cola conjunta.

  2. 2
    Medidas apareadas.

    Altura-peso, antes-después, sensor redundante con ruido común.

  3. 3
    Cópula a otras marginales.

    Exponenciales o discretas atadas por orden: Φ(Z) + inversa de cada margen.

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

EXPERIMENTO 28

Pares con ρ objetivo

Y = ρ·Z₁ + √(1−ρ²)·Z₂

Los resultados numéricos aparecen debajo.
Corr muestral0,700
Teórica ρ0,700
Media X0,000
Media Y0,000

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

  1. Con ρ = 0,7, ¿corr muestral ≈ 0,7? ¿Medias ≈ 0?
  2. Llevá ρ a 0. ¿La nube se vuelve redonda? ¿La recta se acuesta?
  3. Poné ρ = −0,8 con N = 500. ¿La corr muestral baila? ¿Sesgo o ruido?
Ver respuestas sugeridas
  1. Sí: corr 0,7 ± 0,02 con N = 3000 y medias ≈ 0.
  2. Sí: independencia ⇒ nube redonda y recta horizontal Y = 0.
  3. 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.