# Prax 2 # Ava antud tekstifail R-i skriptina (R: Fail -> Open Script ...) # Kasutades vajadusel lisamaterjale # näiteks # http://www.ms.ut.ee/mart/biomeetria2009/praks1.pdf # lase R-l täita alljärgnevad käsud (Ctrl+R käivitamaks parajasti aktiivset rida või selekteeritud osa) # ja püüa aru saada, mida need teevad, vajadusel kirjuta enese tarvis juurde kommentaare # (märgi '#' järele kirjutatut tõlgendab R kommentaarina). # ---------------------------------------------------------------------------------------- # Salvestage kursuse kodulehelt omale arvutisse andmestik studentsR.xls (http://www.eau.ee/~ktanel/DK_0007/studentsR.xls) # ja avage see MS Excelis. # Andmestik sisaldab juhuslikku valikut (n = 100) esimese kursuse veterinaarmeditsiini- ja loomakasvatuse eriala tudengite # ankeedivastustest aastaist 2003-2005. # R-i importimiseks salvestage see tudengite andmetabel csv-failina # NB! csv-failina tuleb salvestada üksnes algandmeid sisaldav lehekülg!! # Püüa salvestatud fail käsu read.csv abil R-i importida andes ette faili täpse aadressi ja # määrates ära veergude ja kümnendkohtade eraldajana kasutatud sümbolid # (selguse mõttes võid csv-faili avada enne ka Notepadis ja vaadata need eraldajad järgi) # Käsk ise on järgmine: students=read.csv("C:/Documents and Settings/Tanel/My Documents/DK_0007/studentsR.csv",header=TRUE,sep=";",dec=",") # Probleemide korral võite andmestiku sisse lugeda ka internetist: students=read.csv("http://www.eau.ee/~ktanel/DK_0007/studentsR.csv",header=TRUE,sep=";",dec=",") # kuvab tunnuste nimed andmestikust names(students) # Järgnev käsk teeb vaikimisi kasutatavaks andmestiku "students" # Miks seda vaja on? attach(students) # ------------------------------------------------------------------------------------- mean(pikkus) mean(pikkus[sugu=="N"]) by(pikkus,sugu,mean) tapply(pikkus,sugu,mean) summary(pikkus) # veel funktsioone: length, min, max, range, median, sd, var, quantile(pikkus, 0.13) mean(kaal) # Probleem selles, et R on pedantne puuduvate väärtuste osas # - talle tuleb eraldi öelda, mida nendega teha - näiteks eemaldada analüüsist: mean(kaal,na.rm=T) # not available remove = true mean(kaal[sugu=="N" & bmi>mean(bmi,na.rm=T)], na.rm=T) mean(na.omit(kaal)) # pisut universaalsem puuduvate väärtuste kõrvale jätmise variant mean(na.omit(kaal[sugu=="N" & mat>3])) sum(!is.na(kaal)) length(na.omit(kaal)) # ------------------------------------------------------------------------------------- # Proovi ise: # ----------- # Leia keskmine ja mediaan tunnusele peaümbermõõt sõltuvalt matemaatika hindest. # Kas mannaputru söövate tudengite kehakaalude varieeruvus on suurem, kui mannaputru mitte söövatel tudengitel? # ------------------------------------------------------------------------------------- table(X6nnelik) barplot(table(X6nnelik), main="Õnnelikkuse esinemissagedus",ylab="Tudengite arv",xlab="Õnnelik?",col=heat.colors(3)) barplot(table(mannap), col=c("yellow","orange","red"), ylim=c(0,50)) # Vaikimisi kirjutab R vana joonise uue joonisega üle, aga # soovi korral võib lasta R-l ka tehtud jooniseid säilitada # - selleks tuleb joonise aktiivne olekul valida menüüst Edit -> Recording # peale paljude jooniste tegemist saab neid vaadata PageUp & PageDown klahvide abil # ------------------------------------------------------------------------------------- table(ainegr) # Probleem - R tõlgendab antul juhul tühja lahtrit reaalse väärtusena, # korrektsete analüüside tarvis tuleks R-le öelda, et tühja lahtri näol om tegu puuduva väärtusega # Viimase tarvis tuleks andmestikku lisada uus ja korrektne tuunus detach(students) # andestikule uue tunnuse lisamiseks tuleb andmestik esmalt deaktiveerida ... students$ainegr2=ifelse(students$ainegr!="O",ifelse(students$ainegr!="S",ifelse(students$ainegr!="A",NA,students$ainegr),students$ainegr),students$ainegr) table(students$ainegr2) attach(students) table(factor(ainegr2,labels=c("Art","Other","Science"))) ainegrf=factor(ainegr2,labels=c("Art","Other","Science")) round(100*prop.table(table(ainegrf)),2) pie(table(ainegrf)) # Mis on vahet järgneval kahel tabelil? 100*prop.table(table(sugu,ainegrf),1) round(100*prop.table(table(sugu,ainegrf),2),1) addmargins(table(sugu,ainegrf)) # ------------------------------------------------------------------------------------- # Proovi ise: # ----------- # Kuidas tudengid jaotuvad matemaatika hinde lõikes - tee sagedustabel ja tulpdiagramm. # Kas erialati on matemaatika hinnete suhtelised sagedused erinevad? # Konstrueeri sektordiagramm tunnusele sugu ja lase R-l juurde kirjutada "naised" ja "mehed". # ------------------------------------------------------------------------------------- hist(kaal,col="red",las=1) hist(kaal,col="gold",las=1,ylab="f(x)",xlab="x",main="Kaalu tihedus",xlim=c(30,110),probability=TRUE) lines(density(na.omit(kaal)),lwd=2) # Järgnevad 4 rida võid ka korraga käivitada par(mfrow=c(2,1)) # jagab joonise akna 2-ks reaks ja 1-ks veeruks hist(kaal[sugu=="N"],xlim=c(40,100), main="Naised", xlab="kaal(kg)", ylab="Sagedus") hist(kaal[sugu=="M"],xlim=c(40,100), main="Mehed", xlab="kaal(kg)", ylab="Sagedus") par(mfrow=c(1,1)) # Soovi korral võib intervallid ka ise moodustada: kaaluvahemik=cut(kaal,c(40,50,60,70,80,90,100)) # täpsete intervallipiiride asemel võib R-le ka lihtsalt öelda, kui mitut intervalli soovite: ...cut(weight,6) table(kaaluvahemik) 100*prop.table(table(kaaluvahemik)) table(kaaluvahemik,sugu) Mehed=table(kaaluvahemik[sugu=="M"]) Naised=table(kaaluvahemik[sugu=="N"]) barplot(rbind(Naised,Mehed),beside=TRUE,legend.text=TRUE,col=c("Green2","Green4")) boxplot(pikkus, ylim=c(150,195)) boxplot(pikkus~factor(sugu), col="skyblue1", names=c("Mehed","Naised"), ylim=c(150,195), main="Karp-vurrud-daigramm pikkusele") # Veel keerulisemad joonised (käivita järgmised käsuread (8 tk) korraga): par(mfrow=c(2,1)) hist(pikkus[sugu=="M"], col="lightblue", main="Mehed", ylab="Osakaal", xlab="Pikkus", las=1, probability=TRUE, ylim=c(0,0.065), xlim=c(150,205)) lines(density(na.omit(pikkus[sugu=="M"]))) hist(pikkus[sugu=="N"], col="red", main="Naised", ylab="Osakaal", xlab="Pikkus", las=1, probability=TRUE, ylim=c(0,0.065), xlim=c(150,205)) lines(density(na.omit(pikkus[sugu=="N"])), lty=2) par(mfrow=c(1,1)) # ------------------------------------------------------------------------------------- # Proovi ise: # ----------- # Joonsta mannaputru söövate ja mittesöövate tudengite kehakaalude histogrammid ja tihedusfunktsioonid. # Konstrueeri sagedustabel tunnusele pikkus, jagades pikkused 6 klassi - cut(pikkus,6) # Konstrueeri karp-vurrud diagrammid tunnusele peaümbermõõt sõltuvalt matemaatika hindest # ------------------------------------------------------------------------------------- # Mitmesugused testid (püüa sõnastada järeldused kõigi testide tulemuste alusel) # Kas tudengite keskmine pikkus erineb 170-st? t.test(pikkus,mu=170,conf.level=0.99) t.test(pikkus[sugu=="M"],mu=180,conf.level=0.95) # Kas matemaatikas 3- ja 4-liste keskmised peaümbermõõdud on erinevad? t.test(peaymb[mat==3],peaymb[mat==4]) # eeldab normaaljaotust mõlemas võrreldavas grupis # ei eelda normaaljaotust wilcox.test(peaymb[mat==3],peaymb[mat==4]) # Wilcoxoni ehk Mann-Whitney test ks.test(peaymb[mat==3],peaymb[mat==4]) # Kolmogorov-Smirnovi test # Hoiatus tähendab, et andmestikus esineb korduvaid väärtusi, KS-test aga eeldab vaikimis, et korduvad väärtused puuduvad # Kas peaümbermõõtude varieeruvus sõltub soost? bartlett.test(peaymb, sugu) # Bartlett' test - dispersioonide võrdlemisel kasutatava F-testi edasiarendus # (eeldab, et uuritava tunnuse jaotus kõigis võrreldavais gruppides on normaaljaotus) # Kui normaaljaotust pole, siis on dispersioonide võrdlemisel kasutatav Fligner-Killeen'i test: fligner.test(peaymb, sugu) # Kas tudengite peaümbermõõt erineb normaaljaotusest? shapiro.test(peaymb) # Shapiro-Wilk'i test # Nagu enamus normaaljaotust kontrollivaid teste, on ka SW'i test enamasti liiga range # ja praktilistes analüüsides piisab normaaljaotuse graafilisest kontrollimisest. Näiteks: hist(peaymb) # Et gruppide võrdlemisel eeldatakse normaaljaotust igas grupis, siis ... : par(mfrow=c(2,2)) by(peaymb, sugu, hist) by(peaymb, sugu, qqnorm) par(mfrow=c(1,1)) # Juhul, kui puuduvaid väärtuseid ei ole, sobib normaaljaotuse testimiseks ka Kolmogorov-Smirnovi test: ks.test(pikkus, pnorm, mean=mean(pikkus), sd=sd(pikkus)) # ------------------------------------------------------------------------------------- # Proovi ise: # ----------- # Leidke naistudengite keskmise kaalu 95%-usalduspiirid. Kas naistudengite keskmine kaal erineb statistiliselt oluliselt 60 kg-st? # Kas nais- ja meestudengite keskmised kehamassiindeksid on statistiliselt oluliselt erinevad? # Kas tudengite kehamassiindeksite jaotus erineb normaaljaotusest? # ------------------------------------------------------------------------------------- # Lõpetuseks oleks soovitav aktiivne andmestik deaktiveerida: detach(students) # -------------------------------------------------------------------------------------