Pokračování v pipeline infer

Testování hypotéz v R

Richie Cotton

Data Evangelist at DataCamp

Opakování: hypotézy a dataset

$H_{0}$: Podíl nadšenců mladších 30 let je stejný jako podíl nadšenců ve věku alespoň 30 let.

$H_{A}$: Podíl nadšenců mladších 30 let se liší od podílu nadšenců ve věku alespoň 30 let.

alpha <- 0.1

stack_overflow_imbalanced %>% 
  count(hobbyist, age_cat, .drop = FALSE)
  hobbyist     age_cat    n
1       No At least 30    0
2       No    Under 30  191
3      Yes At least 30   15
4      Yes    Under 30 1025
Testování hypotéz v R

Opakování: postup

null_distn <- dataset %>% 
  specify() %>% 
  hypothesize() %>% 
  generate() %>% 
  calculate()
observed_stat <- dataset %>% 
  specify() %>% 
  calculate()
get_p_value(null_distn, observed_stat)
stack_overflow_imbalanced %>%
  specify(hobbyist ~ age_cat, success = "Yes") %>% 
  hypothesize(null = "independence")
Response: hobbyist (factor)
Explanatory: age_cat (factor)
Null Hypothesis: independence
# A tibble: 1,231 x 2
  hobbyist age_cat    
  <fct>    <fct>      
1 Yes      At least 30
2 Yes      At least 30
3 Yes      At least 30
4 Yes      Under 30   
5 Yes      At least 30
6 Yes      At least 30
7 No       Under 30   
# ... with 1,224 more rows
Testování hypotéz v R

Motivace pro generate()

$H_{0}$: Podíl nadšenců mladších 30 let je stejný jako podíl nadšenců ve věku alespoň 30 let.

Pokud platí $H_{0}$, pak

  • V každém řádku by hodnota nadšence mohla odpovídat libovolné věkové kategorii se stejnou pravděpodobností.
  • Pro simulaci permutujeme (přeházíme) hodnoty nadšence a věkové kategorie ponecháme fixní.
Testování hypotéz v R

DNT_FAKE_不僅HEADER







stack_overflow_imbalanced


# A tibble: 1,231 x 2 hobbyist age_cat <fct> <fct> 1 Yes At least 30 2 Yes At least 30 3 Yes At least 30 4 Yes Under 30 5 Yes At least 30 6 Yes At least 30 7 No Under 30 # ... with 1,224 more rows
bind_cols(
  stack_overflow_imbalanced %>% 
    select(hobbyist) %>% 
    slice_sample(prop = 1),
  stack_overflow_imbalanced %>% 
    select(age_cat)
)
# A tibble: 1,231 x 2
  hobbyist age_cat    
  <fct>    <fct>      
1 Yes      At least 30
2 Yes      At least 30
3 No       At least 30
4 No       Under 30   
5 Yes      At least 30
6 Yes      At least 30
7 Yes      Under 30   
# ... with 1,224 more rows
Testování hypotéz v R

Generování replikátů

Dvousloupcová tabulka jako výsledek specifikace sloupců je vlevo. Vpravo je slovo generate se šipkou doprava. Za šipkou jsou tři další dvousloupcové tabulky představující replikáty. Pravý sloupec každého replikátu je shodný s původním datasetem – vysvětlující proměnná se nemění. Levý sloupec se liší – odpověďová proměnná je permutována.

Testování hypotéz v R

generate()

generate() generuje simulovaná data odpovídající nulové hypotéze.

  • Pro nulové hypotézy o „nezávislosti" nastavte type na "permute".
  • Pro „bodové" nulové hypotézy nastavte type na "bootstrap" nebo "simulate".
stack_overflow_imbalanced %>%
  specify(hobbyist ~ age_cat, success = "Yes") %>% 
  hypothesize(null = "independence") %>% 
  generate(reps = 5000, type = "permute")
