Generación de Variables Aleatorias · Tema 26

Generación gamma

Sumas de exponenciales y forma α: Erlang entera, Marsaglia-Tsang general y escala 1/λ.

01 · Punto de partida

Cuánto tarda la k-ésima llegada

¿Cuánto hasta el tercer cliente, la quinta falla, la décima llamada? Si cada espera es Exp(λ), la espera acumulada es Gamma(α,λ): α cuenta cuántas exponenciales se suman y λ mantiene la tasa.

Es la generalización continua de la Erlang y la madre de la chi-cuadrado: con α entero basta sumar, con α real hace falta un método general como Marsaglia-Tsang.

  • ¿Por qué sumar α exponenciales da Gamma(α,λ)?
  • ¿Qué forma toma con α < 1, α = 1 y α grande?
  • ¿Cómo se escala la tasa con Y/λ?
  • ¿Cuándo usar suma, Marsaglia-Tsang o librería?

02 · Definición

Forma α, tasa λ y casos famosos

Soporte [0,∞). E[X] = α/λ, Var(X) = α/λ². Con α = 1 es Exp(λ); con α entero es Erlang; con λ = 1/2 y α = ν/2 es chi-cuadrado con ν grados.

ΣExp

Suma exacta entera

Con α = k entero: X = Σ Exp(λ). Sin rechazo, O(k): ideal para Erlang de k chico.

α→forma

α manda la forma

α < 1 ⇒ pico en 0 con cola larga; α = 1 ⇒ exponencial; α grande ⇒ campana asimétrica que tiende a normal.

/λ

Escala 1/λ

Generar con tasa 1 y dividir por λ. Un solo generador base sirve para toda tasa.

Misma tasa, distinta forma: α esculpe la densidad.
CasoMedia α/λVarianzaLectura
Gamma(1,2)0,500,25Exponencial λ = 2
Gamma(3,1)3,003,00Erlang: pico en 2, cola derecha
Gamma(9,3)3,001,00Casi campana, misma media que Erlang

03 · Anatomía

Suma, Marsaglia-Tsang y escala

Suma de exponenciales O(α)
Con α = k entero: −Σ ln(Uᵢ)/λ. Gasta k uniformes por muestra. Perfecta si k ≤ 10 y didáctica siempre.
Marsaglia-Tsang para α ≥ 1
Propuesta normal con d = α−1/3 y c = 1/√(9d): v = (1+cZ)³ aceptada con test logarítmico. O(1) por muestra, exacta y con colas reales.
Boost para α < 1
Generar G ~ Gamma(α+1,1) y devolver G·U^(1/α). Reduce el caso difícil al caso fácil con un uniforme extra.
Escala de tasa
Todo se genera con λ = 1 y se divide por λ al final. Validar media y varianza después de escalar, no antes.

Suma directa

Clara con α entera

La opción por defecto para Erlang chica: sin rechazo y con la intuición de esperas acumuladas.

Marsaglia-Tsang + boost

General y rápida

Cubre todo α > 0 con costo casi constante. Lo que usan las librerías por dentro.

04 · Dónde suma la gamma

De la espera al modelo

Exp(λ)×α→suma Y→Y/λ
  1. 1
    Fiabilidad y colas.

    Tiempo hasta la k-ésima falla o llegada: Erlang con α entera.

  2. 2
    Chi-cuadrado.

    Gamma(ν/2,1/2): base de tests e intervalos de varianza. (Tema 38)

  3. 3
    Mezclas y Bayes.

    Prior conjugada de Poisson y exponencial: tasas aleatorias con forma α.

  4. 4
    Puente a normal.

    Con α grande, (X−α/λ)/√(α/λ²) ⇒ N(0,1): otra campana por suma.

05 · Representación en Python

Suma entera frente a gammavariate

Mismos α y λ: la suma didáctica contra random.gammavariate (general). Ambas deben calzar en media y varianza.

Python en tu navegador. Llevá α a 9 con λ = 3: la media sigue en 3 pero la varianza cae a 1.

import random
import math

random.seed(220)
alpha, lam, N = 3, 1.5, 8000
inv_lam = 1.0 / lam

def gamma_erlang(k, lam):
    return -sum(math.log(1 - random.random()) for _ in range(k)) / lam

m1 = [gamma_erlang(alpha, lam) for _ in range(N)]
random.seed(220)
m2 = [random.gammavariate(alpha, inv_lam) for _ in range(N)]

def resumen(m):
    media = sum(m) / N
    var = sum((x - media) ** 2 for x in m) / N
    return round(media, 3), round(var, 3)

print("erlang:", resumen(m1), "vs (2.0, 1.333)")
print("librería:", resumen(m2), "vs (2.0, 1.333)")

