Processing math: 100%

GABARITO

Instruções

1 Fumantes

  1. Uma amostra aleatória de 86 pessoas inclui 41 fumantes.

    1. Construa um intervalo de confiança de 95% para o percentual de fumantes na população de onde foi coletada a amostra.

      Condições

      • A distribuição da população é normal e n10?

        Não sabemos se a distribuição da população é normal.

      • Caso a distribuição da população não seja conhecida, n30?

        Sim.

      • A amostra é aleatória, representativa da população?

        Supomos que sim.

      • Os valores da amostra são independentes entre si?

        Supomos que sim.

      • O tamanho da amostra é menos do que 10% da população?

        Sim.

      • Há pelo menos 10 fracassos e pelo menos 10 sucessos na amostra?

        Sim.

      Passo a passo

      n <- 86
      sucessos <- 41
      nivel_confianca <- .95
      
      pchapeu <- sucessos / n
      cat('pchapeu =', pchapeu)
      ## pchapeu = 0,4767442
      
      erro_padrao <- sqrt(pchapeu * (1 - pchapeu) / n)
      cat('\nEP =', erro_padrao)
      ## 
      ## EP = 0,05385804
      
      valor_critico <- -qnorm((1 - nivel_confianca)/2)
      cat('\nValor crítico =', valor_critico)
      ## 
      ## Valor crítico = 1,959964
      
      margem_erro <- erro_padrao * valor_critico
      cat('\nME =', margem_erro)
      ## 
      ## ME = 0,1055598
      
      intervalo <- pchapeu + c(-1, 1) * margem_erro
      cat('\nIC = [', intervalo[1], ';', intervalo[2], ']')
      ## 
      ## IC = [ 0,3711844 ; 0,582304 ]

      Graficamente, segundo esta amostra, a distribuição amostral de ˆp é a normal abaixo, com média 0,477 e desvio padrão 0,054. A área preenchida corresponde a 95% de probabilidade:

      Usando a função binom.confint()

      library(binom)
      n <- 86
      sucessos <- 41
      binom.confint(
        sucessos,
        n,
        method = 'asymptotic'
      )
      ABCDEFGHIJ0123456789
       
       
      method
      <chr>
      x
      <dbl>
      n
      <dbl>
      mean
      <dbl>
      lower
      <dbl>
      upper
      <dbl>
      1asymptotic41860,47674420,37118440,582304
    2. Faça um teste de hipóteses para avaliar a afirmação de que o percentual de fumantes na população é diferente de 50%. Use α=0,05.

      Condições

      Já foram verificadas no item anterior.

      Hipóteses

      H0:p=0,5

      HA:p0,5

      Passo a passo

      n <- 86
      sucessos <- 41
      
      # Valor de p na hipótese nula
      pzero <- .5
      
      # Supondo a hipótese nula
      erro_padrao <- sqrt(pzero * (1 - pzero) / n)
      cat('\nEP =', erro_padrao)
      ## 
      ## EP = 0,05391639
      
      pchapeu <- sucessos / n
      cat('\npchapeu =', pchapeu)
      ## 
      ## pchapeu = 0,4767442
      
      # Valor p
      valor_p <- 2 * pnorm(
        pchapeu, 
        mean = pzero, 
        sd = erro_padrao
      )
      cat('\nValor p =', valor_p)
      ## 
      ## Valor p = 0,6662276

      Graficamente, o valor p corresponde à área em vermelho abaixo da seguinte distribuição normal, com média 0,500 e desvio padrão 0,054:

      Note que esta é a distribuição amostral de ˆp supondo que H0 é verdadeira; sua média é 0,5, diferente da distribuição amostral de ˆp baseada na amostra que temos, desenhada acima, cuja média era 0,477.

      Como o valor p (0,666) é muito maior do que α (0,05), não temos evidência para rejeitar H0.

      Usando a função prop.test()

      n <- 86
      sucessos <- 41
      
      prop.test(sucessos, n, p = .5, correct = FALSE)
      ## 
      ##    1-sample proportions test without continuity correction
      ## 
      ## data:  sucessos out of n, null probability 0.5
      ## X-squared = 0,18605, df = 1, p-value = 0,6662
      ## alternative hypothesis: true p is not equal to 0,5
      ## 95 percent confidence interval:
      ##  0,3744554 0,5810217
      ## sample estimates:
      ##         p 
      ## 0,4767442

2 Graduação em 4 anos

  1. Qual o tamanho mínimo da amostra necessária para estimar, com um nível de confiança de 95% e uma margem de erro de 0,05 (5 pontos percentuais), a proporção de alunos universitários que completam a graduação em 4 anos ou menos? Nada mais é sabido sobre a população.

    Explique por que você escolheu o valor de ˆp que você escolheu.

    Quando construímos um intervalo de confiança com nível de confiança de 95%, a margem de erro é calculada como

    ME=zˆp(1ˆp)n

    onde z= -qnorm((1 - .95)/2) 1,96.

    Se isolarmos n, chegamos a

    n=ˆp(1ˆp)(zME)2

    Não sabemos o valor de ˆp. Vamos pensar no maior n possível, que corresponde a ˆp=0,5. Então,

    n=ˆp(1ˆp)(zME)2=0,50,5(1,960,05)2385

    Ou seja, na pior das hipóteses, vamos precisar de uma amostra de 385 ou mais pessoas.

  2. Em uma amostra de 400 alunos universitários, 150 completaram a graduação em 4 anos ou menos. Teste a afirmação de que, na população, menos de 40% dos alunos universitários completam a graduação neste tempo.

    Condições

    • A distribuição da população é normal e n10?

      Não sabemos se a distribuição da população é normal.

    • Caso a distribuição da população não seja conhecida, n30?

      Sim.

    • A amostra é aleatória, representativa da população?

      Supomos que sim.

    • Os valores da amostra são independentes entre si?

      Supomos que sim.

    • O tamanho da amostra é menos do que 10% da população?

      Sim.

    • Há pelo menos 10 fracassos e pelo menos 10 sucessos na amostra?

      Sim.

    Hipóteses

    H0:p0,4

    HA:p<0,4

    Passo a passo

    n <- 400
    sucessos <- 150
    
    # Valor de p na hipótese nula
    pzero <- .4
    
    # Supondo a hipótese nula
    erro_padrao <- sqrt(pzero * (1 - pzero) / n)
    cat('\nEP =', erro_padrao)
    ## 
    ## EP = 0,0244949
    
    pchapeu <- sucessos / n
    cat('\npchapeu =', pchapeu)
    ## 
    ## pchapeu = 0,375
    
    # Valor p
    valor_p <- pnorm(
      pchapeu, 
      mean = pzero, 
      sd = erro_padrao
    )
    cat('\nValor p =', valor_p)
    ## 
    ## Valor p = 0,1537171

    Graficamente, o valor p corresponde à área em vermelho abaixo da seguinte distribuição normal, com média 0,400 e desvio padrão 0,024:

    Como o valor p (0,154) é maior do que α (0,05), não temos evidência para rejeitar H0.

    Como a hipótese alternativa é HA:p<0,4, o teste é unilateral.

    Usando a função prop.test()

    n <- 400
    sucessos <- 150
    
    prop.test(sucessos, n, p = .4, alternative = 'less', correct = FALSE)
    ## 
    ##   1-sample proportions test without continuity correction
    ## 
    ## data:  sucessos out of n, null probability 0.4
    ## X-squared = 1,0417, df = 1, p-value = 0,1537
    ## alternative hypothesis: true p is less than 0,4
    ## 95 percent confidence interval:
    ##  0,0000000 0,4155303
    ## sample estimates:
    ##     p 
    ## 0,375

3 Estimativa do tamanho de uma multidão1

Observe a foto abaixo, que mostra parte de uma multidão. A quantidade de pessoas em cada setor quadrado foi estimada por um algoritmo.

Os valores obtidos para os setores da foto foram

setores <- c(
  200, 400, 800, 1000, 400, 800, 700, 1000, 400, 200, 700, 900, 400, 400, 700, 900,  
  600, 700, 900, 650, 672, 700, 900, 450, 566, 700, 900
)
  1. Construa um intervalo de confiança de 95% para a quantidade média de pessoas por setor na multidão inteira (inclusive as partes que não aparecem na foto).

    A população consiste de todas as quantidades de pessoas por setor na multidão inteira.

    O vetor setores é uma amostra.

    Como não sabemos o desvio padrão da população, vamos usar o teste t para estimar a média de pessoas por setor.

    Condições

    • A amostra é aleatória, representativa da população?

      Supomos que sim.

    • Os valores da amostra são independentes entre si?

      Supomos que sim.

    • A amostra vem de uma população aproximadamente normal?

      Podemos fazer um teste de normalidade:

      setores %>% shapiro.test()
      ## 
      ##    Shapiro-Wilk normality test
      ## 
      ## data:  .
      ## W = 0,93376, p-value = 0,08547

      O valor p acima de 0,05 é evidência de que os dados seguem uma distribuição normal.

      Podemos fazer um histograma:

      tibble(n = setores) %>% 
        ggplot(aes(n)) +
          geom_histogram(bins = 5) +
          labs(y = NULL)

      A forma do histograma é aproximadamente normal.

    Passo a passo

    n = length(setores)
    cat('n =', n)
    ## n = 27
    
    xbarra <- mean(setores)
    cat('\nMédia amostral =', xbarra)
    ## 
    ## Média amostral = 653,2593
    
    s <- sd(setores)
    cat('\nDesvio padrão amostral =', s)
    ## 
    ## Desvio padrão amostral = 230,7807
    
    erro_padrao <- s / sqrt(n)
    cat('\nEP =', erro_padrao)
    ## 
    ## EP = 44,41377
    
    gl <- n - 1
    cat('\nGraus de liberdade = ', gl)
    ## 
    ## Graus de liberdade =  26
    
    nivel_confianca <- .95
    valor_critico <- -qt((1 - nivel_confianca)/2, df = gl)
    cat('\nValor crítico =', valor_critico)
    ## 
    ## Valor crítico = 2,055529
    
    margem_erro <- erro_padrao * valor_critico
    cat('\nME =', margem_erro)
    ## 
    ## ME = 91,29381
    
    intervalo <- xbarra + c(-1, 1) * margem_erro
    cat('\nIC = [', intervalo[1], ';', intervalo[2], ']')
    ## 
    ## IC = [ 561,9654 ; 744,5531 ]

    Graficamente, o intervalo de confiança corresponde à área em vermelho abaixo da seguinte distribuição t, com 26 graus de liberdade:

    Observe que esta distribuição t corresponde à variável padronizada

    xˉxs/n

    Trabalhamos com esta variável padronizada porque a distribuição t sempre tem média zero.

    Aqui, cada valor no eixo x corresponde ao número de desvios padrão acima ou abaixo da média.

    De fato, o limite inferior da área preenchida corresponde a

    (intervalo[1] - xbarra) / erro_padrao
    ## [1] -2,055529

    e o limite superior da área preenchida corresponde a

    (intervalo[2] - xbarra) / erro_padrao
    ## [1] 2,055529

    Usando a função t.test()

    t.test(x = setores)
    ## 
    ##  One Sample t-test
    ## 
    ## data:  setores
    ## t = 14,708, df = 26, p-value = 0,00000000000004076
    ## alternative hypothesis: true mean is not equal to 0
    ## 95 percent confidence interval:
    ##  561,9654 744,5531
    ## sample estimates:
    ## mean of x 
    ##  653,2593
  2. Usando o resultado do item anterior e considerando que a multidão inteira cobre 50 setores, construa um intervalo de confiança para o total de pessoas na multidão.

    Basta multiplicar os valores do intervalo de confiança por 50:

    intervalo * 50
    ## [1] 28098,27 37227,65
  3. Faça um teste de hipóteses para avaliar a afirmação de que a multidão inteira consiste de mais de 35 mil pessoas. Use α=0,05.

    A multidão inteira ter 35 mil pessoas equivale a

    μ=35.00050=700

    onde μ é a média de pessoas por setor.

    Antes de fazer qualquer cálculo, percebemos que o valor 700 está dentro do intervalo de confiança de 95% para a média de pessoas por setor.

    Isto significa que a hipótese de nulidade não vai ser rejeitada.

    Condições

    Já foram verificadas em um item anterior.

    Hipóteses

    H0:μ700

    HA:μ>700

    Passo a passo

    n <- length(setores)
    cat('n =', n)
    ## n = 27
    
    s <- sd(setores)
    cat('\nDesvio padrão amostral =', s)
    ## 
    ## Desvio padrão amostral = 230,7807
    
    xbarra <- mean(setores)
    cat('\nMédia amostral =', xbarra)
    ## 
    ## Média amostral = 653,2593
    
    # Valor de μ na hipótese nula
    mizero <- 700
    
    # Supondo a hipótese nula 
    erro_padrao <- s / sqrt(n)
    cat('\nEP =', erro_padrao)
    ## 
    ## EP = 44,41377
    
    # Média amostral padronizada (supondo a hipótese nula)
    tzero <- (xbarra - mizero) / erro_padrao
    cat('\ntzero =', tzero)
    ## 
    ## tzero = -1,052393
    
    # Graus de liberdade
    gl <- n - 1
    
    # Valor p
    valor_p <- pt(
      tzero, 
      df = gl,
      lower.tail = FALSE
    )
    cat('\nValor p =', valor_p)
    ## 
    ## Valor p = 0,8488489

    Como o valor p (0,849) é muito maior do que α (0,05), não temos evidência para rejeitar H0.

    Graficamente, o valor p corresponde à área em vermelho abaixo da seguinte distribuição t, com 26 graus de liberdade, que corresponde à variável padronizada

    xˉxs/n

    Como a hipótese alternativa é HA:μ>700, o teste é unilateral.

    Usando a função t.test()

    t.test(x = setores, alternative = 'greater', mu = mizero)
    ## 
    ##  One Sample t-test
    ## 
    ## data:  setores
    ## t = -1,0524, df = 26, p-value = 0,8488
    ## alternative hypothesis: true mean is greater than 700
    ## 95 percent confidence interval:
    ##  577,5063      Inf
    ## sample estimates:
    ## mean of x 
    ##  653,2593

