Inglisekeelses statistikakirjanduses nimetatakse vahel ka distribution-free methods (‘jaotusvabad’), st nad ei põhine mingil etteantud jaotusel nagu näiteks normaaljaotus, kuid töötavad tavaliselt laia jaotuste valiku korral.
Kasutatakse kvalitatiivsete tunnuste (järjestus-, binaar- ja nominaaltunnused) puhul ja ka arvtunnuste puhul, kui parameetriliste meetodite eeldused pole täidetud ja tunnuseid ei õnnestu normaliseerida. Osa tunnuste puhul, nt töötasu on vahel informatiivsem mediaani ja teiste järjestusel põhinevate statistikute kasutamine.
Juhendi eesmärk on tutvustada parameetriliste meetodite alternatiive valdavalt ilma arvutuseeskirjadeta. Põhirõhk on asetatud sellele, millal millist meetodit kasutada ning mitme alternatiivse meetodi korral on püütud neid võrdlevalt iseloomustada.
Mediaani, kvartiili, haarde (range), kvartiilide vahe, min ja max väärtuse leidmine
Kasutame näitena andmetabelit: Aggressn (http://aasa.ut.ee/statistika/Aggressn.csv).
Aggressn <- read.csv("http://aasa.ut.ee/statistika/Aggressn.csv", sep=";", dec=",")
head(Aggressn)
## GENDER AGGRESSN
## 1 BOYS 86
## 2 BOYS 69
## 3 BOYS 72
## 4 BOYS 65
## 5 BOYS 113
## 6 BOYS 65
Tunnuseks on hindepallid, mis on antud 12 poisi ja 12 tüdruku agressiivsusele 15 minutilise mängu jooksul. Arvutame üldised kirjeldavad statistikud, kasutame selleks eelmisest praktikumist !meelde jäänud! laienduse dplyr abi:
summarise(Aggressn, N=length(AGGRESSN), median=median(AGGRESSN), min=min(AGGRESSN), max=max(AGGRESSN), range = max - min, IQR=IQR(AGGRESSN))
## N median min max range IQR
## 1 24 47.5 7 141 134 48.25
Või kasutame eraldiseisvaid käske:
length(Aggressn$AGGRESSN); median(Aggressn$AGGRESSN); min(Aggressn$AGGRESSN); max(Aggressn$AGGRESSN); quantile(Aggressn$AGGRESSN); range(Aggressn$AGGRESSN); IQR(Aggressn$AGGRESSN)
## [1] 24
## [1] 47.5
## [1] 7
## [1] 141
## 0% 25% 50% 75% 100%
## 7.00 21.50 47.50 69.75 141.00
## [1] 7 141
## [1] 48.25
Kui mõni asi jääb selgusetuks, siis on paras hetk abi saamiseks meelde tuletada käsku ?käsunimi
näiteks: ?IQR
Nagu korduvalt on mainitud tasub kindlasti olukorda analüüsida ka joonise abil. Teeme poiste ja tüdrukute agressiivsuse võrdlemiseks karpdiagrammi:
library(ggplot2)
ggplot() + theme_bw() + geom_boxplot(data=Aggressn, aes(x=GENDER, y=AGGRESSN), colour="red")
Jooniselt on näha, et poiste mäng tundub olevat agressiivsem. Midagi kindlat me ei saa öelda enne, kui oleme teinud mitteparameetrilise testi rühmade võrdlemiseks. Antud juhul ei saa vahemike kattuvusest midagi öelda, sest tegemist pole arvtunnuste ja usalduspiirkondadega. Kahe rühma võrdlemiseks on mitteparameetriliste meetodite puhul mitu võimalust.
Esialgsete andmete asemel kasutatakse nende astakuid ehk järjekorranumbreid kasvavas variatsioonreas.
Järgnevad testid on t-testi mitteparameetrilised alternatiivid sõltumatute (independent samples) tunnuste korral.
Need kaks testi on tegelikkuses identsed. Kuna Wilcoxon’i teste on mitu, siis kasutatakse sagedamini just esimest nimetust. R millegi pärast segadust ei karda ja kasutab viimast. See test on kõige tundlikum, vahel on ta isegi suurema võimsusega sisuka hüpoteesi tõestamisel sõltumatute tunnuste keskmiste erinevuste kohta kui t-test. Võib vaadelda kui t-testi metteparametrilist analoogi. Rühmad võivad olla võetud samast populatsioonist, kontrollitakse nende keskmiste või astakute erinevuse usaldusväärsust, st nende asukoht üldkogumis võib olla erinev. Test sooritatakse vaikimisi 2-poolsena:
wilcox.test(Aggressn$AGGRESSN~Aggressn$GENDER)
## Warning in wilcox.test.default(x = c(86L, 69L, 72L, 65L, 113L, 65L, 118L, :
## cannot compute exact p-value with ties
##
## Wilcoxon rank sum test with continuity correction
##
## data: Aggressn$AGGRESSN by Aggressn$GENDER
## W = 138, p-value = 0.0001548
## alternative hypothesis: true location shift is not equal to 0
Saame hoiatuse, et P-väärtuseid ei saa täpselt arvutada, kuna andmestikus on identseid väärtuseid. See ei mõjuta praegust tulemust, mis ütleb, et tüdrukute ja poiste agressiivsus on usaldusväärselt erinev (poistel suurem).
Püstitatakse hüpoteesid:
Aggr_boys <- subset(Aggressn, GENDER=="BOYS")
Aggr_girls <- subset(Aggressn, GENDER=="GIRLS")
ks.test(Aggr_boys$AGGRESSN, Aggr_girls$AGGRESSN) # Kolmogorov-Smirnov test
## Warning in ks.test(Aggr_boys$AGGRESSN, Aggr_girls$AGGRESSN): cannot compute
## exact p-value with ties
##
## Two-sample Kolmogorov-Smirnov test
##
## data: Aggr_boys$AGGRESSN and Aggr_girls$AGGRESSN
## D = 0.83333, p-value = 0.0004807
## alternative hypothesis: two-sided
Näiteülesande lahendus ütleb, et rühmad on erinevatest üldkogumitest, P < 0,05.
Ühe analoogina saab kasutada ka Wald-Wolfowitz’i testi.
#install.packages("DescTools")
library(DescTools)
RunsTest(Aggr_boys$AGGRESSN, Aggr_girls$AGGRESSN) # Wald-Wolfowitz test
##
## Wald-Wolfowitz Runs Test
##
## data: Aggr_boys$AGGRESSN and Aggr_girls$AGGRESSN
## runs = 4, m = 12, n = 12, p-value = 0.0001967
## alternative hypothesis: true number of runs is not equal the expected number
Sõltuvate tunnuste puhul saab kasutada Wilcoxoni testi ja märgitesti, esimene on tugevam. Kui parameetrilise testi eeldused on täidetud, on Wilcoxon’i test peaaegu sama tugev kui parameetriline t-test sõltuvate tunnuste puhul. Wilcoxon’i testi eelduseks on, et ka tunnuste vahesid elementaarobjektide kaupa peab saama järjestada. Seda ei nõua märgitest, mistõttu ta nõrgem ongi.
Näiteks andmetabelis Job_prof (http://aasa.ut.ee/statistika/Job_prof.csv) töövestluse tulemuste võrdlus Test1, Test2 jne, töökoha soovijaid oli 25.
Job_prof <- read.csv("http://aasa.ut.ee/statistika/Job_prof.csv", sep=";", dec=",")
head(Job_prof)
## TEST1 TEST2 TEST3 TEST4 JOB_PROF
## 1 86 110 100 87 88
## 2 62 97 99 100 80
## 3 110 107 103 103 96
## 4 101 117 93 95 76
## 5 100 101 95 88 80
## 6 78 85 95 84 73
Kasutame erinevuste selgitamiseks Wilcoxoni testi (Wilcoxon Matched Pairs Test) ja Märgi test’i (Sign Test’i):
library(PASWR)
wilcox.test(Job_prof$TEST1,Job_prof$TEST2,paired=TRUE)
## Warning in wilcox.test.default(Job_prof$TEST1, Job_prof$TEST2, paired = TRUE):
## cannot compute exact p-value with ties
##
## Wilcoxon signed rank test with continuity correction
##
## data: Job_prof$TEST1 and Job_prof$TEST2
## V = 139, p-value = 0.536
## alternative hypothesis: true location shift is not equal to 0
SIGN.test(Job_prof$TEST1, Job_prof$TEST2, alternative="two.sided")
##
## Dependent-samples Sign-Test
##
## data: Job_prof$TEST1 and Job_prof$TEST2
## S = 11, p-value = 0.69
## alternative hypothesis: true median difference is not equal to 0
## 95 percent confidence interval:
## -19.79168 12.27089
## sample estimates:
## median of x-y
## -7
## Conf.Level L.E.pt U.E.pt
## Lower Achieved CI 0.8922 -18.0000 6.0000
## Interpolated CI 0.9500 -19.7917 12.2709
## Upper Achieved CI 0.9567 -20.0000 13.0000
Erinevus pole usaldusväärne (P > 0,05).
Kui aga vaatleme testide 2 ja 4 tulemuste erinevust, näeme, et need on erinevad:
wilcox.test(Job_prof$TEST4,Job_prof$TEST2,paired=TRUE)
## Warning in wilcox.test.default(Job_prof$TEST4, Job_prof$TEST2, paired = TRUE):
## cannot compute exact p-value with ties
##
## Wilcoxon signed rank test with continuity correction
##
## data: Job_prof$TEST4 and Job_prof$TEST2
## V = 49, p-value = 0.002354
## alternative hypothesis: true location shift is not equal to 0
Kruskal-Wallise mitteparameetriline dispersioonanalüüs on ühefaktorilise dispersioonanalüüsi mitteparameetriline variant. Eeldab tunnuse pidevust, seega ka järjestustunnused peavad olema mõõdetud tiheda sammuga. Rühmad peavad olema kas samast üldkogumist või erinevatest üldkogumitest, millel on sama mediaan. Seega kahe rühma puhul on meil tegemist t-testi mitteparameetrilise analoogiga. Astakute test on tavaliselt parem kui mediaanide test. Arvutame alustuseks Kruskal-Wallise astakute dispersioonanalüüsi:
kruskal.test(AGGRESSN~GENDER, data=Aggressn)
##
## Kruskal-Wallis rank sum test
##
## data: AGGRESSN by GENDER
## Kruskal-Wallis chi-squared = 14.533, df = 1, p-value = 0.0001378
by(Aggressn$AGGRESSN, Aggressn$GENDER, median) # et parem arusaamine tekiks arvutame siia juurde ka mediaanid
## Aggressn$GENDER: BOYS
## [1] 70.5
## ------------------------------------------------------------
## Aggressn$GENDER: GIRLS
## [1] 21
Kasutasime juba eespool dplyr paketi võimalusi. Järgnevalt on lisatud näide, kuidas gruppide kaupa mediaane arvutada kasutades sama paketi ‘%>%’ operaatorit (sellist “kirjaviisi” nimetatakse piping). Esmapilgul keeruline ja võõras kirjaviis muudab tegelikult koodi palju loetavamaks:
Aggressn %>% group_by(GENDER) %>% summarise(median = median(AGGRESSN))
## # A tibble: 2 x 2
## GENDER median
## <chr> <dbl>
## 1 BOYS 70.5
## 2 GIRLS 21
Käsu kruskal.test() tulemusena näeme, et poiste ja tüdrukute agressiivuse tase on erinev (P< 0,05), mediaanid on vastavalt 21 ja 70,5.
Mediaanide test’i kahjuks R’i keskkonnas funktsioonina saadaval pole. Seda viga saab parandada, kasutades kellegi teise poolt loodud funktsiooni:
### funktsiooni algus
median.test <- function(x, y){
z <- c(x, y)
g <- rep(1:2, c(length(x), length(y)))
m <- median(z)
fisher.test(z < m, g)$p.value
}
### funktsiooni lõpp
median.test(Aggr_boys$AGGRESSN, Aggr_girls$AGGRESSN) # loodud funktsiooni kasutamine
## [1] 0.00332895
Mediaanide test kinnitab eelmist tulemust.
Nagu kõigi dispersioonanalüüsi meetodite puhul ütleb usaldusväärne erinevus vaid seda, et mingid rühmad on erinevad, ei ütle aga millised. Kui usaldusväärne erinevus on tõestatud (P < 0,05), st faktori mõju on oluline, võib paarikaupa rühmi võrrelda nt Mann-Whitney U-testi või Kruskal- Wallise dispersioonanalüüsiga.
Vaatleme andmetabelit Kruskal:
Kruskal <- read.csv("http://aasa.ut.ee/statistika/Kruskal.csv", sep=";", dec=",")
head(Kruskal)
## CONDITN PERFRMNC
## 1 FORM 6
## 2 FORM 11
## 3 FORM 12
## 4 FORM 20
## 5 FORM 24
## 6 FORM 21
Tabelis Kruskal on üks rühmitav tunnus CONDITN (otsustamise tingimused, kas kuju, värvi või suuruse põhjal) ja PERFRMNC (valik hindepallidena).
kruskal.test(PERFRMNC~CONDITN, data=Kruskal)
##
## Kruskal-Wallis rank sum test
##
## data: PERFRMNC by CONDITN
## Kruskal-Wallis chi-squared = 13.844, df = 2, p-value = 0.0009857
Erinevus on usaldusväärne, aga millised rühmad erinevad?
Selleks kasutame Mann-Whitney U-testi (wilcox.test(funktsioontunnus~faktor). Ees pool olevas testi tutvustuses on kirjas, et tegemist on justkui t-testi mitteparameetrilise analoogiga. T-testi sisu meelde tuletades teame, et t-test võrdleb kahe rühma keskväärtuseid. Meie praeguses näites aga on kolm rühma! Kes ei usu, saab kontrollida:
unique(Kruskal$CONDITN)
## [1] "FORM" "COLOR" "SIZE"
Tõesti: tabelis on 3 rühma. Kahe rühma võrdlemiseks peaksime tegema lisatabelid, kuhu on filtreeritud andmed kahe rühma kaupa (vastasel juhul saame veateate). Filtreerimine käib näiteks käskudega subset() baaspaketist ja filter(tabelinimi, tingimused) paketist dplyr vaatame viimase kasutamist:
library(dplyr)
Krusk.col_form <- filter(Kruskal, CONDITN=="COLOR" | CONDITN =="FORM") # kui on vaja näidata täpset väärtust, kasutatakse kahte võrdusmärki, püstkriips '|' on vaste tingimusele 'OR', &-märk tähendab 'AND'
wilcox.test(Krusk.col_form$PERFRMNC~Krusk.col_form$CONDITN) # paneme tähele, et ees pool oli testi defineerimisel kasutusel ',' nüüd aga '~'. Milles erinevus?
## Warning in wilcox.test.default(x = c(31L, 7L, 9L, 11L, 16L, 19L, 17L, 11L, :
## cannot compute exact p-value with ties
##
## Wilcoxon rank sum test with continuity correction
##
## data: Krusk.col_form$PERFRMNC by Krusk.col_form$CONDITN
## W = 93, p-value = 0.2361
## alternative hypothesis: true location shift is not equal to 0
Testi tulemusena võime väita, et sooritus (PERFMNC) ei erine värvi ja vormi lõikes. Selliselt tuleks võrrelda kõiki rühmade kombinatsioone. Tehke iseseisvalt!
Kasutatakse, kui dispersioonanalüüsil oli faktori(te) mõju oluline ja soovime teada saada:
Üks võimalus on Duncan’i test. Seda kasutatakse vähemalt järjestustunnuste puhul või siis on muutujaks arvtunnused, mille puhul pole parameetrilise meetodi eeldused täidetud. Selleks tuleb alustuseks koostada dispersioonanalüüsi mudel ning siis sööta see Duncan’i test’i:
krusk_aov <- aov(PERFRMNC~CONDITN, data=Kruskal) # dispersioonanalüüsi mudel
library(agricolae) # Duncani testi annalüüsipakett
duncan.test(krusk_aov, "CONDITN", alpha=0.01, console=TRUE) # kuna Duncani test on pälvinud suurt kriitikat oma nõrkuse pärast, siis on siin olulisuse tasemeks määratud 0,01
##
## Study: krusk_aov ~ "CONDITN"
##
## Duncan's new multiple range test
## for PERFRMNC
##
## Mean Square Error: 39.36869
##
## CONDITN, means
##
## PERFRMNC std r Min Max
## COLOR 18.25000 7.747434 12 7 31
## FORM 14.41667 5.468228 12 6 24
## SIZE 26.00000 5.308655 12 13 32
##
## Alpha: 0.01 ; DF Error: 33
##
## Critical Range
## 2 3
## 7.001376 7.301472
##
## Means with the same letter are not significantly different.
##
## PERFRMNC groups
## SIZE 26.00000 a
## COLOR 18.25000 b
## FORM 14.41667 b
Tulemustest näeme, et suurus (SIZE) erineb nii värvist (COLOR) kui ka vormist (FORM), värvil ja vormil olulist erinevust pole. Leitud homogeensed rühmad on esitatud tulemuste väljatrüki viimases osas tähtedega a ja b.
Teine võimalus on kasutada Tukey HSD testi astakute versiooni (Rank-based version of Tukey’s HSD (Tukey-Kramer)):
library(pgirmess) # vajaliku analüüsipaki käivitamine
kruskalmc(PERFRMNC~CONDITN, data=Kruskal) # määrame analüüsi parameetrid
## Multiple comparison test after Kruskal-Wallis
## p.value: 0.05
## Comparisons
## obs.dif critical.dif difference
## COLOR-FORM 5.083333 10.2969 FALSE
## COLOR-SIZE 10.583333 10.2969 TRUE
## FORM-SIZE 15.666667 10.2969 TRUE
Väljatrükk näitab analüüsifunktsiooni ennast, aga ka kõiki võimalikke gruppe moodustavaid paare ning kriitilisi ja mõõdetud erinevusi (TRUE näitab olulist erinevust).
Korrelatsioonanalüüsil hinnatakse tunnustevahelise seose tugevust, suunda ja usaldusväärsust ehk olulisust. Mida lähemal on korrelatsioonikordaja absoluutväärtus ühele, seda tugevam seos on. Suunda näitab kordaja märk (+ võrdeline; - pöördvõrdeline). Seose olulisust näitab olulisustõenäosus P, kui P < 0,05, on seos tunnuste vahel statistiliselt usadusväärne, st kontrollides hüpotees H0: r = 0 H1: r <> 0,
võtame vastu H1.
Pearson’i parameetrilisele korrelatsioonile on 3 alternatiivi: Spearman’i astakkorrelatsioonikordaja, Kendalli astakkorrelatsioonikordaja e Kendalli tau ja gamma astakkorrelatsioonikordaja. Väärtused jäävad kõigil vahemikku -1…1.
Arvutatakse nagu parameetrilisel juhul, ainult esialgsete mõõtmiste asemel kasutatakse väärtuste järjekorranumbreid variatsioonireas ehk astakuid (ingl. k. rank). Saame kasutada juba eespool korrelatsionide arvutamiseks kasutatud käsku cor(), mis on võimeline arvutame kolme erinevat korrelatsioni (pearson, spearman ja kendall):
cor(Job_prof, method="spearman")
## TEST1 TEST2 TEST3 TEST4 JOB_PROF
## TEST1 1.00000000 0.02967245 0.2301021 0.4406551 0.4757319
## TEST2 0.02967245 1.00000000 0.4744652 0.3358382 0.4786210
## TEST3 0.23010214 0.47446522 1.0000000 0.7654654 0.9138896
## TEST4 0.44065511 0.33583815 0.7654654 1.0000000 0.8659477
## JOB_PROF 0.47573193 0.47862099 0.9138896 0.8659477 1.0000000
cor(Job_prof, method="kendall")
## TEST1 TEST2 TEST3 TEST4 JOB_PROF
## TEST1 1.00000000 0.02027027 0.1590527 0.3147213 0.3204052
## TEST2 0.02027027 1.00000000 0.3485623 0.2335029 0.3204052
## TEST3 0.15905268 0.34856226 1.0000000 0.5355932 0.7702747
## TEST4 0.31472126 0.23350287 0.5355932 1.0000000 0.6959499
## JOB_PROF 0.32040518 0.32040518 0.7702747 0.6959499 1.0000000
Kahjuks ei paku see käsk võimalust P-väärtuste arvutamiseks, st olulisuse kontrolliks. Selleks on võimalik kasutada analüüsipaketi Hmisc käsku rcorr():
library(Hmisc)
rcorr(as.matrix(Job_prof), type="spearman")
## TEST1 TEST2 TEST3 TEST4 JOB_PROF
## TEST1 1.00 0.03 0.23 0.44 0.48
## TEST2 0.03 1.00 0.47 0.34 0.48
## TEST3 0.23 0.47 1.00 0.77 0.91
## TEST4 0.44 0.34 0.77 1.00 0.87
## JOB_PROF 0.48 0.48 0.91 0.87 1.00
##
## n= 25
##
##
## P
## TEST1 TEST2 TEST3 TEST4 JOB_PROF
## TEST1 0.8880 0.2685 0.0275 0.0162
## TEST2 0.8880 0.0166 0.1007 0.0155
## TEST3 0.2685 0.0166 0.0000 0.0000
## TEST4 0.0275 0.1007 0.0000 0.0000
## JOB_PROF 0.0162 0.0155 0.0000 0.0000
Arvutatakse nii korrelatsioonid kui ka P väärtused.
Kahjuks pole siin võimalust Kendalli korrelatsiooni arvutamiseks. Kes aga siiski soovib ka Kendalli korrelatsiooni olulisusi teada, saab kasutada käsku:
cor.test(Job_prof$JOB_PROF, Job_prof$TEST2, method="kendall")
## Warning in cor.test.default(Job_prof$JOB_PROF, Job_prof$TEST2, method =
## "kendall"): Cannot compute exact p-value with ties
##
## Kendall's rank correlation tau
##
## data: Job_prof$JOB_PROF and Job_prof$TEST2
## z = 2.2234, p-value = 0.02619
## alternative hypothesis: true tau is not equal to 0
## sample estimates:
## tau
## 0.3204052
Sel juhul arvutatakse kahe tunnuse vahelist korrelatsiooni, maatriksile seda rakendada ei saa. Kendalli Tau valem ja tõlgendus:
Tau = tõenäosus, et järjestus on sama - tõenäosus, et järjestus on erinev.
Positiivne usaldusväärne kordaja: tunnuste järjestus langeb usaldusväärselt kokku ja mõlemad tunnused kasvavad koos. Kui järjestus on täpselt ühesugune, on Kendalli tau väärtus 1.
Negatiivne usaldusväärne kordaja: üks tunnus kasvab teine kahaneb. Kui tunnuste järjekord on täpselt vastupidine, on kordaja väärtus -1.
Kasutame juhul, kui andmetes on palju korduvaid väärtusi. Tõlgendus nagu Kendalli Tau’l. Ei ole praegu otstarbekas kasutada.
Empiirilised sagedused on esimeses veerus, teoreetilised sagedused teises. Andmed on vaja ise sisestada.
hii.ruut.data_obs <- c(137, 23)
hii.ruut.data_exp <- c(110, 30)
chisq.test(x=hii.ruut.data_obs, p=hii.ruut.data_exp, rescale.p = TRUE)
##
## Chi-squared test for given probabilities
##
## data: hii.ruut.data_obs
## X-squared = 4.728, df = 1, p-value = 0.02967
Vaatamata sellele, et R võib tunduda alguses väga raske (ja ongi raske!), tasub meeles pidada praegusel ajal pidevalt korrutatavat lauset: “Program or be programmed!”. Koodi kirjutamine annab andmete analüüsil paindlikkuse, mida ei anna ükski ilusa graafilise kasutajaliidesega desktop-tarkvara.
Kui aga tõesti tundub, et tahaks hakkkama saada valdavalt hiire klikkidega, siis on tegelikult ka R-is olemas nö graafiline kasutajaliides: Rcmdr
#install.packages("Rcmdr") # kui pole paigaldatud, tasub see käsk ka #-märgita käima panna!
library(Rcmdr)
Käsu tulemusena avaneb mitte kõige kaunim kasutajaliides, mis võimaldab põhiliste andmetöötluse, graafikute loomise ja statistiliste meetoditega hakkama saada. Tulemus pole kindlasti nii kena kui ise koodi kirjutades, aga hädaolukorras, kui uue õppimine või vana meelde tuletamine tundub liiga vaevalise ettevõtmisena, ajab Rcmdr asja ära.
Juhendi koostanud Anto Aasa (tuginetud on Krista Lõhmuse varasematele analoogsetele juhenditele)
Juhendit on täiendanud Mikk Espenberg
Juhend Internetis: http://aasa.ut.ee/statistika/
õppeaine: LOOM.02.153 / Statistilise andmetöötluse praktikum
Viimati täiendatud: 2020-10-19