11.01.2018

Uvod

Ako je \(Y\) slučajna veličina, poznato je da je \[F_Y(Y) \stackrel{d}{=} U \sim U[0,1],\] pa odatle i \[F_Y^{-1}(U) \stackrel{d}{=} Y,\] pa je zato standaran način generisanja brojeva iz raspodele \(F_Y\) taj da se generiše niz \(u_1, \dots u_n\) iz uniformne \([0,1]\) raspodele, pa željeni uzorak \(y_i\) dobijamo sa \[y_i = F_Y^{-1}(u_i).\]

Uvod

  • Problem koji se često pojavljuje je da ne postoji analitički oblik inverza \(F_Y^{-1}\) i njegovo izračunavanje može biti veoma vremenski zahtevno, pa je ovaj metod generisanja neupotrebljiv za iole veće uzorke, jer je za svaki element uzorka potrebno izračunati vrednost inverza.

  • Zato bismo da nadjemo način da sa manjim brojem izračunavanja inverza dobijemo metod za generisanje uzoraka.

  • Moguć način da to izvedemo je interpolacija.

Interpolacija

  • Cilj interpolacije je da aproksimiramo funkciju koju teško izračunavamo nekim polinomom, čije se vrednosti poklapaju sa vrednostima funkcije u odredjenim čvornim tačkama.

  • Mi ćemo koristiti samo interpolaciju Lagranževim polinomom, koji je oblika \[F_Y^{-1}(u) \approx \sum_{i=1}^NF_Y^{-1}(x_i)l_i(u),\] gde je \(N\) broj čvornih tačaka \(x_i\), а \(l_i(u) = \prod\limits_{j=1, j\neq i}^N\frac{u-x_j}{x_i-x_j}\).

Interpolacija

  • Iz izraza aproksimacije \[F_Y^{-1}(u) \approx \sum_{i=1}^NF_Y^{-1}(x_i)l_i(u),\quad l_i(u) = \prod\limits_{j=1, j\neq i}^N\frac{u-x_j}{x_i-x_j},\] vidimo da nam je potrebno samo \(N\) inverzija \(F_Y^{-1}(x_i)\), dok ostatak izraza zavisi samo od čvornih tačaka.

  • Kada se ova suma sredi zapravo se dobije polinom po \(x\), pa se zato može jednostavno i veoma brzo izračunavati.

  • Razvijen oblik polinoma se direktno može i vektorski izračunavati, što je od značaja kada se radi sa programskim jezicima poput R-a.

Interpolacija na \([0,1]\)

  • Uzmimo da je \(Y\sim Logistic(0,1)\) i interpolacijom generišimo uzorak. Ako su \(u_1,\dots,u_n\sim U[0,1]\), uzorak \(y_i\) pravimo sa \(y_k = \sum_{i=1}^NF_Y^{-1}(x_i)l_i(u_k)\). Ocena gustine takvog uzorka je:

Interpolacija na \([0,1]\)

Problem možemo da vidimo kada pogledamo konkretno kvalitet same interpolacije.

Interpolacija na \([0,1]\)

Pri krajevima pravimo velike greške, jer tu \(F_Y^{-1}\) naglo raste, a polinom je mnogo sporiji. Možemo da povećamo broj tačaka, ali ne dobijamo veliko poboljšanje.

Interpolacija na \([0,1]\)

  • Možemo i da dodamo par tačaka bliže krajevima intervala, da bismo ispratili rast funkcije, ali…

Uopštenje

  • Da bismo smanjili problem nestabilnosti na krajevima intervala, možda bi pomoglo da nekako razvučemo funkciju \(F_Y^{-1}(u)\) na veći domen, npr. celo \(\mathbb{R}\), da bi polinom manje morao da se adaptira ekstremnim vrednostima.

  • To možemo da postignemo nekom smenom oblika \(u=h(x)\), gde je \(h:\mathbb{R}\to[0,1]\).

  • Sada interpoliramo funkciju \(g(x) = F_Y^{-1}(h(x)) :\mathbb{R}\to\mathbb{R}\).

  • Problem: Kako biramo smenu \(h\)?

  • Da bismo koristili \(g(x)\) za generisanje slučajnih veličina, \(h(x)\) mora da ima \(U[0,1]\) raspodelu.