4 Pulsação média de mulheres

  1. Qual o tamanho mínimo da amostra necessária para estimar, com um nível de confiança de 95% e uma margem de erro de 2 batimentos por minuto (bpm), a pulsação média de mulheres adultas? De estudos anteriores, podemos usar a informação de que o desvio padrão da população é σ=12,54 bpm.

    Quando construímos um intervalo de confiança com nível de confiança de 95%, a margem de erro é calculada como

    ME=zσn

    onde z= -qnorm((1 - .95)/2) 1,96.

    Se isolarmos n, chegamos a

    n=(zσME)2

    Substituindo os valores que temos:

    n=(1,9612,542)2152

    Vamos precisar de uma amostra de 152 ou mais pessoas.

  2. O vetor pulsacao contém os valores das pulsações (em bpm) de diversas mulheres.

    pulsacao <- c(
      80, 94, 58, 66, 56, 82, 78, 86, 88, 56, 36, 66, 84, 76, 78, 64, 66, 
      78, 60, 64, 84, 82, 70, 74, 86, 90, 88, 90, 90, 94, 68, 90, 82, 80, 74, 
      56, 100, 74, 76, 76, 86, 74, 66, 62, 78, 68, 62, 62, 74, 104, 54, 74, 
      74, 84, 60, 52, 84, 66, 56, 66, 84, 64, 64, 78, 104, 84, 84, 62, 82, 64, 
      78, 76, 86, 72, 82, 82, 66, 58, 62, 80, 58, 82, 76, 70, 88, 44, 58, 64, 
      68, 70, 58, 72, 80, 70, 74, 72, 66, 82, 98, 74, 80, 82, 56, 78, 100, 56, 
      68, 72, 64, 94, 72, 56, 80, 76, 56, 56, 54, 72, 70, 80, 72, 62, 96, 72, 
      60, 98, 72, 80, 84, 68, 86, 72, 80, 64, 82, 80, 62, 74, 96, 72, 96, 64, 
      62, 82, 76, 94, 74
    )
  3. Teste a afirmação de que a pulsação média de mulheres adultas é menor do que 70 bpm. Use α=0,05. Use o fato de que σ=12,54 bpm.

    Condições

    Como temos o valor do desvio padrão da população, podemos usar o teste z, cujas condições são:

    • A amostra é aleatória, representativa da população?

      Supomos que sim.

    • Os valores da amostra são independentes entre si?

      Supomos que sim.

    • O tamanho da amostra é menor do que 10% da população?

      A população é o conjunto de todas as mulheres adultas (da cidade? do país?)

      Nossa amostra tem 147, que é menos do que 10% da população.

    Hipóteses

    H0:μ70

    HA:μ<70

    Passo a passo

    n <- length(pulsacao)
    cat('n =', n)
    ## n = 147
    
    xbarra <- mean(pulsacao)
    cat('\nMédia amostral =', xbarra)
    ## 
    ## Média amostral = 74,04082
    
    # Desvio padrão da população (dado)
    sigma <- 12.54
    
    # Valor de μ na hipótese nula
    mizero <- 70
    
    erro_padrao <- sigma / sqrt(n)
    cat('\nEP =', erro_padrao)
    ## 
    ## EP = 1,034282
    
    # Valor p
    valor_p <- pnorm(
      xbarra, 
      mean = mizero,
      sd = erro_padrao
    )
    cat('\nValor p =', valor_p)
    ## 
    ## Valor p = 0,9999533

    Como o valor p (1,000) é muito maior do que α (0,05), não temos evidência para rejeitar H0.

    Na verdade, como a média da amostra é maior do que 70bpm, esta amostra não ajuda a refutar a hipótese de nulidade, que diz que μ<70.

    Além disso, o valor baixo do erro padrão diz que as amostras não variam muito em suas médias; ou seja, esta é uma amostra típica.

    Por isso, é praticamente impossível refutar a hipótese de nulidade com esta amostra.

    Graficamente, o valor p corresponde à área em vermelho abaixo da normal na seguinte figura. Perceba como a área à esquerda do valor de ˉx=74,041 é praticamente 100% da área inteira abaixo da curva:

    Como a hipótese alternativa é HA:μ<70, o teste é unilateral.

    Usando a função z.test()

    library(BSDA)
    ## Loading required package: lattice
    z.test(
      pulsacao,
      alternative = 'less',
      mu = 70,
      sigma.x = sigma
    )
    ## 
    ##  One-sample z-Test
    ## 
    ## data:  pulsacao
    ## z = 3,9069, p-value = 1
    ## alternative hypothesis: true mean is less than 70
    ## 95 percent confidence interval:
    ##        NA 75,74206
    ## sample estimates:
    ## mean of x 
    ##  74,04082
  4. Refaça o item anterior sem usar o fato de que σ=12,54 bpm.

    Condições

    Como agora não temos o desvio padrão da população, precisamos fazer um teste t, cujas condições são:

    • A amostra é aleatória, representativa da população?

      Supomos que sim.

    • Os valores da amostra são independentes entre si?

      Supomos que sim.

    • A amostra vem de uma população aproximadamente normal?

      Podemos fazer um teste de normalidade:

      pulsacao %>% shapiro.test()
      ## 
      ##    Shapiro-Wilk normality test
      ## 
      ## data:  .
      ## W = 0,98912, p-value = 0,3102

      O valor p acima de 0,05 é evidência de que os dados seguem uma distribuição normal.

      Podemos fazer um histograma:

      tibble(n = pulsacao) %>% 
        ggplot(aes(n)) +
          geom_histogram(bins = 9) +
          labs(y = NULL)

      A forma do histograma é aproximadamente normal.

    Hipóteses

    H0:μ70

    HA:μ<70

    Passo a passo

    n <- length(pulsacao)
    cat('n =', n)
    ## n = 147
    
    s <- sd(pulsacao)
    cat('\nDesvio padrão amostral =', s)
    ## 
    ## Desvio padrão amostral = 12,54356
    
    xbarra <- mean(pulsacao)
    cat('\nMédia amostral =', xbarra)
    ## 
    ## Média amostral = 74,04082
    
    # Valor de μ na hipótese nula
    mizero <- 70
    
    # Supondo a hipótese nula 
    erro_padrao <- s / sqrt(n)
    cat('\nEP =', erro_padrao)
    ## 
    ## EP = 1,034575
    
    # Média amostral padronizada (supondo a hipótese nula)
    tzero <- (xbarra - mizero) / erro_padrao
    cat('\ntzero =', tzero)
    ## 
    ## tzero = 3,905774
    
    # Graus de liberdade
    gl <- n - 1
    cat('\ngl =', gl)
    ## 
    ## gl = 146
    
    # Valor p
    valor_p <- pt(
     tzero, 
     df = gl
    )
    cat('\nValor p =', valor_p)
    ## 
    ## Valor p = 0,9999284

    Como o valor p (1,000) é muito maior do que α (0,05), não temos evidência para rejeitar H0.

    Graficamente, o valor p corresponde à área em vermelho abaixo da seguinte distribuição t, com 146 graus de liberdade, que corresponde à variável padronizada

    xˉxs/n

    Trabalhamos com esta variável padronizada porque a distribuição t sempre tem média zero.

    Aqui, cada valor no eixo x corresponde ao número de desvios padrão acima ou abaixo da média.

    Como a hipótese alternativa é HA:μ<70, o teste é unilateral.

    Usando a função t.test()

    t.test(x = pulsacao, alternative = 'less', mu = mizero)
    ## 
    ##  One Sample t-test
    ## 
    ## data:  pulsacao
    ## t = 3,9058, df = 146, p-value = 0,9999
    ## alternative hypothesis: true mean is less than 70
    ## 95 percent confidence interval:
    ##      -Inf 75,75341
    ## sample estimates:
    ## mean of x 
    ##  74,04082
  5. Compare e comente os resultados.

    Observe que

    • O desvio padrão populacional σ=12,540 é bem próximo do desvio padrão amostral s=12,544.

    • Com 146 graus de liberdade, a distribuição t é muito próxima da normal padrão:

    Estas semelhanças tornam os cálculos dos valores p bem parecidos, tanto no teste z quanto no teste t.

5 PlayStations com bootstrapping

Em uma amostra A de 200 pessoas, 124 possuem um PlayStation.

O método de bootstrapping consiste em simular muitas amostras — com reposição — a partir dos elementos desta amostra original A. A partir destas muitas amostras simuladas, você pode calcular intervalos de confiança como explicado abaixo:

  1. Armazene, em uma lista, 10 mil amostras, cada uma com 200 pessoas sorteadas com reposição a partir da amostra original A acima (com todas as 200 pessoas tendo a mesma probabilidade de sorteio).

    Poderíamos criar um vetor com os 200 elementos da amostra original para passar para a função sample:

    amostra_original <- rep(c(TRUE, FALSE), c(124, 76))

    Mas podemos pensar de outro modo: ao escolhermos um elemento da amostra original, a probabilidade de obtermos TRUE é igual a 124/200.

    Ou seja, sortear 200 pessoas desta amostra com reposição equivale a sortear 200 valores booleanos, com TRUE tendo probabilidade 124/200 de ser sorteado a cada vez:

    n_amostras <- 1e4
    n <- 200
    sucessos <- 124
    p <- sucessos / n
    
    sortear_amostra_bool <- function(n, p) {
    
      sample(c(TRUE, FALSE), n, replace = TRUE, prob = c(p, 1 - p))
    
    }

    Para construir a lista de 10 mil amostras:

    amostras <- replicate(
      n_amostras, 
      sortear_amostra_bool(n, p),
      simplify = FALSE
    )

    Vamos examinar a lista gerada:

    str(amostras)
    ## List of 10000
    ##  $ : logi [1:200] FALSE FALSE TRUE TRUE ...
    ##  $ : logi [1:200] TRUE TRUE FALSE TRUE ...
    ##  $ : logi [1:200] TRUE FALSE TRUE TRUE ...
    ##  $ : logi [1:200] FALSE TRUE FALSE TRUE ...
    ##  $ : logi [1:200] TRUE FALSE FALSE TRUE ...
    ##  $ : logi [1:200] TRUE FALSE FALSE FALSE ...
    ##  $ : logi [1:200] TRUE TRUE FALSE TRUE ...
    ##  $ : logi [1:200] TRUE TRUE FALSE FALSE ...
    ##  $ : logi [1:200] FALSE TRUE TRUE TRUE ...
    ##  $ : logi [1:200] TRUE TRUE TRUE FALSE ...
    ##  $ : logi [1:200] FALSE FALSE TRUE FALSE ...
    ##  $ : logi [1:200] TRUE FALSE TRUE TRUE ...
    ##  $ : logi [1:200] TRUE TRUE FALSE TRUE ...
    ##  $ : logi [1:200] FALSE TRUE TRUE TRUE ...
    ##  $ : logi [1:200] TRUE FALSE TRUE FALSE ...
    ##  $ : logi [1:200] TRUE TRUE TRUE FALSE ...
    ##  $ : logi [1:200] TRUE FALSE FALSE TRUE ...
    ##  $ : logi [1:200] TRUE TRUE FALSE TRUE ...
    ##  $ : logi [1:200] FALSE FALSE TRUE TRUE ...
    ##  $ : logi [1:200] TRUE FALSE FALSE TRUE ...
    ##  $ : logi [1:200] FALSE TRUE FALSE TRUE ...
    ##  $ : logi [1:200] TRUE TRUE FALSE TRUE ...
    ##  $ : logi [1:200] TRUE TRUE FALSE TRUE ...
    ##  $ : logi [1:200] TRUE TRUE FALSE FALSE ...
    ##  $ : logi [1:200] TRUE FALSE TRUE TRUE ...
    ##  $ : logi [1:200] TRUE FALSE TRUE FALSE ...
    ##  $ : logi [1:200] TRUE TRUE TRUE TRUE ...
    ##  $ : logi [1:200] TRUE FALSE FALSE TRUE ...
    ##  $ : logi [1:200] TRUE TRUE FALSE FALSE ...
    ##  $ : logi [1:200] TRUE TRUE FALSE TRUE ...
    ##  $ : logi [1:200] FALSE TRUE TRUE TRUE ...
    ##  $ : logi [1:200] TRUE FALSE FALSE TRUE ...
    ##  $ : logi [1:200] FALSE TRUE TRUE TRUE ...
    ##  $ : logi [1:200] FALSE FALSE FALSE TRUE ...
    ##  $ : logi [1:200] FALSE FALSE TRUE TRUE ...
    ##  $ : logi [1:200] FALSE TRUE TRUE TRUE ...
    ##  $ : logi [1:200] TRUE FALSE FALSE TRUE ...
    ##  $ : logi [1:200] TRUE TRUE FALSE TRUE ...
    ##  $ : logi [1:200] FALSE TRUE TRUE TRUE ...
    ##  $ : logi [1:200] FALSE TRUE TRUE TRUE ...
    ##  $ : logi [1:200] FALSE TRUE TRUE FALSE ...
    ##  $ : logi [1:200] FALSE FALSE FALSE FALSE ...
    ##  $ : logi [1:200] TRUE FALSE TRUE TRUE ...
    ##  $ : logi [1:200] TRUE FALSE TRUE FALSE ...
    ##  $ : logi [1:200] FALSE TRUE TRUE TRUE ...
    ##  $ : logi [1:200] FALSE TRUE TRUE FALSE ...
    ##  $ : logi [1:200] TRUE FALSE TRUE TRUE ...
    ##  $ : logi [1:200] TRUE TRUE TRUE TRUE ...
    ##  $ : logi [1:200] TRUE FALSE TRUE TRUE ...
    ##  $ : logi [1:200] TRUE TRUE TRUE TRUE ...
    ##  $ : logi [1:200] TRUE TRUE TRUE FALSE ...
    ##  $ : logi [1:200] TRUE FALSE FALSE FALSE ...
    ##  $ : logi [1:200] TRUE FALSE TRUE TRUE ...
    ##  $ : logi [1:200] TRUE TRUE TRUE TRUE ...
    ##  $ : logi [1:200] TRUE FALSE TRUE TRUE ...
    ##  $ : logi [1:200] TRUE TRUE FALSE TRUE ...
    ##  $ : logi [1:200] TRUE TRUE TRUE TRUE ...
    ##  $ : logi [1:200] FALSE FALSE TRUE TRUE ...
    ##  $ : logi [1:200] FALSE TRUE FALSE FALSE ...
    ##  $ : logi [1:200] FALSE TRUE TRUE FALSE ...
    ##  $ : logi [1:200] TRUE TRUE FALSE FALSE ...
    ##  $ : logi [1:200] TRUE TRUE FALSE FALSE ...
    ##  $ : logi [1:200] FALSE TRUE FALSE FALSE ...
    ##  $ : logi [1:200] FALSE FALSE FALSE FALSE ...
    ##  $ : logi [1:200] FALSE TRUE TRUE TRUE ...
    ##  $ : logi [1:200] TRUE TRUE TRUE FALSE ...
    ##  $ : logi [1:200] TRUE FALSE FALSE FALSE ...
    ##  $ : logi [1:200] TRUE FALSE TRUE TRUE ...
    ##  $ : logi [1:200] TRUE TRUE FALSE TRUE ...
    ##  $ : logi [1:200] TRUE TRUE TRUE TRUE ...
    ##  $ : logi [1:200] TRUE TRUE TRUE FALSE ...
    ##  $ : logi [1:200] TRUE FALSE FALSE TRUE ...
    ##  $ : logi [1:200] TRUE FALSE TRUE TRUE ...
    ##  $ : logi [1:200] TRUE FALSE FALSE FALSE ...
    ##  $ : logi [1:200] TRUE TRUE TRUE TRUE ...
    ##  $ : logi [1:200] TRUE TRUE TRUE TRUE ...
    ##  $ : logi [1:200] FALSE FALSE TRUE TRUE ...
    ##  $ : logi [1:200] FALSE FALSE FALSE FALSE ...
    ##  $ : logi [1:200] TRUE TRUE TRUE FALSE ...
    ##  $ : logi [1:200] TRUE TRUE FALSE FALSE ...
    ##  $ : logi [1:200] TRUE FALSE TRUE FALSE ...
    ##  $ : logi [1:200] FALSE TRUE FALSE FALSE ...
    ##  $ : logi [1:200] FALSE TRUE TRUE TRUE ...
    ##  $ : logi [1:200] FALSE FALSE TRUE FALSE ...
    ##  $ : logi [1:200] TRUE FALSE FALSE TRUE ...
    ##  $ : logi [1:200] TRUE TRUE TRUE TRUE ...
    ##  $ : logi [1:200] TRUE TRUE TRUE TRUE ...
    ##  $ : logi [1:200] TRUE TRUE FALSE TRUE ...
    ##  $ : logi [1:200] TRUE TRUE FALSE FALSE ...
    ##  $ : logi [1:200] TRUE TRUE FALSE TRUE ...
    ##  $ : logi [1:200] FALSE FALSE TRUE TRUE ...
    ##  $ : logi [1:200] TRUE FALSE TRUE TRUE ...
    ##  $ : logi [1:200] TRUE TRUE TRUE FALSE ...
    ##  $ : logi [1:200] TRUE FALSE TRUE TRUE ...
    ##  $ : logi [1:200] TRUE TRUE FALSE TRUE ...
    ##  $ : logi [1:200] TRUE TRUE FALSE TRUE ...
    ##  $ : logi [1:200] TRUE FALSE TRUE FALSE ...
    ##  $ : logi [1:200] TRUE TRUE FALSE TRUE ...
    ##  $ : logi [1:200] TRUE FALSE FALSE TRUE ...
    ##   [list output truncated]
  2. Armazene, em um vetor de 10 mil elementos, as proporções de possuidores de PlayStations nas amostras obtidas no item anterior.

    Lembre-se de que calcular a proporção de valores TRUE em um vetor booleano equivale a calcular a média (já que TRUE é visto como 1, e FALSE é visto como 0).

    As funções da família map aplicam uma operação (aqui, a média) a cada elemento de um vetor, retornando uma lista. Veja ?purrr::map para mais detalhes sobre programação funcional em R.

    proporcoes <- amostras %>% 
      map_dbl(~mean(.))
    str(proporcoes)
    ##  num [1:10000] 0,615 0,68 0,59 0,615 0,635 0,61 0,575 0,63 ...
  3. Imprima os valores deste vetor que estão no quantil 0,05 e no quantil 0,95. Estes são os extremos do intervalo de confiança para a proporção de possuidores de PlayStations na população, com 95% de confiança, calculados via bootstrapping.

    Uma das vantagens do bootstrapping é não precisar de qualquer conhecimento sobre a população — sua distribuição, sua variância etc.

    ic_bs <- proporcoes %>% 
      quantile(c(.05, .95))
    
    ic_bs
    ##    5%   95% 
    ## 0,565 0,675
  4. Use a função prop.test() do R para construir um intervalo de confiança para a proporção de possuidores de PlayStations na população, com 95% de confiança — não é necessário fazer os cálculos passo a passo.

    ic_teste <- prop.test(sucessos, n, correct = FALSE)$conf.int
    ic_teste
    ## [1] 0,5510672 0,6844099
    ## attr(,"conf.level")
    ## [1] 0,95
  5. Compare com o resultado do bootstrapping.

    Os centros dos intervalos são

    • Bootstrap: 0,620

    • Teste: 0,618

    Os extremos de um intervalo são próximos dos extremos do outro intervalo.

    Como o bootstrapping consiste em sortear elementos da amostra original, os resultados podem ser diferentes a cada execução, mas os resultados costumam ser próximos aos dos testes paramétricos — como prop.test.

    Se tomarmos uma quantidade maior de amostras — aqui, foram 10 mil — a precisão melhorará mais ainda. Experimente.

