2012-05-10 13 views
10

Sto cercando di trovare un modo per generare numeri casuali correlati da diverse distribuzioni binomiali.Generare numeri casuali correlati dalle distribuzioni binomiali in R

So come farlo con le normali distribuzioni (usando mvrnorm), ma non ho trovato una funzione applicabile a quelle binomiali.

+0

È possibile utilizzare il pacchetto 'bindata', come ben demo'd qui: https://stat.ethz.ch/pipermail/r-help/2007-July/135575.html. (Quel collegamento era nella prima pagina restituita da una ricerca di Google per "simula la variabile binomiale correlata R" ...) –

+0

Grazie Josh, ma ho bisogno di dati binomiali non binari! – Arnaud

+1

@Arnaud - concesso Non ho avuto alcun tipo di caffeina o stimolante stamattina, ma non è una distribuzione binomiale una distribuzione discreta in cui gli unici valori accettabili sono "sì/no", "pass/fail", "VERO/FALSO ", in altre parole binario? Questo è ciò che [Wikipedia sembra pensare.] (Http://en.wikipedia.org/wiki/Binomial_distribution) – Chase

risposta

11

è possibile generare uniformi correlate utilizzando il pacchetto copula, quindi utilizzare la funzione qbinom per convertire quelle a variabili binomiali. Ecco un rapido esempio:

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)) 

Ora x2 è una matrice con le colonne che rappresentano 2 2 variabili binomio che sono correlate.

+0

Wow, bello e dolce! – Arnaud

+0

Grazie ancora Greg ... dopo il tuo aiuto con l'ottimismo sull'aiuto R, mi salvi di nuovo! – Arnaud

+4

Questa è un'idea interessante, ma non restituisce le variabili con la correlazione desiderata. (Ad esempio, ho calcolato i coefficienti di correlazione del campione per 100 replicati del codice precedente: la correlazione media era di 0,724, con solo 5 dei coefficienti di correlazione superiori a 0,75). –

9

Una variabile binomiale con n prove e probabilità p di successo in ciascuna prova può essere vista come la somma di n prove di Bernoulli ciascuna avendo anche probabilità p di successo.

Analogamente, è possibile costruire coppie di variabili binomiali correlate per sommando coppie di variabili di Bernoulli aventi la correlazione desiderata 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) 

È importante notare che ci sono molti distribuzioni congiunte diversi che condividono il coefficiente di correlazione desiderato. Il metodo di simulazione in rmvBinomial() produce uno di questi, ma indipendentemente dal fatto che sia appropriato dipenderà dal processo che genera i dati.

Come osservato in this R-help answer ad una domanda simile (che va poi a spiegare l'idea più in dettaglio):

mentre un bivariati normali (dato mezzo e varianze) è univocamente definita dal coefficiente di correlazione , questo non è il caso di un bivariata binomio

+0

Grazie mille Josh. Ho modificato il tuo script per consentire un numero maggiore di distribuzioni binomiali. Tuttavia, come indicato in http://stat.ethz.ch/pipermail/r-help/2007-July/135575.html, rho è limitato al di sotto e al di sopra da una qualche funzione delle probabilità marginali (la funzione fallisce per rho = 0.8). L'uso di odd ratio sembra essere la soluzione, ma ... sai come generalizzare la funzione proposta che consente di convertire il odds ratio in una correlazione binaria valida per più di 2 distribuzioni? – Arnaud

+0

@Josh Ho fatto una domanda correlata, forse potresti darci un'occhiata? https://stackoverflow.com/questions/47006881/how-to-generate-a-binomial-vector-of-n-correlated-items – jaySf