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?
probability
correlation
conditional-probability
random-generation
Joseph Weissman
źródło
źródło
Odpowiedzi:
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 Ldo do L LT. L.
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 XL. X Y= L X
Można znaleźć zwięzłe wyjaśnienie, dlaczego tak się dzieje tutaj .
źródło
+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:
jest proporcją wariancji w Y wynikającą z wariancji w X ,r2 Y X
(również z zasad dotyczących odchyleń ):
Jeśli chcesz to zrobić w R, może działać następujący kod:
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.
źródło
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
mvrnorm
wMASS
pakiecie), w których wystarczy wprowadzić macierz kowariancji i wektor średni.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.
źródło
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).
Powodzenia!
źródło