Cieľom druhého praktického cvičenia je skúsiť si jednoduchú prácu s
reálnymi datovými súbormi – t.j., jednoduchá analýza jednoduchého
datasetu v programe R a aplikácia základných štatistických metód (napr.
počítanie jednoduchých výberovýchcharakteristík, konštrukcia intervalov
spoľahlivosti pre neznámy parameter, alebo štatistické testy konkrétnej
nulovej hypotézy o neznámom parametri v danom modeli).
V programe R je k dispozícii množstvo rôznych datových súborov,
ktorých zoznam získame pomocou príkazu data()
. Ďalšie
datové súbory sa získajú nainštalovaním dodatočných/rozširujúcich
Rkových knižníc (baličkov – packages). Okrem takýchto vzorových datových
súborov je možné do programu R načítať aj vlastné súbory (vpodstate
ľubovolného typu, napr. xls súbor, alebo csv a txt
tabulky, alebo aj načítať data priamo z databázy SQL, alebo z
internetového zdroja).
Užitočné materiály pre prácu so štatistickým softwarom
R
Pre ľubovoľný náhodný výběr \(X_1,\ldots,X_n\) z nejakého rozdělení \(F_X\) používame kvantilový diagram ako neformálnu grafickú metódu slúžiacu k porovnaniu neznámeho rozdělení \(F_X\) s hypotetickým rozdělením \(F_0\) (napr. v prípade potreby overiť predpoklad normality je \(F_0\) štandardne Gaussovo rozdelenie \(N(0,1)\)).
Na os \(y\) sa vykreslia pořádkové statistiky \(X_{(i)}\), pro \(i = 1, \dots, n\). Na os \(x\) se vynášejí aproximace střední hodnoty pořádkových statistik rozdělení \(F_0\), tj. \(F_0^{-1}\bigl(\frac{i}{n+1}\bigr)\) [proč zrovna tohle?].
Jestliže data pocházejí z rozdělení \(F_0\), vykreslené body leží přibližně na přímce \(y=x\). Jestliže data pocházejí z lineární transformace rozdělení \(F_0\), vykreslené body stále leží přibližně na přímce (ale jiné než \(y=x\)). Jestliže data pocházejí z rozdělení odlišného od \(F_0\), vykreslené body tvoří rostoucí křivku. Z tvaru této křivky dokážeme poznat, v čem se rozdělení dat liší od \(F_0\).
V programe R se dá porovnávat rozdělení dat s rozdělením N(0,1)
pomocí funkce qqnorm()
. Argumentem funkce je vektor
obsahující náhodný výběr.
Vygenerujme 50 pozorování z rozdělení N(10,4) a namalujme normální kvantilový diagram:
set.seed(1234)
x <- rnorm(50,10,2)
qqnorm(x, pch = 21, bg = "red")
qqline(x) ### qq -- ako "quartile-quartile" (prvy a treti kvartil)
Funkce qqline()
namaluje přímku procházející dolním a
horním výběrovým kvartilem dat, která usnadnuje čtení grafu.
Nyní vygenerujme 50 pozorování z rozdělení Exp(0.4) a namalujme opět normální kvantilový diagram:
x <- rexp(50,0.4)
qqnorm(x, pch = 21, bg = "red")
qqline(x)
Poznali by ste, že data nepocházejí z normálního rozdělení? Akými
ďalšími vizuálnymi nástrojmi a prostriedkami by sme mohli overovať
teoretický predpoklad normálneho rozdelenia náhodného výberu \(X_1, \dots, X_n\)?
Pokúste sa vzájomne porovnať výpovednú hodnotu jednotlivých
vizuálnych nástrojov, ktoré môžeme použíť pre overenie normality (napr.
histogram, odhad hustoty, odhad distribučnej funkcie, až po rózne
inferenčné nástroje – napr. štatistické testy).
rgamma()
pro
správnou parametrizaci Gama rozdělení.
V následujúcej časti budeme pracovať s datovým súborom, ktoré pochádzajú z reálneho experimentu. Datovy súbor je možne stiahnuť na adrese http://msekce.karlin.mff.cuni.cz/~maciak/NMFM301/cv2.RData, prípadne je možné použiť link na data a data priamo načítať do programu R pomocou následujúceho príkazu:´
load(url("http://msekce.karlin.mff.cuni.cz/~maciak/NMFM301/cv2.RData"))
?load
Momentálne máme v programe R k dispozíci datový soubor s názvom
cv2
. Stručny náhľad na štruktúru datového súboru získame
pomocou príkazu head()
head(cv2)
## id pohl vzdelani stav vaha vyska
## 6126 68573 Male Elementary Married 57.1 165.0
## 8610 71157 Female College unfinished Married 94.5 162.7
## 2886 65182 Male Elementary Living with partner 71.6 170.3
## 7500 69993 Female Elementary Single 118.4 156.6
## 2430 64705 Female College unfinished Married 76.7 148.9
## 3591 65919 Female Elementary unfinished Widowed 49.4 145.8
Data mají celkovo 500 pozorování (řádků) a 6 veličin (sloupců). Túto
informáciu zjistíme pomocou funkcie dim()
:
dim(cv2)
## [1] 500 6
Pozorování tvoří náhodný výběr 500 obyvatel USA. V jednotlivých veličinách o nich máme následující údaje:
Název | Význam |
---|---|
id |
ID jedince |
pohl |
Pohlaví |
vzdelani |
Vzdělání |
stav |
Rodinný stav |
vaha |
Hmotnost [kg] |
vyska |
Výška [cm] |
Data si prohlédněte poklepáním na příslušný řádek v okénku
“Workspace”. Strukturu dat vypíšeme pomocí funkce str
:
str(cv2)
## 'data.frame': 500 obs. of 6 variables:
## $ id : num 68573 71157 65182 69993 64705 ...
## $ pohl : Factor w/ 2 levels "Male","Female": 1 2 1 2 2 2 1 1 1 1 ...
## $ vzdelani: Factor w/ 5 levels "Elementary unfinished",..: 2 4 2 2 4 1 3 4 2 4 ...
## $ stav : Factor w/ 6 levels "Married","Widowed",..: 1 1 6 5 1 2 3 6 1 1 ...
## $ vaha : num 57.1 94.5 71.6 118.4 76.7 ...
## $ vyska : num 165 163 170 157 149 ...
## - attr(*, "na.action")= 'omit' Named int [1:385] 13 32 48 75 83 93 103 105 119 145 ...
## ..- attr(*, "names")= chr [1:385] "30" "62" "87" "130" ...
Základní popisné statistiky všech veličin získáme pomocí funkce
summary()
:
summary(cv2)
## id pohl vzdelani
## Min. :62172 Male :259 Elementary unfinished: 40
## 1st Qu.:64728 Female:241 Elementary : 82
## Median :67260 High school :100
## Mean :67133 College unfinished :155
## 3rd Qu.:69597 College :123
## Max. :71897
## stav vaha vyska
## Married :268 Min. : 35.30 Min. :139.3
## Widowed : 34 1st Qu.: 65.67 1st Qu.:160.4
## Divorced : 45 Median : 78.60 Median :167.8
## Separated : 18 Mean : 81.81 Mean :168.1
## Single : 97 3rd Qu.: 94.08 3rd Qu.:175.3
## Living with partner: 38 Max. :188.50 Max. :204.5
S datovým souborem se zachází podobně jako s maticí. Můžeme vypsat jeden nebo více řádků pomocí hranaté závorky:
cv2[1:5,]
## id pohl vzdelani stav vaha vyska
## 6126 68573 Male Elementary Married 57.1 165.0
## 8610 71157 Female College unfinished Married 94.5 162.7
## 2886 65182 Male Elementary Living with partner 71.6 170.3
## 7500 69993 Female Elementary Single 118.4 156.6
## 2430 64705 Female College unfinished Married 76.7 148.9
K jednotlivým veličinám máme přístup buď pomocí čísla sloupce
(cv2[,2]
je vektor hodnot pohlaví) nebo lépe pomocí názvu
veličiny napsané za názvem dat a oddělené znakem $
, teda
např. cv2$pohl
. Výšky prvních pěti obyvatel vypíšeme
takto:
cv2$vyska[1:5]
## [1] 165.0 162.7 170.3 156.6 148.9
Hmotnosti lidí se základním vzděláním získáme pomocí podmínky v hranaté závorce (rovnítko musí být zdvojeno):
cv2$vaha[cv2$vzdelani=="Elementary"]
## [1] 57.1 71.6 118.4 77.6 82.8 62.1 35.3 73.2 130.0 67.0 61.0 83.0
## [13] 78.7 109.0 104.1 66.6 87.1 84.5 137.4 91.2 62.1 63.0 124.7 87.2
## [25] 84.4 86.6 82.4 70.0 76.7 83.7 113.8 90.4 62.1 90.6 84.0 64.6
## [37] 81.0 167.8 71.3 129.2 73.4 83.1 69.8 51.9 77.2 88.3 109.3 83.0
## [49] 78.2 87.9 75.0 94.5 78.1 140.1 101.4 51.8 87.4 81.1 70.0 109.7
## [61] 69.1 73.3 64.5 57.7 110.2 76.1 60.2 143.5 62.2 90.2 59.6 88.6
## [73] 68.2 70.3 104.5 54.5 88.1 86.4 65.6 110.1 75.9 64.5
Několik užitočných funkcii, ktoré trochu zjednodušia prácu v programe
R (napr. funkcie
plotCI
,plotmeans
,ci.asym
,ci.t
,sign.test
,
ktoré využijeme nižšie) načítame do programu R pomocou následujúceho
príkazu:
load(url("http://msekce.karlin.mff.cuni.cz/~maciak/NMFM301/functions.RData"))
Pomocou príkazu ls()
môžete následne overiť, čo sme
vlastne do R prostrednia načítali.
Zkusme se nyní podívat na normální kvantilový diagram
výšky.
qqnorm(cv2$vyska, pch = 21, bg = "red")
qqline(cv2$vyska)
Obecně se věří, že výška v populaci (a stejně tak aj mnoho iných
veličín/charakteristík) má normální rozdělení. Nasvědčuje tomu tento
obrázek? Nasimulujte náhodný výber o rozsahu 500 z normálneho rozdelenia
a porovnajte príslušný QQ graf zo simulovaných dat s QQ grafom vyššie.
Podívejme se ještě na výšky mužů a žen zvlášť.
qqnorm(cv2$vyska[cv2$pohl=="Male"], pch = 21, bg = "red")
qqline(cv2$vyska[cv2$pohl=="Male"])
qqnorm(cv2$vyska[cv2$pohl=="Female"], pch = 21, bg = "red")
qqline(cv2$vyska[cv2$pohl=="Female"])
Jsou výšky pro každé pohlaví normální? Resp. je tento predpoklad
opodstatnený (na základe nášho obrázku)?
Pozor ale na to, čo je
teoretický predpoklad a čo je empirické zistenie – a čo z čoho zle
následne logicky korektne vyvodiť.
Ak budeme predpokladáť (teoretický model), že výška ľudí v
populácii má normálne rozdelení, je možné z teoretického hľadiska, aby
aj výška mužov a výška žien (oboje samostatne) mali normálne rozdelenie?
Resp. opačne, ak budeme predpokladať, že výška žien v populácii má
normálne rozdelenie (t.j., teoretický model) a taktiež výška mužov v
populácii má normálne rozdelenie (druhý teoretický model), môžeme
následne povedať, že aj celková výška ľudí v populácii má normálne
rozdelenie?
Použijte iné grafické nástroje v programe R a pokúste za podívat na
data alternatívnym spôsobom: napr. pomocou histogramu (príkaz
hist()
), alebo pomocou odhadu hustoty (príkaz
density()
), alebo empirickej distribučnej funkcie (príkaz
ecdf()
). Jednotlivé empirické charakteristiky vykreslite na
vhodnom obrázku a porovnajte s príslušným protejškem založeným na
predpoklade normality.
Ak by bolo nutné overiť predpoklad normality na základe nejakého
štatistického testu, aké rôzne možnosti sú k dispozícii?
Funkce ci.t()
počítá 95% interval spolehlivosti pro
střední hodnotu založený na t-rozdělení. Náhodný interval spoľahlivosti,
je přesný interval za predpokladu normality a je přibližný (t.j.,
asymptotický) pro jakékoli rozdělení s konečným druhým momentem.
Interval spoľahlivosti má explicitný tvar \[
\left(\overline{X}_{n}-\frac{S_n}{\sqrt{n}}t_{n-1}\Bigl(1-\frac{\alpha}{2}\Bigr),
\
\overline{X}_{n}+\frac{S_n}{\sqrt{n}}t_{n-1}\Bigl(1-\frac{\alpha}{2}\Bigr)\right),\qquad\qquad
(1)
\] (pro nějaké \(\alpha \in
(0,1)\), často malé, napr. \(\alpha =
0.05\)), ale funkcia ci.t()
nám ako výstup dá pouze
jednu konkrétnu realizáciu tohto náhodného intervalu. Rozmyslite si,
ako sa líši interpretácia náhodného intervalu a interpretácia jednej
konkrétnej realizácie.
smp <- rnorm(20,2,1)
prum <- mean(smp)
ci.t(smp)
## CI.low Mean CI.up
## 1.630457 2.009294 2.388130
Výsledkem funkce ci.t
je vektor o třech složkách: dolní
konec intervalu, průměr, horní konec intervalu.
Zatiaľ čo náhodný interval (1) pokrýva hodnotu neznámeho parametru s predpísanou pravdepodobnosťou \((1 - \alpha)\) (a to buď presne, alebo asymptoticky – podľa typu intervalu, resp. podľa počiatočných predpokladov), konkrétna realizácia tohto náhodného intervalu, teda interval \((1.63; 2.39)\) buď pokrýva neznámu hodnotu parametru \(\mu \in \mathbb{R}\), alebo ju nepokrýva – buď áno, nebo ne – žiadna iná možnosť nemôže nastať. Akurat vzhľadom k tomu, že parameter je neznámy, nevieme povedať, či daná realizácia intervalu parameter pokryla, alebo nepokryla.
Skúsime ale experiment nezávisle zopakovať 100-krát, t.j., získame interval spoľahlivosti na základe 100 náhodných výběrů (vždy o rozsahu \(n = 20\) a se střední hodnotou \(\mu = 2\)). Dostaneme teda nie jednu realizáciu náhodného intervalu z (1), ale dohromady 100 rôznych realizácii, ktoré následne porovnáme z “neznámou” teoretickou hodnotou \(EX = \mu = 2\). Nejprve nastavíme požadované vstupy:
nobs <- 20
nvyb <- 100
str.h <- 2
Nyní vygenerujeme 2000 veličin z rozdělení N(2,1) a uspořádáme je do matice 20 x 100. Ve sloupcích bude 100 výběrů o rozsahu 20 z rozdělení N(2,1).
vybery <- rnorm(nobs*nvyb,mean=str.h,sd=1)
data.mat <- matrix(vybery,nrow=nobs,ncol=nvyb)
Na každý sloupec (výběr) spočítáme interval spolehlivosti pro střední
hodnotu funkcí ci.t
:
vs.ci <- apply(data.mat,2,ci.t)
Zjistíme, kolik intervalů pokrylo skutečnou střední hodnotu (2) a jaká byla průměrná šířka intervalu. Kolik intervalů by ji teoreticky mělo pokrýt?
(pokryti <- sum(vs.ci[1,]<str.h & str.h<vs.ci[3,])/nvyb)
## [1] 0.97
(prum.sirka <- mean(vs.ci[3,]-vs.ci[1,]))
## [1] 0.9272183
Nakonec nakreslíme všech 100 spočítaných intervalů do obrázku. Červená čára značí skutečnou střední hodnotu. Vidíte, které intervaly ji nepokryly?
plotCI(vs.ci[2,],uiw=vs.ci[3,]-vs.ci[2,],liw=vs.ci[2,]-vs.ci[1,],
gap=0.15,sfrac=0.002,ylab="Int. spol. pro stredni hodnotu",xlab="MC Opakování", pch = 22, cex = 0.8, pt.bg = "gray")
abline(h=str.h,col="red")
Sestrojíme interval spolehlivosti pro střední hmotnost mužů a žen:
ci.t(cv2$vaha[cv2$pohl=="Male"])
## CI.low Mean CI.up
## 84.11979 86.67181 89.22384
ci.t(cv2$vaha[cv2$pohl=="Female"])
## CI.low Mean CI.up
## 73.77435 76.59378 79.41320
Co tyto intervaly znamenají? Umíte je interpretovat?
Chceme-li získat obrázky těchto intervalů, použijeme funkci
plotmeans
:
plotmeans(vaha~pohl,data=cv2,connect=FALSE, ylim = c(70,90))
Dá se říci, že muži a ženy váží stejně?
Pokuste se namalovat intervaly spolehlivosti pro hmotnost pro různé
stupně vzdělání.
V nasledujúcej časti sa budeme podrobnejšie venovať niekoľkým
štatistických testom, ktorými budeme testovať skutočnu hodnotu parametru
(resp. parametrov).
Znaménkový test testuje hypotézu \(H_0: m_X=m_0\) proti alternativě \(H_1: m_X\neq m_0\), kde \(m_X\) je výberový médian z nejakého spojitého rozdelenia. Test je založen na testovej statistice \[ Y_n=\sum_{i=1}^n \mathbb{I}_{(0,\infty)}(X_i-m_0). \] Můžeme jej provést přesně (\(Y_n\) má za hypotézy binomické rozdělení) nebo asymptoticky pomocí statistiky \[ \frac{2}{\sqrt{n}}Y_n-\sqrt{n}, \] která má za \(H_0\) přibližně normované normální rozdělení.
Asymptotický test je implementován funkcí sign.test
.
Jejím prvním argumentem je samotný náhodný výběr, druhým argumentem je
hypotetický medián \(m_0\). Např. pre
náhodný výber \(X_1, \dots, X_{25}\) (v
programe R jako objekt vyberX
) môžeme otestovať nulovú
hypotézu, že skutočny/teoretický (neznámy) medián je rovný hodnote \(15\):
vyberX <- c(19,15,18,16,12,12,11,13,10,18,10,17,10,15,17,20,18,6,16,16,9,12,16,16)
sign.test(vyberX,15)
## n Y_n Test. statistika Krit. hodnota
## 2.400000e+01 1.200000e+01 8.881784e-16 1.959964e+00
## P-hodnota
## 1.000000e+00
Analogicky pre náhodný výber \(Z_1, \dots,
Z_{22}\) (v programe R jako objekt vyberY
) môžeme
otestovať stejnú nulovú hypotézu, že skutočny/teoretický (neznámy)
medián je rovný hodnote \(15\):
vyberZ <- c(16,15,13,10,10.5,15,5.5,20,18,15.5,14,15.5,3.5,10.5,13.5,11.5,16,19,12.6,15,19.5,7)
sign.test(vyberZ,15)
## n Y_n Test. statistika Krit. hodnota
## 22.0000000 8.0000000 -1.2792043 1.9599640
## P-hodnota
## 0.2008251
Funkce sign.test
počítá celkový počet pozorování
n, hodnotu \(Y_n\), hodnotu
asymptotické testové statistiky, kritickou hodnotu pro testování a
p-hodnotu. Aký je záver a interpretácia jednotlivých
testov?
Použijte nyní datový súbor cv2
a otestujte pomocou
asymptotického znaménkového testu nulovou hypotézu, že teoretický
(neznámy) medián hmotnosti (celkové, nebo pouze mužů, resp. žen) je 78
kg. Přesný statistický test lze získat pomocí funkce
binom.test
(jde vlastně o test na parametr binomického
rozdělení). Do této funkce musíme zadat hodnotu \(Y_n\) a hodnotu n.
sign.test(cv2$vaha, 78)
## n Y_n Test. statistika Krit. hodnota
## 500.0000000 254.0000000 0.3577709 1.9599640
## P-hodnota
## 0.7205148
binom.test(sum(cv2$vaha>78),length(cv2$vaha))
##
## Exact binomial test
##
## data: sum(cv2$vaha > 78) and length(cv2$vaha)
## number of successes = 254, number of trials = 500, p-value = 0.7543
## alternative hypothesis: true probability of success is not equal to 0.5
## 95 percent confidence interval:
## 0.4632436 0.5526613
## sample estimates:
## probability of success
## 0.508
Otestujte nyní přesným znaménkovým testem hypotézy, že medián
hmotnosti mužů (žen) je 78 kg. Liší se nějak zásadně výsledky přesného
testu od testu asymptotického? Proč?
V prípade, že rozdelenie je symetrické – napr. predpokládame, že
náhodný výber pochádza z normálneho rozdelenia (alebo iného symetrického
rozdelenia s konečným rozptylom), tak teoretická hodnota mediánu je
totožná s teoretickou strednou hodnotou a pre testovanie nulovej
hypotézy o teoretickom mediáne môžeme použíť aj jednovýberový \(t\)-test (s neznámou hodnotou parametru
rozptylu), ktorý je štandardne určený na inferenciu o strednej hodnote.
Implementácia testu je pomocou príkazu t.test()
.
t.test(cv2$vaha, mu = 78)
##
## One Sample t-test
##
## data: cv2$vaha
## t = 3.8617, df = 499, p-value = 0.0001274
## alternative hypothesis: true mean is not equal to 78
## 95 percent confidence interval:
## 79.87366 83.75474
## sample estimates:
## mean of x
## 81.8142
Ako vysvetliť rozpor medzi výsledkom znamienkového testu a klasického \(t\)-testu?
hist(cv2$vaha, col = "lightblue", xlab = "Hmotnosť/váha", breaks = 20, main = "")
Ako by vypadalo použitie jednovýberového \(t\)-testu na náhodný výber \(X_{1}, \dots, X_{24}\) (prípadne na náhodný výber \(Z_1, \dots, Z_{22}\))? Aku nulovú hypotézu vlastne test testuje? Je použitie testu (vzhľadom k predpokladom testu) opodstatnené?
par(mfrow = c(1,2))
hist(vyberX, col = "lightblue", xlab = "Celkový počet bodov (06.11.2024)", ylab = "Frekvencia", main = "", breaks = c(0,2,4,6,8,10,12,14,16,18,20), xlim = c(0,20))
hist(vyberZ, col = "lightblue", xlab = "Celkový počet bodov (07.11.2024)", ylab = "Frekvencia", main = "", breaks = c(0,2,4,6,8,10,12,14,16,18,20), xlim = c(0,20))
V programe R je defaultne implementoványch niekoľko funkcii so
základnými štatistickými testami, napr. test parametru binomického
rozdelenia binom.test()
(znamienkový test), alebo
jedno/dvoj výberové testy wilcox.test()
,
t.test()
, ks.test()
,
fisher.test()
, var.test()
, prípadne
viacvýberové testy kruskal.test()
, anova()
a
mnoho ďalších.