Raport 6 - Bootstrap
Bootstrap w estymacji punktowej i przedziałowej na przykładzie badania średniej.
Analiza została wykonana na pliku studenci_warszawa.RData. Dane dotyczą 500 studentów pochodzących z i studiujących w Warszawie.
Zmienna objaśniana to dochody rodzin studentów liczone jako - Dochód rodziny (procent 3-go kwartyla dochodów rodzin w Warszawie).
Pozostałe zmienne (4):
plec= 0/1
samodzielnie : 0-mieszka z rodzicami/1-mieszka samodzielnie
rok : rok studiów [1-5]
rodzeństwo : 0- nie ma/ 1- ma rodzeństwo
(uzupełnie, że te dane ankietowe, pierwotnie wykorzystywaliśmy na zajęciach z mikroekonomeetrii na 1 semestrze II stopnia, w celu oszacowania modelu logitowego. Zmienną objaśnianą wtedy było czy strudent mieszka SAMODZIELNIE, dlatego też, zmiena dochody jest przedatwiona w nietypowy sposób).
library(psych)
tabela<- knitr::kable(head(studenci), caption="Studenci - dane")
kable_classic(tabela)
samodzielnie | rok | dochod | plec | rodzenstwo |
---|---|---|---|---|
0 | 5 | 76 | 0 | 1 |
1 | 3 | 149 | 0 | 0 |
1 | 2 | 122 | 0 | 1 |
1 | 3 | 135 | 0 | 0 |
0 | 1 | 112 | 1 | 1 |
1 | 5 | 145 | 1 | 0 |
Zadanie 1. Estymacja błędu standardowego średniej próbkowej metodą bootstrap.
Podstawowe statystyki opisowe dla Dochodów Rodzin studenta
opis=describe(studenci$dochod)
opis<- knitr::kable(opis, caption="statystyki opisowe dla zmiennej Dochód rodziny studenta")
kable_classic(opis)
vars | n | mean | sd | median | trimmed | mad | min | max | range | skew | kurtosis | se | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
X1 | 1 | 500 | 115.354 | 35.61187 | 114 | 115.23 | 37.065 | 13 | 216 | 203 | 0.0030899 | -0.0889096 | 1.592611 |
Estymacja błędu standardowego dla pełnej próby
Błąd standardowy
## [1] 1.592611
Procentowy Błąd standardowy
## [1] 0.01380629
Błąd standardowy równy 0.01380629 (1,38%) będzie punktem odniesienia w dalszych estymacjach metodą bootstrap.
dolna krawędź przedziału ufności
## [1] 112.2325
górna krawędź przedziału ufności
## [1] 118.4755
Estymacja błędu standardowego dla próbek bootstrapowych
nobs=50
poniżej Średnia, odch. standardowe, SE i SEP
B=999
mean.dochod=rep(0,B)
nobs=50 #liczba próbek bootstrapowych - zwiększaj ich liczbę: 50, 250, 500, 1000, 10000
## [1] 118.38
## [1] 35.09514
## [1] 4.963203
## [1] 0.01345338
dolny | gorny |
---|---|
108.6521 | 128.1079 |
dolny | gorny | |
---|---|---|
2.5% | 63.35 | 186.925 |
nobs=15
poniżej Średnia, odch. standardowe, SE i SEP
attach(studenci)
B=999
mean.dochod=rep(0,B)
nobs=15 #liczba próbek bootstrapowych - zwiększaj ich liczbę: 50, 250, 500, 1000, 10000
## [1] 115.5333
## [1] 23.90716
## [1] 6.172803
## [1] 0.01378486
dolny | gorny |
---|---|
103.4346 | 127.632 |
dolny | gorny | |
---|---|---|
2.5% | 77.7 | 158.9 |
nobs=30
poniżej Średnia, odch. standardowe, SE i SEP
attach(studenci)
B=999
mean.dochod=rep(0,B)
nobs=30 #liczba próbek bootstrapowych - zwiększaj ich liczbę: 50, 250, 500, 1000, 10000
## [1] 114.7
## [1] 24.23612
## [1] 4.42489
## [1] 0.01388501
dolny | gorny |
---|---|
106.0272 | 123.3728 |
dolny | gorny | |
---|---|---|
2.5% | 79.725 | 163.925 |
nobs=100
poniżej Średnia, odch. standardowe, SE i SEP
attach(studenci)
B=999
mean.dochod=rep(0,B)
nobs=100 #liczba próbek bootstrapowych - zwiększaj ich liczbę: 50, 250, 500, 1000, 10000
## [1] 113.75
## [1] 32.87177
## [1] 3.287177
## [1] 0.01400098
dolny | gorny |
---|---|
107.3071 | 120.1929 |
dolny | gorny | |
---|---|---|
2.5% | 56.95 | 171.05 |
Tabela - porównanie
liczebość.próbki | średnia.próbkowa | odch.std | SE | SEP |
---|---|---|---|---|
Pełny zakres | 115.3540 | 35.61187 | 1.59261 | 0.01381 |
N=15 | 115.5333 | 23.90716 | 6.17280 | 0.01378 |
N=30 | 114.7000 | 24.23612 | 4.42489 | 0.01389 |
N=50 | 118.3800 | 35.09514 | 4.96320 | 0.01345 |
N=100 | 113.7500 | 32.87177 | 3.28718 | 0.01400 |
Wnioski
Na podstawie powyżej tabeli można wysnuć wniosek, że wraz ze zwiększeniem liczebności próbek N, zwiększa się błąd standardowy procentowy i (SEP). Dlatego też ta metoda jest bardzo korzystna, ponieważ małe próby dają niewielkie procentowe błędy standardowe.
Dodatkowe porównanie Bootrstrap model vs model liniowy z zastosowaniem funkcji bootstraps()
Model KMNK
##
## Call:
## lm(formula = dochod ~ ., data = studenci)
##
## Residuals:
## Min 1Q Median 3Q Max
## -113.861 -14.766 0.138 13.797 111.368
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 101.5597 4.5076 22.531 < 2e-16 ***
## samodzielnie 20.3905 3.0926 6.593 1.11e-10 ***
## rok 1.6368 1.0990 1.489 0.137
## plec -1.8537 3.0738 -0.603 0.547
## rodzenstwo -0.2009 3.0577 -0.066 0.948
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 34.06 on 495 degrees of freedom
## Multiple R-squared: 0.09244, Adjusted R-squared: 0.0851
## F-statistic: 12.6 on 4 and 495 DF, p-value: 8.962e-10
Wiemy, że tylko zmienna samodzielnie jest istotna statystycznie w modelu szacującym dochody rodzin studentów. Poniżej zatem zostanie oszacowny model: dochod=const + beta*samodzielnie + u
##
## Call:
## lm(formula = dochod ~ samodzielnie, data = studenci)
##
## Residuals:
## Min 1Q Median 3Q Max
## -113.416 -13.305 0.695 13.584 110.695
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 105.305 2.103 50.065 < 2e-16 ***
## samodzielnie 21.111 3.049 6.924 1.36e-11 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 34.05 on 498 degrees of freedom
## Multiple R-squared: 0.08783, Adjusted R-squared: 0.08599
## F-statistic: 47.95 on 1 and 498 DF, p-value: 1.356e-11
Oszacowania modelu bootstrap dla 500 próbek
N dla każdej próbki wynosi tyle samo co pierwotne dane, tzn. 500 obserwacji
## # Bootstrap sampling
## # A tibble: 500 × 2
## splits id
## <list> <chr>
## 1 <split [500/185]> Bootstrap001
## 2 <split [500/185]> Bootstrap002
## 3 <split [500/187]> Bootstrap003
## 4 <split [500/177]> Bootstrap004
## 5 <split [500/199]> Bootstrap005
## 6 <split [500/180]> Bootstrap006
## 7 <split [500/180]> Bootstrap007
## 8 <split [500/190]> Bootstrap008
## 9 <split [500/193]> Bootstrap009
## 10 <split [500/184]> Bootstrap010
## # ℹ 490 more rows
## <Analysis/Assess/Total>
## <500/185/500>
boot_models<-boot_dane%>%
mutate(model = map(splits, ~lm(dochod~0+samodzielnie, data=.)),
coefs=map(model, tidy))
boot_models
## # Bootstrap sampling
## # A tibble: 500 × 4
## splits id model coefs
## <list> <chr> <list> <list>
## 1 <split [500/185]> Bootstrap001 <lm> <tibble [2 × 5]>
## 2 <split [500/185]> Bootstrap002 <lm> <tibble [2 × 5]>
## 3 <split [500/187]> Bootstrap003 <lm> <tibble [2 × 5]>
## 4 <split [500/177]> Bootstrap004 <lm> <tibble [2 × 5]>
## 5 <split [500/199]> Bootstrap005 <lm> <tibble [2 × 5]>
## 6 <split [500/180]> Bootstrap006 <lm> <tibble [2 × 5]>
## 7 <split [500/180]> Bootstrap007 <lm> <tibble [2 × 5]>
## 8 <split [500/190]> Bootstrap008 <lm> <tibble [2 × 5]>
## 9 <split [500/193]> Bootstrap009 <lm> <tibble [2 × 5]>
## 10 <split [500/184]> Bootstrap010 <lm> <tibble [2 × 5]>
## # ℹ 490 more rows
bootsraps( ) : times - The number of bootstrap samples.
## # A tibble: 1,000 × 2
## term estimate
## <chr> <dbl>
## 1 samodzielnie0 107.
## 2 samodzielnie1 127.
## 3 samodzielnie0 102.
## 4 samodzielnie1 124.
## 5 samodzielnie0 104.
## 6 samodzielnie1 127.
## 7 samodzielnie0 106.
## 8 samodzielnie1 127.
## 9 samodzielnie0 105.
## 10 samodzielnie1 128.
## # ℹ 990 more rows
Przedziały ufności
Poniżej tabela z przedziałami ufności w modelu dochody~samodzielnie.
boot_meds<-boot_coefs%>%
group_by(term)%>%
summarise(
mediana_est=median(estimate),
quintile=quantile(estimate,0.5),
conf.low_2.5=quantile(estimate, 0.025),
conf.high_97.5=quantile(estimate,0.975),
conf.25=quantile(estimate,0.25),
conf.75=quantile(estimate,0.75)
)
knitr::kable(boot_meds)%>%
kable_classic()
term | mediana_est | quintile | conf.low_2.5 | conf.high_97.5 | conf.25 | conf.75 |
---|---|---|---|---|---|---|
samodzielnie0 | 105.3178 | 105.3178 | 101.4066 | 109.1886 | 103.8528 | 106.5426 |
samodzielnie1 | 126.5098 | 126.5098 | 122.0641 | 131.1057 | 124.7712 | 127.9365 |
Histogram dla parametrów przy zmiennej samodzielne zamieszkanie
Na wykresie poniżej poza wykresem gęstości dla paramaterów zostały również zaznaczone przedziały ufności (zielone i niebieskie obszary) oraz mediana (linia pionowa).
Zewnętrzne pola jasno zielone oznaczają przedziały ufności 2,5% i 97,5%. Obszar zaznaczony na niebieski kolor to przedziały 25%-75%.
boot_coefs%>%
ggplot(aes(x=estimate))+
geom_rect(data=boot_meds, alpha=0.3, fill="green",
aes(x=mediana_est, xmin=conf.low_2.5, xmax=conf.high_97.5, ymin=0, ymax=Inf))+
geom_rect(data=boot_meds, alpha=0.4, fill="blue", aes(x=mediana_est, xmin=conf.25, xmax=conf.75,ymin=0, ymax=Inf))+
geom_density()+
geom_vline(data=boot_meds, aes(xintercept=mediana_est))+
facet_wrap(~term, scales = "free")
Na podsawie wykresów powyżej można stwierdzić, że 50% badanych studentów, którzy mieszkają z rodzicami (0) ich rodziny nie zarabiają więcej niż 107 jednostek i nie mniej niż 104j. Natomiast na wykresie po prawej widzimy, że w grupie, która mieszka samodzielnie (1), 50% badanych studentów zadeklarowało, że dochód w ich rodzinienie mieści się w przedziale 125-128j.
Co więcej 95% studentów mieszkających samodzielnie, w ich rodzinach, dochód nigdy nie był mniejszy niż 121 jednostek. Potiwerdza, to intuicyjne przekonanie, że tylko zamorzniejsze rodziny mogą sobie pozwolić na to aby, ich dziecko będące na studiach mieszkało samodzielnie, gdyż zazwyczaj większość studentów jest jeszcze wspieranych przez rodziców.
Bootstrap p-value - średnia vs mediana (1000 próbek)
Porównanie średnią i mediane dla p-value z regresji bootstrapowej w stosunku do p-value z modelu liniowego. W celu sprawdzenia czy mediana sprwadza się lepiej od średniej.
Liczna próbek = 1000 N=500 (jak pierwotne dane)
boot_models<- bootstraps(studenci, times=1000)%>%
mutate(model=map(splits, ~lm(dochod~0+samodzielnie, data=.)),
coefs=map(model, tidy))
m<-lm(dochod~samodzielnie, data=studenci)
boot_coefs%>%
group_by(term)%>%
summarise(
mean_boot_pvalue = mean(p.value),
mediana_boot_pvalue= median(p.value)
)%>%
left_join(tidy(m)%>% select(term, p.value))
## # A tibble: 2 × 4
## term mean_boot_pvalue mediana_boot_pvalue p.value
## <chr> <dbl> <dbl> <dbl>
## 1 samodzielnie0 1.20e-177 1.70e-196 NA
## 2 samodzielnie1 2.39e-192 1.56e-221 1.36e-11
Nie dostrzegamy znacznych różnic między medianą z p-value, a śrendią z p-value oszacowanym metodą bootstrap, ponieważ wartości są bardzo małe i bliskie zeru.
Zadanie 2. Estymacja błędu standardowego średniej próbkowej metodą bootstrap dla różnych wielkości próby.
attach(studenci)
mean.boot=function(dochod,idx) {
ans=mean(dochod[idx])
ans
}
DOCHOD.mean.boot = boot(dochod,statistic=mean.boot, R=999)
class(DOCHOD.mean.boot)
## [1] "boot"
## [1] "t0" "t" "R" "data" "seed" "statistic"
## [7] "sim" "call" "stype" "strata" "weights"
##
## ORDINARY NONPARAMETRIC BOOTSTRAP
##
##
## Call:
## boot(data = dochod, statistic = mean.boot, R = 999)
##
##
## Bootstrap Statistics :
## original bias std. error
## t1* 115.354 -0.03110911 1.563535
Nieparametryczne przedziały ufności Bootstrap
## BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS
## Based on 999 bootstrap replicates
##
## CALL :
## boot.ci(boot.out = DOCHOD.mean.boot, conf = 0.95, type = c("norm",
## "perc"))
##
## Intervals :
## Level Normal Percentile
## 95% (112.3, 118.4 ) (112.3, 118.3 )
## Calculations and Intervals on Original Scale
Testy t studenta
Wyżej do oszacowań dochódów rodziny studenta wykorzystano zmienną istotna - SAMODZIELNIE.
Jednak aby, zbadać inne relacje między Dochodami rodzin, a pozostałymy zmiennymi zostaną przeprowadzone testy (t-studenta, Chi2 oraz ANOVA)
Zatem teraz, w pirewszej kolejności chcemy zbadać czy dochody rodziny studentów istotnie różnią się w zależności od płci studenta?
Poniżej wyniki testu t-studenta wraz z wynikami testu bootstrapowego (Bootstrap Welch Two Sample t-test).
library(MKinfer)
library(tidyverse)
attach(studenci)
studenci2<- studenci %>%
filter(plec %in% c(0,1))
boot.t.test(dochod~plec, R=999, studenci2)
##
## Bootstrap Welch Two Sample t-test
##
## data: dochod by plec
## number of bootstrap samples: 999
## bootstrap p-value = 0.2142
## bootstrap difference of means (SE) = 4.232713 (3.17716)
## 95 percent bootstrap percentile confidence interval:
## -1.8698 10.1688
##
## Results without bootstrap:
## t = 1.2427, df = 497.97, p-value = 0.2146
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## -2.298722 10.210722
## sample estimates:
## mean in group 0 mean in group 1
## 117.332 113.376
##
## Welch Two Sample t-test
##
## data: dochod by plec
## t = 1.2427, df = 497.97, p-value = 0.2146
## alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
## 95 percent confidence interval:
## -2.298722 10.210722
## sample estimates:
## mean in group 0 mean in group 1
## 117.332 113.376
Wnioski
Otrzymano, że: - bootstrap: p-value = 0.2102 - Results without bootstrap: p-value = 0.2146
Na podstawie powyższego można stwierdzić, że p-value dla bootrstapa i
bez
w obu przypadkach Testu t-studenta brak podstaw do odrzucenia H0,
ponieważ p-value jest większe od alfa=0.05. Oznacza to, ze różnice
między średnimi dochodami rodzin studentów w przypadku kiedy studentem
była kobiet i mężczyzn są statystycznie nie istotne. Metoda boodstrap
jest dobrze dobrana, gdyż wynik p-value jest bardzo zbliżony do p-value
z testu bez bootstrapa (N jest wystarczają dużą prbóbką).
Test proporcji
Test proporcji dla zmiennych jakościowych - sprawdzenie, czy wyniki z włączonym bootstrapem różnią się od wyników pojedynczego testu chi2.
Testy zostaną przeprowadzone dla kilku par zmiennych.
1) samodzielnie (Tak/Nie) ~ płec (K/M)
Czy samodzielne zamieszaknie różni się istotnie w zależności od płci studenta?
- Tak różni się istotnie. Przyjmując poziom istotnośći alfa=0.05, na podstawie testu chi2 swierdzamy, że należy odrzucić H0, na rzecz Hipotezy alternatywnej, ponieważ p-value=0.01562 (bez bootstrapa) i p-value = 0.01499 (test z boostrapem) co jest mniejszą wartością od alfa. Oznacza to, że występują istotne różnicę między statusem zamieszkania studenta (samodzielnie lub nie), a płcią studenta.
-Metoda boodstrap jest dobrze dobrana (N jest wystarczają dużą prbóbką) ponieważ test dał bardzo bliski wynik jak bez.
# Przykład 2. Test Chi2 dla dwóch zmiennych jakościowych
attach(studenci)
# Czy status studenta (YES, NO) różni się istotnie wg płci (Male, Female)?
tabelka<-table(samodzielnie,plec)
chisq.test(tabelka,simulate.p.value = TRUE, B = 2000)
##
## Pearson's Chi-squared test with simulated p-value (based on 2000
## replicates)
##
## data: tabelka
## X-squared = 6.2865, df = NA, p-value = 0.01699
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: tabelka
## X-squared = 5.8455, df = 1, p-value = 0.01562
2) rok (1-5) ~ samodzielnie (Tak/Nie)
Czy samodzielne zamieszaknie różni się istotnie w zależności od roku studiów studenta?
# Czy status studenta (YES, NO) różni się istotnie wg płci (Male, Female)?
tabelka2<-table(rok,samodzielnie)
chisq.test(tabelka2,simulate.p.value = TRUE, B = 2000)
##
## Pearson's Chi-squared test with simulated p-value (based on 2000
## replicates)
##
## data: tabelka2
## X-squared = 11.12, df = NA, p-value = 0.02799
##
## Pearson's Chi-squared test
##
## data: tabelka2
## X-squared = 11.12, df = 4, p-value = 0.02524
- Tak różni się istotnie. p-value< alfa 0.05. Należy odrzucić H0, na rzecz H1.
- Jest to także dodatkowe potwierdzenie, że metoda boodstrap jest dobrze dobrana (N jest wystarczają dużą prbóbką) ponieważ test z bootstrapem dał bardzo bliski wynik jak bez niego.
3) rodzeństwo (tak/nie) ~ samodzielnie mieszka (Tak/Nie)
Czy samodzielne zamieszaknie różni się istotnie w zależności od tego czy student posiadał rodzeństwo?
- Poniższy test wskazuje, że brak istotnych statystycznie różnic. P-value>0.05, co daje brak podstaw do odrzucenia H0.
- To również dodatkowe potwierdzenie, że metoda boodstrap jest dobrze dobrana (N jest wystarczają dużą prbóbką).
##
## Pearson's Chi-squared test with simulated p-value (based on 2000
## replicates)
##
## data: tabelka3
## X-squared = 0.47717, df = NA, p-value = 0.5347
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: tabelka3
## X-squared = 0.36145, df = 1, p-value = 0.5477
Testy ANOVA
test Anova: czy średni poziom dochodów różni się istotnie w zależności od samodzielnego zamieszkania, płci, roku studiów i posiadanego rodzeństwa?
attach(studenci)
model1 <- lm(dochod ~ samodzielnie+rok+plec+rodzenstwo, data=studenci)
anova(model1)
## Analysis of Variance Table
##
## Response: dochod
## Df Sum Sq Mean Sq F value Pr(>F)
## samodzielnie 1 55579 55579 47.7867 1.48e-11 ***
## rok 4 4482 1120 0.9634 0.4272
## plec 1 523 523 0.4501 0.5026
## rodzenstwo 1 22 22 0.0192 0.8899
## Residuals 492 572228 1163
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Wykazano istotność statystyczną tylko dla zmiennej samodzielnie - p-value<alfa=0.05 s # ANOVA z włączonym bootstrapem
Poniżej oszacowania parametrów dla modelu zapisanego:
dochod~samodzielnie+rok+plec+rodzenstwo
library(lmboot)
anova_boot<-ANOVA.boot(dochod~samodzielnie+rok+plec+rodzenstwo,data=studenci,B=999)
anova_boot$`p-values`
## [1] 0.0000000 0.4264264 0.5145145 0.8968969
Wnioski
Równiez test ANOVA z bootstrapem wykazał, że przeciętne dochody rodzin istontnie różnią się w zależności czy student mieszkał sam lub nie. Dodatkowo, różnice w oszacowanych parametrach przy zmiennych objaśniających są nieznaczne. Zatem resampling okazał się być dobrze dostosowany i przyniósł spodziewane rezultaty.
ANOVA 1-czynnikowa
library(ggstatsplot)
ggbetweenstats(data=studenci,
y=dochod,
x=samodzielnie,
nboot=999,
title = "ANOVA z bootstrap - dochody rodzin~samodzielne mieszkanie")
ggbetweenstats(data=studenci,
y=dochod,
x=samodzielnie,
title = "ANOVA bez bootstrap - dochody rodzin~samodzielne mieszkanie")
ggbetweenstats(data=studenci,
y=dochod,
x=plec,
nboot=999,
title = "ANOVA z bootstrap - dochody rodzin względem płci")
ggbetweenstats(data=studenci,
y=dochod,
x=plec,
title = "ANOVA bez bootstrap - dochody względem płci")
ggbetweenstats(data=studenci,
y=dochod,
x=rok,
nboot=999,
title = "ANOVA z bootstrap - dochody rodzin względem roku studiów")
ggbetweenstats(data=studenci,
y=dochod,
x=rodzenstwo,
nboot=999,
title = "ANOVA z bootstrap - dochody rodzin względem posiadanego rodzeństwa")
Wnioski
Na podstawie powyższych oszacowań ANOVY jendoczynnikowej wykazano, że różnicę pomiędzy średnimi dochodami rodzin, a samodzielnym zamieszkaniem studenta są statystycznie istotne. P-vaule = 1.44e-11 < 0.05 zatem należy odrzucić hipoteze zerową, na rzecz hipotezy alternatywnej.
Pozostałe różnice dla przeciętnych dochodów rodzin, a oddzielnie płci, roku studiów i posiadania rodzeńtwa wykazywały brak istotności statystycznej, p-value>alfa=0.05, co świadczy o braku podstaw do hipotezy zerowej.