Come generare numeri casuali correlati (date medie, varianze e grado di correlazione)?


53

Mi dispiace se questo sembra un po 'troppo semplice, ma credo che sto solo cercando di confermare la comprensione qui. Ho la sensazione che dovrei farlo in due passaggi, e ho iniziato a cercare di individuare le matrici di correlazione, ma sta cominciando a sembrare davvero coinvolto. Sto cercando una spiegazione concisa (idealmente con suggerimenti per una soluzione pseudocodice) di un buon modo idealmente rapido per generare numeri casuali correlati.

Date due variabili pseudocasuali di altezza e peso con medie e varianze note e una data correlazione, penso che sto sostanzialmente cercando di capire come dovrebbe essere questo secondo passaggio:

   height = gaussianPdf(height.mean, height.variance)
   weight = gaussianPdf(correlated_mean(height.mean, correlation_coefficient), 
                        correlated_variance(height.variance, 
                        correlation_coefficient))
  • Come posso calcolare la media e la varianza correlate? Ma voglio confermare che questo è davvero il problema rilevante qui.
  • Devo ricorrere alla manipolazione della matrice? O ho qualcos'altro di sbagliato nel mio approccio di base a questo problema?

1
Non sono sicuro di averti capito correttamente, ma non devi calcolare "media e varianza correlate". Se stai assumendo che le variabili siano normali bivariate, dovrebbe essere sufficiente specificare i singoli mezzi, le varianze e la correlazione. C'è qualche software particolare che vuoi usare per questo?
mark999,


Risposte:


44

Per rispondere alla tua domanda su "un modo buono, idealmente rapido per generare numeri casuali correlati": Data una matrice varianza-covarianza desiderata che è per definizione positiva definita, la sua scomposizione di Cholesky è: C = L L T ; L essendo matrice triangolare inferiore.CCLLTL

Se ora usi questa matrice per proiettare un vettore variabile casuale non correlato X , la proiezione risultante Y = L X sarà quella delle variabili casuali correlate.LXY=LX

Puoi trovare una spiegazione concisa del perché questo accada qui .


Grazie! Questo è stato di enorme aiuto. Penso di avere almeno un'idea migliore di ciò che devo guardare dopo.
Joseph Weissman,

7
Questo metodo si applica solo alle distribuzioni gaussiane (come specificato nella domanda) o può essere utilizzato per generare variabili correlate che seguono altre distribuzioni? In caso contrario, sei a conoscenza di un metodo che potrebbe essere utilizzato in quel caso?
user000001

1
@Michael: Sì. Detto questo, dato che è una matrice di covarianza valida, la decomposizione di Cholesky è il modo più veloce. Puoi anche ottenere la matrice X (simmetrica) della radice quadrata di C usando SVD (quindi C = X X = X X T , dove X = U S 0,5 V T da C = U S V T ) ma sarebbe più costoso pure. CXCC=XX=XXTX=US0.5VTC=USVT
usεr11852 dice Reinstate Monic

1
@Michael: Certo. La loro covarianza sarà (approssimativamente) la stessa, non i numeri stessi.
usεr11852 dice Reinstate Monic il

1
@Sid: qualsiasi distribuzione continua non supportata su tutta la linea reale fallirà immediatamente. Ad esempio se usiamo una uniforme non possiamo garantire che i "numeri correlati" saranno in [ 0 , 1 ] ; allo stesso modo per un Poisson finiremo con numeri non discreti. Inoltre, qualsiasi distribuzione in cui la somma delle distribuzioni non è ancora la stessa distribuzione (ad es. Sommando la distribuzione t non si traduce in distribuzioni t ) fallirà. In tutti i casi menzionati, i numeri prodotti saranno correlati secondo la CU[0,1][0,1]ttCma non corrisponderanno alla distribuzione che abbiamo iniziato.
usεr11852 dice Reinstate Monic il

36

Da +1 a @ user11852 e @ jem77bfp, queste sono buone risposte. Consentitemi di affrontarlo da una prospettiva diversa, non perché penso che sia necessariamente migliore nella pratica , ma perché penso che sia istruttivo. Ecco alcuni fatti rilevanti che conosciamo già:

  1. è la pendenza della linea di regressione quando sia X che Y sonostandardizzati, ovvero N ( 0 , 1 ) , rXYN(0,1)
  2. è la proporzione della varianza in Y attribuibile alla varianza in X , r2YX



    (anche, dalle regole per le varianze ):

  3. la varianza di una variabile casuale moltiplicata per una costante è la costante al quadrato della varianza originale:
    Var[aX]=a2Var[X]

  4. Var[X+ε]=Var[X]+Var[ε]

