Prevzorkovacie metódy sú nenahraditeľným nástrojom modernej štatistiky.
Pomocou jednoduchého triku dokážu získať ďalšie informácie o odhadovanom modeli.
Trik spočíva v aproximácii náhodného výberu zo základného súboru pomocou náhodného výberu z trénovacej vzorky údajov.
Hoci sú výpočtovo náročnejšie ako tradičné metódy (ktoré predpokladajú asymptotické vlastnosti zložiek modelu), pretože vyžadujú mnohonásobné opakovanie odhadu, tak vďaka pokroku vo výkone výpočtovej techniky nie je táto nevýhoda už veľmi obmedzujúca.
Preberieme si dve najčastejšie používané metódy resamplingu:
krížovú validáciu, ktorou sa dá napr. odhadnúť testovacia chyba (vyhodnotenie modelu, angl. model assessment) alebo zvoliť vhodný stupeň flexibility (výber modelu, angl. model selection), a
bootstrap, ktorou sa okrem ďalších využití určuje miera presnosti odhadu parametrov modelu.
3.2 Krížová validácia
Vieme už, že testovacia chyba vyjadruje presnosť predpovede odozvy pre nové pozorovania prediktorov (teda pre tie, ktoré neboli použité na trénovanie).
Za model sa dá zaručiť, len ak má nízku testovaciu chybu.
Testovacia chyba sa dá odhadnúť pomocou na-to-vyhradenej testovacej vzorky. Tú však často nemáme k dispozícii, pretože všetky dostupné pozorovania sa použili na tréning modelu a nové neboli zozbierané. Zároveň odhad trénovacej chyby je nespoľahlivou náhradou, pretože testovaciu chybu výrazne podhodnocuje.
Sú však prístupy, ako testovaciu chybu odhadnúť z trénovacej vzorky.
Jeden z nich na to ide matematickou korekciou trénovacej chyby. Budeme sa mu venovať inde – v rámci metód výberu prediktorov.
Druhý pred odhadom modelu odčlení zo súboru pozorovaní časť, ktorú následne použije ako testovaciu vzorku. To je aj prípad krížovej validácie (cross-validation, CV) a dvoch jej metód, ktoré preberieme nižšie, po predstavení jednoduchšej metódy.
Krížová validáciá sa spravidla používa na jeden z nasledujúcich cieľov:
odhad hodnoty testovacej chyby (na vyhodnotenie kvality modelu),
nájdenie minima testovacej chyby ako funkcie flexibility modelu (pre výber vhodného kandidáta spomedzi modelov jednej triedy).
3.2.1 Metóda jednej validačnej sady (validation set)
V najjednoduchšej z metód druhého prístupu sa dataset náhodne rozdelí na trénovaciu a validačnú vzorku (iba raz).
Predikcie modelu natrénovanom na prvej vzorke sa porovnajú s druhou a vypočíta sa stredná chyba. V prípade regresnej úlohy je to najčastejšie MSE.
Príklad (autá)
V kapitole o lineárnom regresnom modeli sme použili F-test na posúdenie predikčnej schopnosti polynomickej regresie druhého či dokonca až piateho stupňa. Tento prístup využíval iba trénovaciu vzorku a polynóm 5 stupňa ešte označil za užitočný. Z interpretačného hľadiska však máme problém už aj s kvadratickou funkciou.
Teraz, keď je k dispozícii validačná vzorka, porovnáme modely z hľadiska odhadu testovacej MSE.
Na obrázku vľavo je zobrazená MSE pre 10 modelov (s rôznymi stupňami polynomickej funkcie) odhadnutých na rovnakej trénovacej vzorke a vyhodnotených na rovnakej validačnej vzorke. Je vidieť približný tvar písmena U a minimum niekde v bode 6 alebo 7, ale priebeh dáva tušiť veľkú variabilitu v odhade MSE.
Aby sme získali predstavu o rozsahu neistoty určenia MSE touto metódou, skúsime náhodné rozdelenie súboru údajov do trénovacej a validačnej vzorky zopakovať 12-krát. Výsledok je na obrázku vpravo. Jediné, čo sa z neho dá vytušiť, je to, že lineárny model má systematicky najvyššiu chybu.
Kód
# Function to # 1. split the data proportionaly into training and evaluation sample, # 2. fit the linear model given by formula to training set,# 3. calculate MSE based on evaluation set.# in: formula - formula defining relationship among variables,# data - data frame to split# proportion - numeric value in [0,1] interval, proportion of training sample to the whole set# out: numeric value of MSEmse_validset_lm <-function(formula, data, proportion =1/2, seed =sample(1000,1)) { n <-nrow(data)set.seed(seed) ind <-1:n %in%sample(n, size = n*proportion) train <- data[ind,] valid <- data[!ind,] fit <-lm(formula, train) yname <-names(fit$model)[[1]] RSS <-sum((valid[[yname]] -predict(fit, newdata = valid))^2) df <-nrow(valid) -length(fit$coefficients) RSS / df}# 1 split, 10 polynomials of certain degreestibble::tibble(degree =1:10,MSE =sapply(degree, function(x) mse_validset_lm(mpg ~poly(horsepower, x), ISLR2::Auto,seed =2))) |>ggplot() +aes(x = degree, y = MSE) +geom_line() +geom_point() +scale_x_continuous(n.breaks =10) +ylim(16, 26.5)# 12 splits, 10 modelsset.seed(1234)replicate(n =12, local({ seed <-sample(1000, 1)sapply(1:10, function(x) mse_validset_lm(mpg ~poly(horsepower, x), ISLR2::Auto, seed = seed))})) |>t() |>as.data.frame() |>setNames(1:10) |> dplyr::mutate(replication =1:dplyr::n()) |> tidyr::pivot_longer(-replication, names_to ="degree", values_to ="MSE",names_transform = forcats::as_factor) |>ggplot() +aes(x = degree, y = MSE, color = replication, group = replication) +geom_line(show.legend =FALSE) +ylim(16, 26.5)
Metóda jednej validačnej sady je jednoduchá (koncepčne aj implementačne), ale má dve nevýhody:
Odhad testovacej chyby má veľký rozptyl, t.j. veľmi závisí od náhody pri rozdelení súboru na dve vzorky.
Iba časť údajov sa využije na trénovanie modelu. Ak je však trénovaný na menšom počte bodov, validačná chyba má tendenciu nadhodnocovať testovaciu chybu, ktorú by mal model trénovaný na celom datasete.
Tieto nevýhody sa snažia eliminovať metódy krížovej validácie (pomocou aritmetického priemeru).
3.2.2 Vynechanie jedného pozorovania (leave-one-out CV )
V metóde, pre ktorú sa zaužívala skratka LOOCV, sa vytvorí n rôznych dvojíc vzoriek, pričom v každej tvorí validačnú vzorku jediné pozorovanie a trénovacia vzorka obsahuje zvyšných n-1 pozorovaní. (To znamená, že v i-tej trénovacej vzorke je vynechané i-te pozorovanie.)
Pre každú z n dvojíc vzoriek sa natrénuje model, vypočíta predikcia (v jedinom bode) a z nej MSE,
MSE_i = (y_i-\hat y_i)^2.
Jednotlivé MSE_i sú síce vďaka vylúčeniu i-teho pozorovania z trénovacej vzorky približne nevychýleným odhadom, no keďže sú vypočítané z jedinej hodnoty, majú veľmi veľký rozptyl.
Variabilitu takýchto MSE znížime priemerom. Odhad testovacej chyby bude mať tvar
\overline{MSE}_{(n)} = \frac1n\sum_{i=1}^n MSE_i
Oproti metóde jednej validačnej sady má LOOCV okrem nižšieho rozptylu aj ďalšie výhody:
menšia vychýlenosť (na trénovanie sú zakaždým použité takmer všetky pozorovania, takže skutočnú chybu až tak veľmi nenadhodnocuje),
stálosť výsledku (pretože delenie na trénovaciu a validačnú vzorku už nie je náhodné).
Naopak nevýhodou LOOCV je výpočtová náročnosť, pretože model musí byť odhadnutý až n-krát.
V prípade lineárneho modelu však existuje jednoduchá skratka k výsledku,
\overline{MSE}_{(n)} = \frac1n\sum_{i=1}^n \left(\frac{y_i-\hat y_i}{1-h_i}\right)^2
pri ktorej stačí urobiť jediný odhad modelu a to na celej vzorke. Z neho sú vypočítané stredné hodnoty \hat y_i a diagonálne prvky h_i matice váhových koeficientov (hat matrix) \mathbf{H} vyjadrujúce relatívnu veľkosť pákového efektu. Rezíduá bodov s vysokým pákovým efektom sú tak dostatočne nafúknuté, aby vzťah mohol platiť.
Príklad (autá)
Príklad z predošlej časti zopakujeme pre LOOCV metódu.
Súbor údajov Auto obsahuje záznamy o 392 autách, a bez použitia efektívnejšej verzie pre lineárny model by výpočet MSE pre všetkých 10 regresných modelov trval približne 8s (na CPU z roku 2020).
Kód
# (General version) # Function that for every observation from data repeats the following steps # 1. fit the linear model given by formula to training set, # where the one particular observation is ommited,# 2. calculate MSE based on prediction for the ommited observation,# and calculates average MSE.# in: formula - formula defining relationship among variables,# data - data frame of observations# out: numeric value of MSEmse_loocv_lm <-function(formula, data) { n <-nrow(data) y <- formula |> _[[2]] |>as.character() |>getElement(data, name = _) df <- formula |>terms() |>attr("term.labels") |>length() |> (`+`)(1) MSE <-sapply(1:n, function(i) {lm(formula, data[-i,]) |>predict(newdata = data[i,]) |> (`-`)(y[i]) |> (`^`)(2) })mean(MSE)}# (Effective version)# Function, that implements the effective version of LOOCV, valid for linear models.mse_loocv_lm <-function(formula, data) { n <-nrow(data) fit <-lm(formula, data) eps <-residuals(fit) h <-hatvalues(fit)mean((eps/(1-h))^2)}# repeat for 10 models# system.time( dat_mse <- tibble::tibble(degree =1:10,MSE =sapply(degree, function(x) mse_loocv_lm(mpg ~poly(horsepower, x), ISLR2::Auto)) )# ) |> _["elapsed"] |> round(1) |> cat("time: ", a = _, "s")# displaydat_mse |>ggplot() +aes(x = degree, y = MSE) +geom_line() +geom_point() +scale_x_continuous(n.breaks =10) +ylim(16, 26.5)# built-in implementation of the general version: # glm(mpg ~ poly(horsepower, 1), data = ISLR2::Auto) |> # boot::cv.glm(data = ISLR2::Auto) |> # _$delta[1]
3.2.3 k-násobná (k-fold CV)
Videli sme, že metóda jednej validačnej sady
vedie k nadhodnoteným stredným chybám (high bias), pretože model je natrénovaný iba na polovici pozorovaní.
Zároveň hodnoty veľmi fluktuujú s náhodným výberom trénovacej vzorky, pretože MSE nie je spresnené žiadnym priemerovaním.
Ten druhý problém by sčasti riešilo vyhodnotenie (validácia) MSE do kríža, čiže druhá chyba MSE by sa vypočítala zamenením rolí trénovacej a validačnej vzorky, a potom by sa obe MSE spriemerovali.
Na prvý i druhý problém odpovedá metóda LOOCV, ktorá model zakaždým odhaduje z takmer celej sady pozorovaní, takže odhad MSE je takmer nevychýlený. Avšak v dôsledku vysokého prekrytu trénovacích vzoriek sú jednotlivé hodnoty MSE veľmi korelované, takže rozptyl strednej MSE je vysoký (high variance).
Kompromisné riešenie problému vysokého vychýlenia odhadu MSE na jednej strane a vysokého rozptylu na druhej strane (bias-variance trade-off) ponúka metóda k-násobnej krížovej validácie (k-fold CV).
Jej princíp spočíva v náhodnom rozdelení súboru pozorovaní na k vzoriek (skupín, folds) približne rovnakej veľkosti. Následne v j tom kroku cyklu (z celkového počtu k) sa j-ta vzorka označí za validačnú a všetky zvyšné spolu za trénovaciu, odhadne sa model, vypočítajú predikcie a chyba MSE_j. Výsledkom je priemer z k odhadov MSE,
\overline{MSE}_{(k)} = \frac1k\sum_{j=1}^k MSE_j
Je zjavné, že voľba k=2 vedie k priamemu rozšíreniu metódy jednej validačnej sady na validáciu do kríža, zatiaľčo na opačnom konci spektra je špeciálnym prípadom metóda LOOCV, ak k=n.
Presné určenie hodnoty k nie je nijak zásadné, štandardne sa zvykne voliť k=5 alebo k=10. Výhoda oproti LOOCV je nielen v znížení rozptylu, ale aj menšej výpočtovej náročnosti. Navyše pri tomto počte skupín sa výpočet dá efektívne paralelizovať a tým (na viac-vláknových procesoroch) ešte výraznejšie zredukovať výpočtový čas.
Príklad (autá)
Príklad z predošlých častí zopakujeme pre k-násobnú CV.
Na obrázku vľavo je jeden odhad MSE pre 10 lineárnych modelov s rôznym stupňom polynomickej funkcie a k=5. Sú veľmi podobné odhadom pomocou LOOCV.
Na obrázku vpravo je výpočet zopakovaný 12-krát. Výsledky sa líšia v dôsledku náhody vo výbere pozorovaní do jednotlivých skupín, no ich rozptyl je podstatne menší než v prípade metódy jednej validačnej sady.
Kód
# Function that uses boot::cv.glm to split observations into K folds and repeats the following steps # 1. fit the linear model given by formula to training set, # where one particular fold is ommited,# 2. calculate MSE based on predictions for the ommited fold,# and calculates average MSE.# in: formula - formula defining relationship among variables,# data - data frame of observations# K - integer, number of folds# out: numeric value of average MSEmse_kfold_lm <-function(formula, data, K =5) {glm(formula, data = data) |> boot::cv.glm(data = data, K = K) |> _$delta[1]}# single runset.seed(1)tibble::tibble(degree =1:10,MSE =sapply(degree, function(x) mse_kfold_lm(mpg ~poly(horsepower, x), data = ISLR2::Auto) ) ) |>ggplot() +aes(x = degree, y = MSE) +geom_line() +geom_point() +scale_x_continuous(n.breaks =10) +ylim(16, 26.5)# 12-times repeatreplicate(n =12, sapply(1:10, function(x) mse_kfold_lm(mpg ~poly(horsepower, x), ISLR2::Auto) )) |>t() |>as.data.frame() |>setNames(1:10) |> dplyr::mutate(replication =1:dplyr::n()) |> tidyr::pivot_longer(-replication, names_to ="degree", values_to ="MSE",names_transform = forcats::as_factor) |>ggplot() +aes(x = degree, y = MSE, color = replication, group = replication) +geom_line(show.legend =FALSE) +ylim(16, 26.5)
3.3 Bootstrap
Bootstrap metóda je nesmierne užitočný štatistický nástroj, ktorý umožňuje kvantifikovať neistotu štatistického odhadu.
Napríklad v lineárnej regresii sa dá použiť na odhad štandardných chýb parametrov modelu. (To sa síce nemusí zdať veľmi užitočné, keďže poznáme explicitné matematické vzťahy na ich výpočet, tie však platia iba vtedy, ak sú splnené určité predpoklady modelu.)
Sila bootsrap spočíva v tom, že sa dá aplikovať na široké spektrum štatistických metód, a to aj takých, ktoré neumožňujú jednoduché vyjadrenie miery variability (a tá potom nie je ani súčasťou výstupu štatistického softvéru).
Názov pochádza z frázy “pull oneself up by one’s bootstraps” použitej v príbehu o dobrodružstvách baróna Prášila (Adventures of Baron Munchausen):
The Baron had fallen to the bottom of a deep lake. Just when it looked like all was lost, he thought to pick himself up by his own bootstraps.
Aj princíp metódy bootstrap môže vyvolávať pochybnosti, ale – na rozdiel od barónovho spôsobu záchrany – v skutočnosti aj funguje.
3.3.1 Princíp
Označme naše pozorovania (jednu realizáciu náhodného výberu zo základného súboru) ako Z a štatistiku, ktorú potrebujeme určiť (napr. parameter modelu alebo strednú hodnotu odozvy), označme symbolom \alpha.
Na základe jednej sady údajov dokážeme odhadnúť iba strednú hodnotu \hat\alpha.
Na určenie variability odhadu \alpha potrebujeme poznať ďalšie informácie o jeho rozdelení pravdepodobnosti. Tu máme dve možnosti:
budeme veriť predpokladu o tomto rozdelení (napr. že je gaussovské) a použijeme vzťah pre výpočet štandardnej chyby platný za podmienky tohoto predpokladu,
získame ďalšie súbory pozorovaní Z^1,Z^2,\ldots,Z^N, pomocou nich odhadneme \hat\alpha^1, \hat\alpha^2, \ldots, \hat\alpha^N a z nich štandardnú chybu SE(\hat\alpha).
Prvá možnosť predstavuje asymptotický prístup, ktorý sa v štatistike aplikuje oddávna, v mnohých prípadoch napr. využíva centrálnu limitnú vetu na zaistenie predpokladu normality pri väčšej vzorke.
Druhá možnosť je v praxi problematická, pretože získanie nových pozorovaní býva ekonomicky nákladné, niekedy aj nemožné. Preto sa využíva iba v simulačných štúdiách, kedy je známe rozdelenie (alebo základný súbor), z ktorého boli pozorovania získané. Väčšinou je to nejaký model.
Čo však robiť v reálnej štúdii, kedy nové pozorovania nemáme a o splnení predpokladov pochybujeme alebo ich na odhad presnosti nevieme použiť?
Riešením je základný súbor aproximovať existujúcim súborom pozorovaníZ a náhodným výberom (s opakovaním) získať rovnako veľké vzorky Z^{*1}, Z^{*1}, \ldots, Z^{*B}. Z nich sa vypočítajú odhady \hat\alpha^{*1}, \hat\alpha^{*2}, \ldots, \hat\alpha^{*B}, ktoré tvoria podklad vzorkovacieho rozdelenia (sampling distribution) odhadu \hat\alpha.
Ilustrácia (bootstrap)
Nasledujúci obrázok ilustruje bootstrap metódu pre n=3.
Pomocou vzorkovacieho rozdelenia vieme určiť rôzne vlastnosti rozdelenia odhadu \hat\alpha, ako napr.
štandardnú odchýlku SE(\hat\alpha)=\sqrt{\frac1{B-1}\sum_{i=1}^B(\hat\alpha^{*i}-\bar{\hat\alpha^*})^2}, kde \bar{\hat\alpha^*}=\frac1B\sum_{i=1}^B\hat\alpha^{*i},
95% interval spoľahlivosti [\hat\alpha_{(2.5\%)}^*, \hat\alpha_{(97.5\%)}^*], kde \hat\alpha_{(p\%)}^* predstavuje p-ty percentil (bootstrap percentile).
V prípade dát s komplexnejšou štruktúrou, ako sú napr. časové rady, je nutné postup prispôsobiť. V prípade stacionárnych časových radov napr. tak, že sa dáta rozdelia do blokov a náhodný výber (s opakovaním) sa vykoná na nich namiesto na jednotlivých pozorovaniach.
3.3.2 Príklady
Ilustrácia (investovanie)
Predstavme si, že chceme investovať určitú jednotkovú sumu peňazí do dvoch finančných aktív, z ktorých jedno dáva výnos (return) X a druhé Y. Oboje sú náhodné premenné s normálnym rozdelením a mierne spolu korelujú.
Do aktíva s výnosom X investujeme čiastku \alpha, do Y zas čiastku 1-\alpha.
Pretože s výnosmi je spojená premenlivosť, chceme zvoliť \alpha tak, aby sa minimalizovalo celkové riziko (t.j. rozptyl) našej investície.
Deriváciou celkového rozptylu
var(\alpha X + (1-\alpha)Y) = \alpha^2 \sigma_X^2 + (1-\alpha)^2 \sigma_Y^2 + \alpha(1-\alpha)\sigma_{XY}
podľa \alpha, kde sme označili \sigma_X^2=var(X) a \sigma_{XY}=cov(X,Y), a položením derivácie do nuly dostaneme vzťah
\alpha = \frac{\sigma_Y^2-\sigma_{XY}}{\sigma_X^2+\sigma_Y^2-2\sigma_{XY}}
Rozptyly a kovariancia sú v praxi neznáme, dajú sa však odhadnúť z minulých pozorovaní výnosov. Z odhadov \hat\sigma_X^2, \hat\sigma_Y^2, \hat\sigma_{XY} dostaneme i odhad \hat\alpha.
Keďže v našej ilustrácii poznáme (združené) rozdelenie X a Y, tisíckrát vygenerujeme súbor 100 párov hodnôt výnosov a pre každý súbor vypočítame odhad hodnoty podielu \alpha.
Potom však jeden z týchto súborov považujeme za súbor pozorovaní a z neho pomocou bootstrap metódy s počtom prevzorkovaní B=1000 vypočítame hodnoty \hat\alpha^*.
Na obrázkoch je zobrazené samplovacie rozdelenie náhodnej premennej \alpha, vľavo pomocou náhodných výberov zo základného súboru, vpravo pomocou náhodných výberov z jedného takého súboru. Vidno, že hoci odhad strednej hodnoty, \hat\alpha (modrá), sa nachádza “iba viac-menej blízko” skutočnej strednej hodnoty \alpha (červená), rozptyl bootstrap vzorky je veľmi podobný tomu zo simulácií.
Kód
n <-100# Distribution of alpha based on samples from true population# ----------------------------------------------# number of data points and data setsN <-1000# Function to construct bivariate covariance matrix from standard deviation 'sd' and correlation coefficient 'cor'.make_cov_matrix <-function(sd =c(1,sqrt(1.25)), cor =0.5/prod(sd)) {diag(sd) %*%cbind(c(1,cor), c(cor,1)) %*%diag(sd)}# Function to calculate ratio alpha from bivariate covariance matrix.make_alpha <-function(cov) { (cov[2,2] - cov[1,2]) / (cov[1,1] + cov[2,2] -2*cov[1,2])}# Function to generaten pairs from 2D normal distribution with mean vector 'mu' and covariance matrix 'cov'. simulate_data <-function(n, mu =c(0,0), cov =make_cov_matrix()) { X1 <-rnorm(n) X2 <-rnorm(n) cor <- cov[1,2]/sqrt(cov[1,1]*cov[2,2]) X3 <- cor * X1 +sqrt(1-cor^2) * X2data.frame(X = mu[1] +sqrt(cov[1,1]) * X1, Y = mu[2] +sqrt(cov[2,2]) * X3)# alternatively: mvtnorm::rmvnorm(n, mu = mu, sigma = cov)}# simulate values of alphasim_alpha <-make_cov_matrix() |># theoretical covariancesimulate_data(n = n, cov = _) |># generate random datacov() |># estimate covariancemake_alpha() |># calculate alphareplicate(n = N) # repeat# display hsitogram with true value of alpha indicatedsim_alpha |>data.frame(alpha = _) |>ggplot() +aes(x = alpha) +geom_histogram(bins =20, color ="white") +geom_vline(xintercept =make_cov_matrix() |>make_alpha(),color =2, linewidth =1) +ggtitle("Simulation")# Distribution of alpha based on bootstrap samples# ----------------------------------------------B <-1000# single data set of observationsset.seed(1)dat <-simulate_data(n =100)# Function to make 'n' random drawings from 'data'.resample_data <-function(data, n) { ind <-sample(nrow(data), size = n, replace =TRUE) data[ind,]}# make sampling distribution of alphaboot_alpha <- dat |>resample_data(n =100) |>cov() |>make_alpha() |>replicate(n = B)# show sampling distribution of alphaboot_alpha |>data.frame(alpha = _) |>ggplot() +aes(x = alpha) +geom_histogram(bins =20, color ="white") +geom_vline(xintercept =make_cov_matrix() |>make_alpha(),color =2, linewidth =1) +geom_vline(xintercept = dat |>cov() |>make_alpha(), color =4, linewidth =1) +ggtitle("Bootstrap")
true sim boot
alpha 0.6 0.602 0.639
SE NA 0.081 0.071
Príklad (autá)
Naposledy sa vrátime k modelovaniu dojazdu auta pomocou výkonu motora a porovnáme odhady štandardných chýb parametrov lineárneho modelu metódou bootstrap s odhadmi odvodenými analyticky na základe predpokladov.
Tentokrát využijeme vstavanú funkciu boot zo základného balíka boot, pre ktorú je iba potrebné pripraviť funkciu na výpočet štatistiky (jednej alebo viacerých), ktorá nás zaujíma.
Kód
# Function to calculate parameters of linear regression based on data subset given by vector of row indicesmake_linpar <-function(data, indices) {lm(mpg ~ horsepower, data = data, subset = indices) |>coef()}n <-nrow(ISLR2::Auto)make_linpar(ISLR2::Auto, sample(n, n, replace =TRUE))
(Intercept) horsepower
40.8819444 -0.1627521
Funkcia so vstupom súboru pozorovaní Auto a náhodnej množiny (aj opakujúcich sa) indexov riadkov vráti mierne odlišné odhady ako sme videli v predošlej kapitole. Pre získanie miery variability takýchto odhadov (vo všeobecnosti pre získanie vzorkovacieho rozdelenia) je potrebné odhad veľakrát zopakovať a z výsledku získať požadovanú mieru.
Kód
B <-1000make_linpar(ISLR2::Auto, sample(n, n, replace =TRUE)) |>replicate(n = B) |>apply(MARGIN =1, sd) |>rbind(SE = _)
(Intercept) horsepower
SE 0.8463759 0.007384191
Vstavaná funkcia k tomu pridá i strednú hodnotu štatistiky odhadnutú z pôvodného súboru (original) a odchýľku odhadu strednej hodnoty zo vzorkovacieho rozdelenia (bias).
Kód
boot::boot(ISLR2::Auto, make_linpar, R = B)
ORDINARY NONPARAMETRIC BOOTSTRAP
Call:
boot::boot(data = ISLR2::Auto, statistic = make_linpar, R = B)
Bootstrap Statistics :
original bias std. error
t1* 39.9358610 0.035484127 0.850724147
t2* -0.1578447 -0.000318217 0.007465228
Porovnajme bootstrap odhad presnosti s odhadom na základe predpokladov modelu.
Estimate Std. Error t value Pr(>|t|)
(Intercept) 39.9358610 0.717498656 55.65984 1.220362e-187
horsepower -0.1578447 0.006445501 -24.48914 7.031989e-81
Štandardné chyby vypočítané analyticky z predpokladov modelu sú zjavne nižšie. Znamená to chybu v bootstrap metóde?
Nie. Asymptotické odhady sú podhodnotené kvôli nesplneným podmienkam lineárneho modelu: jednak počítajú s nenáhodnosťou hodnôt prediktorov (t.j. že všetok rozptyl odozvy pochádza zo šumovej zložky), jednak skutočný vzťah medzi dojazdom a výkonom (podľa bodového grafu) je zjavne nelineárny.