Genera coppie di numeri casuali distribuiti uniformemente e correlati


14

Vorrei generare coppie di numeri casuali con una certa correlazione. Tuttavia, il solito approccio all'uso di una combinazione lineare di due variabili normali non è valido qui, poiché una combinazione lineare di variabili uniformi non è più una variabile distribuita uniformemente. Ho bisogno che le due variabili siano uniformi.

Qualche idea su come generare coppie di variabili uniformi con una data correlazione?


6
Strettamente correlato: stats.stackexchange.com/questions/30526 . Vuoi anche dare un'occhiata al tag copula - fai clic sul link qui. Una tecnica veloce e sporca è quella di lasciare X uniforme [0,1] e Y=X quando Xα e altrimenti. La correlazione è , da cui fa il trucco. Ma le copule ti daranno un maggiore controllo ... ρ = 2 ( α - 1 ) 3 + 1 α = 1 - ( ( 1 - ρ ) / 2 ) 1 / 3Y=1+αXρ=2(α1)3+1α=1((1ρ)/2)1/3
whuber

Grazie per il commento, ma sì, penso che questo metodo sia davvero "sporco"
Onturenio

1
La mia speranza era che, vedendo questo approccio, riconoscessi che puoi (e dovresti) fornire criteri aggiuntivi riguardanti le proprietà delle tue coppie di numeri casuali. Se questo è "sporco", allora che cosa c'è di sbagliato nella soluzione? Comunicaci in modo che possiamo fornire risposte più appropriate per la tua situazione.
whuber

A questa domanda è stata data una risposta accidentale nella risposta a una domanda strettamente correlata: come generare coppie di camper con una relazione di regressione lineare. Poiché la pendenza della regressione lineare è correlata in modo facilmente calcolato al coefficiente di correlazione e possono essere prodotte tutte le pendenze possibili, ciò consente di produrre esattamente ciò che si desidera. Vedi stats.stackexchange.com/questions/257779/… .
whuber

1
Vedi anche stats.stackexchange.com/questions/31771 , che risponde alla generalizzazione a tre uniformi casuali.
whuber

Risposte:


16

Non sono a conoscenza di un metodo universale per generare variabili casuali correlate con una determinata distribuzione marginale. Quindi, proporrò un metodo ad hoc per generare coppie di variabili casuali distribuite uniformemente con una data correlazione (Pearson). Senza perdita di generalità, presumo che la distribuzione marginale desiderata sia uniforme standard (ovvero, il supporto è ).[0,1]

L'approccio proposto si basa su quanto segue:
a) Per le variabili casuali uniformi standard e U 2 con le rispettive funzioni di distribuzione F 1 e F 2 , abbiamo F i ( U i ) = U i , per i = 1 , 2 . Quindi, per definizione, il rho di Spearman è ρ S ( U 1 , U 2 ) = c o r r ( FU1U2F1F2Fi(Ui)=Uii=1,2 Quindi, il coefficiente di correlazione rho e Pearson di Spearman sono uguali (le versioni del campione potrebbero tuttavia differire).

ρS(U1,U2)=corr(F1(U1),F2(U2))=corr(U1,U2).

b) Se sono variabili casuali con margini continui e copula gaussiana con coefficiente di correlazione (Pearson) ρ , allora il rho di Spearman è ρ S ( X 1 , X 2 ) = 6X1,X2ρ Ciò semplifica la generazione di variabili casuali che hanno un valore desiderato del rho di Spearman.

ρS(X1,X2)=6πarcsin(ρ2).

L'approccio è generare dati dalla copula gaussiana con un coefficiente di correlazione appropriato tale che il rho di Spearman corrisponda alla correlazione desiderata per le variabili casuali uniformi.ρ

Algoritmo di simulazione
Indichiamo il livello di correlazione desiderato e n il numero di coppie da generare. L'algoritmo è:rn

  1. Calcola .ρ=2sin(rπ/6)
  2. Genera una coppia di variabili casuali dalla copula gaussiana (ad esempio, con questo approccio )
  3. Ripetere il passaggio 2 volte.n

Esempio
Il seguente codice è un esempio di implementazione di questo algoritmo usando R con una correlazione target e n = 500 coppie.r=0.6n=500

## Initialization and parameters 
set.seed(123)
r <- 0.6                            # Target (Spearman) correlation
n <- 500                            # Number of samples