6 Telefones celulares com bootstrapping

Uma amostra das quantidades de radiação emitidas por telefones celulares consiste dos seguintes valores:

radiacao <- c(38, 55, 86, 91, 99, 103, 145)

O método de bootstrapping consiste em simular muitas amostras — com reposição — a partir dos elementos desta amostra original. A partir destas muitas amostras simuladas, você pode calcular intervalos de confiança como explicado abaixo:

  1. Armazene, em uma lista, 10 mil amostras, cada uma com 7 elementos sorteados com reposição a partir do vetor radiacao (com todos os elementos tendo a mesma probabilidade de sorteio).

    n_amostras <- 1e4
    n <- length(radiacao)
    amostras <- replicate(
      n_amostras, 
      sample(radiacao, n, replace = TRUE),
      simplify = FALSE
    )

    Vamos examinar a lista gerada:

    str(amostras)
    ## List of 10000
    ##  $ : num [1:7] 91 103 86 99 86 99 55
    ##  $ : num [1:7] 145 55 99 38 86 38 86
    ##  $ : num [1:7] 86 86 99 55 99 145 38
    ##  $ : num [1:7] 103 55 86 38 86 145 38
    ##  $ : num [1:7] 55 145 86 86 99 91 145
    ##  $ : num [1:7] 145 55 103 145 55 145 145
    ##  $ : num [1:7] 86 99 55 99 99 86 99
    ##  $ : num [1:7] 99 55 99 91 86 91 103
    ##  $ : num [1:7] 91 38 99 86 103 99 145
    ##  $ : num [1:7] 86 55 91 38 91 91 86
    ##  $ : num [1:7] 38 145 99 55 103 99 55
    ##  $ : num [1:7] 99 86 145 55 103 99 91
    ##  $ : num [1:7] 38 103 99 86 99 38 145
    ##  $ : num [1:7] 38 55 103 86 86 86 99
    ##  $ : num [1:7] 38 86 91 103 38 86 103
    ##  $ : num [1:7] 145 38 103 38 145 103 38
    ##  $ : num [1:7] 86 91 103 55 103 86 55
    ##  $ : num [1:7] 55 55 55 91 103 86 38
    ##  $ : num [1:7] 86 86 38 145 86 38 86
    ##  $ : num [1:7] 99 99 145 91 86 55 103
    ##  $ : num [1:7] 86 38 91 91 38 145 86
    ##  $ : num [1:7] 99 38 55 38 91 103 103
    ##  $ : num [1:7] 38 145 55 91 103 38 99
    ##  $ : num [1:7] 91 38 86 91 99 55 38
    ##  $ : num [1:7] 38 38 145 55 86 145 91
    ##  $ : num [1:7] 145 91 145 103 103 91 55
    ##  $ : num [1:7] 86 103 86 99 86 99 55
    ##  $ : num [1:7] 145 38 103 55 86 38 99
    ##  $ : num [1:7] 103 103 86 86 103 91 91
    ##  $ : num [1:7] 103 103 38 86 91 103 38
    ##  $ : num [1:7] 91 38 38 38 145 145 99
    ##  $ : num [1:7] 86 55 55 38 99 145 91
    ##  $ : num [1:7] 86 55 91 91 91 86 38
    ##  $ : num [1:7] 103 86 86 91 145 103 86
    ##  $ : num [1:7] 145 55 145 103 55 86 99
    ##  $ : num [1:7] 86 91 38 145 55 145 38
    ##  $ : num [1:7] 99 55 99 99 86 103 99
    ##  $ : num [1:7] 55 145 103 103 86 99 86
    ##  $ : num [1:7] 145 145 145 99 91 99 99
    ##  $ : num [1:7] 91 145 55 145 145 91 91
    ##  $ : num [1:7] 103 99 38 91 38 86 91
    ##  $ : num [1:7] 145 91 103 86 38 55 145
    ##  $ : num [1:7] 91 38 55 103 99 38 91
    ##  $ : num [1:7] 55 38 103 38 145 55 145
    ##  $ : num [1:7] 91 38 103 103 86 55 55
    ##  $ : num [1:7] 55 99 145 99 38 103 91
    ##  $ : num [1:7] 38 103 86 103 38 99 145
    ##  $ : num [1:7] 103 145 38 91 86 38 103
    ##  $ : num [1:7] 38 86 99 86 38 103 86
    ##  $ : num [1:7] 145 103 91 91 99 99 38
    ##  $ : num [1:7] 86 103 145 86 86 86 55
    ##  $ : num [1:7] 91 103 55 99 99 103 91
    ##  $ : num [1:7] 86 145 91 55 145 38 38
    ##  $ : num [1:7] 99 91 86 91 145 99 145
    ##  $ : num [1:7] 55 103 99 99 145 86 145
    ##  $ : num [1:7] 99 103 91 55 55 91 103
    ##  $ : num [1:7] 145 91 55 38 91 55 55
    ##  $ : num [1:7] 38 99 99 86 38 91 99
    ##  $ : num [1:7] 91 38 38 91 55 55 86
    ##  $ : num [1:7] 55 145 86 99 99 86 91
    ##  $ : num [1:7] 86 38 86 86 55 99 103
    ##  $ : num [1:7] 86 145 91 91 91 99 55
    ##  $ : num [1:7] 103 38 86 145 38 91 91
    ##  $ : num [1:7] 86 145 55 86 103 55 99
    ##  $ : num [1:7] 99 86 55 38 38 38 99
    ##  $ : num [1:7] 145 91 91 91 99 86 103
    ##  $ : num [1:7] 55 145 91 38 145 145 99
    ##  $ : num [1:7] 55 91 38 38 38 55 103
    ##  $ : num [1:7] 38 145 99 145 145 99 55
    ##  $ : num [1:7] 55 55 55 86 103 55 86
    ##  $ : num [1:7] 103 145 145 86 91 145 91
    ##  $ : num [1:7] 99 86 55 103 38 86 55
    ##  $ : num [1:7] 145 99 38 145 55 38 86
    ##  $ : num [1:7] 55 91 91 99 99 91 86
    ##  $ : num [1:7] 55 145 86 99 145 103 86
    ##  $ : num [1:7] 86 99 91 86 145 103 55
    ##  $ : num [1:7] 86 145 103 145 103 38 86
    ##  $ : num [1:7] 145 99 55 145 103 103 86
    ##  $ : num [1:7] 103 55 99 145 103 103 86
    ##  $ : num [1:7] 55 103 91 55 99 38 145
    ##  $ : num [1:7] 99 145 38 55 99 145 38
    ##  $ : num [1:7] 91 86 91 55 86 99 145
    ##  $ : num [1:7] 38 55 91 55 145 145 55
    ##  $ : num [1:7] 55 55 91 91 99 55 99
    ##  $ : num [1:7] 55 145 99 91 145 103 103
    ##  $ : num [1:7] 55 99 145 91 38 55 91
    ##  $ : num [1:7] 99 145 99 38 145 91 99
    ##  $ : num [1:7] 103 55 145 55 86 103 103
    ##  $ : num [1:7] 103 99 91 86 99 99 86
    ##  $ : num [1:7] 55 38 55 38 103 86 86
    ##  $ : num [1:7] 99 91 38 55 55 91 86
    ##  $ : num [1:7] 103 145 145 38 91 99 91
    ##  $ : num [1:7] 99 38 103 91 145 38 103
    ##  $ : num [1:7] 91 145 55 91 55 91 55
    ##  $ : num [1:7] 103 145 55 38 55 91 103
    ##  $ : num [1:7] 91 86 145 55 145 91 99
    ##  $ : num [1:7] 103 91 91 86 145 86 38
    ##  $ : num [1:7] 86 38 86 55 103 91 38
    ##  $ : num [1:7] 38 91 145 91 38 86 86
    ##   [list output truncated]
  2. Armazene, em um vetor de 10 mil elementos, as médias das amostras obtidas no item anterior.

    As funções da família map aplicam uma operação (aqui, a média) a cada elemento de um vetor, retornando uma lista. Veja ?purrr::map para mais detalhes sobre programação funcional em R.

    medias <- amostras %>% 
      map_dbl(~mean(.))
    str(medias)
    ##  num [1:10000] 88,4 78,1 86,9 78,7 ...
  3. Imprima os valores deste vetor que estão no quantil 0,05 e no quantil 0,95. Estes são os extremos do intervalo de confiança para a radiação média na população, com 95% de confiança, calculados via bootstrapping.

    Uma das vantagens do bootstrapping é não precisar de qualquer conhecimento sobre a população — sua distribuição, sua variância etc.

    ic_bs <- medias %>% 
      quantile(c(.05, .95))
    
    ic_bs
    ##        5%       95% 
    ##  68,57143 108,57143
  4. Use a função t.test() do R para construir um intervalo de confiança para a radiação média, com 95% de confiança — não é necessário fazer os cálculos passo a passo.

    ic_teste <- t.test(radiacao)$conf.int
    ic_teste
    ## [1]  56,11225 120,17346
    ## attr(,"conf.level")
    ## [1] 0,95
  5. Compare com o resultado do bootstrapping.

    Os centros dos intervalos são

    • Bootstrap: 88,571

    • Teste: 88,143

    Os extremos de um intervalo são mais ou menos próximos dos extremos do outro intervalo. Neste exemplo, a amostra original era pequena; se fosse maior, os intervalos seriam mais parecidos.

    Como o bootstrapping consiste em sortear elementos da amostra original, os resultados podem ser diferentes a cada execução, mas os resultados costumam ser próximos aos dos testes paramétricos — como prop.test.

7 Sonhando em cores ou em preto e branco2

Dentre 306 pessoas com mais de 55 anos, 68 disseram que sonham em preto e branco.

Dentre 298 pessoas com menos de 25 anos, 13 disseram que sonham em preto e branco.

  1. Construa um intervalo de confiança de 99% para a diferença entre as duas proporções.

    Condições

    • A distribuição da população é normal e n10?

      Não sabemos se a distribuição da população é normal.

    • Caso a distribuição da população não seja conhecida, n30?

      Sim.

    • As amostras são aleatórias, representativas das populações?

      Supomos que sim.

    • Os valores da amostra são independentes entre si?

      Supomos que sim.

    • O tamanho da amostra é menos do que 10% da população?

      Sim.

    • Há pelo menos 10 fracassos e pelo menos 10 sucessos em cada amostra?

      Sim.

    • Os grupos são independentes?

      Supomos que sim (não são parentes nem de outra forma relacionados).

    Passo a passo

    n1 <- 306
    sucessos1 <- 68
    pchapeu1 <- sucessos1 / n1
    cat('\npchapeu1 =', pchapeu1)
    ## 
    ## pchapeu1 = 0,2222222
    
    n2 <- 298
    sucessos2 <- 13
    pchapeu2 <- sucessos2 / n2
    cat('\npchapeu2 =', pchapeu2)
    ## 
    ## pchapeu2 = 0,04362416
    
    dchapeu <- pchapeu1 - pchapeu2
    cat('\ndchapeu =', dchapeu)
    ## 
    ## dchapeu = 0,1785981
    
    nivel_confianca <- .99
    
    erro_padrao <- sqrt(
      (pchapeu1 * (1 - pchapeu1) / n1) +
      (pchapeu2 * (1 - pchapeu2) / n2)
    )
    cat('\nEP =', erro_padrao)
    ## 
    ## EP = 0,0265488
    
    valor_critico <- -qnorm((1 - nivel_confianca)/2)
    cat('\nValor crítico =', valor_critico)
    ## 
    ## Valor crítico = 2,575829
    
    margem_erro <- erro_padrao * valor_critico
    cat('\nME =', margem_erro)
    ## 
    ## ME = 0,06838517
    
    intervalo <- dchapeu + c(-1, 1) * margem_erro
    cat('\nIC = [', intervalo[1], ';', intervalo[2], ']')
    ## 
    ## IC = [ 0,1102129 ; 0,2469832 ]

    Graficamente, segundo esta amostra, a distribuição amostral de ˆd (a diferença estimada entre as proporções) é a normal abaixo, com média 0,179 e desvio padrão 0,027. A área preenchida corresponde a 99% de probabilidade:

    Usando a função prop.test

    prop.test(
      matrix(
        c(
          sucessos1, sucessos2,
          n1 - sucessos1, n2 - sucessos2
        ),
        ncol = 2
      ),
      conf.level = .99,
      correct = FALSE
    )
    ## 
    ##  2-sample test for equality of proportions without continuity correction
    ## 
    ## data:  matrix(c(sucessos1, sucessos2, n1 - sucessos1, n2 - sucessos2), ncol = 2)
    ## X-squared = 41,471, df = 1, p-value = 0,0000000001197
    ## alternative hypothesis: two.sided
    ## 99 percent confidence interval:
    ##  0,1102129 0,2469832
    ## sample estimates:
    ##     prop 1     prop 2 
    ## 0,22222222 0,04362416
  2. Teste a afirmação de que a proporção de pessoas com mais de 55 anos que sonham em preto e branco é maior do que a proporção de pessoas com menos de 25 anos que sonham em preto e branco. Use α=0,01.

    Como o intervalo de confiança para a diferença entre as proporções, calculado no item anterior, não inclui o zero, e como ˆp1>ˆp2, já sabemos, antes de qualquer cálculo, que a hipótese de nulidade vai ser rejeitada.

    Neste nível de confiança, a amostra é evidência de que a proporção de pessoas com mais de 55 anos que sonham em preto e branco é maior do que a proporção de pessoas com menos de 25 anos que sonham em preto e branco.

    Condições

    Já foram verificadas no item anterior.

    Hipóteses

    H0:p1p20

    HA:p1p2>0

    Passo a passo

    n1 <- 306
    sucessos1 <- 68
    pchapeu1 <- sucessos1 / n1
    cat('\npchapeu1 =', pchapeu1)
    ## 
    ## pchapeu1 = 0,2222222
    
    n2 <- 298
    sucessos2 <- 13
    pchapeu2 <- sucessos2 / n2
    cat('\npchapeu2 =', pchapeu2)
    ## 
    ## pchapeu2 = 0,04362416
    
    dchapeu <- pchapeu1 - pchapeu2
    cat('\ndchapeu =', dchapeu)
    ## 
    ## dchapeu = 0,1785981
    
    # Valor de d (diferença) na hipótese nula
    dzero <- 0
    
    # Supondo a hipótese nula
    pbarra <- (sucessos1 + sucessos2) / (n1 + n2)
    erro_padrao <- sqrt(
      (pbarra * (1 - pbarra) / n1) +
      (pbarra * (1 - pbarra) / n2)
    )
    cat('\nEP =', erro_padrao)
    ## 
    ## EP = 0,02773359
    
    # Valor p
    valor_p <- pnorm(
      dchapeu, 
      mean = dzero, 
      sd = erro_padrao,
      lower.tail = FALSE
    )
    cat('\nValor p =', valor_p)
    ## 
    ## Valor p = 0,00000000005982533

    Graficamente, o valor p corresponde à área em vermelho (praticamente invisível!) abaixo da seguinte distribuição normal, com média 0 e desvio padrão 0,028:

    Como o valor p (0,00000000005983) é muito menor do que α (0,01), temos evidência para rejeitar H0.

    Usando a função prop.test()

    prop.test(
      matrix(
        c(
          sucessos1, sucessos2,
          n1 - sucessos1, n2 - sucessos2
        ),
        ncol = 2
      ),
      alternative = 'greater',
      conf.level = .99,
      correct = FALSE
    )
    ## 
    ##  2-sample test for equality of proportions without continuity correction
    ## 
    ## data:  matrix(c(sucessos1, sucessos2, n1 - sucessos1, n2 - sucessos2), ncol = 2)
    ## X-squared = 41,471, df = 1, p-value = 0,00000000005983
    ## alternative hypothesis: greater
    ## 99 percent confidence interval:
    ##  0,1168363 1,0000000
    ## sample estimates:
    ##     prop 1     prop 2 
    ## 0,22222222 0,04362416

