Jak wygenerować skorelowane liczby losowe (podane średnie, wariancje i stopień korelacji)?

53

Przepraszam, jeśli wydaje się to trochę zbyt proste, ale myślę, że tylko chcę tutaj potwierdzić zrozumienie. Wydaje mi się, że musiałbym to zrobić w dwóch krokach i zacząłem próbować analizować macierze korelacji, ale to zaczyna wydawać się naprawdę zaangażowane. Szukam zwięzłego wyjaśnienia (najlepiej ze wskazówkami dotyczącymi rozwiązania pseudokodu) dobrego, idealnie szybkiego sposobu generowania skorelowanych liczb losowych.

Biorąc pod uwagę dwie zmienne pseudolosowe: wzrost i wagę ze znanymi średnimi i wariancjami oraz daną korelację, myślę, że w zasadzie staram się zrozumieć, jak powinien wyglądać ten drugi krok:

   height = gaussianPdf(height.mean, height.variance)
   weight = gaussianPdf(correlated_mean(height.mean, correlation_coefficient), 
                        correlated_variance(height.variance, 
                        correlation_coefficient))
  • Jak obliczyć skorelowaną średnią i wariancję? Ale chcę potwierdzić, że to naprawdę istotny problem.
  • Czy muszę uciekać się do manipulacji matrycą? Czy mam coś jeszcze bardzo złego w moim podstawowym podejściu do tego problemu?
Joseph Weissman
źródło
1
Nie jestem pewien, czy rozumiem cię poprawnie, ale nie musisz obliczać „skorelowanej średniej i wariancji”. Jeśli zakładasz, że zmienne są dwuwymiarowe normalne, powinno wystarczyć określenie poszczególnych średnich i wariancji oraz korelacji. Czy jest jakieś konkretne oprogramowanie, którego chcesz użyć do tego?
mark999

Odpowiedzi:

44

Aby odpowiedzieć na pytanie dotyczące „dobrego, idealnie szybkiego sposobu generowania skorelowanych liczb losowych”: Biorąc pod uwagę pożądaną macierz wariancji-kowariancji która z definicji jest z definicji pozytywna, jej rozkład Choleskiego wynosi: = ; jest dolną macierzą trójkątną.C L L T LCCLLTL

Jeśli teraz użyjesz tej macierzy do rzutowania nieskorelowanego wektora zmiennych losowych , wynikowy rzut będzie taki, jak skorelowanych zmiennych losowych.X Y = L XLXY=LX

Można znaleźć zwięzłe wyjaśnienie, dlaczego tak się dzieje tutaj .

usεr11852 mówi Reinstate Monic
źródło
Dzięki! To było niezwykle pomocne. Myślę, że przynajmniej lepiej rozumiem, na co muszę spojrzeć w następnej kolejności.
Joseph Weissman,
7
Czy ta metoda ma zastosowanie tylko do rozkładów Gaussa (jak określono w pytaniu), czy może być stosowana do generowania skorelowanych zmiennych, które następują po innych rozkładach? Jeśli nie, czy znasz metodę, którą można by zastosować w takim przypadku?
user000001
1
@Michael: Tak. Powiedziawszy, że dane jest prawidłową macierzą kowariancji, rozkład Choleskiego jest najszybszym sposobem. Możesz także uzyskać (symetryczną) macierz pierwiastka kwadratowego z , używając SVD (więc , gdzie z ), ale byłoby to więcej drogie też. X C C = X X = X X T X = U S 0,5 V T C = U S V TCXCC=XX=XXTX=US0.5VTC=USVT
usεr11852 mówi Przywróć Monic
1
@Michael: Oczywiście. Ich kowariancja będzie (w przybliżeniu) taka sama, a nie same liczby.
usεr11852 mówi Przywróć Monic
1
@Sid: Jakakolwiek ciągła dystrybucja nieobsługiwana w całej linii rzeczywistej natychmiast się nie powiedzie. Na przykład, jeśli użyjemy jednolitego nie możemy zagwarantować, że „skorelowane liczby” będą w ; podobnie w przypadku Poissona otrzymamy liczby niedyskretne. Ponadto każda dystrybucja, w której suma dystrybucji nie jest wciąż taka sama (np. Sumowanie dystrybucji nie powoduje dystrybucji) również się nie powiedzie. We wszystkich wymienionych przypadkach wytworzone liczby będą skorelowane według ale nie będą odpowiadały rozkładowi, który rozpoczęliśmy. [ 0 , 1 ] t t C.U[0,1][0,1]ttC
usεr11852 mówi Przywróć Monic
36

