1) Jednovýběrový t-test V jednom nejmenovaném časopisu jsem si před lety přečetl článek s názvem „Osadníky hrají gentlemani“, kde se vlevo dole psalo o tom, že průměrný majitel deskové hry Osadníci z Katanu odehraje minimálně tři partie za měsíc. My v naší databázi Katan disponujeme náhodným výběrem 200 Osadníků, s jejichž pomocí se pokusíme tento výrok vyvrátit, jelikož se nám jeví jako přespříliš optimistický. Statistický zápis našich hypotéz zní následovně: H0: µ >= 3 H1: µ < 3 t.test(Katan$Partie, alternative = "less", mu = 3) 2) V našem případě by však dávalo smysl testovat i oboustrannou hypotézu, ve které se budeme ptát, zdali může být pravda, že průměrný počet odehraných partií Osadníků činí právě tři hry za měsíc? H0: µ = 3 H1: µ != 3 t.test(Katan$Partie, alternative = "two.sided", mu = 3) Sami 3) Otestujte v databázi https://elandio.fra1.cdn.digitaloceanspaces.com/cesta/Investice.xlsx na hladině významnosti 5 % hypotézu, že investiční strategie č. 1 má výnosnost alespoň 137 $ za měsíc. H0: µ <= 137 H1: µ > 137 t.test(Investice$Strategie1, alternative = "greater", mu = 137) 4) To byl tedy jednovýběrový t-test, ale co jeho neparametrická varianta vzhledem k porušené normalitě? Získáme díky ní odlišné výsledky? Pojďme se podívat. shapiro.test(Katan$Partie) wilcox.test(Katan$Partie, alternative = "less", mu = 3) 5) Dvouvýběrový t-test Uveďme si další příklad. V něm budeme chtít zjisti, zdali kuřáci odehrají stejné množství partií Osadníků nežli nekuřáci. Testování budeme chtít provést na hladině významnosti 5 % (tj. p-hodnota musí být nižší než 0,05). H0: µ = 0 (µ kuřáků - µ nekuřáků) H1: µ != 0 t.test(Katan$Partie ~ Katan$Kouření, alternative = "two.sided", mu = 0, conf.level = 0.95) 6) Abychom však mohli testovat, zda kuřáci odehrají méně partií než nekuřáci, budeme muset zvolit levostrannou hypotézu. Nulovou hypotézou v tomto případě bude charakterizovat tvrzení, že kuřáci odehrají více partií než nekuřáci. H0: µ >= 0 (µ kuřáků - µ nekuřáků) H1: µ < 0 t.test(Katan$Partie ~ Katan$Kouření, alternative = "less", mu = 0) 7) V následujícím příkladu nás bude zajímat, zdali odehrají ženy více partií než muži, Nejdříve opět začněme s oboustrannou hypotézou, tj. v nulové hypotéze budeme tvrdit, že ženy odehrají stejný počet partií jako muži. H0: µ = 0 (µ mužů - µ žen) H1: µ != 0 t.test(Katan$Partie ~ Katan$Pohlaví, alternative = "two.sided", mu = 0) H0: µ >= 0 (µ mužů - µ žen) H1: µ < 0 t.test(Katan$Partie ~ Katan$Pohlaví, alternative = "less", mu = 0) 8) Statistika dokáže být v některých případech velice zrádná. V předchozím příkladě jsme totiž statisticky dokázali, že ženy odehrají více partií než muži. Z předchozích kapitol jsme ale získali odlišný pocit a byli to naopak muži, kteří Osadníkům holdovali více nežli ženy. Tak kde leží pomyslný zakopaný pes? Problém nastal při výběru osob ze souboru Katan, který nebyl nijak omezen. Naše databáze totiž obsahuje velké množství mužů nad 26 let, kteří osadníky stále hrají, ale už v mnohem menší míře než za dob studií. U žen je situace zcela opačná. Ty sice Osadníky taktéž rády hrají, ale po dokončení vysokoškolských studií už na ně nemají čas, přestávají je hrát, a tudíž už se v naší databázi neobjevují. Abychom tak mohli smysluplně testovat hypotézu, zdali muži a ženy hrají Osadníky se stejnou intenzitou, budeme muset náš soubor dat omezit věkem. Toho docílíme pomocí hranatých závorek nebo balíčku dplyr. Katan2 <- filter(Katan, Věk <= 25, !is.na(Partie)) t.test(Katan2$Partie ~ Katan2$Pohlaví, alternative = "two.sided", mu = 0) 9) Otestujte v databázi "https://elandio.fra1.cdn.digitaloceanspaces.com/cesta/LungCapData.xlsx" na hladině významnosti 5 % hypotézu, že nekuřáci mají větší kapacitu plic nežli kuřáci. H0: µ <= 0 (µ no - µ yes) H1: µ > 0 t.test(LungCapData$LungCap ~ LungCapData$Smoke, alternative = "greater", mu = 0, conf.level = 0.95) # Změníme kategoriální proměnné na faktorové proměnné Katan$Pohlaví <- as.factor(Katan$Pohlaví) Katan$Vzdělání <- as.factor(Katan$Vzdělání) Katan$Kolej <- as.factor(Katan$Kolej) Katan$Práce <- as.factor(Katan$Práce) Katan$Kouření <- as.factor(Katan$Kouření) Katan$Klub <- as.factor(Katan$Klub) # Vytvoření lineárního regresního modelu model <- lm(Partie ~ ., data = Katan) # Zobrazit shrnutí modelu summary(model) Úkol sami: Katan2 <- Katan %>% mutate(Pracuje_bin = ifelse(Práce == "pracuje", 1, 0)) %>% mutate(Vzdělání_ZŠ_bin = ifelse(Vzdělání == "ZŠ", 1, 0)) Spolu # Vytvoření modelu pouze se specifikovanými úrovněmi reduced_model <- lm(Partie ~ Věk + Vzdělání_ZŠ_bin + Pracuje_bin, data = Katan) # Zobrazení shrnutí redukovaného modelu summary(reduced_model) Cyklus for # skript pro ekonoma N <- 4 kostka <- numeric(N) kostka[1] <- 0 for (t in 2:N) { kostka[t] <- kostka[t-1] + sample(6, size = 1) } vysledek_ekonom <- kostka[N]/(N-1) N <- 1000 # cyklus pro ekonoma vysledek_ekonom <- numeric(N) # Výsledkem tohoto cyklu má být vektor s názvem vysledek_ekonom, který # bude obsahovat 1 000 řádků, kde každý řádek bude obsahovat průměr ze # tří hodů kostkou. for (x in 1:N) { N2 <- 4 # Místo obligátního t můžeme zvolit i jiné písmeno, kupříkladu x. # V těle cyklu se může nacházet i další cyklus, jako třeba nyní. K tomu # abychom totiž zjistili součet tří po sobě jdoucích hodů, je nutné # vytvořit vložený cyklus, který však už důvěrně známe. # Proměnná N2 se takto nejmenuje kvůli tomu, že už s jedním N pracujeme, # a že bychom tímto N = 4 přepsali N = 1000, jelikož proměnné uvnitř # cyklu jsou oddělené od těch mimo něj. Důvodem je skutečnost, že s # proměnnou N2 pracujeme i mimo cyklus v příkazu # vysledek_ekonom[x] <- (kostka[N2])/(N2-1), ve kterém chceme použít # hodnotu N2 <- 4, a nikoliv N <- 1000. kostka <- numeric(N) kostka[1] <- 0 for (t in 2:N2) { kostka[t] <- kostka[t-1] + sample(6,1) } vysledek_ekonom[x] <- kostka[N2]/(N2-1) } - otázka na vítěze, viz učebnice Cyklus while pocet_hodu <- 0 kostka <- 0 while (kostka != 6) { pocet_hodu <- pocet_hodu + 1 kostka <- sample(6, size = 1)} print(pocet_hodu) Franta a Lojza se rádi sází. Lojza ale není příliš velký chytrák, a tak toho Franta občas využívá, jako třeba nyní při hře v kostky. V každém kole každý z hráčů hází dvěma kostkami tak dlouho, dokud mu nepadne jeho oblíbené číslo. V případě Franty se jedná o osmičku a v případě Lojzy o dvanáctku. Kolo vyhraje ten, komu jeho oblíbené číslo padne za nejméně hodů (je to hra pro doopravdy dlouhé zimní večery). V případě shody vyhrává Lojza, který si tak myslí, jak na Frantu nevyzrál. Simulujte 50 kol této hry a určete v kolika procentech kol vyhraje Lojza? N <- 50 Franta <- numeric(N) Franta[1] <- 1 for (t in 1:N) { pocet_hodu <- 0 kostka <- 0 while (kostka != 8) { pocet_hodu <- pocet_hodu + 1 kostka <- sample(6, size = 1) + sample(6, size = 1)} Franta[t] <- pocet_hodu } N <- 50 Lojza <- numeric(N) Lojza[1] <- 1 for (t in 1:N) { pocet_hodu <- 0 kostka <- 0 while (kostka != 12) { pocet_hodu <- pocet_hodu + 1 kostka <- sample(6, size = 1) + sample(6, size = 1)} Lojza[t] <- pocet_hodu } Rozdíl <- Lojza - Franta Výsledek <- sum(Rozdíl <= 0)/50*100 # Příkaz cat() není příliš známý, ale pomůže nám tehdy, chceme-li # vytisknout větu, která by měla obsahovat hodnotu z proměnné. cat("Lojza vyhraje v", Výsledek, "% kol.") --------- # QQ plot pro kontrolu normality reziduí qqnorm(model$residuals) qqline(model$residuals) # Plot reziduí pro kontrolu homoskedasticity plot(model$fitted.values, model$residuals) abline(h = 0, col = "red") --------