[R-es] Generacion de binomiales correlacionadas

Olivier Nuñez onunez en iberstat.es
Jue Dic 16 12:17:26 CET 2010


Jorge,

redacté a partir del articulo de Biswas y Hwang (2002) y de sus  
notaciones,
el código (mejorable) de una función para generar N realizaciones de  
dos variables binomiales Y_i  ~ Binomial(n_i, p_i)  ( i =1,2) y con  
correlación rho:


r2Binom <- function(N=100,n1=10,n2=10,p1=.5,p2=.5,rho=0){
m=min(n1,n2)
M=max(n1,n2)
min.alpha=max(-(1-p2)/(1+p1-p2),-p2/(1+p2-p1))
if(p1 > p2) max.alpha=p2/(p1-p2) else max.alpha=(1-p2)/(p2-p1+1e-30)
c=sqrt(M/m)*sqrt(p2*(1-p2)/(p1*(1-p1)))
rho.min=max(round(min.alpha/(1+min.alpha)/c,2),-1)
rho.max=min(round(max.alpha/(1+max.alpha)/c,2),1)
if(rho>rho.max |rho<rho.min) stop("la correlación rho ha de ser  
incluida entre ",rho.min," y ",rho.max,".")
z=rho*sqrt(M/m)*sqrt(p2*(1-p2)/p1/(1-p1))
alpha=z/(1-z)
Y1j=matrix(rbinom(M*N,1,p1),M,N)
p2y=(p2+alpha*(p2-p1)+alpha*Y1j)/(1+alpha)
Y2j=apply(p2y,2,FUN=function(x) rbinom(M,1,x))
Y1=apply(Y1j[1:n1,],2,sum)
Y2=apply(Y2j[1:n2,],2,sum)
return(cbind(Y1,Y2))
}



 > Y=r2Binom(2000,n1=10,n2=8,p1=.3,p2=.5,rho=-.4)
 > summary(Y)
        Y1              Y2
  Min.   :0.000   Min.   :0.000
  1st Qu.:2.000   1st Qu.:3.000
  Median :3.000   Median :4.000
  Mean   :3.010   Mean   :4.029
  3rd Qu.:4.000   3rd Qu.:5.000
  Max.   :7.000   Max.   :8.000
 > cor(Y)
            Y1         Y2
Y1  1.0000000 -0.3881115
Y2 -0.3881115  1.0000000
Un saludo. Olivier


PD: Hay que tomar en cuenta que hay restricciones sobre el rango de  
valores de rho dados p1 y p2.
Lo cual es bastante lógico. Cuentame si te funciona.

____________________________________

Olivier G. Nuñez
Email: onunez en iberstat.es
Tel : +34 663 03 69 09
Web: http://www.iberstat.es

____________________________________




El 16/12/2010, a las 3:51, Jorge Ivan Velez escribió:

> Gracias Olivier. Ese fue uno de los primeros papers que encontre y  
> sobre el que comence a trabajar  :)  Al parecer no existe (bueno,  
> al menos no la he encontrado aun) una manera simple de generar, via  
> R, directamente lo que necesito.
>
> Feliz noche,
> Jorge
>
>
> 2010/12/15 Olivier Nuñez <onunez en iberstat.es>
> Es un problema delicado, y como alternativa a lo que JuanMi propone,
> puedes también utilizar la metodología expuesta en el articulo  
> adjunto.
> Consiste básicamente en sumar combinaciones de Bernouilli.
> Un saludo. Olivier
>
> --  
> ____________________________________
>
> Olivier G. Nuñez
> Email: onunez en iberstat.es
> Tel : +34 663 03 69 09
> Web: http://www.iberstat.es
>
> ____________________________________
>
>
>
>
> El 15/12/2010, a las 23:08, Jorge Ivan Velez escribió:
>
>> Buenas tardes,
>>
>> Estoy interesado en generar observaciones de una distribucion  
>> binomial
>> bivariada en la que hay _cierto_ grado de correlacion (denotemoslo  
>> rho).
>> Podria por favor alguien indicarme como hacerlo en R?
>>
>> Este es el contexto. Supongamos que se tienen dos experimentos en  
>> los que la
>> variable respuesta _sigue_ una distribucion binomial, i.e., X_i
>> ~Binomial(n_i, p_i), i=1,2 y que, por ahora, n_i y p_i son  
>> conocidos. El
>> interes principal es calcular T = P(X_1=1, X_2=1).  Si las X_i's  
>> fueran
>> independientes (caso 1), seria suficiente generar binomiales con los
>> parametros correspondientes a cada tipo de experimento (via rbinom) y
>> calcular lo que se necesita usando table(). Ahora, si X_i's *no* son
>> independientes (caso 2), el calculo de T no puede hacerse de la  
>> misma forma.
>> Observe que independiente del modelo (caso) bajo el cual estemos  
>> trabajando,
>> T _podria_ calcularse como una funcion de rho, n_i y p_i.  
>> Desafortunadamente
>> no tengo claro como _modelar_ el segundo caso utilizando R.
>>
>> Alguna sugerencia?
>>
>> Muchas gracias,
>>       Jorge Ivan Velez
>>
>> [[alternative HTML version deleted]]
>>
>> _______________________________________________
>> R-help-es mailing list
>> R-help-es en r-project.org
>> https://stat.ethz.ch/mailman/listinfo/r-help-es
>
>
>



Más información sobre la lista de distribución R-help-es