## Functions
gen.gauss.cop <- function(r, n){
    rho <- 2 * sin(r * pi/6)        # Pearson correlation
    P <- toeplitz(c(1, rho))        # Correlation matrix
    d <- nrow(P)                    # Dimension
    ## Generate sample
    U <- pnorm(matrix(rnorm(n*d), ncol = d) %*% chol(P))
    return(U)
}

## Data generation and visualization
U <- gen.gauss.cop(r = r, n = n)
pairs(U, diag.panel = function(x){
          h <- hist(x, plot = FALSE)
          rect(head(h$breaks, -1), 0, tail(h$breaks, -1), h$counts/max(h$counts))})

Nella figura seguente, i grafici diagonali mostrano istogrammi delle variabili e U 2 e i grafici off-diagonali mostrano grafici a dispersione di U 1 e U 2 . U1U2U1U2enter image description here

Per costruzione, le variabili casuali hanno margini uniformi e un coefficiente di correlazione (vicino a) . Ma a causa dell'effetto del campionamento, il coefficiente di correlazione dei dati simulati non è esattamente uguale a r .rr

cor(U)[1, 2]
# [1] 0.5337697

Si noti che la gen.gauss.copfunzione dovrebbe funzionare con più di due variabili semplicemente specificando una matrice di correlazione più ampia.

Studio di simulazione
Il seguente studio di simulazione ripetuto per la correlazione target suggerisce che la distribuzione del coefficiente di correlazione converge alla correlazione desiderata all'aumentare della dimensione del campione n .r=0.5,0.1,0.6n

## Simulation
set.seed(921)
r <- 0.6                                                # Target correlation
n <- c(10, 50, 100, 500, 1000, 5000); names(n) <- n     # Number of samples
S <- 1000                                               # Number of simulations

res <- sapply(n,
              function(n, r, S){
                   replicate(S, cor(gen.gauss.cop(r, n))[1, 2])
               }, 
               r = r, S = S)
boxplot(res, xlab = "Sample size", ylab = "Correlation")
abline(h = r, col = "red")

enter image description here enter image description here enter image description here


3
Il metodo generale per generare distribuzioni multivariate correlate con determinate distribuzioni marginali è chiamato copula .
whuber

@whuber, l'uso di copula consente di specificare una struttura di dipendenza tra variabili casuali. Il problema è che la correlazione (persona) è influenzata sia dalla struttura di dipendenza che dai margini. Pertanto, ogni scelta di margini richiederà una corrispondente scelta di parametri di copula, per non parlare del fatto che alcuni livelli di correlazione semplicemente non possono essere raggiunti per determinati margini (ad esempio, vedere qui ). Se sei a conoscenza di un metodo che consente di "controllare" il livello di correlazione per qualsiasi scelta di margini, mi piacerebbe saperlo.
QuantIbex,

Grazie @QuantIbex. Ma non capisco perché "a) implica che il coefficiente di correlazione rho e (di Pearson) di Spearman per variabili casuali con margini uniformi standard sono approssimativamente uguali in un campione ampio"
Onturenio,

2
[1,1]

1
@Quantibex Mi sono preso la libertà di aggiungere una frase che sottolinea che la tua gen.gauss.copfunzione funzionerà per più di due variabili con una (banale) modifica. Se non ti piace l'aggiunta o desideri metterla in modo diverso, ripristina o modifica se necessario.
Glen_b

0

u1U(0,1)u1w1U(0,1)I=1u1w2U(0,1)I=0u1U(0,1)u2

E(u1u2)=E[Iw1+(1I)w2][Iw1+(1I)w3]

I(I1)=0I2=I(1I)2=(1I)I01Iw

E(u1u2)=E(I)E(w12)+E(1I)E(w2)E(w3) =pE(w12)+(1p)/4

V(w1)=1/12E(w12)=1/3E(u1u2)=p/12+1/4cov(u1u2)=p/12V(u1)=V(u2)=1/12, we get finally that cor(u1,u2)=p.


0

Here is one easy method for positive correlation: Let (u1,u2)=Iw1+(1I)(w2,w3), where w1,w2, and w3 are independent U(0,1) and I is Bernoulli(p). u1 and u2 will then have U(0,1) distributions with correlation p. This extends immediately to k-tuples of uniforms with compound symmetric variance matrix.

If you want pairs with negative correlation, use (u1,u2)=I(w1,1w1)+(1I)(w2,w3), and the correlation will be p.


Can you add a short proof of why this works?
The Laconic

if your want to be computationally efficient, u1=w1 also produces the same correlation (both positive and negative cases)
Anvit
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.