rρXN(0,1)aveYN(0,a2+ve)a2+ve=1|a| 1a=rra1r2xieiveyi

Se vuoi farlo in R, il seguente codice potrebbe funzionare per te:

correlatedValue = function(x, r){
  r2 = r**2
  ve = 1-r2
  SD = sqrt(ve)
  e  = rnorm(length(x), mean=0, sd=SD)
  y  = r*x + e
  return(y)
}

set.seed(5)
x = rnorm(10000)
y = correlatedValue(x=x, r=.5)

cor(x,y)
[1] 0.4945964

0

Ancora una volta, questo, nella sua forma più semplice, ti consente solo di generare una coppia di variabili correlate (questo potrebbe essere ridimensionato, ma diventa brutto veloce), e non è certamente il modo più conveniente per fare il lavoro. In R, vorresti usare ? Mvrnorm nel pacchetto MASS , sia perché è più semplice sia perché puoi generare molte variabili con una data matrice di correlazione della popolazione. Tuttavia, penso che valga la pena seguire questo processo per vedere come alcuni principi di base si svolgono in modo semplice.


Questo approccio essenzialmente regressivo è particolarmente piacevole, consentendo di generare una Y casuale correlata con un numero qualsiasi di "predittori" X esistenti . Ho ragione in tale comprensione?
ttnphns

Dipende esattamente da quale modello di correlazioni tra le variabili desiderate, @ttnphns. Puoi iterarlo uno dopo l'altro, ma diventerebbe noioso. Per creare molte variabili correlate con un determinato modello, è meglio usare la decomposizione di Cholesky.
gung - Ripristina Monica

gung, sai come usare Cholesky per generare una Y correlata (approssimativamente, come nel tuo metodo) secondo un vettore di correlazioni con diverse X (non simulate) esistenti ?
ttnphns

@ttnphns, vuoi generare una singola Y con una data correlazione di popolazione con una serie di X, non una serie di variabili p che hanno tutte correlazioni di popolazione prespecificate? Un modo semplice sarebbe scrivere un'equazione di regressione per generare un singolo Y-hat dalle tue X, quindi utilizzare il metodo sopra per generare Y come correlato al tuo Y-hat. Puoi fare una nuova domanda a riguardo, se vuoi.
gung - Ripristina Monica

1
Questo è ciò che intendevo nel mio commento iniziale: questo metodo sarebbe un'estensione diretta di ciò di cui parli nella tua risposta: essenzialmente un metodo regressivo (Hat).
ttnphns

16

In generale questa non è una cosa semplice da fare, ma credo che ci siano pacchetti per la generazione di variabili normali multivariate (almeno in R, vedi mvrnormnel MASSpacchetto), in cui hai appena inserito una matrice di covarianza e un vettore medio.

(X1,X2)F(x1,x2)Fx2

FX1(x1)=F(x1,x2)dx2.
FX11FX1ξ1[0,1]x^1=FX11(ξ)

F(x1,x2)x1=x^1

F(x2|X1=x^1)=F(x^1,x2)fX1(x^1),
fX1X1FX1(x1)=fX1(x1)

ξ2[0,1]ξ1F(x2|X1=x^1)x^2=(F(x2|X1=x^1))1(ξ)x^2F(x^2|X1=x^1)=ξ

Se non capisci il significato di collegare una variabile uniforme in una funzione di distribuzione di probabilità inversa, prova a fare uno schizzo del caso univariato e poi ricorda qual è l'interpretazione geometrica della funzione inversa.


Idea intelligente! Ha un semplice appello intuitivo. Ma sì sembra costoso dal punto di vista computazionale.
MichaelChirico,

fX,Y(x,y)=fX(x)fY|X(y)

1

Se sei pronto a rinunciare all'efficienza, puoi usare un alogorithm usa e getta. Il suo vantaggio è che consente qualsiasi tipo di distribuzione (non solo gaussiana).

{xi}i=1N{yi}i=1NC

cold=corr({xi},{yi})

n1n2:1n1,2N

xn1xn2

cnew=corr({xi},{yi})

|Ccnew|<|Ccold|

|Cc|<ϵ

xi

In bocca al lupo!


xicorr(xi,yi)

xi{xi}ycorr(xi,yi)corr({xi},{yi})=(1/N)Σi=1N(xix¯)(yyy¯)

{}corr({xi},{yi})
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.