Response: hobbyist (factor)
Explanatory: age_cat (factor)
Null Hypothesis: independence
# A tibble: 6,155,000 x 3
# Groups:   replicate [5,000]
  hobbyist age_cat     replicate
  <fct>    <fct>           <int>
1 Yes      At least 30         1
2 Yes      At least 30         1
3 Yes      At least 30         1
4 Yes      Under 30            1
5 Yes      At least 30         1
6 Yes      At least 30         1
7 Yes      Under 30            1
# ... with 6,154,993 more rows
Testování hypotéz v R

Výpočet testové statistiky

Jsou zobrazeny tabulky původního datasetu a replikátů z kroku generování. Pod nimi je slovo „calculate" a pod každým replikátem šipka dolů. Pod každou šipkou je jedna buňka představující testovou statistiku. Všechny testové statistiky replikátů jsou orámovány a označeny jako „nulové rozdělení".

Testování hypotéz v R

calculate()

calculate() vypočítá rozdělení testových statistik, označované jako nulové rozdělení.

null_distn <- stack_overflow_imbalanced %>%
  specify(
    hobbyist ~ age_cat, 
    success = "Yes"
  ) %>%
  hypothesize(null = "independence") %>%
  generate(reps = 5000, type = "permute") %>%
  calculate(
    stat = "diff in props", 
    order = c("At least 30", "Under 30")
  )
# A tibble: 5,000 x 2
  replicate    stat
      <int>   <dbl>
1         1  0.0896
2         2  0.0896
3         3 -0.180 
4         4  0.157 
5         5  0.0896
6         6 -0.113 
7         7  0.0221
# ... with 4,993 more rows
1 Všechny možné testové statistiky jsou uvedeny na stránce nápovědy ?calculate.
Testování hypotéz v R

Vizualizace nulového rozdělení

visualize(null_distn)

Histogram nulového rozdělení. Je levostranně zešikmený a obsahuje devět různých hodnot.

null_distn %>% count(stat)
# A tibble: 9 x 2
     stat     n
    <dbl> <int>
1 -0.383      2
2 -0.315     22
3 -0.248     63
4 -0.180    246
5 -0.113    641
6 -0.0454  1132
7  0.0221  1453
8  0.0896  1063
9  0.157    378
Testování hypotéz v R

Výpočet testové statistiky na původním datasetu

Jsou zobrazeny tabulky původního datasetu a replikátů spolu s buňkami nulového rozdělení z kroku výpočtu. Tentokrát je pod původním datasetem šipka dolů a pod ní jedna buňka označená jako „pozorovaná statistika".

Testování hypotéz v R

Pozorovaná statistika: specify() %>% calculate()

obs_stat <- stack_overflow_imbalanced %>%
  specify(hobbyist ~ age_cat, success = "Yes") %>%
  # hypothesize(null = "independence") %>%
  # generate(reps = 5000, type = "permute") %>%
  calculate(
    stat = "diff in props",
    order = c("At least 30", "Under 30")
  )
# A tibble: 1 x 1
   stat
  <dbl>
1 0.157
Testování hypotéz v R

Vizualizace: nulové rozdělení vs. pozorovaná statistika

visualize(null_distn) +
  geom_vline(
    aes(xintercept = stat),
    data = observed_stat, 
    color = "red"
  )

Histogram nulového rozdělení s červenou svislou čarou na pozorované statistice. Čára leží nad krajním pravým sloupcem histogramu.

Testování hypotéz v R

Získání p-hodnoty

get_p_value(
  null_distn, obs_stat, 
  direction = "two sided"   # Not alternative = "two.sided"
)
# A tibble: 1 x 1
  p_value
    <dbl>
1   0.151
# A tibble: 1 x 6
  statistic chisq_df p_value alternative lower_ci upper_ci
      <dbl>    <dbl>   <dbl> <chr>          <dbl>    <dbl>
1      2.79        1  0.0949 two.sided    0.00718   0.0217
Testování hypotéz v R

Let's practice!

Testování hypotéz v R

Preparing Video For Download...