Supponiamo di avere
dove è un campione casuale uniforme di dimensione n e
Quindi la correlazione tra e è .
Come posso estenderlo a tre variabili: , , ?
Supponiamo di avere
dove è un campione casuale uniforme di dimensione n e
Quindi la correlazione tra e è .
Come posso estenderlo a tre variabili: , , ?
Risposte:
La domanda contiene diversi errori, come indicato nei commenti: come definito nella domanda, Z non è né uniforme né ha la correlazione specificata.
il cardinale menziona le copule e questo è il modo più generale di procedere. Tuttavia, ci sono molti modi abbastanza semplici per ottenere uniformi correlate (che possono essere viste come semplici scorciatoie per diversi tipi di copule).
Quindi iniziamo con alcuni modi per ottenere un paio di uniformi correlate.
1) Se aggiungi due uniformi il risultato è triangolare, non uniforme. Ma puoi usare il cdf della variabile risultante come una trasformazione per riportare il risultato in un'uniforme. Il risultato non è più linearmente correlato, ovviamente.
Ecco una funzione R per trasformare un triangolare simmetrico su (0,2) in uniforme standard
t2u = function(x) ifelse(x<1, x^2, 2-(2-x)^2)/2
Controlliamo che dia un'uniforme
u1 = runif(30000)
u2 = runif(30000)
v1 = t2u(u1+u2)
Ed è correlato con u1 e u2:
> cor(cbind(u1,u2,v1))
u1 u2 v1
u1 1.000000000 0.006311667 0.7035149
u2 0.006311667 1.000000000 0.7008528
v1 0.703514895 0.700852805 1.0000000
ma non in modo lineare, a causa della trasformazione monotonica in uniformità
Con questo come strumento possiamo generare alcune variabili aggiuntive per ottenere tre uniformi equicorrelate:
u3 = runif(30000)
v2 = t2u(u1+u3)
v3 = t2u(u2+u3)
cor(cbind(v1,v2,v3))
v1 v2 v3
v1 1.0000000 0.4967572 0.4896972
v2 0.4967572 1.0000000 0.4934746
v3 0.4896972 0.4934746 1.0000000
La relazione tra le variabili v è simile alla seguente:
-
Una seconda alternativa è quella di generare prendendo una miscela . Invece di sommare le uniformi, prendile con probabilità fisse.
per esempio
z = ifelse(rbinom(30000,1,.7),u1,u2)
cor(cbind(u1,z))
u1 z
u1 1.0000000 0.7081533
z 0.7081533 1.0000000
Che può essere nuovamente utilizzato per generare più uniformi correlate.
-
Un terzo semplice approccio è generare normali correlate e trasformarle in uniformità.
n1=rnorm(30000)
n2=rnorm(30000)
n3=rnorm(30000)
x=.6*n1+.8*n2
y=.6*n2+.8*n3
z=.6*n3+.8*n1
cor(cbind(x,y,z))
x y z
x 1.0000000 0.4763703 0.4792897
y 0.4763703 1.0000000 0.4769403
z 0.4792897 0.4769403 1.0000000
Quindi ora convertiamo in uniforme:
w1 = pnorm(x)
w2 = pnorm(y)
w3 = pnorm(z)
cor(cbind(w1,w2,w3))
w1 w2 w3
w1 1.0000000 0.4606723 0.4623311
w2 0.4606723 1.0000000 0.4620257
w3 0.4623311 0.4620257 1.0000000
Una cosa bella dei metodi 2 e 3 è che hai molta varietà nella scelta di come potrebbero essere le cose correlate (e non devono essere equilorrelate come gli esempi qui).
Naturalmente esiste una grande varietà di altri approcci, ma questi sono tutti facili e veloci.
La parte difficile è ottenere esattamente la correlazione di popolazione desiderata; non è così semplice come quando vuoi solo gaussiani correlati. La risposta di Quantibex su Genera coppie di numeri casuali distribuiti uniformemente e correlati fornisce un approccio che modifica qui il mio terzo metodo che dovrebbe fornire la correlazione della popolazione desiderata.
Innanzitutto, supponi che siano indipendenti? In tal caso, il coefficiente di correlazione tra e non è . Sarebbe se fosse definito come .
Un semplice sguardo alla definizione della formula del coefficiente di correlazione e alla legge dei coseni dovrebbe convincerti che è un tra serie se le serie sono trattate come vettori con ciascun punto dati trattato come una dimensione di un vettore. Se hai serie indipendenti in coppia, sono tre vettori che sono tutti ortogonali tra loro (perché i 'degli angoli tra loro sono tutti .
Questo dovrebbe iniziare sulla strada della decomposizione di una serie nei suoi componenti nello stesso modo in cui si decompone un vettore nei suoi componenti ortogonali.