8 Professores × professoras3

Professoras mulheres recebem avaliações melhores do que professores homens?

Em uma universidade, as professoras mulheres receberam as seguintes notas dos alunos:

mulheres <- c(
 4.3, 4.3, 4.4, 4.0, 3.4, 4.7, 2.9, 4.0, 4.3, 3.4, 3.4, 3.3
)

Na mesma universidade, os professores homens receberam as seguintes notas:

homens <- c(
 4.5, 3.7, 4.2, 3.9, 3.1, 4.0, 3.8, 3.4, 4.5, 3.8, 4.3, 4.4, 4.1, 4.2, 4.0
)

Nada é sabido sobre as variâncias das duas populações.

  1. Construa um intervalo de confiança de 95% para a diferença entre as médias.

    Condições

    • As amostras são aleatórias, representativas da população?

      Supomos que sim.

    • Os valores das amostras são independentes entre si?

      Supomos que sim.

    • As amostras são menos do que 10% da população?

      Sim.

    • As amostras vêm de populações aproximadamente normais?

      Podemos fazer testes de normalidade:

      mulheres %>% shapiro.test()
      ## 
      ##    Shapiro-Wilk normality test
      ## 
      ## data:  .
      ## W = 0,91737, p-value = 0,2648
      homens %>% shapiro.test()
      ## 
      ##    Shapiro-Wilk normality test
      ## 
      ## data:  .
      ## W = 0,94474, p-value = 0,4457

      Os valores p acima de 0,05 são evidência de que os dados seguem uma distribuição normal.

    Passo a passo

    n_1 = length(mulheres)
    cat('n_1 =', n_1)
    ## n_1 = 12
    
    xbarra_1 <- mean(mulheres)
    cat('\nMédia amostral 1 =', xbarra_1)
    ## 
    ## Média amostral 1 = 3,866667
    
    s_1 <- sd(mulheres)
    cat('\nDesvio padrão amostral 1 =', s_1)
    ## 
    ## Desvio padrão amostral 1 = 0,5630006
    
    n_2 = length(homens)
    cat('\nn_2 =', n_2)
    ## 
    ## n_2 = 15
    
    xbarra_2 <- mean(homens)
    cat('\nMédia amostral 2 =', xbarra_2)
    ## 
    ## Média amostral 2 = 3,993333
    
    s_2 <- sd(homens)
    cat('\nDesvio padrão amostral 2 =', s_1)
    ## 
    ## Desvio padrão amostral 2 = 0,5630006
    
    d <- xbarra_1 - xbarra_2
    cat('\nDiferença =', d)
    ## 
    ## Diferença = -0,1266667
    
    erro_padrao <- sqrt(s_1^2 / n_1 + s_2^2 / n_2)
    cat('\nEP =', erro_padrao)
    ## 
    ## EP = 0,1919363
    
    gl <- (s_1^2 / n_1 + s_2^2 / n_2)^2 / (
      (s_1^2 / n_1)^2 / (n_1 - 1) +
      (s_2^2 / n_2)^2 / (n_2 - 1)
    )
    cat('\nGraus de liberdade = ', gl)
    ## 
    ## Graus de liberdade =  19,06342
    
    nivel_confianca <- .95
    valor_critico <- -qt((1 - nivel_confianca)/2, df = gl)
    cat('\nValor crítico =', valor_critico)
    ## 
    ## Valor crítico = 2,092553
    
    margem_erro <- erro_padrao * valor_critico
    cat('\nME =', margem_erro)
    ## 
    ## ME = 0,4016368
    
    intervalo <- d + c(-1, 1) * margem_erro
    cat('\nIC = [', intervalo[1], ';', intervalo[2], ']')
    ## 
    ## IC = [ -0,5283035 ; 0,2749702 ]

    Graficamente, o intervalo de confiança corresponde à área em vermelho abaixo da seguinte distribuição t, com 19,063 graus de liberdade:

    Observe que esta distribuição t corresponde à variável padronizada

    x(ˉx1ˉx2)s21/n1+s22/n2

    Trabalhamos com esta variável padronizada porque a distribuição t sempre tem média zero.

    Aqui, cada valor no eixo x corresponde ao número de desvios padrão acima ou abaixo da média.

    De fato, o limite inferior da área preenchida corresponde a

    (intervalo[1] - (xbarra_1 - xbarra_2)) / erro_padrao
    ## [1] -2,092553

    e o limite superior da área preenchida corresponde a

    (intervalo[2] - (xbarra_1 - xbarra_2)) / erro_padrao
    ## [1] 2,092553

    Usando a função t.test()

    t.test(
      x = mulheres,
      y = homens
    )
    ## 
    ##  Welch Two Sample t-test
    ## 
    ## data:  mulheres and homens
    ## t = -0,65994, df = 19,063, p-value = 0,5172
    ## alternative hypothesis: true difference in means is not equal to 0
    ## 95 percent confidence interval:
    ##  -0,5283035  0,2749702
    ## sample estimates:
    ## mean of x mean of y 
    ##  3,866667  3,993333
  2. Teste a afirmação de que as médias são diferentes. Use α=0,05.

    Como o intervalo de confiança para a diferença entre as médias, calculado no item anterior, inclui o zero, já sabemos, antes de qualquer cálculo, que a hipótese de nulidade não vai ser rejeitada; isto é, as amostras são evidência de que as médias são iguais.

    Condições

    Já foram verificadas no item anterior.

    Hipóteses

    H0:μ1μ2=0

    HA:μ1μ20

    Passo a passo

    n_1 = length(mulheres)
    cat('n_1 =', n_1)
    ## n_1 = 12
    
    xbarra_1 <- mean(mulheres)
    cat('\nMédia amostral 1 =', xbarra_1)
    ## 
    ## Média amostral 1 = 3,866667
    
    s_1 <- sd(mulheres)
    cat('\nDesvio padrão amostral 1 =', s_1)
    ## 
    ## Desvio padrão amostral 1 = 0,5630006
    
    n_2 = length(homens)
    cat('\nn_2 =', n_2)
    ## 
    ## n_2 = 15
    
    xbarra_2 <- mean(homens)
    cat('\nMédia amostral 2 =', xbarra_2)
    ## 
    ## Média amostral 2 = 3,993333
    
    s_2 <- sd(homens)
    cat('\nDesvio padrão amostral 2 =', s_1)
    ## 
    ## Desvio padrão amostral 2 = 0,5630006
    
    erro_padrao <- sqrt(s_1^2 / n_1 + s_2^2 / n_2)
    cat('\nEP =', erro_padrao)
    ## 
    ## EP = 0,1919363
    
    d <- xbarra_1 - xbarra_2
    cat('\nDiferença =', d)
    ## 
    ## Diferença = -0,1266667
    
    # Vamos padronizar esta diferença
    tx <- (d - 0) / erro_padrao
    cat('\nDiferença padronizada =', tx)
    ## 
    ## Diferença padronizada = -0,6599412
    
    gl <- (s_1^2 / n_1 + s_2^2 / n_2)^2 / (
      (s_1^2 / n_1)^2 / (n_1 - 1) +
      (s_2^2 / n_2)^2 / (n_2 - 1)
    )
    cat('\nGraus de liberdade =', gl)
    ## 
    ## Graus de liberdade = 19,06342
    
    valor_p <- 2 * pt(
      tx, 
      df = gl
    )
    cat('\nValor p =', valor_p)      
    ## 
    ## Valor p = 0,5171864

    Como o valor p (0,517) é maior do que α (0,05), não temos evidência para rejeitar H0.

    Graficamente, o valor p corresponde à área em vermelho abaixo da seguinte distribuição t, com 19,063 graus de liberdade, que corresponde à variável padronizada

    x(ˉx1ˉx2)s21/n1+s22/n2

    Como a hipótese alternativa é HA:μ1μ20, o teste é bilateral.

    Usando a função t.test()

    t.test(
      x = mulheres,
      y = homens
    )
    ## 
    ##  Welch Two Sample t-test
    ## 
    ## data:  mulheres and homens
    ## t = -0,65994, df = 19,063, p-value = 0,5172
    ## alternative hypothesis: true difference in means is not equal to 0
    ## 95 percent confidence interval:
    ##  -0,5283035  0,2749702
    ## sample estimates:
    ## mean of x mean of y 
    ##  3,866667  3,993333

9 Mulheres × maridos4

A tabela abaixo mostra as quantidades de palavras faladas em um dia pelos maridos e mulheres em 8 casais:

casal marido mulher
1 15.684 24.625
2 26.429 13.397
3 1.411 18.338
4 7.771 17.791
5 18.876 12.964
6 15.477 16.937
7 14.069 16.255
8 25.835 18.667
  1. Construa um intervalo de confiança de 95% para a diferença média entre as quantidades de palavras faladas pelos dois cônjuges de um casal.

    Condições

    • As amostras são aleatórias, representativas da população?

      Supomos que sim.

    • Os pares são independentes entre si?

      Supomos que sim. O comportamento de um casal não afeta o comportamento dos outros.

    • As amostras são menos do que 10% da população?

      Sim.

    • A amostra vem de uma população aproximadamente normal?

      Podemos fazer um teste de normalidade sobre as diferenças:

      (df$marido - df$mulher) %>% shapiro.test()
      ## 
      ##    Shapiro-Wilk normality test
      ## 
      ## data:  .
      ## W = 0,97075, p-value = 0,9038

      O valor p acima de 0,05 é evidência de que os dados seguem uma distribuição normal.

    Passo a passo

    n = nrow(df)
    cat('\nn =', n)
    ## 
    ## n = 8
    
    dbarra <- mean(df$marido - df$mulher)
    cat('\nMédia amostral das diferenças =', dbarra)
    ## 
    ## Média amostral das diferenças = -1677,75
    
    s <- sd(df$marido - df$mulher)
    cat('\nDesvio padrão amostral das diferenças =', s)
    ## 
    ## Desvio padrão amostral das diferenças = 10052,87
    
    erro_padrao <- s / sqrt(n)
    cat('\nEP =', erro_padrao)
    ## 
    ## EP = 3554,227
    
    gl <- n - 1
    cat('\nGraus de liberdade = ', gl)
    ## 
    ## Graus de liberdade =  7
    
    nivel_confianca <- .95
    valor_critico <- -qt((1 - nivel_confianca)/2, df = gl)
    cat('\nValor crítico =', valor_critico)
    ## 
    ## Valor crítico = 2,364624
    
    margem_erro <- erro_padrao * valor_critico
    cat('\nME =', margem_erro)
    ## 
    ## ME = 8404,411
    
    intervalo <- dbarra + c(-1, 1) * margem_erro
    cat('\nIC = [', intervalo[1], ';', intervalo[2], ']')
    ## 
    ## IC = [ -10082,16 ; 6726,661 ]

    Graficamente, o intervalo de confiança corresponde à área em vermelho abaixo da seguinte distribuição t, com 7 graus de liberdade:

    Observe que esta distribuição t corresponde à variável padronizada

    x¯(x1x2)s/n

    Trabalhamos com esta variável padronizada porque a distribuição t sempre tem média zero.

    Aqui, cada valor no eixo x corresponde ao número de desvios padrão acima ou abaixo da média.

    De fato, o limite inferior da área preenchida corresponde a

    (intervalo[1] - dbarra) / erro_padrao
    ## [1] -2,364624

    e o limite superior da área preenchida corresponde a

    (intervalo[2] - dbarra) / erro_padrao
    ## [1] 2,364624

    Usando a função t.test()

    t.test(
      x = df$marido,
      y = df$mulher,
      paired = TRUE
    )
    ## 
    ##  Paired t-test
    ## 
    ## data:  df$marido and df$mulher
    ## t = -0,47204, df = 7, p-value = 0,6513
    ## alternative hypothesis: true difference in means is not equal to 0
    ## 95 percent confidence interval:
    ##  -10082,161   6726,661
    ## sample estimates:
    ## mean of the differences 
    ##                -1677,75
  2. Teste a afirmação de que, em casais em geral, a mulher fala mais do que o homem. Use α=0,05.

    Como o intervalo de confiança para a média das diferenças, calculado no item anterior, inclui o zero, já sabemos, antes de qualquer cálculo, que a hipótese de nulidade não vai ser rejeitada; isto é, a amostra não é evidência de que as mulheres falam mais.

    Condições

    Já foram verificadas no item anterior.

    Hipóteses

    Chamando de μd a média das diferenças palavrasmaridopalavrasmulher temos

    H0:μd0

    HA:μd<0

    Passo a passo

    n = nrow(df)
    cat('\nn =', n)
    ## 
    ## n = 8
    
    dbarra <- mean(df$marido - df$mulher)
    cat('\nMédia amostral das diferenças =', dbarra)
    ## 
    ## Média amostral das diferenças = -1677,75
    
    s <- sd(df$marido - df$mulher)
    cat('\nDesvio padrão amostral das diferenças =', s)
    ## 
    ## Desvio padrão amostral das diferenças = 10052,87
    
    erro_padrao <- s / sqrt(n)
    cat('\nEP =', erro_padrao)
    ## 
    ## EP = 3554,227
    
    gl <- n - 1
    cat('\nGraus de liberdade = ', gl)
    ## 
    ## Graus de liberdade =  7
    
    # Vamos padronizar esta diferença
    tx <- (dbarra - 0) / erro_padrao
    cat('\nDiferença padronizada =', tx)
    ## 
    ## Diferença padronizada = -0,4720436
    
    valor_p <- pt(
      tx, 
      df = gl
    )
    cat('\nValor p =', valor_p)      
    ## 
    ## Valor p = 0,3256283

    Como o valor p (0,326) é maior do que α (0,05), não temos evidência para rejeitar H0.

    Graficamente, o valor p corresponde à área em vermelho abaixo da seguinte distribuição t, com 7 graus de liberdade, que corresponde à variável padronizada

    x¯(x1x2)s/n

    Como a hipótese alternativa é HA:μd<0, o teste é unilateral à esquerda.

    Usando a função t.test()

    t.test(
      x = df$marido,
      y = df$mulher,
      alternative = 'less',
      paired = TRUE
    )    
    ## 
    ##  Paired t-test
    ## 
    ## data:  df$marido and df$mulher
    ## t = -0,47204, df = 7, p-value = 0,3256
    ## alternative hypothesis: true difference in means is less than 0
    ## 95 percent confidence interval:
    ##      -Inf 5056,012
    ## sample estimates:
    ## mean of the differences 
    ##                -1677,75

10 Temperatura corporal com bootstrapping