+1 do @ user11852 i @ jem77bfp, to są dobre odpowiedzi. Podejdę do tego z innej perspektywy, nie dlatego, że uważam, że w praktyce jest to lepsze , ale dlatego, że uważam, że jest pouczające. Oto kilka istotnych faktów, które już znamy:

  1. jest nachyleniem linii regresji, gdy zarówno X, jaki Yznormalizowane, tj. N ( 0 , 1 ) , rXYN(0,1)
  2. jest proporcją wariancji w Y wynikającą z wariancji w X , r2YX



    (również z zasad dotyczących odchyleń ):

  3. wariancja zmiennej losowej pomnożona przez stałą jest stałą kwadratową razy pierwotną wariancją:
    Var[aX]=a2Var[X]
  4. dodawane wariancje , tzn. wariancja sumy dwóch zmiennych losowych (zakładając, że są one niezależne) jest sumą dwóch wariancji:
    Var[X+ε]=Var[X]+Var[ε]

rρXN(0,1)aveYN(0,a2+ve)a2+ve=1|a| 1a=rra1r2xiei, z odpowiednią wariancją błędu , i oblicz skorelowaną zmienność pseudolosową, y i , mnożąc i dodając. veyi

Jeśli chcesz to zrobić w R, może działać następujący kod:

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

Ponownie, to, w najprostszej formie, pozwala tylko wygenerować parę skorelowanych zmiennych (może to być skalowane, ale robi się brzydko szybko) i na pewno nie jest najwygodniejszym sposobem na wykonanie zadania. W R chciałbyś użyć ? Mvrnorm w pakiecie MASS , zarówno dlatego, że jest to łatwiejsze, jak i ponieważ możesz wygenerować wiele zmiennych przy danej macierzy korelacji populacji. Niemniej jednak uważam, że warto przejść przez ten proces, aby zobaczyć, jak niektóre podstawowe zasady działają w prosty sposób.

gung - Przywróć Monikę
źródło
To zasadniczo regresyjne podejście jest szczególnie przyjemne, ponieważ pozwala wygenerować jedno losowe Y skorelowane z dowolną liczbą istniejących „predyktorów” X. Czy mam rację w takim rozumieniu?
ttnphns
Zależy to dokładnie od tego, jaki wzór korelacji między zmiennymi, które chcesz, @ttnphns. Możesz to powtarzać jeden po drugim, ale byłoby to nudne. Aby utworzyć wiele skorelowanych zmiennych z danym wzorcem, lepiej jest użyć rozkładu Cholesky'ego.
Gung - Przywróć Monikę
gung, czy wiesz, jak używać Cholesky'ego do generowania jednego skorelowanego Y (w przybliżeniu, jak w twojej metodzie) zgodnie z wektorem korelacji z kilkoma istniejącymi (nie symulowanymi) Xs?
ttnphns
@ttnphns, chcesz wygenerować pojedynczą Y w / daną korelację populacji z zestawem X, a nie zestawem zmiennych p, z których wszystkie mają wcześniej określone korelacje populacji? Prostym sposobem byłoby napisanie równania regresji w celu wygenerowania pojedynczego Y-kapelusza z X, a następnie użycie powyższej metody do wygenerowania Y jako korelacji z Y-hat. Jeśli chcesz, możesz zadać nowe pytanie.
Gung - Przywróć Monikę
1
Oto, co miałem na myśli w moim pierwszym komentarzu: ta metoda byłaby bezpośrednim rozszerzeniem tego, o czym mówisz w swojej odpowiedzi: zasadniczo metody regresji (Hat).
ttnphns
16

Ogólnie rzecz biorąc, nie jest to prosta rzecz, ale uważam, że istnieją pakiety do generowania normalnych zmiennych wielowymiarowych (przynajmniej w R, patrz mvrnormw MASSpakiecie), w których wystarczy wprowadzić macierz kowariancji i wektor średni.

(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)=ξ

Jeśli nie rozumiesz znaczenia wstawiania zmiennej jednorodnej do funkcji odwrotnego rozkładu prawdopodobieństwa, spróbuj wykonać szkic przypadku jednowymiarowego, a następnie pamiętaj, jaka jest geometryczna interpretacja funkcji odwrotnej.

jem77bfp
źródło
Sprytny pomysł! Ma prosty intuicyjny wygląd. Ale tak, wydaje się drogie obliczeniowo.
MichaelChirico
fX,Y(x,y)=fX(x)fY|X(y)
1

Jeśli jesteś gotów zrezygnować z wydajności, możesz użyć alogorytmu wyrzucającego. Jego zaletą jest to, że pozwala na wszelkiego rodzaju rozkłady (nie tylko gaussowskie).

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

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

n1n2:1n1,2N

xn1xn2

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

|Ccnew|<|Ccold|

|Cc|<ϵ

xi

Powodzenia!

F. Jatpil
źródło
xicorr(xi,yi)
xi{xi}ycorr(xi,yi)corr({xi},{yi})=(1/N)Σi=1N(xix¯)(yyy¯)
{}corr({xi},{yi})