class: bottom, left, inverse, title-slide .title[ # Reamostragem Bootstrap ] .subtitle[ ## Introdução, variações e implementação com processamento paralelo ] .author[ ### Anderson Cristiano Neisse (UFV)
] .institute[ ###
Orientador
: Fernando Luiz Pereira de Oliveira (UFOP)
Coorientador
: Anderson Castro Soares de Oliveira (UFMT)
Coorientador
: Frederico Rodrigues Borges da Cruz (UFMG)
] .date[ ### Slides em:
bit.ly/2Lcrdi8
] --- # O que é? .pull-left[ - Introduzido por [Efron (1979)](https://link.springer.com/chapter/10.1007/978-1-4612-4380-9_41); - Estima variabilidade de estatÃsticas; - Generaliza o Jackknife; - Permite estimar: - Distribuição empÃrica; - Erro padrão; - Intervalo de confiança; ] -- .pull-right[ ![image](data:image/png;base64,#images/Bootstraps.jpg) ] Vem de "**to pull one up by one's bootstraps**": processos auto-iniciados. Referência ao [Paradoxo de Bootstrap](https://pt.wikipedia.org/wiki/Paradoxo_de_bootstrap). --- # O que é? Considere uma amostra `\(\mathbf{S} = S_1, S_2, ..., S_n\)` em que `\(S_i = (x_i, y_i)\)`. Além disso, uma estatÃstica `\(T(\mathbf{S}) = T(S_1, S_2, ..., S_n)\)` de interesse. -- <br> Uma reamostragem de bootstrap é obtida: - Amostrando `\(n\)` observações de `\(\mathbf{S}\)`; - Com reposição. o que resulta em `\(\mathbf{S}^* = S^*_1, S^*_2, ..., S^*_n\)`. Então podemos obter a estimativa `\(T(\mathbf{S}^*) = T(S_1^*, S_2^*, ..., S_n^*)\)`. -- <br> Ao realizar este procedimento `\(B\)` vezes obtemos a **distribuição Bootstrap**: - `\(\mathbf{T}_{B} = T(\mathbf{S}^*_1), T(\mathbf{S}^*_2), ..., T(\mathbf{S}^*_B)\)` --- # O que é? Se tivermos uma amostra `\(n = 50\)` da distribuição `\(Exp(\lambda = 1)\)`: <img src="data:image/png;base64,#images/LucidchartPT.png" width="3379" /> --- # Em resumo: A idéia base é simples: - Realizar `\(B\)` reamostragens com reposição nos dados; - Obter a estatÃstica de interesse `\(T(\mathbf{S}^*_j)\)` de cada reamostragem `\(j\)`; - Utilizar a distribuição Bootstrap `\(\mathbf{T}_B\)` para mensurar variabilidade. -- # Variações: Diferentes variações do Bootstrap foram propostas. Cada variação permite diferentes aplicações. Cada variação **altera a forma de reamostragem**. - Contanto que se **mantenha a reposição**. --- class: inverse, center, middle # Exemplo ### Modelando dados de carros --- # Exemplo Banco de dados `mtcars` do R, que contém 11 variáveis de carros: ```r head(mtcars, 3) ``` ``` ## mpg cyl disp hp drat wt qsec vs am gear carb ## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 ## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 ## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 ``` -- Avaliaremos o modelo linear: ```r modelo <- lm(mpg ~ hp + am + qsec, data = mtcars) summary(modelo)$coefficients ``` ``` ## Estimate Std. Error t value Pr(>|t|) ## (Intercept) 16.63206916 11.16841513 1.4892059 0.1476115618 ## hp -0.04912325 0.01342505 -3.6590752 0.0010398097 ## am 5.98311261 1.33812628 4.4712616 0.0001174983 ## qsec 0.46130309 0.51338361 0.8985544 0.3765524637 ``` --- class: inverse, center, middle # Iterações no R ### Melhorando o desempenho --- # Iterações no R No R, `B = 10000` repetições de um operação podem ser feitas: ```r # Por um loop for resultado <- vector("numeric", B) for(i in 1:B){ media <- mean(1:i) resultado[i] <- 1 } ``` -- Utilizando a famÃlia `apply`: ```r tira_media <- function(x) return(mean(1:x)) resultado <- sapply(1:B, FUN = tira_media) ``` -- Ou a famÃlia `purrr::map`: ```r resultado <- purrr::map_dbl(.x = 1:B, ~mean(1:.x)) ``` --- # Iterações no R Em questão de performance são similares: ![](data:image/png;base64,#bootstrap-variations-paralel_files/figure-html/unnamed-chunk-9-1.png)<!-- --><table> <caption>Média de tempo por método.</caption> <thead> <tr> <th style="text-align:center;"> For </th> <th style="text-align:center;"> Apply </th> <th style="text-align:center;"> Map </th> </tr> </thead> <tbody> <tr> <td style="text-align:center;"> 0.27548 </td> <td style="text-align:center;"> 0.28675 </td> <td style="text-align:center;"> 0.29004 </td> </tr> </tbody> </table> --- background-image: url(data:image/png;base64,#images/purrr.png) background-position: 95% 5% background-size: 200px 200px # FamÃlia map Introduzida pelo pacote `purrr`, oferece várias opções: - Diferentes formatos de retorno: - Lista: `map`; - Data frame: `map_dfr` e `map_dfc`; - Vetor: `map_dbl`, `map_int`, `map_chr` e `map_lgl`. <br> - Controle de aplicação: `map_if` e `map_at`. <br> - Função com múltiplos argumentos: `map2` e `pmap` <br> Mais informações do `purrr` e documentação [aqui](https://purrr.tidyverse.org/index.html). --- background-image: url(data:image/png;base64,#images/furrr.png) background-position: 95% 5% background-size: 200px 200px # Paralelização: pacote furrr Por padrão, o R usa **núcleo único** por sessão. Somente o uso de múltiplos núcleos já melhoraria o desempenho. -- <br> O pacote furrr mistura: - FamÃlia `map` do pacote `purrr`; - Capacidade de paralelização do pacote `future`. -- <br> O pacote `furrr` simplifica o uso de `future` com a **famÃlia** **`future_map`**. ```r plan(multisession) resultado <- future_map_dbl(.x = 1:B, ~mean(1:.x)) ``` <br> O `future` é mais geral e permite mais aplicações. Aprofundamento [aqui](https://cran.r-project.org/web/packages/future/vignettes/future-1-overview.html). --- background-image: url(data:image/png;base64,#images/furrr.png) background-position: 95% 5% background-size: 200px 200px # Paralelização: pacote furrr Na prática: - Distribui sessões RScript entre núcleos do processador; - Executa parcelas das iterações em cada sessão. -- <br> Melhor desempenho para iterações independentes. <br> Necessidade de comunicação entre sessões fere a performance. <br> Mais sobre o `furrr` e documentação [aqui](https://github.com/DavisVaughan/furrr). Mais sobre iterações no R? [R for Data Science: Iteration](https://r4ds.had.co.nz/iteration.html). --- # Paralelização: pacote furrr ![](data:image/png;base64,#bootstrap-variations-paralel_files/figure-html/unnamed-chunk-11-1.png)<!-- --><table> <caption>Média de tempo por método.</caption> <thead> <tr> <th style="text-align:center;"> For </th> <th style="text-align:center;"> Apply </th> <th style="text-align:center;"> Map </th> <th style="text-align:center;"> Future_Map </th> </tr> </thead> <tbody> <tr> <td style="text-align:center;"> 0.27548 </td> <td style="text-align:center;"> 0.28675 </td> <td style="text-align:center;"> 0.29004 </td> <td style="text-align:center;"> 0.16961 </td> </tr> </tbody> </table> --- class: inverse, center, middle # Bootstrap Não-paramétrico ### A variação mais conhecida --- # Bootstrap Não-paramétrico Reamostragem direta de `\(\mathbf{S} = S_1, S_2, ..., S_n\)` onde `\(S_i = (x_i, y_i)\)`. -- No contexto de dados, linhas inteiras são reamostradas: <img src="data:image/png;base64,#images/NP_Resampling.png" width="480" style="display: block; margin: auto;" /> Frequentemente utilizado pela simplicidade de aplicação. --- # Bootstrap Não-paramétrico Agora no contexto do nosso exemplo, a função que realiza uma reamostragem é: ```r boot_npr <- function(df){ # Recriando o df df_reamostra <- sample_n(tbl = df, size = nrow(df), replace = T) # Ajustando modelo m <- lm(mpg ~ hp + am + qsec, data = df_reamostra) # Retornando coeficientes coeficientes <- t(coef(m)) %>% as.data.frame() return(coeficientes) } ``` E para gerar a distribuição bootstrap com `B = 10000`: ```r plan(multisession) # Abrindo multi-sessões do R dist_npr <- future_map_dfr(1:B, ~boot_npr(df = mtcars)) ``` --- # Bootstrap Não-paramétrico ![](data:image/png;base64,#bootstrap-variations-paralel_files/figure-html/unnamed-chunk-16-1.png)<!-- --> --- # Bootstrap Não-paramétrico Vamos verificar os valores numéricos: <br> <table class="table table-striped" style="font-size: 18px; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:center;"> Metodo </th> <th style="text-align:center;"> (Intercept) </th> <th style="text-align:center;"> am </th> <th style="text-align:center;"> hp </th> <th style="text-align:center;"> qsec </th> </tr> </thead> <tbody> <tr> <td style="text-align:center;"> Normal </td> <td style="text-align:center;"> 16.63 [-6.25; 39.51] </td> <td style="text-align:center;"> 5.98 [3.24; 8.72] </td> <td style="text-align:center;"> -0.05 [-0.08; -0.02] </td> <td style="text-align:center;"> 0.46 [-0.59; 1.51] </td> </tr> <tr> <td style="text-align:center;"> BootNPR </td> <td style="text-align:center;"> 18.91 [-4.22; 46.42] </td> <td style="text-align:center;"> 5.71 [2.54; 8.32] </td> <td style="text-align:center;"> -0.05 [-0.08; -0.03] </td> <td style="text-align:center;"> 0.36 [-0.93; 1.45] </td> </tr> </tbody> </table> -- <br> Bootstrap tem sempre amplitude maior: <br> <table class="table table-striped" style="font-size: 18px; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:center;"> Metodo </th> <th style="text-align:center;"> (Intercept) </th> <th style="text-align:center;"> am </th> <th style="text-align:center;"> hp </th> <th style="text-align:center;"> qsec </th> </tr> </thead> <tbody> <tr> <td style="text-align:center;"> Normal </td> <td style="text-align:center;"> 45.75 </td> <td style="text-align:center;"> 5.48 </td> <td style="text-align:center;"> 0.05 </td> <td style="text-align:center;"> 2.10 </td> </tr> <tr> <td style="text-align:center;"> BootNPR </td> <td style="text-align:center;"> 50.64 </td> <td style="text-align:center;"> 5.78 </td> <td style="text-align:center;"> 0.06 </td> <td style="text-align:center;"> 2.38 </td> </tr> </tbody> </table> --- class: inverse, center, middle # Bootstrap Residual --- # Bootstrap Residual Depende de uma regra de predição qualquer `\(y_i = f(x_i) + \varepsilon_i\)`. Considerado não-paramétrico pois: - Não depende de distribuição; - Permite qualquer regra de predição. -- <br> A partir de `\(\mathbf{S}\)`, são obtidas(os): - Predições `\(f(x_i)\)`; - Os resÃduos `\(e_i = f(x_i) - y_i\)`. A reamostragem `\(\mathbf{S}^*\)` é obtida por: - Reamostrando de `\(e_1, ..., e_n\)` com reposição. - Fazendo `\(S_i^* = (x_i, y^*_i)\)`; - Em que `\(y_i^* = f(x_i) + e^*_i\)`. --- # Bootstrap Residual No contexto de dados, as osbervações `\(x_i\)` permanecem inalteradas: <img src="data:image/png;base64,#images/RS_Resampling.png" width="771" style="display: block; margin: auto;" /> O Bootstrap Residual permite aplicação de **dados experimentais**. --- # Bootstrap Residual A função para nosso exemplo seria: ```r boot_rsd <- function(mod_obj, df){ # Reamostrando o resÃduo predito <- mod_obj$fitted.values residuo <- mod_obj$residuals rsd_reamostra <- sample(residuo, replace = T) # Recriando o df df$mpg <- predito + rsd_reamostra # Ajustando modelo m <- lm(mpg ~ hp + am + qsec, data = df) # Extraindo e retornando coeficientes coeficientes <- t(coef(m)) %>% as.data.frame() return(coeficientes) } ``` A distribuição obtida com: `map_dfr(1:B, ~boot_rsd(modelo, mtcars)`. --- # Bootstrap Residual ![](data:image/png;base64,#bootstrap-variations-paralel_files/figure-html/unnamed-chunk-22-1.png)<!-- --> --- # Bootstrap Residual Vamos verificar os valores numéricos: <table class="table table-striped" style="font-size: 18px; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:center;"> Metodo </th> <th style="text-align:center;"> (Intercept) </th> <th style="text-align:center;"> am </th> <th style="text-align:center;"> hp </th> <th style="text-align:center;"> qsec </th> </tr> </thead> <tbody> <tr> <td style="text-align:center;"> Normal </td> <td style="text-align:center;"> 16.63 [-6.25; 39.51] </td> <td style="text-align:center;"> 5.98 [3.24; 8.72] </td> <td style="text-align:center;"> -0.05 [-0.08; -0.02] </td> <td style="text-align:center;"> 0.46 [-0.59; 1.51] </td> </tr> <tr> <td style="text-align:center;"> BootNPR </td> <td style="text-align:center;"> 18.91 [-4.22; 46.42] </td> <td style="text-align:center;"> 5.71 [2.54; 8.32] </td> <td style="text-align:center;"> -0.05 [-0.08; -0.03] </td> <td style="text-align:center;"> 0.36 [-0.93; 1.45] </td> </tr> <tr> <td style="text-align:center;"> BootRSD </td> <td style="text-align:center;"> 16.5 [-3.96; 37.27] </td> <td style="text-align:center;"> 6 [3.56; 8.38] </td> <td style="text-align:center;"> -0.05 [-0.07; -0.02] </td> <td style="text-align:center;"> 0.47 [-0.49; 1.4] </td> </tr> </tbody> </table> -- <br> Bootstrap pode resultar em IC erroneamente precisos para `\(n\)` pequeno: <table class="table table-striped" style="font-size: 18px; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:center;"> Metodo </th> <th style="text-align:center;"> (Intercept) </th> <th style="text-align:center;"> am </th> <th style="text-align:center;"> hp </th> <th style="text-align:center;"> qsec </th> </tr> </thead> <tbody> <tr> <td style="text-align:center;"> Normal </td> <td style="text-align:center;"> 45.75 </td> <td style="text-align:center;"> 5.48 </td> <td style="text-align:center;"> 0.05 </td> <td style="text-align:center;"> 2.10 </td> </tr> <tr> <td style="text-align:center;"> BootNPR </td> <td style="text-align:center;"> 50.64 </td> <td style="text-align:center;"> 5.78 </td> <td style="text-align:center;"> 0.06 </td> <td style="text-align:center;"> 2.38 </td> </tr> <tr> <td style="text-align:center;"> BootRSD </td> <td style="text-align:center;"> 41.23 </td> <td style="text-align:center;"> 4.81 </td> <td style="text-align:center;"> 0.05 </td> <td style="text-align:center;"> 1.89 </td> </tr> </tbody> </table> <br> Alguns métodos melhorados de IC Bootstrap por [DiCiccio e Efron (1996)](https://www.jstor.org/stable/pdf/2246110.pdf?refreqid=excelsior%3A4c2fbe99e624724492a165ebaff888e0) --- class: inverse, center, middle # Bootstrap Paramétrico --- # Bootstrap Paramétrico Também depende de modelo `\(y_i = f(x_i) + \varepsilon_i\)`. Chamado de paramétrico por assumir uma distribuição `\(F_{\varepsilon}\)` para `\(\varepsilon_i\)`. No caso do modelo linear: $$ \varepsilon_i \sim N(0, \sigma) $$ -- <br> Similar ao residual, mas amostrando `\(e_i\)` da distribuição assumida. A reamostragem `\(\mathbf{S}^*\)` é obtida por: - Obtendo `\(e*_1, ..., e*_n\)` de `\(F_{\varepsilon}\)`. - Fazendo `\(S_i^* = (x_i, y^*_i)\)`; - Em que `\(y_i^* = f(x_i) + e^*_i\)`. --- # Bootstrap Paramétrico Também pode ser aplicado a dados experimentais. <img src="data:image/png;base64,#images/PR_Resampling.png" width="850" style="display: block; margin: auto;" /> Depende de qualidade de ajuste e pressuposição de distribuição. --- # Bootstrap Paramétrico Para o noso exemplo, com `\(\varepsilon_i \sim N(0, \sigma)\)` fazendo `\(\hat{\sigma} = s(e_1, ..., e_n)\)`. ```r boot_prm <- function(mod_obj, df){ # Reamostrando o resÃduo predito <- modelo$fitted.values desvpad <- sd(modelo$residuals) # Recriando o df df$mpg <- predito + rnorm(nrow(df), 0, desvpad) # Ajustando modelo m <- lm(mpg ~ hp + am + qsec, data = df) # Extraindo e retornando coeficientes coeficientes <- t(coef(m)) %>% as.data.frame() return(coeficientes) } ``` E a distribuição obtida por: `map_dfr(1:B, ~boot_prm(modelo, mtcars))`. --- # Bootstrap Paramétrico ![](data:image/png;base64,#bootstrap-variations-paralel_files/figure-html/unnamed-chunk-28-1.png)<!-- --> --- # Bootstrap Paramétrico Estimativas muito similares à s do modelo: <table class="table table-striped" style="font-size: 18px; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:center;"> Metodo </th> <th style="text-align:center;"> (Intercept) </th> <th style="text-align:center;"> am </th> <th style="text-align:center;"> hp </th> <th style="text-align:center;"> qsec </th> </tr> </thead> <tbody> <tr> <td style="text-align:center;"> Normal </td> <td style="text-align:center;"> 16.63 [-6.25; 39.51] </td> <td style="text-align:center;"> 5.98 [3.24; 8.72] </td> <td style="text-align:center;"> -0.05 [-0.08; -0.02] </td> <td style="text-align:center;"> 0.46 [-0.59; 1.51] </td> </tr> <tr> <td style="text-align:center;"> BootNPR </td> <td style="text-align:center;"> 18.91 [-4.22; 46.42] </td> <td style="text-align:center;"> 5.71 [2.54; 8.32] </td> <td style="text-align:center;"> -0.05 [-0.08; -0.03] </td> <td style="text-align:center;"> 0.36 [-0.93; 1.45] </td> </tr> <tr> <td style="text-align:center;"> BootRSD </td> <td style="text-align:center;"> 16.5 [-3.96; 37.27] </td> <td style="text-align:center;"> 6 [3.56; 8.38] </td> <td style="text-align:center;"> -0.05 [-0.07; -0.02] </td> <td style="text-align:center;"> 0.47 [-0.49; 1.4] </td> </tr> <tr> <td style="text-align:center;"> BootPRM </td> <td style="text-align:center;"> 16.6 [-4.29; 37.71] </td> <td style="text-align:center;"> 5.98 [3.5; 8.48] </td> <td style="text-align:center;"> -0.05 [-0.07; -0.02] </td> <td style="text-align:center;"> 0.46 [-0.5; 1.42] </td> </tr> </tbody> </table> -- <br> Também apresentou amplitudes menores do que o IC Normal: <table class="table table-striped" style="font-size: 18px; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:center;"> Metodo </th> <th style="text-align:center;"> (Intercept) </th> <th style="text-align:center;"> am </th> <th style="text-align:center;"> hp </th> <th style="text-align:center;"> qsec </th> </tr> </thead> <tbody> <tr> <td style="text-align:center;"> Normal </td> <td style="text-align:center;"> 45.75 </td> <td style="text-align:center;"> 5.48 </td> <td style="text-align:center;"> 0.05 </td> <td style="text-align:center;"> 2.10 </td> </tr> <tr> <td style="text-align:center;"> BootNPR </td> <td style="text-align:center;"> 50.64 </td> <td style="text-align:center;"> 5.78 </td> <td style="text-align:center;"> 0.06 </td> <td style="text-align:center;"> 2.38 </td> </tr> <tr> <td style="text-align:center;"> BootRSD </td> <td style="text-align:center;"> 41.23 </td> <td style="text-align:center;"> 4.81 </td> <td style="text-align:center;"> 0.05 </td> <td style="text-align:center;"> 1.89 </td> </tr> <tr> <td style="text-align:center;"> BootPRM </td> <td style="text-align:center;"> 42.00 </td> <td style="text-align:center;"> 4.98 </td> <td style="text-align:center;"> 0.05 </td> <td style="text-align:center;"> 1.93 </td> </tr> </tbody> </table> --- class: inverse, center, middle # Abordagem Bayesiana ## Bootstrap Bayesiano e similaridades inferenciais --- # Bootstrap Bayesiano Considerando que, no Bootstrap de [Efron (1979)](https://link.springer.com/chapter/10.1007/978-1-4612-4380-9_41): - Cada `\(S_i, i= 1, 2,...,n\)` possui probabilidade `\(w_i = 1/n\)` de escolha; - Em `\(\mathbf{S}*\)` o vetor `\(\mathbf{w} = w_1, w_2, ..., w_n\)` varia. - Podendo ser zero para alguns `\(i\)`. - E que, no caso da média: `$$T(x_i) = \sum_{i=1}^n{w_ix_i}$$` [Rubin (1981)](https://www.jstor.org/stable/2240875?casa_token=7misrY9zsWgAAAAA:cqv7vEBk4Pf-3m2WfEqXKQWrcEARYjG-d1Q-wNlsD6-VbiLFSnkJyl7FETejaOzKHBsEjyU2SE1wgXErSe-pfalj4EMejWd_dRvic-wRQ3JxXCj9js69TQ&seq=1#metadata_info_tab_contents) mostra que, assumindo `\(w_i\)` como V.A. então: `$$T(x_i^*) = \sum_{i=1}^n{w_ix_i}$$` seria a interpretação Bayesiana do Bootstrap. --- # Bootstrap Bayesiano Assume-se distribuição Dirichlet `\(n\)`-variada: `$$f(x_1, ..., x_n; \alpha_1, ..., \alpha_n) = \left(\prod_{i=1}^n\Gamma(\alpha_i) \right)^{-1} \Gamma \left(\sum_{i=1}^n{\alpha_i}\right) \prod_{i=1}^n x_i^{\alpha_i-1}$$` tomando `\(\alpha_i = 1\)`. O que resulta em: `$$E[X_i] = \alpha_i/\sum_{j=1}^n{\alpha_j} = 1/n$$` -- <br> De forma geral: - Obter uma amostra `\(\mathbf{w}\)` da Dirichlet n-variada; - Fazer `\(T(\mathbf{S}^*) = T(\mathbf{S}, \mathbf{w})\)`. Onde `\(T(\mathbf{S}, \mathbf{w})\)` é a equivalente a `\(T(\mathbf{S})\)` que pondere as observações por `\(\mathbf{w}\)`. --- # Bootstrap Bayesiano Na prática, `\(\mathbf{S}^*\)` nem chega a ser obtido: <img src="data:image/png;base64,#images/BAY_Resampling.png" width="833" style="display: block; margin: auto;" /> --- # Bootstrap Bayesiano A função de Bootstrap Bayesiano para o exemplo seria: ```r boot_bay <- function(df){ # Obtendo os pesos w <- MCMCpack::rdirichlet(n = 1, alpha = rep(1, nrow(df))) %>% as.numeric() # Ajustando modelo m <- lm(mpg ~ hp + am + qsec, data = df, weights = w) # Extraindo e retornando os coeficientes coeficientes <- t(coef(m)) %>% as.data.frame() return(coeficientes) } ``` **Nota**: A distribuição Dirichlet não retorna `\(w_i = 0\)`, mas valores pequenos. A obtenção da distribuição, novamente, é: ```r plan(multisession) # Abrindo multi-sessões do R dist_bay <- future_map_dfr(1:B, ~boot_bay(df = mtcars)) ``` --- # Bootstrap Bayesiano ![](data:image/png;base64,#bootstrap-variations-paralel_files/figure-html/unnamed-chunk-34-1.png)<!-- --> --- # Bootstrap Bayesiano Vamos ver os valores: <table class="table table-striped" style="font-size: 18px; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:center;"> Metodo </th> <th style="text-align:center;"> (Intercept) </th> <th style="text-align:center;"> am </th> <th style="text-align:center;"> hp </th> <th style="text-align:center;"> qsec </th> </tr> </thead> <tbody> <tr> <td style="text-align:center;"> Normal </td> <td style="text-align:center;"> 16.63 [-6.25; 39.51] </td> <td style="text-align:center;"> 5.98 [3.24; 8.72] </td> <td style="text-align:center;"> -0.05 [-0.08; -0.02] </td> <td style="text-align:center;"> 0.46 [-0.59; 1.51] </td> </tr> <tr> <td style="text-align:center;"> BootNPR </td> <td style="text-align:center;"> 18.91 [-4.22; 46.42] </td> <td style="text-align:center;"> 5.71 [2.54; 8.32] </td> <td style="text-align:center;"> -0.05 [-0.08; -0.03] </td> <td style="text-align:center;"> 0.36 [-0.93; 1.45] </td> </tr> <tr> <td style="text-align:center;"> BootRSD </td> <td style="text-align:center;"> 16.5 [-3.96; 37.27] </td> <td style="text-align:center;"> 6 [3.56; 8.38] </td> <td style="text-align:center;"> -0.05 [-0.07; -0.02] </td> <td style="text-align:center;"> 0.47 [-0.49; 1.4] </td> </tr> <tr> <td style="text-align:center;"> BootPRM </td> <td style="text-align:center;"> 16.6 [-4.29; 37.71] </td> <td style="text-align:center;"> 5.98 [3.5; 8.48] </td> <td style="text-align:center;"> -0.05 [-0.07; -0.02] </td> <td style="text-align:center;"> 0.46 [-0.5; 1.42] </td> </tr> <tr> <td style="text-align:center;"> BootBAY </td> <td style="text-align:center;"> 18.16 [-0.72; 39.87] </td> <td style="text-align:center;"> 5.8 [3.31; 8.13] </td> <td style="text-align:center;"> -0.05 [-0.08; -0.03] </td> <td style="text-align:center;"> 0.4 [-0.59; 1.3] </td> </tr> </tbody> </table> -- Também apresentou amplitudes menores do que o IC Normal: <table class="table table-striped" style="font-size: 18px; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:center;"> Metodo </th> <th style="text-align:center;"> (Intercept) </th> <th style="text-align:center;"> am </th> <th style="text-align:center;"> hp </th> <th style="text-align:center;"> qsec </th> </tr> </thead> <tbody> <tr> <td style="text-align:center;"> Normal </td> <td style="text-align:center;"> 45.75 </td> <td style="text-align:center;"> 5.48 </td> <td style="text-align:center;"> 0.05 </td> <td style="text-align:center;"> 2.10 </td> </tr> <tr> <td style="text-align:center;"> BootNPR </td> <td style="text-align:center;"> 50.64 </td> <td style="text-align:center;"> 5.78 </td> <td style="text-align:center;"> 0.06 </td> <td style="text-align:center;"> 2.38 </td> </tr> <tr> <td style="text-align:center;"> BootRSD </td> <td style="text-align:center;"> 41.23 </td> <td style="text-align:center;"> 4.81 </td> <td style="text-align:center;"> 0.05 </td> <td style="text-align:center;"> 1.89 </td> </tr> <tr> <td style="text-align:center;"> BootPRM </td> <td style="text-align:center;"> 42.00 </td> <td style="text-align:center;"> 4.98 </td> <td style="text-align:center;"> 0.05 </td> <td style="text-align:center;"> 1.93 </td> </tr> <tr> <td style="text-align:center;"> BootBAY </td> <td style="text-align:center;"> 40.59 </td> <td style="text-align:center;"> 4.83 </td> <td style="text-align:center;"> 0.04 </td> <td style="text-align:center;"> 1.89 </td> </tr> </tbody> </table> --- class: inverse, center, middle # Bootstrap 632+ ### Alternativa para validação cruzada --- # Performance de modelos De forma geral, performance está ligada com a perda `\(L[f(x_i), y_i]\)`. Exemplos de função perda são: EQM, 1-Acurácia e a Entropia cruzada. É de interesse estimar a performance em novos dados. -- <br> As formas mais usadas para estimar `\(L[f(x_i), y_i]\)` em novos dados são: - Partição Treino-Teste - Validação Cruzada Leave-One-Out - Validação Cruzada K-fold <br> Um estudo aprofundado para **seleção de modelos** por [Arlot e Celisse (2010)](https://projecteuclid.org/euclid.ssu/1268143839). Segundo, [Tibshirani e Efron (2012)](https://www.tandfonline.com/doi/abs/10.1080/01621459.1997.10474007), CV pode não ser ideais para **estimar performance**. --- # Bootstrap da performance Uma alternativa a esses métodos é utilizar o bootstrap. Pode-se ajustar o modelo e avaliar a perda em `\(\mathbf{S}^*\)`: <br> `$$\overline{err} = \frac{1}{B}\sum_{j=1}^B \frac{1}{n}\sum_{i=1}^n L[f(x^*_i), y^*_i]$$` -- <br> Mas, este método é viesado por: - Medir perda nos dados de treino; - Conter observações repetidas. Existe uma forma de obter dados de teste. --- # Bootstrap da performance Em uma amostragem a probabilidade de cada observação é `\(1/n\)`. Portanto, em `\(n \to \infty\)` amostragens com reposição: `$$P(x_i \notin S^*) = \left(1-\frac{1}{n}\right)^n \approx e^{-1} = 0.368$$` ``` ## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0. ## ℹ Please use `linewidth` instead. ## This warning is displayed once every 8 hours. ## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was ## generated. ``` <img src="data:image/png;base64,#bootstrap-variations-paralel_files/figure-html/unnamed-chunk-37-1.png" style="display: block; margin: auto;" /> Portanto, as observações únicas de `\(\mathbf{S}^*\)` serão, em média, `\(0.632n\)` de `\(\mathbf{S}\)`. --- # Bootstrap da performance Definindo `\(\mathbf{S}^{368}\)` como a amostra de observações não selecionadas. - Possuirá, em média, tamanho `\(n_{368} = 0.368n\)`. <br> Podemos avaliar a perda de cada amostragem nos dados: `$$Err_{boot} = \frac{1}{B}\sum_{j=1}^B \frac{1}{n_{368}}\sum_{i=1}^{n_{368}} L[f(x^{368}_i), y^{368}_i]$$` -- <br> Mas possui viés pessimista: - Modelo ajustado em dados com observações repetidas; - Além da variabilidade naturalmente maior. <br> Uma solução é o **Bootstrap 632**. --- # Bootstrap 632 Proposto por Efron e Tibshirani (1997). Combina as duas quantidades: - `\(\overline{err}\)`: Viés otimista; - `\(Err_{boot}\)`: Viés pessimista. Com base nas proporções `\(0.632\)` e `\(0.368\)` faz-se: `$$Err_{632} = 0.368\times \overline{err} + 0.632\times Err_{boot}$$` dessa forma obtendo menor viés. Para `\(n\)` pequeno usar `\((1-1/n)^n\)`. <br> Os autores também mostram que: - A variância do método é menor do que a obtida por Validação Cruzada. - Entretanto, é viesado para modelos com **overfitting**, onde `\(\overline{err} = 0\)` - Por isso, é proposta correção que resulta no **Bootstrap 632+** --- # Bootstrap 632+ A estimativa é obtida por: `$$Err_{632+} = (1 - z)\times \overline{err} + z\times Err_{boot}$$` Em que: `$$z = 0.632/(1-0.368R) \quad\text{e}\quad R = \frac{Err_{boot} - \overline{err}}{\gamma - \overline{err}}$$` sendo que `\(\gamma\)` é o erro na ausência de informação, obtido de todas as possÃveis combinações de `\(y_i\)` e `\(x_i\)`: `$$\gamma = \frac{1}{n^2} \sum_{i=1}^{n}\sum_{j=1}^{n}L[f(x_i), y_i]$$` O `\(R\)` é uma medida de *overfitting*. Quando `\(R=0\)` então `\(Err_{632+} = Err_{632}\)` --- # Bootstrap 632 Na prática, realiza-se Bootstrap Não-paramétrico com "passos extras". <img src="data:image/png;base64,#images/632_Resampling.png" width="1113" style="display: block; margin: auto;" /> --- # Bootstrap 632 A função que realiza o Bootstrap 632: ```r boot_632 <- function(df){ # Recriando o df ind <- sample(1:nrow(df), size = nrow(df), replace = T) trn <- df[ind, ] tst <- df[-ind, ] # Ajustando modelo m <- lm(mpg ~ hp + am + qsec, data = trn) # Retornando resultados resultado <- tibble( Treino = mean((predict(m, trn) - trn$mpg)^2), Teste = mean((predict(m, tst) - tst$mpg)^2), Boot632 = 0.632*Teste + 0.368*Treino) return(resultado) } ``` --- # Bootstrap 632 ![](data:image/png;base64,#bootstrap-variations-paralel_files/figure-html/unnamed-chunk-41-1.png)<!-- --> --- # Bootstrap 632 Vamos ver os valores: <table class="table table-striped" style="font-size: 18px; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:center;"> Metodo </th> <th style="text-align:center;"> Estimativa </th> <th style="text-align:center;"> IC 95% </th> <th style="text-align:center;"> Amplitude </th> </tr> </thead> <tbody> <tr> <td style="text-align:center;"> Treino </td> <td style="text-align:center;"> 6.573486 </td> <td style="text-align:center;"> [3.66; 9.52] </td> <td style="text-align:center;"> 5.856172 </td> </tr> <tr> <td style="text-align:center;"> Teste </td> <td style="text-align:center;"> 11.118737 </td> <td style="text-align:center;"> [5.06; 21.26] </td> <td style="text-align:center;"> 16.195577 </td> </tr> <tr> <td style="text-align:center;"> Boot632 </td> <td style="text-align:center;"> 9.446085 </td> <td style="text-align:center;"> [6.29; 15.18] </td> <td style="text-align:center;"> 8.888770 </td> </tr> </tbody> </table> O método 632 combinou: - Baixa variabilidade e viés otimista do Treino; - Alta variabilidade e viés pessimista do Teste. -- <br> Essa implementação não considerou: - Correção 0.632+ para grau de *overfitting*; - Uso de `\((1-\frac{1}{n})^n\)` para `\(n\)` pequeno ao invés de `\(0.632\)` e `\(0.368\)`. --- class: inverse, center, middle # Conclusão --- # Conclusão **É um método versátil** Possui variações que permitem diferentes aplicações. Permite avaliar variabilidade facilmente quando: - É difÃcil de derivar `\(\sigma\)`; - Modelos são recentes e complexos; - Há comparação de modelos de diferentes teorias. -- <br> **Entretanto** Dá a falsa impressão de independer de pressuposições. Algumas **limitações dos Não-paramétrico e Bayesiano** (Rubin, 1981): - Não atribui probabilidades parecidas para observações parecidas; - Usa somente valores observados como espaço amostral. --- # Referências Arlot, S., and Celisse, A. (2010). A survey of cross-validation procedures for model selection. *Statistics surveys, 4*, 40-79. [Acesse](https://projecteuclid.org/euclid.ssu/1268143839). <br> DiCiccio, T. J., & Efron, B. (1996). Bootstrap confidence intervals. Statistical science, 189-212. [Acesse](https://www.jstor.org/stable/pdf/2246110.pdf?refreqid=excelsior%3A4c2fbe99e624724492a165ebaff888e0). <br> Efron, B. (1979). Computers and the theory of statistics: thinking the unthinkable. *SIAM review 21(4)*, 460–480. [Acesse](https://epubs.siam.org/doi/abs/10.1137/1021092). <br> Efron, B. (1987). Better bootstrap confidence intervals. *Journal of the American statistical Association 82(397)*, 171–185. [Acesse](https://amstat.tandfonline.com/doi/abs/10.1080/01621459.1987.10478410). <br> Efron, B., and Tibshirani, R. (1997). Improvements on cross-validation: the 632+ bootstrap method. *Journal of the American Statistical Association 92(438)*, 548–560. [Acesse](https://www.tandfonline.com/doi/abs/10.1080/01621459.1997.10474007). <br> Wickham, H. (2016). *ggplot2: Elegant Graphics for Data Analysis*. Springer-Verlag New York. --- # Referências Wickham, H. and Henry, L. (2019). tidyr: Easily Tidy Data with ‘spread()’ and ‘gather()’ Functions. R package version 0.8.3. [Acesse](https://CRAN.R-project.org/package=tidyr). <br> Witten, I. H., Frank, E., Hall, M. A., and Pal, C. J. (2016). *Data Mining: Practical machine learning tools and techniques*. Morgan Kaufmann. <br> R Core Team (2019). R: A language and environment for statistical computing. R Foundation for Statistical Computing. In: Vienna, Austria. [Acesse](https://www.R-project.org/). <br> Vaughan, D. and Matt Dancho, M. (2018). furrr: Apply Mapping Functions in Parallel using Futures. R package version 0.1.0. [Acesse](https://CRAN.R-project.org/package=furrr). --- class: center, middle # Obrigado! Apresentação em: [bit.ly/2Lcrdi8](https://bit.ly/2Lcrdi8) # Perguntas! <br> ### Anderson Cristiano Neisse Site: [aneisse.com](https://aneisse.com/) Twitter: [@a_neisse](https://twitter.com/a_neisse) LinkedIn: [anderson-neisse](https://www.linkedin.com/in/anderson-neisse/) <br> **Slides feitos com o pacote** [xaringan](https://github.com/yihui/xaringan).