2012-05-10 11 views
10

Estoy tratando de encontrar una manera de generar números aleatorios correlacionados entre varias distribuciones binomiales.generar números aleatorios correlacionados de distribuciones binomiales en I

sé cómo hacerlo con distribuciones normales (usando mvrnorm), pero no encontré una función aplicable a los dos términos.

+0

Usted puede utilizar el paquete 'bindata', como muy bien demo'd aquí: https://stat.ethz.ch/pipermail/r-help/2007-July/135575.html. (Ese enlace estaba en la primera página devuelta por una búsqueda en Google para 'R simular la variable binomial correlacionada' ...) –

+0

Gracias Josh, ¡pero necesito datos binomiales no binarios! – Arnaud

+1

@Arnaud - otorgada No he tenido ningún tipo de cafeína o estimulantes de esta mañana, pero no es una distribución binomial una distribución discreta, donde los únicos valores aceptables son "sí/no", "pasa/no pasa", "TRUE/FALSO ", en otras palabras, binario? Eso es lo que [Wikipedia parece pensar demasiado.] (Http://en.wikipedia.org/wiki/Binomial_distribution) – Chase

Respuesta

11

puede generar uniformes correlacionados con el paquete copula, a continuación, utilizar la función de convertir los qbinom a las variables binomiales. Aquí está un ejemplo rápido:

library(copula) 

tmp <- normalCopula(0.75, dim=2) 
x <- rcopula(tmp, 1000) 
x2 <- cbind(qbinom(x[,1], 10, 0.5), qbinom(x[,2], 15, 0.7)) 

Ahora x2 es una matriz con las 2 columnas que representan 2 variables binomiales que están correlacionados.

+0

¡Guau, agradable y dulce! – Arnaud

+0

Gracias de nuevo Greg ... después de su ayuda con optim en la ayuda de R, me salvas de nuevo! – Arnaud

+4

Esta es una idea interesante, pero no devuelve variables con la correlación deseada. (Por ejemplo, calculé coeficientes de correlación de muestra para 100 repeticiones del código anterior: la correlación promedio fue 0.724, con solo 5 de los coeficientes de correlación mayores que 0.75). –

9

Una variable binomial con n ensayos y probabilidad p de éxito en cada ensayo puede verse como la suma de n ensayos de Bernoulli que también tienen probabilidad p de éxito.

De manera similar, puede construir pares de variables binomiales correlacionadas por sumando parejas de variantes de Bernoulli que tienen la correlación deseada r.

require(bindata) 

# Parameters of joint distribution 
size <- 20 
p1 <- 0.5 
p2 <- 0.3 
rho<- 0.2 

# Create one pair of correlated binomial values 
trials <- rmvbin(size, c(p1,p2), bincorr=(1-rho)*diag(2)+rho) 
colSums(trials) 

# A function to create n correlated pairs 
rmvBinomial <- function(n, size, p1, p2, rho) { 
    X <- replicate(n, { 
      colSums(rmvbin(size, c(p1,p2), bincorr=(1-rho)*diag(2)+rho)) 
     }) 
    t(X) 
} 
# Try it out, creating 1000 pairs 
X <- rmvBinomial(1000, size=size, p1=p1, p2=p2, rho=rho) 
#  cor(X[,1], X[,2]) 
# [1] 0.1935928 # (In ~8 trials, sample correlations ranged between 0.15 & 0.25) 

Es importante tener en cuenta que hay muchos diferentes distribuciones conjuntas que comparten el coeficiente de correlación deseada. El método de simulación en rmvBinomial() produce uno de ellos, pero si es el adecuado dependerá del proceso que genere sus datos.

Como se señaló en this R-help answer a una pregunta similar (que luego pasa a explicar la idea en más detalle):

mientras que un bivariados (medios dados y varianzas) normal se define de forma única por el coeficiente de correlación , este no es el caso para un binomio de dos variables

+0

Muchas gracias Josh. Modifiqué tu script para permitir un mayor número de distribuciones binomiales. Sin embargo, como se indica en http://stat.ethz.ch/pipermail/r-help/2007-July/135575.html, rho está limitado debajo y arriba por alguna función de las probabilidades marginales (la función falla para rho = 0.8) El uso de odd ratio parece ser la solución, pero ... ¿sabes cómo generalizar la función propuesta que permite convertir odds ratio en una correlación binaria válida para más de 2 distribuciones? – Arnaud

+0

@Josh He hecho una pregunta relacionada, tal vez es posible que desee echarle un vistazo? https://stackoverflow.com/questions/47006881/how-to-generate-a-binomial-vector-of-n-correlated-items – jaySf

Cuestiones relacionadas