Bootstrap é um método de inferência sobre uma população usando dados amostrais. Bradley Efron o apresentou pela primeira vez neste artigo em 1979. O bootstrap se baseia em amostragem com reposição a partir dos dados da amostra. Essa técnica pode ser usada para estimar o erro-padrão de qualquer estatística e obter um intervalo de confiança (CI) para ela. O bootstrap é especialmente útil quando o CI não tem forma fechada ou é demasiadamente complexo.
Suponha que temos uma amostra de n elementos: X = {x1, x2, …, xn} e queremos um CI para alguma estatística T = t(X). O framework do bootstrap é direto: repetimos R vezes o seguinte esquema: na i-ésima repetição, amostramos com reposição n elementos da amostra disponível (alguns serão selecionados mais de uma vez). Chamamos essa nova amostra de i-ésima amostra bootstrap, Xi, e calculamos a estatística desejada Ti = t(Xi).
Como resultado, teremos R valores da nossa estatística: T1, T2, …, TR. Chamamos isso de realizações bootstrap de T ou distribuição bootstrap de T. A partir dela, podemos calcular o CI para T. Há várias formas de fazer isso; usar percentis costuma ser a mais simples.
Bootstrap na prática
Vamos usar (de novo) o famoso dataset iris. Veja as primeiras linhas:
Suponha que queremos encontrar CIs para a mediana de Sepal.Length, a mediana de Sepal.Width e o coeficiente de correlação de postos de Spearman entre as duas. Vamos usar o pacote boot do R e uma função chamada... boot. Para aproveitar seu potencial, precisamos criar uma função que calcule nossa(s) estatística(s) a partir dos dados reamostrados. Ela deve ter pelo menos dois argumentos: um dataset e um vetor com os indices dos elementos do dataset selecionados para compor a amostra bootstrap.
Se quisermos calcular CIs para mais de uma estatística de uma vez, nossa função deve retorná-las como um único vetor.
foo escolhe os elementos desejados (cujos números estão em indices) de data e calcula o coeficiente de correlação das duas primeiras colunas (method='s' seleciona o coeficiente de Spearman; method='p' retorna o coeficiente de Pearson) e suas medianas.
Também podemos adicionar argumentos extras, por exemplo, deixar o usuário escolher o tipo de coeficiente de correlação:
Para deixar este tutorial mais geral, vou usar a segunda versão de foo.
Agora podemos usar a função boot. Precisamos informar o nome do dataset, a função que acabamos de criar, o número de repetições (R) e quaisquer argumentos adicionais da nossa função (como cor.type). Abaixo, uso set.seed para tornar o exemplo reproduzível.
A função boot retorna um objeto da classe... (sim, você acertou!) boot. Ele tem dois elementos interessantes. $t contém os R valores da(s) nossa(s) estatística(s) gerados pelo procedimento bootstrap (as realizações bootstrap de T):
original é o mesmo que $t0. bias é a diferença entre a média das realizações bootstrap (as de $t), chamada de estimativa bootstrap de T, e o valor no dataset original (o de $t0).
Antes de partir para os CIs, sempre vale a pena olhar a distribuição das realizações bootstrap. Podemos usar a função plot, com index indicando qual estatística calculada em foo queremos analisar. Aqui, index=1 é o coeficiente de Spearman entre comprimento e largura da sépala; index=2 é a mediana do comprimento da sépala; e index=3 é a mediana da largura da sépala.
A distribuição dos coeficientes de correlação bootstrap parece bem próxima da normal. Vamos encontrar um CI para ela. Podemos usar boot.ci. O padrão é CI de 95%, mas isso pode ser alterado com o parâmetro conf.
boot.ci(myBootstrap, index=1)## Warning in boot.ci(myBootstrap, index = 1): bootstrap variances needed for## studentized intervals## BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS## Based on 1000 bootstrap replicates#### CALL :## boot.ci(boot.out = myBootstrap, index = 1)#### Intervals :## Level Normal Basic ## 95% (-0.3178, -0.0209 ) (-0.3212, -0.0329 ) #### Level Percentile BCa ## 95% (-0.3007, -0.0124 ) (-0.3005, -0.0075 ) ## Calculations and Intervals on Original ScaleTecnologia
boot.ci fornece 5 tipos de CIs com bootstrap. Um deles, o intervalo studentizado, é particular: ele precisa de uma estimativa da variância bootstrap. Não a fornecemos, então o R imprime o aviso: bootstrap variances needed for studentized intervals. Estimativas de variância podem ser obtidas com um bootstrap de segundo nível ou (mais fácil) com a técnica jackknife. Isso foge um pouco do escopo deste tutorial, então vamos focar nos outros quatro tipos de CI com bootstrap.
Se não quisermos visualizar todos, podemos escolher os relevantes no argumento type. Os valores possíveis são norm, basic, stud, perc, bca ou um vetor com esses.
boot.ci(myBootstrap, index=1, type=c('basic','perc'))## BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS## Based on 1000 bootstrap replicates#### CALL :## boot.ci(boot.out = myBootstrap, type = c("basic", "perc"), index = 1)#### Intervals :## Level Basic Percentile ## 95% (-0.3212, -0.0329 ) (-0.3007, -0.0124 ) ## Calculations and Intervals on Original ScaleTecnologia
A função boot.ci cria um objeto da classe... (acertou!) bootci. Seus elementos têm os mesmos nomes dos tipos de CI usados no argumento type. $norm é um vetor de 3 elementos com o nível de confiança e os limites do CI.
O CI por percentis geralmente não é recomendado porque tem desempenho ruim em distribuições com caudas estranhas. O CI básico (também chamado de pivotal ou empírico) é bem mais robusto. A ideia é calcular as diferenças entre cada replicação bootstrap e t0 e usar os percentis dessa distribuição. Detalhes completos podem ser encontrados, por exemplo, em All of Statistics, de L. Wasserman.
A fórmula final para o CI básico é:
(2t0 − θ1 − (1 − α)/2, 2t0 − θ(1 − α)/2)
BCα CI
BCα vem de bias-corrected, accelerated (corrigido para viés e acelerado). A fórmula não é muito complicada, mas é pouco intuitiva, então vou pular. Veja o artigo de Thomas J. DiCiccio e Bradley Efron se quiser os detalhes.
A aceleração citada no nome do método exige usar percentis específicos das realizações bootstrap. Às vezes pode acontecer de esses percentis serem extremos, possivelmente outliers. Nesses casos, o BCα pode ficar instável.
Vamos olhar o CI BCα para a mediana da largura da pétala. No dataset original, essa mediana é exatamente 3.
boot.ci(myBootstrap, index=3)## Warning in boot.ci(myBootstrap, index = 3): bootstrap variances needed for## studentized intervals## Warning in norm.inter(t, adj.alpha): extreme order statistics used as## endpoints## BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS## Based on 1000 bootstrap replicates#### CALL :## boot.ci(boot.out = myBootstrap, index = 3)#### Intervals :## Level Normal Basic ## 95% ( 2.939, 3.046 ) ( 2.900, 3.000 ) #### Level Percentile BCa ## 95% ( 3.0, 3.1 ) ( 2.9, 2.9 ) ## Calculations and Intervals on Original Scale## Warning : BCa Intervals used Extreme Quantiles## Some BCa intervals may be unstableTecnologia
Obtivemos o CI BCα (2.9, 2.9). Estranho, mas, felizmente, o R nos alertou que extreme order statistics used as endpoints. Vamos ver o que aconteceu:
Nessa situação, a "aceleração" no método BCα facilmente "salta" para valores extremos. Aqui, o CI por percentis, que serve de base para o CI BCα, é (3, 3.1). Ao expandi-lo "para a esquerda", precisamos usar o percentil 0,002. A expansão "para a direita" também vai ao extremo: percentil 0,997.
Reprodução de resultados
Às vezes, precisamos recriar as reamostragens do bootstrap. Se pudermos usar o R, isso não é problema: a função set.seed resolve. Reconstituir as reamostragens em outro software é bem mais complicado. Além disso, para R grande, recalcular no R também pode não ser uma opção (por falta de tempo, por exemplo).
Podemos contornar isso salvando os índices dos elementos do dataset original que formaram cada amostra bootstrap. É exatamente o que a função boot.array faz (com indices=T).
Definindo indices=F (padrão), teremos a resposta para a pergunta: "Quantas vezes cada elemento do dataset original apareceu em cada amostra bootstrap?". Por exemplo, na primeira amostra: o 1º elemento do dataset apareceu uma vez, o 2º não apareceu, o 3º apareceu uma vez, o 4º duas vezes e assim por diante.
Uma tabela como essa permite recriar as realizações bootstrap fora do R. Ou no próprio R quando não quisermos usar set.seed e refazer todos os cálculos.
Este artigo ensina a você o significado, as diferenças e os casos de uso apropriados de intervalos de previsão e intervalos de confiança em análises estatísticas e de regressão. Ele também mostra a você como implementar esses intervalos no R.
O que é bootstrap?
Bootstrap é um método de inferência sobre uma população usando dados amostrais. Bradley Efron o apresentou pela primeira vez neste artigo em 1979. O bootstrap se baseia em amostragem com reposição a partir dos dados da amostra. Essa técnica pode ser usada para estimar o erro-padrão de qualquer estatística e obter um intervalo de confiança (CI) para ela. O bootstrap é especialmente útil quando o CI não tem forma fechada ou é demasiadamente complexo.
Suponha que temos uma amostra de n elementos: X = {x1, x2, …, xn} e queremos um CI para alguma estatística T = t(X). O framework do bootstrap é direto: repetimos R vezes o seguinte esquema: na i-ésima repetição, amostramos com reposição n elementos da amostra disponível (alguns serão selecionados mais de uma vez). Chamamos essa nova amostra de i-ésima amostra bootstrap, Xi, e calculamos a estatística desejada Ti = t(Xi).
Como resultado, teremos R valores da nossa estatística: T1, T2, …, TR. Chamamos isso de realizações bootstrap de T ou distribuição bootstrap de T. A partir dela, podemos calcular o CI para T. Há várias formas de fazer isso; usar percentis costuma ser a mais simples.
Bootstrap na prática
Vamos usar (de novo) o famoso dataset
iris. Veja as primeiras linhas:Suponha que queremos encontrar CIs para a mediana de
Sepal.Length, a mediana deSepal.Widthe o coeficiente de correlação de postos de Spearman entre as duas. Vamos usar o pacotebootdoRe uma função chamada...boot. Para aproveitar seu potencial, precisamos criar uma função que calcule nossa(s) estatística(s) a partir dos dados reamostrados. Ela deve ter pelo menos dois argumentos: umdatasete um vetor com osindicesdos elementos do dataset selecionados para compor a amostra bootstrap.Se quisermos calcular CIs para mais de uma estatística de uma vez, nossa função deve retorná-las como um único vetor.
No nosso exemplo, pode ficar assim:
fooescolhe os elementos desejados (cujos números estão emindices) dedatae calcula o coeficiente de correlação das duas primeiras colunas (method='s'seleciona o coeficiente de Spearman;method='p'retorna o coeficiente de Pearson) e suas medianas.Também podemos adicionar argumentos extras, por exemplo, deixar o usuário escolher o tipo de coeficiente de correlação:
Para deixar este tutorial mais geral, vou usar a segunda versão de
foo.Agora podemos usar a função
boot. Precisamos informar o nome do dataset, a função que acabamos de criar, o número de repetições (R) e quaisquer argumentos adicionais da nossa função (comocor.type). Abaixo, usoset.seedpara tornar o exemplo reproduzível.A função
bootretorna um objeto da classe... (sim, você acertou!)boot. Ele tem dois elementos interessantes.$tcontém os R valores da(s) nossa(s) estatística(s) gerados pelo procedimento bootstrap (as realizações bootstrap de T):$t0contém os valores da(s) nossa(s) estatística(s) no dataset original, completo:Imprimir o objeto
bootno console traz mais algumas informações:originalé o mesmo que$t0.biasé a diferença entre a média das realizações bootstrap (as de$t), chamada de estimativa bootstrap de T, e o valor no dataset original (o de$t0).std. erroré o erro-padrão da estimativa bootstrap, que é igual ao desvio-padrão das realizações bootstrap.Diferentes tipos de CI com bootstrap
Antes de partir para os CIs, sempre vale a pena olhar a distribuição das realizações bootstrap. Podemos usar a função
plot, comindexindicando qual estatística calculada emfooqueremos analisar. Aqui,index=1é o coeficiente de Spearman entre comprimento e largura da sépala;index=2é a mediana do comprimento da sépala; eindex=3é a mediana da largura da sépala.A distribuição dos coeficientes de correlação bootstrap parece bem próxima da normal. Vamos encontrar um CI para ela. Podemos usar
boot.ci. O padrão é CI de 95%, mas isso pode ser alterado com o parâmetroconf.boot.cifornece 5 tipos de CIs com bootstrap. Um deles, o intervalo studentizado, é particular: ele precisa de uma estimativa da variância bootstrap. Não a fornecemos, então oRimprime o aviso:bootstrap variances needed for studentized intervals. Estimativas de variância podem ser obtidas com um bootstrap de segundo nível ou (mais fácil) com a técnica jackknife. Isso foge um pouco do escopo deste tutorial, então vamos focar nos outros quatro tipos de CI com bootstrap.Se não quisermos visualizar todos, podemos escolher os relevantes no argumento
type. Os valores possíveis sãonorm,basic,stud,perc,bcaou um vetor com esses.A função
boot.cicria um objeto da classe... (acertou!)bootci. Seus elementos têm os mesmos nomes dos tipos de CI usados no argumentotype.$normé um vetor de 3 elementos com o nível de confiança e os limites do CI.$basic,$stud,$perce$bcasão vetores de 5 elementos que também incluem os percentis usados para calcular o CI (voltaremos a isso em seguida):Um pouco de notação (prometo ser breve!)
Para entender os diferentes tipos de CI, precisamos introduzir alguma notação. Considere:
CI por percentis
Com a notação acima, o CI por percentis é:
ou seja, basta pegar os percentis correspondentes. Simples assim.
CI normal
Um CI de Wald típico seria:
mas, no caso do bootstrap, devemos corrigi-lo para o viés. Assim, ele fica:
$$ t_0 - b \pm z_\alpha \cdot se^\star \\ 2t_0 - t^\star \pm z_\alpha \cdot se^\star$$
CI básico
O CI por percentis geralmente não é recomendado porque tem desempenho ruim em distribuições com caudas estranhas. O CI básico (também chamado de pivotal ou empírico) é bem mais robusto. A ideia é calcular as diferenças entre cada replicação bootstrap e t0 e usar os percentis dessa distribuição. Detalhes completos podem ser encontrados, por exemplo, em All of Statistics, de L. Wasserman.
A fórmula final para o CI básico é:
BCα CI
BCα vem de bias-corrected, accelerated (corrigido para viés e acelerado). A fórmula não é muito complicada, mas é pouco intuitiva, então vou pular. Veja o artigo de Thomas J. DiCiccio e Bradley Efron se quiser os detalhes.
A aceleração citada no nome do método exige usar percentis específicos das realizações bootstrap. Às vezes pode acontecer de esses percentis serem extremos, possivelmente outliers. Nesses casos, o BCα pode ficar instável.
Vamos olhar o CI BCα para a mediana da largura da pétala. No dataset original, essa mediana é exatamente 3.
Obtivemos o CI BCα (2.9, 2.9). Estranho, mas, felizmente, o
Rnos alertou queextreme order statistics used as endpoints. Vamos ver o que aconteceu:A distribuição das realizações bootstrap é atípica. Uma grande maioria delas (mais de 90%) é igual a 3.
Nessa situação, a "aceleração" no método BCα facilmente "salta" para valores extremos. Aqui, o CI por percentis, que serve de base para o CI BCα, é (3, 3.1). Ao expandi-lo "para a esquerda", precisamos usar o percentil 0,002. A expansão "para a direita" também vai ao extremo: percentil 0,997.
Reprodução de resultados
Às vezes, precisamos recriar as reamostragens do bootstrap. Se pudermos usar o
R, isso não é problema: a funçãoset.seedresolve. Reconstituir as reamostragens em outro software é bem mais complicado. Além disso, para R grande, recalcular noRtambém pode não ser uma opção (por falta de tempo, por exemplo).Podemos contornar isso salvando os índices dos elementos do dataset original que formaram cada amostra bootstrap. É exatamente o que a função
boot.arrayfaz (comindices=T).Cada linha é uma amostra bootstrap. Por exemplo, nossa primeira amostra contém os seguintes elementos:
Definindo
indices=F(padrão), teremos a resposta para a pergunta: "Quantas vezes cada elemento do dataset original apareceu em cada amostra bootstrap?". Por exemplo, na primeira amostra: o 1º elemento do dataset apareceu uma vez, o 2º não apareceu, o 3º apareceu uma vez, o 4º duas vezes e assim por diante.Uma tabela como essa permite recriar as realizações bootstrap fora do
R. Ou no próprioRquando não quisermos usarset.seede refazer todos os cálculos.Vamos conferir se os resultados batem:
Sim, são os mesmos!
Se você quiser aprender mais sobre Machine Learning em R, faça o curso Machine Learning Toolbox da DataCamp e confira o tutorial Machine Learning em R para iniciantes.