A tabela abaixo mostra as temperatura corporais (em graus Celsius) de 32 pessoas, medidas de manhã e de tarde:

pessoa manhã tarde
1 36,7 36,7
2 37,0 37,1
3 36,3 36,7
4 36,8 37,1
5 36,8 37,1
6 36,8 36,4
7 35,9 37,0
8 36,3 37,0
9 36,3 37,1
10 36,8 36,7
11 36,3 36,8
12 36,6 36,7
13 36,9 36,7
14 36,4 36,1
15 35,7 36,2
16 36,7 36,8
17 37,1 37,1
18 37,4 37,4
19 37,1 36,6
20 36,5 36,9
21 37,2 36,5
22 36,7 36,8
23 37,1 36,5
24 36,4 36,2
25 37,2 36,9
26 36,9 37,0
27 36,2 36,3
28 37,1 35,9
29 36,3 36,1
30 37,1 36,9
31 37,2 36,8
32 37,3 37,0

O método de bootstrapping consiste em simular muitas amostras — com reposição — a partir dos elementos desta amostra original. A partir destas muitas amostras simuladas, você pode calcular intervalos de confiança como explicado abaixo:

  1. Calcule a diferença entre a temperatura matinal e a temperatura vespertina para cada pessoa, armazenando os resultados em um vetor diferencas, com 32 valores.

    diferencas <- df$manhã - df$tarde
    diferencas
    ##  [1]  0,0 -0,1 -0,4 -0,3 -0,3  0,4 -1,1 -0,7 -0,8  0,1 -0,5 -0,1  0,2  0,3 -0,5 -0,1
    ## [17]  0,0  0,0  0,5 -0,4  0,7 -0,1  0,6  0,2  0,3 -0,1 -0,1  1,2  0,2  0,2  0,4  0,3
  2. Armazene, em uma lista, 10 mil amostras, cada uma com 32 elementos sorteados com reposição a partir do vetor diferencas (com todos os elementos tendo a mesma probabilidade de sorteio).

    n_amostras <- 1e4
    n <- length(diferencas)
    amostras <- replicate(
      n_amostras, 
      sample(diferencas, n, replace = TRUE),
      simplify = FALSE
    )

    Vamos examinar a lista gerada:

    str(amostras)
    ## List of 10000
    ##  $ : num [1:32] 0 0,3 -0,3 0,4 ...
    ##  $ : num [1:32] 0,7 0,6 0,2 -0,1 ...
    ##  $ : num [1:32] -0,1 0 0,2 -0,1 ...
    ##  $ : num [1:32] 0 -0,3 0,7 -0,3 ...
    ##  $ : num [1:32] 0,6 0 0 0 ...
    ##  $ : num [1:32] 0,6 -0,4 0 -0,4 ...
    ##  $ : num [1:32] 0,6 1,2 0,2 -0,4 ...
    ##  $ : num [1:32] -1,1 -0,5 0,3 0,3 ...
    ##  $ : num [1:32] 0,3 1,2 0,2 -0,3 ...
    ##  $ : num [1:32] -0,4 -0,1 -0,1 0 ...
    ##  $ : num [1:32] -0,1 -0,1 0,2 0,4 ...
    ##  $ : num [1:32] 0,3 1,2 0,4 0,2 ...
    ##  $ : num [1:32] -0,1 0,4 0,1 -0,5 ...
    ##  $ : num [1:32] -0,1 -0,1 0,2 0 ...
    ##  $ : num [1:32] 0,4 -0,1 0,2 -0,1 ...
    ##  $ : num [1:32] 0,1 0,3 -0,1 -0,8 ...
    ##  $ : num [1:32] 0,7 -0,5 -0,7 0 ...
    ##  $ : num [1:32] -0,8 -0,1 -0,1 1,2 ...
    ##  $ : num [1:32] 0,7 -0,1 0,4 1,2 ...
    ##  $ : num [1:32] -0,1 -0,4 -0,1 -0,4 ...
    ##  $ : num [1:32] -1,1 0,2 -0,1 0,4 ...
    ##  $ : num [1:32] -1,1 -0,3 -0,1 0,7 ...
    ##  $ : num [1:32] 0 -0,7 0,2 -0,4 ...
    ##  $ : num [1:32] 0,3 -0,5 -0,1 -0,4 ...
    ##  $ : num [1:32] -0,3 0,4 0,5 0 ...
    ##  $ : num [1:32] -0,1 -0,7 0,1 -0,1 ...
    ##  $ : num [1:32] 0,3 -0,3 0,3 -0,1 ...
    ##  $ : num [1:32] 0 0,3 -0,1 -0,1 ...
    ##  $ : num [1:32] 1,2 -0,1 1,2 -0,5 ...
    ##  $ : num [1:32] 0,4 -0,4 -0,3 -0,3 ...
    ##  $ : num [1:32] 0,2 1,2 0,1 -0,1 ...
    ##  $ : num [1:32] 0,4 0,2 -0,1 -0,5 ...
    ##  $ : num [1:32] -0,1 -0,1 -0,1 0,1 ...
    ##  $ : num [1:32] -0,1 0 -0,8 0 ...
    ##  $ : num [1:32] 0,1 0,3 1,2 0,3 ...
    ##  $ : num [1:32] 0 -0,7 0,6 0,2 ...
    ##  $ : num [1:32] -0,4 -0,8 0,3 -0,4 ...
    ##  $ : num [1:32] 0 0,1 -0,5 -0,7 ...
    ##  $ : num [1:32] 0 -1,1 0,2 0,3 ...
    ##  $ : num [1:32] 0,2 -1,1 0,3 -0,1 ...
    ##  $ : num [1:32] 0,3 -0,1 0,2 -0,4 ...
    ##  $ : num [1:32] -0,5 -0,8 0 0,6 ...
    ##  $ : num [1:32] 0,4 0 -0,1 0 ...
    ##  $ : num [1:32] 0 -0,1 -1,1 0,5 ...
    ##  $ : num [1:32] -0,1 0,4 0 -0,4 ...
    ##  $ : num [1:32] -0,1 0,7 0,6 0,1 ...
    ##  $ : num [1:32] 0,5 0,3 -0,4 0,3 ...
    ##  $ : num [1:32] -0,5 0,3 0,5 -0,3 ...
    ##  $ : num [1:32] 0,2 0 -0,1 0,3 ...
    ##  $ : num [1:32] 0,6 -0,1 0,4 -0,7 ...
    ##  $ : num [1:32] -1,1 0,5 0,7 -0,1 ...
    ##  $ : num [1:32] 0,2 0,2 0 -0,1 ...
    ##  $ : num [1:32] 0,6 -0,1 -0,5 0,4 ...
    ##  $ : num [1:32] 1,2 0,4 0,4 -0,1 ...
    ##  $ : num [1:32] 0,1 -0,1 0 -0,5 ...
    ##  $ : num [1:32] -0,8 -0,1 0,5 -0,3 ...
    ##  $ : num [1:32] 0,1 0,3 -0,3 0,7 ...
    ##  $ : num [1:32] 0,2 0 -1,1 -0,1 ...
    ##  $ : num [1:32] -0,5 -0,1 0,5 0,4 ...
    ##  $ : num [1:32] 1,2 -0,4 -0,3 0,2 ...
    ##  $ : num [1:32] -0,5 0 -0,4 1,2 ...
    ##  $ : num [1:32] 0,4 0 -0,1 0 ...
    ##  $ : num [1:32] -0,1 0,6 0,3 -0,5 ...
    ##  $ : num [1:32] -0,1 0,3 -1,1 -0,1 ...
    ##  $ : num [1:32] -0,4 -0,3 -0,3 0,6 ...
    ##  $ : num [1:32] 1,2 -0,1 0 0,4 ...
    ##  $ : num [1:32] 0,1 -0,3 0,5 -0,8 ...
    ##  $ : num [1:32] -0,1 -0,1 0,2 0,4 ...
    ##  $ : num [1:32] 0,2 0,6 -1,1 0,2 ...
    ##  $ : num [1:32] 0,7 0,6 -0,5 0,2 ...
    ##  $ : num [1:32] 0,3 -0,1 -0,8 0,6 ...
    ##  $ : num [1:32] 0,2 1,2 -0,4 0 ...
    ##  $ : num [1:32] -0,3 0,7 -1,1 0,2 ...
    ##  $ : num [1:32] -1,1 0,2 -0,1 -0,1 ...
    ##  $ : num [1:32] -0,5 0,3 0,1 -0,1 ...
    ##  $ : num [1:32] -0,8 1,2 -0,1 0,3 ...
    ##  $ : num [1:32] -0,3 0 0 0,7 ...
    ##  $ : num [1:32] -0,3 0,6 -0,1 0,2 ...
    ##  $ : num [1:32] -0,5 0,7 -0,1 0 ...
    ##  $ : num [1:32] -0,1 0,2 0,3 -0,5 ...
    ##  $ : num [1:32] 0 0,5 0 -0,1 ...
    ##  $ : num [1:32] 0 0,2 0,2 -0,1 ...
    ##  $ : num [1:32] 1,2 0,5 0,7 0 ...
    ##  $ : num [1:32] 0 -0,1 -0,1 0,2 ...
    ##  $ : num [1:32] 0,5 -0,4 -0,4 -0,1 ...
    ##  $ : num [1:32] -0,1 0,6 -0,4 -0,8 ...
    ##  $ : num [1:32] -0,1 1,2 0,4 0,6 ...
    ##  $ : num [1:32] 0,2 0,2 -0,1 -0,1 ...
    ##  $ : num [1:32] -0,4 0,3 0,4 0,1 ...
    ##  $ : num [1:32] 0,7 -0,1 0 0,3 ...
    ##  $ : num [1:32] 0,2 -0,1 -1,1 0,4 ...
    ##  $ : num [1:32] -0,5 0,3 -0,4 0,4 ...
    ##  $ : num [1:32] -0,7 -0,7 0,2 0,2 ...
    ##  $ : num [1:32] -0,7 -0,1 0 -0,7 ...
    ##  $ : num [1:32] 0,2 0,2 -0,5 0 ...
    ##  $ : num [1:32] 0,1 0,3 0,3 0,4 ...
    ##  $ : num [1:32] 0,3 0,4 0,3 -0,1 ...
    ##  $ : num [1:32] 0 0,3 -0,5 0,6 ...
    ##  $ : num [1:32] 0,3 0,3 0 1,2 ...
    ##   [list output truncated]
  3. Armazene, em um vetor de 10 mil elementos, as médias das amostras obtidas no item anterior.

    As funções da família map aplicam uma operação (aqui, a média) a cada elemento de um vetor, retornando uma lista. Veja ?purrr::map para mais detalhes sobre programação funcional em R.

    medias <- amostras %>% 
      map_dbl(~mean(.))
    str(medias)
    ##  num [1:10000] 0,03125 -0,00625 0,03125 0,00625 ...
  4. Imprima os valores deste vetor que estão no quantil 0,05 e no quantil 0,95. Estes são os extremos do intervalo de confiança para a diferença média de temperatura na população, com 95% de confiança, calculados via bootstrapping.

    Uma das vantagens do bootstrapping é não precisar de qualquer conhecimento sobre a população — sua distribuição, sua variância etc.

    ic_bs <- medias %>% 
      quantile(c(.05, .95))
    
    ic_bs
    ##        5%       95% 
    ## -0,134375  0,134375
  5. Use a função t.test() do R para construir um intervalo de confiança para a diferença média de temperatura na população, com 95% de confiança — não é necessário fazer os cálculos passo a passo.

    ic_teste <- t.test(df$manhã, df$tarde, paired = TRUE)$conf.int
    ic_teste
    ## [1] -0,1676132  0,1676132
    ## attr(,"conf.level")
    ## [1] 0,95
  6. Compare com o resultado do bootstrapping.

    Os centros dos intervalos são

    • Bootstrap: 0,00000000000000077716

    • Teste: 0,00000000000000044409

    Os extremos de um intervalo são mais ou menos próximos dos extremos do outro intervalo.

    Como o bootstrapping consiste em sortear elementos da amostra original, os resultados podem ser diferentes a cada execução, mas os resultados costumam ser próximos aos dos testes paramétricos — como prop.test.

    Se tomarmos uma quantidade maior de amostras — aqui, foram 10 mil — a precisão melhorará mais ainda. Experimente.

Notas


  1. Baseado em https://web.archive.org/web/20101008192855/http://www.lifeslittlemysteries.com/how-is-crowd-size-estimated--1074/↩︎

  2. Baseado em Murzyn, E. (2008). “Do we only dream in colour? a comparison of reported dream colour in younger and older adults with different experiences of black and white media.” Consciousness and Cognition, 17(4), 1228–1237. http://dx.doi.org/10.1016/j.concog.2008.09.002↩︎

  3. Baseado em Andrew Gelman e Jennifer Hill (2009), “Replication Data for Data Analysis Using Regression Multilevel Hierarchical Models”, http://hdl.handle.net/1902.1/10285↩︎

  4. Baseado em Mehl, M. R., Vazire, S., Nairán Ramírez-Esparza, Slatcher, R. B., & Pennebaker, J. W. (2007). “Are Women Really More Talkative Than Men?”, Science, 317(5834), 82. http://dx.doi.org/10.1126/science.1139940↩︎