Uopštenje

  • Rešenje: Prirodno je da \(h(x)\) bude funkcija raspodele neke nove slučajne veličine \(X\), odakle je \(h(X)=F_X(X) \sim U[0,1].\)

  • Zato je i \[F_Y^{-1}(F_X(X)) \stackrel{d}{=} Y.\]

  • Uzorak iz \(Y\) generišemo sa \[y_i = F_Y^{-1}(F_X(\xi_i)),\] gde je \(\xi_1,\dots,\xi_n\) uzorak iz raspodele \(F_X\).

Uopštenje

  • Sada nećemo da interpoliramo funkciju \(F_Y^{-1}\), već \(F_Y^{-1}\circ F_X : \mathbb{R} \to \mathbb{R}\), pa dobijamo polinom \[g(x) := F_Y^{-1}(F_X(x)) \approx \sum_{i=1}^NF_Y^{-1}(F_X(x_i))l_i(x) =: g_N(x),\] gde su opet \(l_i(x) = \prod\limits_{j=1, j\neq i}^N\frac{x-x_j}{x_i-x_j}\), a \(x_i\) čvorne tačke.

  • Dakle, uzorak iz \(Y\) generišemo sa \[y_i = g_N(\xi_i),\] gde je \(\xi_1,\dots,\xi_n\) uzorak iz \(F_X\).

Normalno \(X\)

  • Mi ćemo se fokusirati samo na slučaj kada je \(X\sim\mathcal{N}(0,1)\). Ovaj izbor daje dobre rezultate za veliku klasu raspodela za \(Y\).

  • Ponovo ćemo pristupiti generisanju logističke raspodele. Funkcija koju aproksimiramo je sada \(g_N(x) \approx F_Y^{-1}(\Phi(x))\).

  • Uzorak generišemo tako što generišemo standardan normalan uzorak \(\xi_1,\dots,\xi_n\) i primenimo \(y_i = g_N(\xi_i)\).

  • Na sledećim slajdovima vidimo rezultate aproksimacije.

Normalno \(X\)

Ovaj put smo koristili samo 5 čvornih tačaka!

Normalno \(X\)

Razlike se javljaju oko -5 i 5, ali nisu toliko ekstremne kao kod uniformne.

KS test nam potvrdjuje dobru ocenu (za uzorak obima 100 000):

set.seed(216)
ks.test(pol_norm(rnorm(1e5)), plogis)
## 
##  One-sample Kolmogorov-Smirnov test
## 
## data:  pol_norm(rnorm(1e+05))
## D = 0.0026158, p-value = 0.5006
## alternative hypothesis: two-sided

Normalno \(X\)

… i gustina izgleda jako dobro

Normalno \(X\)

Ovako bi izgledalo sa 7 tačaka…

Normalno \(X\)

Razlike sad gotovo i da nema.

KS test, očekivano, opet prolazi.

set.seed(216)
ks.test(pol_norm(rnorm(1e5)), plogis)
## 
##  One-sample Kolmogorov-Smirnov test
## 
## data:  pol_norm(rnorm(1e+05))
## D = 0.0016458, p-value = 0.9493
## alternative hypothesis: two-sided

\(L^2\) greška i optimalne tačke

  • U prethodnim primerima, čvorne tačke polinoma koje smo uzimali su bile optimalne u nekom smislu. Proći ćemo ukratko motivaciju izbora tačaka.

  • Cilj nam je da smanjimo \(L^2\) grešku interpolacije, koja je oblika \[E\left[(g(X) -g_N(X))^2\right]=\int_{-\infty}^{\infty}\left(g(x) - g_N(x)\right)^2f_X(x)\,dx.\]
  • Ovo je zapravo integracija \((g(X) -g_N(X))^2\), sa težinskom funkcijom \(f_X(x)\).

  • Zato možemo primeniti znanje iz numeričke matematike…