Media ≈ 2,0 y var ≈ 1,333 con α = 3 y λ = 1,5. Ojo: gammavariate pide escala θ = 1/λ, no tasa.

06 · Exploración

Laboratorio: α esculpe, λ escala

Movete α con λ y N fijos. El histograma usa 20 bines hasta el cuantil 99,5 % (cola aparte); los rombos son la probabilidad teórica por bin. Con α = 1 ves exponencial; con α = 6, campana asimétrica.

EXPERIMENTO 26

Gamma por suma y MT

X = Y/λ · Y ~ Gamma(α,1)

Los resultados numéricos aparecen debajo.
Media muestral3,000
Teórica α/λ3,000
Var. muestral3,000
Teórica α/λ²3,000

Con α 3, λ 1 y N 6000, media 3 y var 3.

20 bines hasta el cuantil 99,5 % más cola. Probá α = 0,5 (pico en 0) y α = 8 (campana).

Preguntas para explorar

  1. Con α = 3 y λ = 1, ¿media y varianza teóricas?
  2. Bajá α a 1. ¿Recuperás la exponencial del Tema 22? ¿Media y var?
  3. Duplicá λ a 2 con α = 3. ¿La media se parte a la mitad? ¿Y la varianza?
Ver respuestas sugeridas
  1. Media 3 y varianza 3.
  2. Sí: Gamma(1,λ) = Exp(λ), media 1 y var 1 con λ = 1.
  3. Sí: media 3/2 = 1,5 y var 3/4 = 0,75. Escalar la tasa comprime todo.

07 · Comprensión

Confusiones frecuentes

«Gamma es solo para α entera»

La suma cubre α entera (Erlang); Marsaglia-Tsang + boost cubre todo α > 0, incluido α < 1.

«Tasa y escala son lo mismo»

Se invierten: escala θ = 1/λ. gammavariate(α, θ) con θ = λ simula Gamma(α,1/λ) sin querer.

«La media alcanza para validar»

Gamma(3,1) y Gamma(9,3) comparten media 3 con varianzas 3 y 1. Validar media + varianza + forma.

«Con α grande da igual el método»

La suma gasta α uniformes por muestra: con α = 100 es 100× más cara que Marsaglia-Tsang O(1).

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: tercera llegada

α = 3, λ = 2, N = 8000 (semilla 221): estimá media (≈ 1,5) y varianza (≈ 0,75).

import random
import math

random.seed(221)
alpha, lam, N = 3, 2.0, 8000
m = [-sum(math.log(1 - random.random()) for _ in range(alpha)) / lam
     for _ in range(N)]
media = sum(m) / N
print(round(media, 3), "vs 1.5")
print(round(sum((x-media)**2 for x in m)/N, 3), "vs 0.75")
Ver solución razonada

≈ 1,5 y ≈ 0,75 (típicamente 1,45–1,55). Si la media da ≈ 6, usaste escala θ = 2 en vez de tasa.

Ejercicio 2: chi-cuadrado como gamma

Generá χ² con ν = 4 como Gamma(2; 0,5) con N = 8000 y verificá media ≈ 4 y var ≈ 8.

import random

random.seed(222)
N = 8000
m = [random.gammavariate(2, 2.0) for _ in range(N)]
media = sum(m) / N
print(round(media, 3), "vs 4.0")
print(round(sum((x-media)**2 for x in m)/N, 3), "vs 8.0")
Ver solución

≈ 4,0 y ≈ 8,0. χ²(ν) = Gamma(ν/2, escala 2): aquí α = 2 y θ = 2.

Ejercicio 3: escala de tasa

Generá 3000 Gamma(4,1) y dividí por λ = 2: debe dar Gamma(4,2) con media ≈ 2.

Ver una posible respuesta
import random

random.seed(223)
alpha, lam, N = 4, 2.0, 3000
base = [random.gammavariate(alpha, 1.0) for _ in range(N)]
m = [x / lam for x in base]
media = sum(m) / N
print(round(media, 3), "vs 2.0")
print(round(sum((x-media)**2 for x in m)/N, 3), "vs 1.0")

Media ≈ 2,0 y var ≈ 1,0 = α/λ². Generar con tasa 1 y escalar alcanza para toda λ.

09 · Síntesis

Ideas para recordar

  • Gamma(α,λ): media α/λ, varianza α/λ², escala Y/λ.
  • α entera ⇒ suma de exponenciales O(α), exacta.
  • α ≥ 1 ⇒ Marsaglia-Tsang; α < 1 ⇒ boost con U^(1/α).
  • Cuidar tasa λ vs escala θ = 1/λ en cada librería.
  • Contiene a exponencial, Erlang y chi-cuadrado.

En el próximo tema abrimos el catálogo: beta, Weibull, lognormal y triangular.