LS0tCnRpdGxlOiAnTGlzdGEgYXZhbGlhdGl2YTogSUMgZSBUSCcKc3VidGl0bGU6ICdQcm9iYWJpbGlkYWRlIGUgRXN0YXTDrXN0aWNhIC0tIDIwMjEuMicKYXV0aG9yOiAnZm5hdWZlbCcKZW1haWw6ICdodHRwczovL2ZuYXVmZWwuZ2l0aHViLmlvLycKZGF0ZTogJzE3LzAxLzIwMjIgKHYuIGByIGZvcm1hdChTeXMuRGF0ZSgpLCAiJWQvJW0vJVkiKWApJwpsYW5nOiAncHQtYnInCm91dHB1dDogCiAgIyBUbyBpbnN0YWxsIHRoZXNlIG91dHB1dCBmb3JtYXRzLCBlbnRlcgogICMgICBpbnN0YWxsLnBhY2thZ2VzKCJkZXZ0b29scyIpCiAgIyAgIGRldnRvb2xzOjppbnN0YWxsX2dpdGh1YigiZm5hdWZlbC9mbmF1ZmVsUm1kIikKICBmbmF1ZmVsUm1kOjpodG1sX3JlcG9ydDoKICAgIFtdCiAgZm5hdWZlbFJtZDo6cGRmX3JlcG9ydDoKICAgIGRvY3VtZW50Y2xhc3M6IGFydGljbGUKICAgIHBhcGVyc2l6ZTogYTQKICAgIGZvbnRzaXplOiAxMnB0CiAgICBsaW5rcy1hcy1ub3RlczogdHJ1ZQogICAgZ2VvbWV0cnk6CiAgICAtIHRvcD0zMG1tCiAgICAtIGxlZnQ9MjBtbQogICAgIyBGb3IgbW9yZSBwZGYgb3B0aW9ucywgc2VlCiAgICAjIGh0dHBzOi8vcGFuZG9jLm9yZy9NQU5VQUwuaHRtbCN2YXJpYWJsZXMtZm9yLWxhdGV4Ci0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CiMgVGhlIG5leHQgY29tbWFuZCBjb25maWd1cmVzIE1BTlkgdGhpbmdzIGFuZCBsb2FkcyBxdWl0ZSBhIGZldyBwYWNrYWdlcy4KIyAKIyBJZiB5b3Ugd2FudCB0byBzZWUgd2hhdCdzIGJlaW5nIGRvbmUsIGV4ZWN1dGUgCiMgCiMgICBjYXQoCiMgICAgIHN5c3RlbS5maWxlKAojICAgICAgICJybWFya2Rvd24vcmVzb3VyY2VzL1IvX2NvbW1vbl9yZXBvcnQuUiIsIAojICAgICAgIHBhY2thZ2UgPSAiZm5hdWZlbFJtZCIKIyAgICAgKQojICAgKQojIAojIHRvIGZpbmQgb3V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlsZS4gVGhlbiBvcGVuIHRoZSBmaWxlLgojIAojIElmIHlvdSB3YW50IHRvIGNoYW5nZSB0aGUgY29uZmlndXJhdGlvbiwgY29weSB0aGUgZmlsZSwgZWRpdCBpdCwgYW5kCiMgc291cmNlIGl0IGluc3RlYWQgb2YgdGhlIHBhY2thZ2UgZmlsZS4gCiMgCiMgT3Igc2ltcGx5IHdyaXRlIHlvdXIgY29tbWFuZHMgaGVyZSBpbiB0aGlzIGNvZGUgY2h1bmsuCgpzb3VyY2UoCiAgc3lzdGVtLmZpbGUoCiAgICAicm1hcmtkb3duL3Jlc291cmNlcy9SL19jb21tb25fcmVwb3J0LlIiLAogICAgcGFja2FnZSA9ICJmbmF1ZmVsUm1kIgogICkKKQoKIyAzIGNhc2FzIGRlY2ltYWlzIGVtIG7Dum1lcm9zIG5vIHRleHRvCm9wdGlvbnMoZm1kaWdpdHMgPSAzKQoKIyBQbG90cyBkZSBkaXN0cmlidWnDp8O1ZXMgYW1vc3RyYWlzCnNvdXJjZSgncGxvdF9zaGFkZWQuUicpCgpzZXQuc2VlZCgxMjM0NTYpCgpnYWJhcml0byA8LSBGQUxTRQpnYWJhcml0byA8LSBUUlVFCmBgYAoKCmBgYHtyIGVjaG89RkFMU0UsIHJlc3VsdHM9J2FzaXMnfQppZiAoZ2FiYXJpdG8pIHsKICBjYXQoCic6Ojogey5ybWRub3RlIGxhdGV4PTF9CioqR0FCQVJJVE8qKgo6OjonCiAgKQp9CmBgYAoKCiMgSW5zdHJ1w6fDtWVzIHstfQoKKiBWZWphIG5hIHRhYmVsYSBhYmFpeG8gbyBuw7ptZXJvIGRhIHF1ZXN0w6NvIHF1ZSBmb2kgc29ydGVhZGEgcGFyYSB2b2PDqi4gW1NlIHNldSBuw7ptZXJvIGRlIG1hdHLDrWN1bGEgbsOjbyBlc3RpdmVyIG5hIHRhYmVsYSwgZW50cmUgZW0gY29udGF0byBjb21pZ28gcGVsbyBUZWxlZ3JhbS5dey5obH0KCiAgICBgYGB7ciBlY2hvPUZBTFNFfQogICAgdGliYmxlOjp0cmliYmxlKAogICAgICAgfm1hdHJpY3VsYSwgfnF1ZXN0YW8sCiAgICAgICIxMTkwNjAwMDciLCAgICAgICAxTCwKICAgICAgIjExOTA2MDAyNSIsICAgICAgIDNMLAogICAgICAiMTE5MDYwMDM4IiwgICAgICAgOEwsCiAgICAgICIxMTkwNjAwNDMiLCAgICAgICA5TCwKICAgICAgIjEyMDA2MDAxMCIsICAgICAgIDRMLAogICAgICAiMTIwMDYwMDE0IiwgICAgICAgNkwsCiAgICAgICIxMjAwNjAwMjkiLCAgICAgICA3TCwKICAgICAgIjEyMDA2MDAzNCIsICAgICAgMTBMLAogICAgICAiMjE2MDYwMDU1IiwgICAgICAgNUwsCiAgICAgICIyMTkwNjAwNTMiLCAgICAgICAyTAogICAgICApICU+JSAKICAgICAga2JsKAogICAgICAgIGRpZ2l0cyA9IDksIAogICAgICAgIGFsaWduID0gJ3InLCAKICAgICAgICBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAnLicpCiAgICAgICkgJT4lIAogICAgICBrYWJsZV9wYXBlcigKICAgICAgICBjKCdzdHJpcGVkJywgJ2hvdmVyJyksCiAgICAgICAgZnVsbF93aWR0aCA9IEZBTFNFCiAgICAgICkKICAgIGBgYAoKCiogQ2xpcXVlIG8gYm90w6NvIGBDb2RlYCwgbm8gaW7DrWNpbyBkZXN0YSBww6FnaW5hLCBwYXJhIGJhaXhhciBvIGFycXVpdm8gUm1kIGRlc3RlIGRvY3VtZW50by4KCiogQ2VydGlmaXF1ZS1zZSBkZSBxdWUgbyBwYWNvdGUgYGZuYXVmZWxSbWRgIGVzdMOhIGluc3RhbGFkby4gVXNlIG9zIGNvbWFuZG9zCgogICAgYGBge3IgZXZhbD1GQUxTRX0KICAgIGluc3RhbGwucGFja2FnZXMoImRldnRvb2xzIikKICAgIGRldnRvb2xzOjppbnN0YWxsX2dpdGh1YigiZm5hdWZlbC9mbmF1ZmVsUm1kIikKICAgIGBgYAogIAoqIEVkaXRlIG8gYXJxdWl2byBSbWQgcGFyYSByZXNvbHZlciBhIHN1YSBxdWVzdMOjby4gCgoqIENhZGEgaXRlbSBxdWUgcGVkZSBwYXJhIHZvY8OqIGNvbnN0cnVpciB1bSBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBvdSBwYXJhIHZvY8OqIGZhemVyIHVtIHRlc3RlIGRlIGhpcMOzdGVzZXMgW2RldmUgc2VyIHJlc29sdmlkbyBkZSBkdWFzIG1hbmVpcmFzXXsuaGx9IChleGNldG8gcXVhbmRvIGhvdXZlciBpbnN0cnXDp8OjbyBkaXplbmRvIG8gY29udHLDoXJpbyk6CgogIDEuIEZhemVuZG8gb3MgY8OhbGN1bG9zIHBhc3NvIGEgcGFzc28sIGNvbW8gbm9zIHbDrWRlb3MgZG8gY3Vyc28sIGUKICAKICAxLiBVc2FuZG8gYXMgZnVuw6fDtWVzIHByb250YXMgZG8gUiBwYXJhIElDIGUgdGVzdGVzIGRlIGhpcMOzdGVzZSBxdWUgZm9yYW0gdXNhZGFzIG5vcyB2w61kZW9zIGRvIGN1cnNvLgoKKiBFc2NyZXZhIG8gbcOheGltbyBwb3Nzw612ZWwgc29icmUgbyBzZXUgcmFjaW9jw61uaW8uIEp1c3RpZmlxdWUgc3VhcyByZXNwb3N0YXMuCgoqIFRlc3RlIHN1YXMgcmVzcG9zdGFzLiBUdWRvIGRldmUgZXN0YXIgZXhlY3V0YW5kbyBzZW0gZXJyb3MuCgoqIFtFbnZpZSBubyBNb29kbGU6IF17LmhsfQoKICAxLiBPIGFycXVpdm8gUm1kIGNvbSBhcyBzdWFzIHJlc29sdcOnw7VlcyBlCiAgCiAgMS4gVW0gdsOtZGVvIGRlIGF0w6kgJDUkIG1pbnV0b3MgZXhwbGljYW5kbyBhcyBzdWFzIHJlc29sdcOnw7Vlcy4KCiogQm9tIHRyYWJhbGhvLgoKCiMgRnVtYW50ZXMKCjEuIFVtYSBhbW9zdHJhIGFsZWF0w7NyaWEgZGUgJDg2JCBwZXNzb2FzIGluY2x1aSAkNDEkIGZ1bWFudGVzLgoKICAgYS4gQ29uc3RydWEgdW0gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgZGUgJDk1XCUkIHBhcmEgbyBwZXJjZW50dWFsIGRlIGZ1bWFudGVzIG5hIHBvcHVsYcOnw6NvIGRlIG9uZGUgZm9pIGNvbGV0YWRhIGEgYW1vc3RyYS4gCiAgIAogICAgICBgYGB7ciBjaGlsZD0nZnVtYW50ZXMxLlJtZCcsIGV2YWw9Z2FiYXJpdG99CiAgICAgIAogICAgICBgYGAKICAgCiAgIGEuIEZhw6dhIHVtIHRlc3RlIGRlIGhpcMOzdGVzZXMgcGFyYSBhdmFsaWFyIGEgYWZpcm1hw6fDo28gZGUgcXVlIG8gcGVyY2VudHVhbCBkZSBmdW1hbnRlcyBuYSBwb3B1bGHDp8OjbyDDqSBbZGlmZXJlbnRlIGRlICQ1MFwlJF17LmhsfS4gVXNlICRcYWxwaGEgPSAweyx9MDUkLgogICAKICAgICAgYGBge3IgY2hpbGQ9J2Z1bWFudGVzMi5SbWQnLCBldmFsPWdhYmFyaXRvfQogICAgICAKICAgICAgYGBgCgoKIyBHcmFkdWHDp8OjbyBlbSAkNCQgYW5vcwoKMS4gUXVhbCBvIHRhbWFuaG8gbcOtbmltbyBkYSBhbW9zdHJhIG5lY2Vzc8OhcmlhIHBhcmEgZXN0aW1hciwgY29tIHVtIG7DrXZlbCBkZSBjb25maWFuw6dhIGRlICQ5NVwlJCBlIHVtYSBtYXJnZW0gZGUgZXJybyBkZSAkMHssfTA1JCAoJDUkIHBvbnRvcyBwZXJjZW50dWFpcyksIGEgcHJvcG9yw6fDo28gZGUgYWx1bm9zIHVuaXZlcnNpdMOhcmlvcyBxdWUgY29tcGxldGFtIGEgZ3JhZHVhw6fDo28gZW0gJDQkIGFub3Mgb3UgbWVub3M/IE5hZGEgbWFpcyDDqSBzYWJpZG8gc29icmUgYSBwb3B1bGHDp8Ojby4gCgogICBbRXhwbGlxdWUgcG9yIHF1ZSB2b2PDqiBlc2NvbGhldSBvIHZhbG9yIGRlICRcaGF0IHAkIHF1ZSB2b2PDqiBlc2NvbGhldS5dey5obH0KCiAgIGBgYHtyIGNoaWxkPSdncmFkdWFjYW8xLlJtZCcsIGV2YWw9Z2FiYXJpdG99CiAgICAKICAgYGBgCgoxLiBFbSB1bWEgYW1vc3RyYSBkZSAkNDAwJCBhbHVub3MgdW5pdmVyc2l0w6FyaW9zLCAkMTUwJCBjb21wbGV0YXJhbSBhIGdyYWR1YcOnw6NvIGVtICQ0JCBhbm9zIG91IG1lbm9zLiBUZXN0ZSBhIGFmaXJtYcOnw6NvIGRlIHF1ZSwgbmEgcG9wdWxhw6fDo28sIFttZW5vcyBkZSAkNDBcJSRdey5obH0gZG9zIGFsdW5vcyB1bml2ZXJzaXTDoXJpb3MgY29tcGxldGFtIGEgZ3JhZHVhw6fDo28gbmVzdGUgdGVtcG8uCgogICBgYGB7ciBjaGlsZD0nZ3JhZHVhY2FvMi5SbWQnLCBldmFsPWdhYmFyaXRvfQogICAgCiAgIGBgYAoKCiMgRXN0aW1hdGl2YSBkbyB0YW1hbmhvIGRlIHVtYSBtdWx0aWTDo29eW0Jhc2VhZG8gZW0gaHR0cHM6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLzIwMTAxMDA4MTkyODU1L2h0dHA6Ly93d3cubGlmZXNsaXR0bGVteXN0ZXJpZXMuY29tL2hvdy1pcy1jcm93ZC1zaXplLWVzdGltYXRlZC0tMTA3NC9dIHsgI211bHRpZGFvIH0KCk9ic2VydmUgYSBmb3RvIGFiYWl4bywgcXVlIG1vc3RyYSBbcGFydGVdey5obH0gZGUgdW1hIG11bHRpZMOjby4gQSBxdWFudGlkYWRlIGRlIHBlc3NvYXMgZW0gY2FkYSBzZXRvciBxdWFkcmFkbyBmb2kgZXN0aW1hZGEgcG9yIHVtIGFsZ29yaXRtby4KCmBgYHtyIGVjaG89RkFMU0UsIG91dC53aWR0aD0nODAlJ30Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoJ2Nyb3dkLWNvdW50aW5nLTAyLmpwZycpCmBgYAoKT3MgdmFsb3JlcyBvYnRpZG9zIHBhcmEgb3Mgc2V0b3JlcyBkYSBmb3RvIGZvcmFtCgpgYGB7cn0Kc2V0b3JlcyA8LSBjKAogIDIwMCwgNDAwLCA4MDAsIDEwMDAsIDQwMCwgODAwLCA3MDAsIDEwMDAsIDQwMCwgMjAwLCA3MDAsIDkwMCwgNDAwLCA0MDAsIDcwMCwgOTAwLCAgCiAgNjAwLCA3MDAsIDkwMCwgNjUwLCA2NzIsIDcwMCwgOTAwLCA0NTAsIDU2NiwgNzAwLCA5MDAKKQpgYGAKCgoxLiBDb25zdHJ1YSB1bSBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSAkOTVcJSQgcGFyYSBhIHF1YW50aWRhZGUgbcOpZGlhIGRlIHBlc3NvYXMgcG9yIHNldG9yIG5hIG11bHRpZMOjbyBbaW50ZWlyYV17LmhsfSAoaW5jbHVzaXZlIGFzIHBhcnRlcyBxdWUgbsOjbyBhcGFyZWNlbSBuYSBmb3RvKS4KCiAgIGBgYHtyIGNoaWxkPSdtdWx0aWRhbzEuUm1kJywgZXZhbD1nYWJhcml0b30KICAgIAogICBgYGAKCjEuIFVzYW5kbyBvIHJlc3VsdGFkbyBkbyBpdGVtIGFudGVyaW9yIGUgY29uc2lkZXJhbmRvIHF1ZSBhIG11bHRpZMOjbyBbaW50ZWlyYV17LmhsfSBjb2JyZSAkNTAkIHNldG9yZXMsIGNvbnN0cnVhIHVtIGludGVydmFsbyBkZSBjb25maWFuw6dhIHBhcmEgbyB0b3RhbCBkZSBwZXNzb2FzIG5hIG11bHRpZMOjby4KCiAgIGBgYHtyIGNoaWxkPSdtdWx0aWRhbzIuUm1kJywgZXZhbD1nYWJhcml0b30KICAgIAogICBgYGAKCjEuIEZhw6dhIHVtIHRlc3RlIGRlIGhpcMOzdGVzZXMgcGFyYSBhdmFsaWFyIGEgYWZpcm1hw6fDo28gZGUgcXVlIGEgbXVsdGlkw6NvIFtpbnRlaXJhXXsuaGx9IGNvbnNpc3RlIGRlIFttYWlzIGRlICQzNSQgbWlsIHBlc3NvYXNdey5obH0uIFVzZSAkXGFscGhhID0gMHssfTA1JC4KCiAgIGBgYHtyIGNoaWxkPSdtdWx0aWRhbzMuUm1kJywgZXZhbD1nYWJhcml0b30KICAgIAogICBgYGAKCgojIFB1bHNhw6fDo28gbcOpZGlhIGRlIG11bGhlcmVzCgoxLiBRdWFsIG8gdGFtYW5obyBtw61uaW1vIGRhIGFtb3N0cmEgbmVjZXNzw6FyaWEgcGFyYSBlc3RpbWFyLCBjb20gdW0gbsOtdmVsIGRlIGNvbmZpYW7Dp2EgZGUgJDk1XCUkIGUgdW1hIG1hcmdlbSBkZSBlcnJvIGRlICQyJCBiYXRpbWVudG9zIHBvciBtaW51dG8gKGJwbSksIGEgcHVsc2HDp8OjbyBtw6lkaWEgZGUgbXVsaGVyZXMgYWR1bHRhcz8gRGUgZXN0dWRvcyBhbnRlcmlvcmVzLCBwb2RlbW9zIHVzYXIgYSBpbmZvcm1hw6fDo28gZGUgcXVlIG8gZGVzdmlvIHBhZHLDo28gZGEgcG9wdWxhw6fDo28gw6kgJFxzaWdtYSA9IDEyeyx9NTQkIGJwbS4gCgogICBgYGB7ciBjaGlsZD0ncHVsc28xLlJtZCcsIGV2YWw9Z2FiYXJpdG99CiAgICAKICAgYGBgCgoxLiBPIHZldG9yIGBwdWxzYWNhb2AgY29udMOpbSBvcyB2YWxvcmVzIGRhcyBwdWxzYcOnw7VlcyAoZW0gYnBtKSBkZSBkaXZlcnNhcyBtdWxoZXJlcy4gCgogICAgYGBge3J9CiAgICBwdWxzYWNhbyA8LSBjKAogICAgICA4MCwgOTQsIDU4LCA2NiwgNTYsIDgyLCA3OCwgODYsIDg4LCA1NiwgMzYsIDY2LCA4NCwgNzYsIDc4LCA2NCwgNjYsIAogICAgICA3OCwgNjAsIDY0LCA4NCwgODIsIDcwLCA3NCwgODYsIDkwLCA4OCwgOTAsIDkwLCA5NCwgNjgsIDkwLCA4MiwgODAsIDc0LCAKICAgICAgNTYsIDEwMCwgNzQsIDc2LCA3NiwgODYsIDc0LCA2NiwgNjIsIDc4LCA2OCwgNjIsIDYyLCA3NCwgMTA0LCA1NCwgNzQsIAogICAgICA3NCwgODQsIDYwLCA1MiwgODQsIDY2LCA1NiwgNjYsIDg0LCA2NCwgNjQsIDc4LCAxMDQsIDg0LCA4NCwgNjIsIDgyLCA2NCwgCiAgICAgIDc4LCA3NiwgODYsIDcyLCA4MiwgODIsIDY2LCA1OCwgNjIsIDgwLCA1OCwgODIsIDc2LCA3MCwgODgsIDQ0LCA1OCwgNjQsIAogICAgICA2OCwgNzAsIDU4LCA3MiwgODAsIDcwLCA3NCwgNzIsIDY2LCA4MiwgOTgsIDc0LCA4MCwgODIsIDU2LCA3OCwgMTAwLCA1NiwgCiAgICAgIDY4LCA3MiwgNjQsIDk0LCA3MiwgNTYsIDgwLCA3NiwgNTYsIDU2LCA1NCwgNzIsIDcwLCA4MCwgNzIsIDYyLCA5NiwgNzIsIAogICAgICA2MCwgOTgsIDcyLCA4MCwgODQsIDY4LCA4NiwgNzIsIDgwLCA2NCwgODIsIDgwLCA2MiwgNzQsIDk2LCA3MiwgOTYsIDY0LCAKICAgICAgNjIsIDgyLCA3NiwgOTQsIDc0CiAgICApCiAgICBgYGAKCjEuIFRlc3RlIGEgYWZpcm1hw6fDo28gZGUgcXVlIGEgcHVsc2HDp8OjbyBtw6lkaWEgZGUgbXVsaGVyZXMgYWR1bHRhcyDDqSBbbWVub3IgZG8gcXVlICQ3MCQgYnBtXXsuaGx9LiBVc2UgJFxhbHBoYSA9IDB7LH0wNSQuIFVzZSBvIGZhdG8gZGUgcXVlICRcc2lnbWEgPSAxMnssfTU0JCBicG0uCgogICBgYGB7ciBjaGlsZD0ncHVsc28zLlJtZCcsIGV2YWw9Z2FiYXJpdG99CiAgICAKICAgYGBgCgoxLiBSZWZhw6dhIG8gaXRlbSBhbnRlcmlvciBbc2VtIHVzYXIgbyBmYXRvIGRlIHF1ZSAkXHNpZ21hID0gMTJ7LH01NCQgYnBtLl17LmhsfQoKICAgYGBge3IgY2hpbGQ9J3B1bHNvNC5SbWQnLCBldmFsPWdhYmFyaXRvfQogICAgCiAgIGBgYAoKMS4gQ29tcGFyZSBlIGNvbWVudGUgb3MgcmVzdWx0YWRvcy4KCiAgIGBgYHtyIGNoaWxkPSdwdWxzbzUuUm1kJywgZXZhbD1nYWJhcml0b30KICAgIAogICBgYGAKCgojIFBsYXlTdGF0aW9ucyBjb20gKmJvb3RzdHJhcHBpbmcqCgpFbSB1bWEgYW1vc3RyYSAkQSQgZGUgJDIwMCQgcGVzc29hcywgJDEyNCQgcG9zc3VlbSB1bSBQbGF5U3RhdGlvbi4KCk8gbcOpdG9kbyBkZSAqYm9vdHN0cmFwcGluZyogY29uc2lzdGUgZW0gc2ltdWxhciBtdWl0YXMgYW1vc3RyYXMgLS0tIFtjb20gcmVwb3Npw6fDo29dey5obH0gLS0tIGEgcGFydGlyIGRvcyBlbGVtZW50b3MgZGVzdGEgYW1vc3RyYSBvcmlnaW5hbCAkQSQuIEEgcGFydGlyIGRlc3RhcyBtdWl0YXMgYW1vc3RyYXMgc2ltdWxhZGFzLCB2b2PDqiBwb2RlIGNhbGN1bGFyIGludGVydmFsb3MgZGUgY29uZmlhbsOnYSBjb21vIGV4cGxpY2FkbyBhYmFpeG86CgoxLiBBcm1hemVuZSwgZW0gdW1hIGxpc3RhLCAkMTAkIG1pbCBhbW9zdHJhcywgY2FkYSB1bWEgY29tICQyMDAkIHBlc3NvYXMgc29ydGVhZGFzIFtjb20gcmVwb3Npw6fDo29dey5obH0gYSBwYXJ0aXIgZGEgYW1vc3RyYSBvcmlnaW5hbCAkQSQgYWNpbWEgKGNvbSB0b2RhcyBhcyAkMjAwJCBwZXNzb2FzIHRlbmRvIGEgbWVzbWEgcHJvYmFiaWxpZGFkZSBkZSBzb3J0ZWlvKS4KCiAgIGBgYHtyIGNoaWxkPSdwczEuUm1kJywgZXZhbD1nYWJhcml0b30KICAgIAogICBgYGAKCjEuIEFybWF6ZW5lLCBlbSB1bSB2ZXRvciBkZSAkMTAkIG1pbCBlbGVtZW50b3MsIGFzIHByb3BvcsOnw7VlcyBkZSBwb3NzdWlkb3JlcyBkZSBQbGF5U3RhdGlvbnMgbmFzIGFtb3N0cmFzIG9idGlkYXMgbm8gaXRlbSBhbnRlcmlvci4KCiAgIGBgYHtyIGNoaWxkPSdwczIuUm1kJywgZXZhbD1nYWJhcml0b30KICAgIAogICBgYGAKCjEuIEltcHJpbWEgb3MgdmFsb3JlcyBkZXN0ZSB2ZXRvciBxdWUgZXN0w6NvIG5vIHF1YW50aWwgJDB7LH0wNSQgZSBubyBxdWFudGlsICQweyx9OTUkLiBFc3RlcyBzw6NvIG9zIGV4dHJlbW9zIGRvIGludGVydmFsbyBkZSBjb25maWFuw6dhIHBhcmEgYSBwcm9wb3LDp8OjbyBkZSBwb3NzdWlkb3JlcyBkZSBQbGF5U3RhdGlvbnMgbmEgcG9wdWxhw6fDo28sIGNvbSAkOTVcJSQgZGUgY29uZmlhbsOnYSwgY2FsY3VsYWRvcyB2aWEgKmJvb3RzdHJhcHBpbmcqLgoKICAgW1VtYSBkYXMgdmFudGFnZW5zIGRvICpib290c3RyYXBwaW5nKiDDqSBuw6NvIHByZWNpc2FyIGRlIHF1YWxxdWVyIGNvbmhlY2ltZW50byBzb2JyZSBhIHBvcHVsYcOnw6NvIC0tLSBzdWEgZGlzdHJpYnVpw6fDo28sIHN1YSB2YXJpw6JuY2lhIGV0Yy5dey5obH0KICAgCiAgIGBgYHtyIGNoaWxkPSdwczMuUm1kJywgZXZhbD1nYWJhcml0b30KICAgIAogICBgYGAKCjEuIFVzZSBhIGZ1bsOnw6NvIGBwcm9wLnRlc3QoKWAgZG8gUiBwYXJhIGNvbnN0cnVpciB1bSBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBwYXJhIGEgcHJvcG9yw6fDo28gZGUgcG9zc3VpZG9yZXMgZGUgUGxheVN0YXRpb25zIG5hIHBvcHVsYcOnw6NvLCBjb20gJDk1XCUkIGRlIGNvbmZpYW7Dp2EgLS0tIFtuw6NvIMOpIG5lY2Vzc8OhcmlvIGZhemVyIG9zIGPDoWxjdWxvcyBwYXNzbyBhIHBhc3NvLl17LmhsfSAKCiAgIGBgYHtyIGNoaWxkPSdwczQuUm1kJywgZXZhbD1nYWJhcml0b30KICAgIAogICBgYGAKCjEuIENvbXBhcmUgY29tIG8gcmVzdWx0YWRvIGRvICpib290c3RyYXBwaW5nKi4KCiAgIGBgYHtyIGNoaWxkPSdwczUuUm1kJywgZXZhbD1nYWJhcml0b30KICAgIAogICBgYGAKCgojIFRlbGVmb25lcyBjZWx1bGFyZXMgY29tICpib290c3RyYXBwaW5nKgoKVW1hIGFtb3N0cmEgZGFzIHF1YW50aWRhZGVzIGRlIHJhZGlhw6fDo28gZW1pdGlkYXMgcG9yIHRlbGVmb25lcyBjZWx1bGFyZXMgY29uc2lzdGUgZG9zIHNlZ3VpbnRlcyB2YWxvcmVzOgoKYGBge3J9CnJhZGlhY2FvIDwtIGMoMzgsIDU1LCA4NiwgOTEsIDk5LCAxMDMsIDE0NSkKYGBgCgpPIG3DqXRvZG8gZGUgKmJvb3RzdHJhcHBpbmcqIGNvbnNpc3RlIGVtIHNpbXVsYXIgbXVpdGFzIGFtb3N0cmFzIC0tLSBbY29tIHJlcG9zacOnw6NvXXsuaGx9IC0tLSBhIHBhcnRpciBkb3MgZWxlbWVudG9zIGRlc3RhIGFtb3N0cmEgb3JpZ2luYWwuIEEgcGFydGlyIGRlc3RhcyBtdWl0YXMgYW1vc3RyYXMgc2ltdWxhZGFzLCB2b2PDqiBwb2RlIGNhbGN1bGFyIGludGVydmFsb3MgZGUgY29uZmlhbsOnYSBjb21vIGV4cGxpY2FkbyBhYmFpeG86CgoxLiBBcm1hemVuZSwgZW0gdW1hIGxpc3RhLCAkMTAkIG1pbCBhbW9zdHJhcywgY2FkYSB1bWEgY29tICRgciBsZW5ndGgocmFkaWFjYW8pYCQgZWxlbWVudG9zIHNvcnRlYWRvcyBbY29tIHJlcG9zacOnw6NvXXsuaGx9IGEgcGFydGlyIGRvIHZldG9yIGByYWRpYWNhb2AgKGNvbSB0b2RvcyBvcyBlbGVtZW50b3MgdGVuZG8gYSBtZXNtYSBwcm9iYWJpbGlkYWRlIGRlIHNvcnRlaW8pLgoKICAgYGBge3IgY2hpbGQ9J3RlbDEuUm1kJywgZXZhbD1nYWJhcml0b30KICAgIAogICBgYGAKCjEuIEFybWF6ZW5lLCBlbSB1bSB2ZXRvciBkZSAkMTAkIG1pbCBlbGVtZW50b3MsIGFzIG3DqWRpYXMgZGFzIGFtb3N0cmFzIG9idGlkYXMgbm8gaXRlbSBhbnRlcmlvci4KCiAgIGBgYHtyIGNoaWxkPSd0ZWwyLlJtZCcsIGV2YWw9Z2FiYXJpdG99CiAgICAKICAgYGBgCgoxLiBJbXByaW1hIG9zIHZhbG9yZXMgZGVzdGUgdmV0b3IgcXVlIGVzdMOjbyBubyBxdWFudGlsICQweyx9MDUkIGUgbm8gcXVhbnRpbCAkMHssfTk1JC4gRXN0ZXMgc8OjbyBvcyBleHRyZW1vcyBkbyBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBwYXJhIGEgcmFkaWHDp8OjbyBtw6lkaWEgbmEgcG9wdWxhw6fDo28sIGNvbSAkOTVcJSQgZGUgY29uZmlhbsOnYSwgY2FsY3VsYWRvcyB2aWEgKmJvb3RzdHJhcHBpbmcqLgoKICAgW1VtYSBkYXMgdmFudGFnZW5zIGRvICpib290c3RyYXBwaW5nKiDDqSBuw6NvIHByZWNpc2FyIGRlIHF1YWxxdWVyIGNvbmhlY2ltZW50byBzb2JyZSBhIHBvcHVsYcOnw6NvIC0tLSBzdWEgZGlzdHJpYnVpw6fDo28sIHN1YSB2YXJpw6JuY2lhIGV0Yy5dey5obH0KICAgCiAgIGBgYHtyIGNoaWxkPSd0ZWwzLlJtZCcsIGV2YWw9Z2FiYXJpdG99CiAgICAKICAgYGBgCiAgIAoxLiBVc2UgYSBmdW7Dp8OjbyBgdC50ZXN0KClgIGRvIFIgcGFyYSBjb25zdHJ1aXIgdW0gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgcGFyYSBhIHJhZGlhw6fDo28gbcOpZGlhLCBjb20gJDk1XCUkIGRlIGNvbmZpYW7Dp2EgLS0tIFtuw6NvIMOpIG5lY2Vzc8OhcmlvIGZhemVyIG9zIGPDoWxjdWxvcyBwYXNzbyBhIHBhc3NvLl17LmhsfSAKCiAgIGBgYHtyIGNoaWxkPSd0ZWw0LlJtZCcsIGV2YWw9Z2FiYXJpdG99CiAgICAKICAgYGBgCgoxLiBDb21wYXJlIGNvbSBvIHJlc3VsdGFkbyBkbyAqYm9vdHN0cmFwcGluZyouCgogICBgYGB7ciBjaGlsZD0ndGVsNS5SbWQnLCBldmFsPWdhYmFyaXRvfQogICAgCiAgIGBgYAoKCiMgU29uaGFuZG8gZW0gY29yZXMgb3UgZW0gcHJldG8gZSBicmFuY29eW0Jhc2VhZG8gZW0gTXVyenluLCBFLiAoMjAwOCkuICJEbyB3ZSBvbmx5IGRyZWFtIGluIGNvbG91cj8gYSBjb21wYXJpc29uIG9mIHJlcG9ydGVkIGRyZWFtIGNvbG91ciBpbiB5b3VuZ2VyIGFuZCBvbGRlciBhZHVsdHMgd2l0aCBkaWZmZXJlbnQgZXhwZXJpZW5jZXMgb2YgYmxhY2sgYW5kIHdoaXRlIG1lZGlhLiIgKkNvbnNjaW91c25lc3MgYW5kIENvZ25pdGlvbiosIDE3KDQpLCAxMjI44oCTMTIzNy4gaHR0cDovL2R4LmRvaS5vcmcvMTAuMTAxNi9qLmNvbmNvZy4yMDA4LjA5LjAwMl0KCkRlbnRyZSAkMzA2JCBwZXNzb2FzIFtjb20gbWFpcyBkZSAkNTUkIGFub3Ndey5obH0sICQ2OCQgZGlzc2VyYW0gcXVlIHNvbmhhbSBlbSBwcmV0byBlIGJyYW5jby4KCkRlbnRyZSAkMjk4JCBwZXNzb2FzIFtjb20gbWVub3MgZGUgJDI1JCBhbm9zXXsuaGx9LCAkMTMkIGRpc3NlcmFtIHF1ZSBzb25oYW0gZW0gcHJldG8gZSBicmFuY28uCgoxLiBDb25zdHJ1YSB1bSBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSAkOTlcJSQgcGFyYSBhIGRpZmVyZW7Dp2EgZW50cmUgYXMgZHVhcyBwcm9wb3LDp8O1ZXMuCgogICBgYGB7ciBjaGlsZD0nc29uaG8xLlJtZCcsIGV2YWw9Z2FiYXJpdG99CiAgICAKICAgYGBgCgoxLiBUZXN0ZSBhIGFmaXJtYcOnw6NvIGRlIHF1ZSBhIHByb3BvcsOnw6NvIGRlIHBlc3NvYXMgW2NvbSBtYWlzIGRlICQ1NSQgYW5vc117LmhsfSBxdWUgc29uaGFtIGVtIHByZXRvIGUgYnJhbmNvIMOpIFttYWlvciBkbyBxdWVdey5obH0gYSBwcm9wb3LDp8OjbyBkZSBwZXNzb2FzIFtjb20gbWVub3MgZGUgJDI1JCBhbm9zXXsuaGx9IHF1ZSBzb25oYW0gZW0gcHJldG8gZSBicmFuY28uIFVzZSAkXGFscGhhID0gMHssfTAxJC4KCiAgIGBgYHtyIGNoaWxkPSdzb25obzIuUm1kJywgZXZhbD1nYWJhcml0b30KICAgIAogICBgYGAKCgojIFByb2Zlc3NvcmVzICRcdGltZXMkIHByb2Zlc3NvcmFzXltCYXNlYWRvIGVtIEFuZHJldyBHZWxtYW4gZSBKZW5uaWZlciBIaWxsICgyMDA5KSwgIlJlcGxpY2F0aW9uIERhdGEgZm9yIERhdGEgQW5hbHlzaXMgVXNpbmcgUmVncmVzc2lvbiBNdWx0aWxldmVsIEhpZXJhcmNoaWNhbCBNb2RlbHMiLCBodHRwOi8vaGRsLmhhbmRsZS5uZXQvMTkwMi4xLzEwMjg1Cl0KClByb2Zlc3NvcmFzIG11bGhlcmVzIHJlY2ViZW0gYXZhbGlhw6fDtWVzIG1lbGhvcmVzIGRvIHF1ZSBwcm9mZXNzb3JlcyBob21lbnM/CgpFbSB1bWEgdW5pdmVyc2lkYWRlLCBhcyBwcm9mZXNzb3JhcyBtdWxoZXJlcyByZWNlYmVyYW0gYXMgc2VndWludGVzIG5vdGFzIGRvcyBhbHVub3M6CgpgYGB7cn0KbXVsaGVyZXMgPC0gYygKIDQuMywgNC4zLCA0LjQsIDQuMCwgMy40LCA0LjcsIDIuOSwgNC4wLCA0LjMsIDMuNCwgMy40LCAzLjMKKQpgYGAKCk5hIG1lc21hIHVuaXZlcnNpZGFkZSwgb3MgcHJvZmVzc29yZXMgaG9tZW5zIHJlY2ViZXJhbSBhcyBzZWd1aW50ZXMgbm90YXM6CgpgYGB7cn0KaG9tZW5zIDwtIGMoCiA0LjUsIDMuNywgNC4yLCAzLjksIDMuMSwgNC4wLCAzLjgsIDMuNCwgNC41LCAzLjgsIDQuMywgNC40LCA0LjEsIDQuMiwgNC4wCikKYGBgCgpOYWRhIMOpIHNhYmlkbyBzb2JyZSBhcyB2YXJpw6JuY2lhcyBkYXMgZHVhcyBwb3B1bGHDp8O1ZXMuCgoxLiBDb25zdHJ1YSB1bSBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBkZSAkOTVcJSQgcGFyYSBhIGRpZmVyZW7Dp2EgZW50cmUgYXMgbcOpZGlhcy4KCiAgIGBgYHtyIGNoaWxkPSdwcm9mMS5SbWQnLCBldmFsPWdhYmFyaXRvfQogICAgCiAgIGBgYAoKMS4gVGVzdGUgYSBhZmlybWHDp8OjbyBkZSBxdWUgYXMgbcOpZGlhcyBzw6NvIGRpZmVyZW50ZXMuIFVzZSAkXGFscGhhID0gMHssfTA1JC4KCiAgIGBgYHtyIGNoaWxkPSdwcm9mMi5SbWQnLCBldmFsPWdhYmFyaXRvfQogICAgCiAgIGBgYAoKCiMgTXVsaGVyZXMgJFx0aW1lcyQgbWFyaWRvc15bQmFzZWFkbyBlbSBNZWhsLCBNLiBSLiwgVmF6aXJlLCBTLiwgTmFpcsOhbiBSYW3DrXJlei1Fc3BhcnphLCBTbGF0Y2hlciwgUi4gQi4sICYgUGVubmViYWtlciwgSi4gVy4gKDIwMDcpLiAiQXJlIFdvbWVuIFJlYWxseSBNb3JlIFRhbGthdGl2ZSBUaGFuIE1lbj8iLCAqU2NpZW5jZSosIDMxNyg1ODM0KSwgODIuIGh0dHA6Ly9keC5kb2kub3JnLzEwLjExMjYvc2NpZW5jZS4xMTM5OTQwXQoKQSB0YWJlbGEgYWJhaXhvIG1vc3RyYSBhcyBxdWFudGlkYWRlcyBkZSBwYWxhdnJhcyBmYWxhZGFzIGVtIHVtIGRpYSBwZWxvcyBtYXJpZG9zIGUgbXVsaGVyZXMgZW0gJDgkIGNhc2FpczoKCmBgYHtyIGVjaG89RkFMU0V9CmRmIDwtIHRpYmJsZSgKICBjYXNhbCA9IDE6OCwKICBtYXJpZG8gPSBjKAogICAgMTU2ODQsCiAgICAyNjQyOSwKICAgICAxNDExLAogICAgIDc3NzEsCiAgICAxODg3NiwKICAgIDE1NDc3LAogICAgMTQwNjksCiAgICAyNTgzNQogICksCiAgbXVsaGVyID0gYygKICAgIDI0NjI1LAogICAgMTMzOTcsCiAgICAxODMzOCwKICAgIDE3NzkxLAogICAgMTI5NjQsCiAgICAxNjkzNywKICAgIDE2MjU1LAogICAgMTg2NjcKICApCikKCmRmICU+JSBrYmwoCiAgZGlnaXRzID0gOSwgCiAgYWxpZ24gPSAncicsIAogIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICcuJykKKSAlPiUgCmthYmxlX3BhcGVyKAogIGMoJ3N0cmlwZWQnLCAnaG92ZXInKSwKICBmdWxsX3dpZHRoID0gRkFMU0UKKQpgYGAKCjEuIENvbnN0cnVhIHVtIGludGVydmFsbyBkZSBjb25maWFuw6dhIGRlICQ5NVwlJCBwYXJhIGEgZGlmZXJlbsOnYSBtw6lkaWEgZW50cmUgYXMgcXVhbnRpZGFkZXMgZGUgcGFsYXZyYXMgZmFsYWRhcyBwZWxvcyBkb2lzIGPDtG5qdWdlcyBkZSB1bSBjYXNhbC4KCiAgIGBgYHtyIGNoaWxkPSdjYXNhaXMxLlJtZCcsIGV2YWw9Z2FiYXJpdG99CiAgICAKICAgYGBgCgoxLiBUZXN0ZSBhIGFmaXJtYcOnw6NvIGRlIHF1ZSwgZW0gY2FzYWlzIGVtIGdlcmFsLCBhIG11bGhlciBmYWxhIG1haXMgZG8gcXVlIG8gaG9tZW0uIFVzZSAkXGFscGhhID0gMHssfTA1JC4KCiAgIGBgYHtyIGNoaWxkPSdjYXNhaXMyLlJtZCcsIGV2YWw9Z2FiYXJpdG99CiAgICAKICAgYGBgCgojIFRlbXBlcmF0dXJhIGNvcnBvcmFsIGNvbSAqYm9vdHN0cmFwcGluZyoKCkEgdGFiZWxhIGFiYWl4byBtb3N0cmEgYXMgdGVtcGVyYXR1cmEgY29ycG9yYWlzIChlbSBncmF1cyBDZWxzaXVzKSBkZSAkMzIkIHBlc3NvYXMsIG1lZGlkYXMgZGUgbWFuaMOjIGUgZGUgdGFyZGU6CgpgYGB7ciBlY2hvPUZBTFNFfQpkZiA8LSB0aWJibGUoCiAgcGVzc29hID0gMTozMiwKICBtYW5ow6MgPSBjKAogICAgMzYuNywgMzcsIDM2LjMsIDM2LjgsIDM2LjgsIDM2LjgsIDM1LjksIDM2LjMsIDM2LjMsIDM2LjgsIDM2LjMsIDM2LjYsCiAgICAzNi45LCAzNi40LCAzNS43LCAzNi43LCAzNy4xLCAzNy40LCAzNy4xLCAzNi41LCAzNy4yLCAzNi43LCAzNy4xLCAzNi40LAogICAgMzcuMiwgMzYuOSwgMzYuMiwgMzcuMSwgMzYuMywgMzcuMSwgMzcuMiwgMzcuMwogICksCiAgdGFyZGUgPSBjKAogICAgMzYuNywgMzcuMSwgMzYuNywgMzcuMSwgMzcuMSwgMzYuNCwgMzcsIDM3LCAzNy4xLCAzNi43LCAzNi44LCAzNi43LAogICAgMzYuNywgMzYuMSwgMzYuMiwgMzYuOCwgMzcuMSwgMzcuNCwgMzYuNiwgMzYuOSwgMzYuNSwgMzYuOCwgMzYuNSwgMzYuMiwKICAgIDM2LjksIDM3LCAzNi4zLCAzNS45LCAzNi4xLCAzNi45LCAzNi44LCAzNwogICkKKQoKZGYgJT4lIGtibCgKICBkaWdpdHMgPSA5LCAKICBhbGlnbiA9ICdyJywgCiAgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gJy4nKQopICU+JSAKa2FibGVfcGFwZXIoCiAgYygnc3RyaXBlZCcsICdob3ZlcicpLAogIGZ1bGxfd2lkdGggPSBGQUxTRQopCmBgYAoKTyBtw6l0b2RvIGRlICpib290c3RyYXBwaW5nKiBjb25zaXN0ZSBlbSBzaW11bGFyIG11aXRhcyBhbW9zdHJhcyAtLS0gW2NvbSByZXBvc2nDp8Ojb117LmhsfSAtLS0gYSBwYXJ0aXIgZG9zIGVsZW1lbnRvcyBkZXN0YSBhbW9zdHJhIG9yaWdpbmFsLiBBIHBhcnRpciBkZXN0YXMgbXVpdGFzIGFtb3N0cmFzIHNpbXVsYWRhcywgdm9jw6ogcG9kZSBjYWxjdWxhciBpbnRlcnZhbG9zIGRlIGNvbmZpYW7Dp2EgY29tbyBleHBsaWNhZG8gYWJhaXhvOgoKMS4gQ2FsY3VsZSBhIGRpZmVyZW7Dp2EgZW50cmUgYSB0ZW1wZXJhdHVyYSBtYXRpbmFsIGUgYSB0ZW1wZXJhdHVyYSB2ZXNwZXJ0aW5hIHBhcmEgY2FkYSBwZXNzb2EsIGFybWF6ZW5hbmRvIG9zIHJlc3VsdGFkb3MgZW0gdW0gdmV0b3IgYGRpZmVyZW5jYXNgLCBjb20gJDMyJCB2YWxvcmVzLgoKICAgYGBge3IgY2hpbGQ9J3RlbXAxLlJtZCcsIGV2YWw9Z2FiYXJpdG99CiAgICAKICAgYGBgCgoxLiBBcm1hemVuZSwgZW0gdW1hIGxpc3RhLCAkMTAkIG1pbCBhbW9zdHJhcywgY2FkYSB1bWEgY29tICQzMiQgZWxlbWVudG9zIHNvcnRlYWRvcyBbY29tIHJlcG9zacOnw6NvXXsuaGx9IGEgcGFydGlyIGRvIHZldG9yIGBkaWZlcmVuY2FzYCAoY29tIHRvZG9zIG9zIGVsZW1lbnRvcyB0ZW5kbyBhIG1lc21hIHByb2JhYmlsaWRhZGUgZGUgc29ydGVpbykuCgogICBgYGB7ciBjaGlsZD0ndGVtcDIuUm1kJywgZXZhbD1nYWJhcml0b30KICAgIAogICBgYGAKCjEuIEFybWF6ZW5lLCBlbSB1bSB2ZXRvciBkZSAkMTAkIG1pbCBlbGVtZW50b3MsIGFzIG3DqWRpYXMgZGFzIGFtb3N0cmFzIG9idGlkYXMgbm8gaXRlbSBhbnRlcmlvci4KCiAgIGBgYHtyIGNoaWxkPSd0ZW1wMy5SbWQnLCBldmFsPWdhYmFyaXRvfQogICAgCiAgIGBgYAoKMS4gSW1wcmltYSBvcyB2YWxvcmVzIGRlc3RlIHZldG9yIHF1ZSBlc3TDo28gbm8gcXVhbnRpbCAkMHssfTA1JCBlIG5vIHF1YW50aWwgJDB7LH05NSQuIEVzdGVzIHPDo28gb3MgZXh0cmVtb3MgZG8gaW50ZXJ2YWxvIGRlIGNvbmZpYW7Dp2EgcGFyYSBhIGRpZmVyZW7Dp2EgbcOpZGlhIGRlIHRlbXBlcmF0dXJhIG5hIHBvcHVsYcOnw6NvLCBjb20gJDk1XCUkIGRlIGNvbmZpYW7Dp2EsIGNhbGN1bGFkb3MgdmlhICpib290c3RyYXBwaW5nKi4KCiAgIFtVbWEgZGFzIHZhbnRhZ2VucyBkbyAqYm9vdHN0cmFwcGluZyogw6kgbsOjbyBwcmVjaXNhciBkZSBxdWFscXVlciBjb25oZWNpbWVudG8gc29icmUgYSBwb3B1bGHDp8OjbyAtLS0gc3VhIGRpc3RyaWJ1acOnw6NvLCBzdWEgdmFyacOibmNpYSBldGMuXXsuaGx9CiAgIAogICBgYGB7ciBjaGlsZD0ndGVtcDQuUm1kJywgZXZhbD1nYWJhcml0b30KICAgIAogICBgYGAKCjEuIFVzZSBhIGZ1bsOnw6NvIGB0LnRlc3QoKWAgZG8gUiBwYXJhIGNvbnN0cnVpciB1bSBpbnRlcnZhbG8gZGUgY29uZmlhbsOnYSBwYXJhIGEgZGlmZXJlbsOnYSBtw6lkaWEgZGUgdGVtcGVyYXR1cmEgbmEgcG9wdWxhw6fDo28sIGNvbSAkOTVcJSQgZGUgY29uZmlhbsOnYSAtLS0gW27Do28gw6kgbmVjZXNzw6FyaW8gZmF6ZXIgb3MgY8OhbGN1bG9zIHBhc3NvIGEgcGFzc28uXXsuaGx9IAoKICAgYGBge3IgY2hpbGQ9J3RlbXA1LlJtZCcsIGV2YWw9Z2FiYXJpdG99CiAgICAKICAgYGBgCgoxLiBDb21wYXJlIGNvbSBvIHJlc3VsdGFkbyBkbyAqYm9vdHN0cmFwcGluZyouCgogICBgYGB7ciBjaGlsZD0ndGVtcDYuUm1kJywgZXZhbD1nYWJhcml0b30KICAgIAogICBgYGAKCgo8ZGl2IHN0eWxlPSdoZWlnaHQ6IDUwcHgnPjwvZGl2PgoKIyBOb3RhcyB7LX0KCg==