\(L^2\) greška i optimalne tačke

  • Ideja je da ovaj integral možemo da predstavimo pomoću Gausove kvadraturne formule \[\int_{-\infty}^{\infty}\left(g(x) - g_N(x)\right)^2f_X(x)\,dx =\\ \sum_{i=1}^N(g(x_i) -g_N(x_i))^2w_i + \varepsilon_N.\]
  • Stoga možemo da koristimo i teoriju vezanu za Gausove kvadraturne formule.

  • Pokazuje se da optimalne tačke \(x_i\) i težine \(w_i\) možemo izračunati koristeći samo prvih \(2N\) momenata raspodele \(X\).

\(L^2\) greška i optimalne tačke

  • Kako je \(g_N\) interpolacioni polinom za \(g\), u čvornim tačkama oni se poklapaju pa je \[\sum_{i=1}^N(g(x_i) -g_N(x_i))^2w_i + \varepsilon_N = \varepsilon_N.\]

  • Stoga se \(L^2\) greška interpolacije svodi samo na grešku integracije, koju smo smanjili izborom optimalnih tačaka \(x_i\) i težina \(w_i\).

\(L^2\) greška i optimalne tačke

Za \(X\sim\mathcal{N}(0,1)\), izvodi se da je ova greška jednaka:

\[\varepsilon_N = \frac{N!\sqrt\pi}{2^N}\frac{\Psi^{(2N)}(\hat\xi)}{2N},\] gde je \(\Psi(x) = (g(x)-g_N(x))^2 = \left(\frac1{N!}\left.\frac{d^Ng(x)}{dx^N}\right|_{x=\hat\xi}\prod_{i=1}^N(x-x_i)\right)^2\) kvadrat standardne greške Lagranževe interpolacije.

Za dovoljno glatke \(\Psi\), greška teži nuli, kad \(N\to\infty\).

Por brzih primera

  • Pokrenućemo u nastavku još nekoliko primera generisanja slučajnih veličina pomoću SCMC metode.

  • Cilj ovih primera je da demonstriraju brzinu koja se dobija SCMC metodom.
    Zato su prikazani samo rezultati merenja vremena izvršavanja.

  • Generisanje vršimo pomoću paketa scmc, koji razvijamo, a razvojna verzija se može instalirati sa

    devtools::install_github("blaza/scmc")
  • Odabir broja čvorova je takav da ks.test potvrdi da je raspodela tačna.

Primer \(\Gamma(5, 2)\) raspodele

library(scmc)
scmc_gamma <- univariate_sampler(function(p) qgamma(p, 5, 2),
                                 optimal_points(5, norm_moment_fun))
scmc_gamma_c <- univariate_sampler(function(p) qgamma(p, 5, 2),
                                   optimal_points(5, norm_moment_fun),
                                   compile_c = TRUE)
microbenchmark(rnorm = rnorm(1e5), scmc = abs(scmc_gamma(1e5)),
               scmc_C = abs(scmc_gamma_c(1e5)), 
               rgamma = rgamma(1e5, 5, 2))
## Unit: milliseconds
##    expr      min       lq     mean   median       uq       max neval
##   rnorm 16.62757 16.71416 18.52745 16.78947 17.96909 133.03801   100
##    scmc 18.98969 19.31079 20.46864 20.09106 20.78538  24.35740   100
##  scmc_C 17.44855 17.61641 20.12920 18.54073 20.68410 131.98450   100
##  rgamma 20.68688 20.95757 21.72544 21.18082 22.12453  25.28315   100

Primer \(\chi_{4}^2(1)\) raspodele

library(scmc)
scmc_chsq <- univariate_sampler(function(p) qchisq(p, 4, 1),
                                optimal_points(9, norm_moment_fun))
scmc_chsq_c <- univariate_sampler(function(p) qchisq(p, 4, 1),
                                  optimal_points(9, norm_moment_fun),
                                  compile_c = TRUE)
microbenchmark(rnorm = rnorm(1e5), scmc = abs(scmc_chsq(1e5)),
               scmc_C = abs(scmc_chsq_c(1e5)), 
               rchisq = rchisq(1e5, 4, 1))
## Unit: milliseconds
##    expr      min       lq     mean   median       uq       max neval
##   rnorm 16.51811 16.61855 17.25577 16.72489 17.44646  20.40210   100
##    scmc 21.31185 21.72010 23.79026 22.21083 23.14901 140.73569   100
##  scmc_C 17.68671 18.01011 19.21388 18.96561 20.94715  22.51759   100
##  rchisq 43.90117 44.19067 45.02708 44.46970 45.50348  48.00655   100

