34 votos

Generación de variables aleatorias binomiales correlacionadas

Me preguntaba si sería posible generar variables binomiales aleatorias correlacionadas siguiendo un enfoque de transformación lineal.

A continuación, probé algo simple en R y produce cierta correlación. Pero me preguntaba si hay una forma basada en principios para hacer esto.

 X1 = rbinom(1e4, 6, .5) ; X2 = rbinom(1e4, 6, .5) ;  X3 = rbinom(1e4, 6, .5) ; a = .5

Y1 = X1 + (a*X2) ; Y2 = X2 + (a*X3) ## Y1 and Y2 are supposed to be correlated

cor(Y1, Y2)

7voto

SeanOC Puntos 875

Una implementación de Python ( python3 ) de la solución de @ whuber:

 import numpy as np


def bernoulli_sample(n=100, p=0.5, q=0.5, rho=0):
    p1 = rho * np.sqrt(p * q * (1 - p) * (1 - q)) + (1 - p) * (1 - q)
    p2 = 1 - p - p1
    p3 = 1 - q - p1
    p4 = p1 + p + q - 1
    samples = np.random.choice([0, 1, 2, 3], size=n, replace=True, p=[p1, p2, p3, p4])
    samples = list(map(lambda x: np.array(tuple(np.binary_repr(x, width=2))).astype(np.int), samples))
    return np.array(samples).sum(0)
    
    
def gen_correlated_bernoulli(size, n=100, p=0.5, q=0.5, rho=0):
    return np.array([bernoulli_sample(n, p, q, rho) for _ in range(size)])

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X