Primer \(t_4\) raspodele

library(scmc)
scmc_t <- univariate_sampler(function(p) qt(p, df = 4),
                             optimal_points(11, norm_moment_fun))
scmc_t_c <- univariate_sampler(function(p) qt(p, df = 4),
                               optimal_points(11, norm_moment_fun),
                               compile_c = TRUE)
microbenchmark(rnorm = rnorm(1e5), scmc = scmc_t(1e5),
               scmc_C = scmc_t_c(1e5), 
               rt = rt(1e5, df = 4))
## Unit: milliseconds
##    expr      min       lq     mean   median       uq       max neval
##   rnorm 16.50086 16.56965 17.05532 16.61432 16.85617  19.92335   100
##    scmc 22.31638 22.79356 24.21375 23.62967 25.53849  47.26307   100
##  scmc_C 17.59987 18.04641 20.30147 19.08060 19.44263 136.05575   100
##      rt 40.76989 41.01058 41.67480 41.17092 41.64953  44.60718   100

Uslovne raspodele

  • Često može da se desi, na primer pri generisanju višedimenzionih raspodela, da nije dovoljno da generišemo samo neku slučajnu veličinu \(Z\), već uslovnu raspodelu \(Z|Y\), gde je \(Y\) neka druga slučajna veličina.

  • Pretpostavimo da znamo raspodelu \(Y\), pa možemo da je generišemo, npr. SCMC metodom, kao i da znamo raspodelu \(Z|Y=y\).

  • Odatle možemo da pristupimo generisanju \(Z\) tako što prvo generišemo uzorak iz \(Y\), pa za svako \(y_i\) generišemo odgovarajuće \(z_i\) iz raspodele \(Z|Y=y_i\).

  • Koristeći SCMC, za \(\xi_i\sim\mathcal{N}(0,1)\), uzorak je \[z_i = F_{Z|Y=y_i}^{-1}(\Phi(\xi_i)).\]

Višedimenziona interpolacija

  • Primetimo da, ako bismo interpolirali \(F_{Z|Y=y_i}^{-1}(\Phi(\xi_i))\), morali bismo da konstruišemo zaseban polinom za svako \(y_i\), što je potpuno neupotrebljivo.

  • To možemo da izbegnemo koristeći dvodimenzionu Lagranževu interpolaciju.

  • Posmatramo funkciju \(g(x, y) := F_{Z|Y=y}^{-1}(\Phi(x))\), i nju interpoliramo:

  • \[g(x, y) \approx \sum_{i=1}^{N_X}\sum_{j=1}^{N_Y}F_{Z|Y=y_j}^{-1}(\Phi(x_i))l_Y^{(j)}(y)l_X^{(i)}(x) =: g_N(x,y),\] gde su \(l_X^{(i)}(x)=\prod\limits_{j=1, j\neq i}^{N_X}\frac{x-x_j}{x_i-x_j}\) i \(l_Y^{(j)}(y)=\prod\limits_{i=1, j\neq i}^{N_Y}\frac{y-y_i}{y_j-y_i}\), a \(y_1,\dots, y_{N_Y}\) čvorne tačke za interpolaciju za promenljivu \(y\).

Višedimenziona interpolacija

  • Ovime smo pokrili ceo domen \((x,y)\) dvodimenzionim polinomom, pa \(Z\) sada generišemo na isti način kako smo i zamislili, samo što umesto \(F_{Z|Y=y_i}^{-1}(\Phi(\xi_i))\) koristimo aproksimaciju koju smo naveli, pa dobijamo \[z_i = g_N(\xi_i, y_i) \approx F_{Z|Y=y_i}^{-1}(\Phi(\xi_i)).\]
  • Generisanje se sada svodi na generisanje \(\xi_i\), \(y_i\) i evaluaciju dvodimenzionog polinoma \(g_n(x,y)\), što se sve radi vrlo brzo.

  • Optimalne tačke za \(Y\) možemo računati na osnovu uzoračkih momenata generisanog uzorka \(y_i\), dok za \(X\) koristimo isti metod kao i za jednodimenzione raspodele.

  • Ovaj postupak se može lako uopštiti na veličine \(Z|X_1,\dots,X_d\), gde samo koristimo \((d+1)\)-dimenzioni polinom.

Višedimenzione raspodele

  • Generisanje uslovnih raspodela je od velike koristi za generisanje višedimenzionih raspodela.

  • Recimo da hoćemo da generišemo vektor \((X, Y)\).
    To možemo da uradimo u dva koraka:
    1. Generišemo uzorak \(x_1,\dots,x_n\) iz raspodele \(X\)
    2. Generišemo uzorak \(y_1,\dots,y_n\) iz \(Y\) koristeći uslovne raspodele \(Y|X=x_i\)
  • Vidimo da nam je za generisanje potrebno znanje marginalne raspodele \(X\) i uslovne raspodele \(Y|X=x_i\).

  • Svaki korak se može odraditi SCMC metodom

Višedimenzione raspodele

  • Postupak se lako uopštava na više od dve dimenzije.

  • Kad generišemo \((X_1,\dots,X_d)\), imamo \(d\) koraka:
    • Generišemo \(X_1\)
    • Generišemo \(X_2|X_1\)
    • Generišemo \(X_3|X_2, X_1\)
      \(\vdots\)
    • Generišemo \(X_d|X_{d-1},\dots,X_2, X_1\)
  • U svakom koraku \(k\) imamo \(k\)-dimenzioni interpolacioni polinom.

Primer višedimenzione normalne raspodele

  • Neka je \((X_1,X_2) \sim \mathcal{N}\left(\begin{pmatrix}1 \\ 2\end{pmatrix}, \begin{pmatrix}1 & 0.3\\ 0.3 & 1\end{pmatrix}\right)\).

  • Znamo da je onda \(X_1 \sim \mathcal{N}(1, 1)\).

  • Takodje, \(X_2|X_1=x \sim \mathcal{N}\left(\mu_2 + \frac{\sigma_2}{\sigma_1} \rho (x-\mu_1), (1-\rho^2)\sigma_2^2\right)\),

    odnosno \(X_2|X_1=x \sim \mathcal{N}\left(1.7 + 0.3x, 0.91\right)\)

  • Imamo sve što je potrebno za generisanje.

Primer višedimenzione normalne raspodele

library(scmc)
gen_x1 <- univariate_sampler(function(p) qnorm(p, mean = 1, sd = 1),
                             optimal_points(3, norm_moment_fun))
gen_x2 <- conditional_sampler(function(x, p) qnorm(p, mean = 1.7 + 0.3*x, sd = 0.91),
                              list(optimal_points(3, sample = gen_x1(1e5)),
                                   optimal_points(3, norm_moment_fun)))

scmc_rmvnorm <- function(n) {
  x1 <- gen_x1(n)
  x2 <- gen_x2(n, list(x1))
  cbind(x1,x2)
}

Primer višedimenzione normalne raspodele

Uporedimo za početak brzinu sa paketom mvtnorm

microbenchmark(mvtnorm = mvtnorm::rmvnorm(1e5, mean = c(1, 2),
                                sigma = matrix(c(1,0.3,0.3,1), ncol=2)),
               scmc = scmc_rmvnorm(1e5))
## Unit: milliseconds
##     expr      min       lq     mean   median       uq      max neval
##  mvtnorm 41.03584 44.43790 63.43815 46.06311 48.33447 175.9364   100
##     scmc 39.93450 42.99014 52.77934 43.39189 44.65853 163.0170   100

Primer višedimenzione normalne raspodele

Ocena gustine raspodele jednog uzorka generisanog pomoću SCMC…

Primer višedimenzione normalne raspodele

Uradimo još i jedan statistički test da potvrdimo da je raspodela korektna…

library(ks)
kde.test(scmc_rmvnorm(1e4), mvtnorm::rmvnorm(1e4, mean = c(1, 2),
                                sigma = matrix(c(1,0.3,0.3,1), ncol=2)))$pvalue
## [1] 0.6613652

P-vrednost je velika, stoga ne odbacujemo pretpostavku o jednakosti raspodele našeg uzorka i onog generisanog sa mvtnorm paketom.