Jak na jazyk R instalace a z´akladn´ı pˇr´ıkazy
Vladislav B´ına Arnoˇst Kom´arek Lenka Kom´arkov´a
2006
Co je R? R je jazyk a z´aroveˇ n prostˇred´ı vhodn´e pro prov´adˇen´ı statistick´ ych v´ ypoˇct˚ u a tvorbu grafick´ ych v´ ystup˚ u. Je to volnˇe ˇsiˇriteln´ y n´astroj, kter´ y vych´az´ı z velmi podobn´eho jazyka S. Umoˇzn ˇuje vytv´aˇret profesion´aln´ı grafy a obr´azky. Relativnˇe snadno umoˇzn ˇuje pˇrid´avat dalˇs´ı n´astroje, uˇzivatel´e maj´ı moˇznost svou pr´aci maxim´alnˇe zjednoduˇsovat a prostˇred´ı si upravit podle sv´ ych pˇredstav. Do syst´emu lze doinstalovat velk´e mnoˇzstv´ı bal´ıˇck˚ u, kter´e jeho moˇznosti d´ale rozˇsiˇruj´ı. Prostˇred´ı R je moˇzn´e pouˇz´ıvat ve vˇsech verz´ıch Microsoft Windows (poˇc´ınaje Windows 95), ale tak´e v syst´emech Linux a MacOS X. V´ıce o jazyku R na str´ank´ach: http://www.r-project.org/
Instalace prostˇ red´ı R Program samotn´ y a nˇekter´e pˇr´ıdavn´e bal´ıˇcky lze pˇred instalac´ı zkop´ırovat ze ˇskoln´ıho disku K:, konkr´etnˇe K:\PED\KMIH\verejny\kmm\Komarek\software. Kde naleznete adres´aˇre se dvˇema instalacemi pro r˚ uzn´e operaˇcn´ı syst´emy: jednak pro Windows (Rko-Windows) a jednak pro linux (Rko-Linux). Kromˇe toho je tento software ke staˇzen´ı na str´ank´ach R Project, kter´e naleznete na v´ yˇse uveden´e adrese (http://www.r-project.org/), budete-li n´asledovat odkaz CRAN a vyberete-li um´ıstˇen´ı, odkud chcete program stahovat. Je vhodn´e vybrat um´ıstˇen´ı (CRAN Mirror) v bl´ızk´e lokalitˇe, zvol´ıte-li rakouskou Wirtschaftsuniversitaet Wien, je moˇzn´e pouˇz´ıt pˇr´ımo odkaz: http://cran.at.r-project.org/. Zde vyberete syst´em, kter´ y bˇeˇz´ı na vaˇsem poˇc´ıtaˇci a pod n´ımˇz prostˇred´ı R pobˇeˇz´ı, tedy zˇrejmˇe prostˇred´ı Windows. D´ale n´asledujete-li odkaz base, m˚ uˇzete st´ahnout soubor README.R-*1 a vlastn´ı instalaci programu (v pˇr´ıpadˇe syst´emu Windows) R-*-win32.exe2 . Pokud m´ate instalaci programu uloˇzenou v poˇc´ıtaˇci a m´ate opr´avnˇen´ı na dan´em poˇc´ıtaˇci instalovat, m˚ uˇzete R-*-win32.exe spustit3 . 1
M´ısto hvˇezdiˇcky aktu´aln´ı ˇc´ıslo verze - napˇr´ıklad: README.R-2.3.1. Zde opˇet m´ısto hvˇezdiˇcky aktu´aln´ı ˇc´ıslo verze - napˇr´ıklad: R-2.3.1-win32.exe. 3 I kdyˇz to obecnˇe nelze doporuˇcit, lze prostˇred´ı R bez pot´ıˇz´ı jiˇz nainstalovan´e (obvykle v adres´aˇri Program Files\R) pˇrekop´ırovat do jin´eho poˇc´ıtaˇce a zaˇc´ıt jej pouˇz´ıvat. 2
1
• Nejdˇr´ıve se v´as program zept´a na jazyk, kter´ y m´a pouˇz´ıt pˇri instalaci. • Po odsouhlasen´ı se objev´ı obvykl´ y Pr˚ uvodce instalac´ı, kde stisknete s´ı >. tlaˇc´ıtko Dalˇ • Pot´e odsouhlas´ıte podm´ınky licenˇcn´ı smlouvy a opˇet stisknete Dalˇ s´ı >. • Nyn´ı je potˇreba volit sloˇzku, kam bude program nainstalov´an, obvykle staˇc´ı ponechat implicitn´ı pˇredvyplnˇenou cestu, jen v pˇr´ıpadˇe, ˇze tam nem´ate povolen´ y z´apis, zvolte jin´ y adres´aˇr na v´am pˇr´ıstupn´em disku (v uˇcebnˇe napˇr´ıklad disk D:). • V dalˇs´ım dialogu pak zvolte souˇca´sti, kter´e se maj´ı instalovat, pˇredvolen´e m˚ uˇzete ponechat nebo vybrat Full installation. • Pot´e zvol´ıte jm´eno sloˇzky v nab´ıdce Start, opˇet lze ponechat. • A koneˇcnˇe zvol´ıte dalˇs´ı u ´koly, kter´e se maj´ı prov´est, opˇet nen´ı obvykle potˇreba mˇenit, jen v pˇr´ıpadˇe pot´ıˇz´ı s opr´avnˇen´ımi lze tato zaˇskrtnut´ı zruˇsit. • Pak se spust´ı samotn´a instalace a po jej´ım probˇehnut´ı zb´ yv´a jen stisknout tlaˇc´ıtko Dokonˇ cit a pot´e prostˇred´ı R spustit. Rozˇsiˇruj´ıc´ı bal´ıˇcky lze nal´ezt na str´ank´ach CRAN v sekci: Packages, ale o tom v n´asleduj´ıc´ı ˇca´sti.
Instalace rozˇ siˇ ruj´ıc´ıch bal´ıˇ ck˚ u Bal´ıˇcky ve formˇe zip archiv˚ u lze obecnˇe z´ıskat opˇet napˇr´ıklad ze str´anek http://cran.at.r-project.org/ pod odkazem Packages. Nicm´enˇe bal´ıˇcky, kter´e budou potˇrebn´e v r´amci v´ yuky naleznete opˇet na ˇskoln´ım disku K:, ve v´ yˇse zm´ınˇen´em adres´aˇri s instalac´ı R, konkr´etnˇe pro windows: K:\PED\KMIH\verejny\kmm\Komarek\software\Rko-Windows\baliky Pokud je jiˇz m´ate na nˇekter´em z disk˚ u pˇr´ıstupn´em v poˇc´ıtaˇci, spust’te si prostˇred´ı R a pro instalaci bal´ıˇck˚ u lze pouˇz´ıt na liˇstˇe menu Packages poloˇzku Install package(s) from local zip files ... Pot´e vyhled´ate cestu, kde jsou rozˇsiˇruj´ıc´ı bal´ıˇcky uloˇzeny (tedy na ˇskoln´ıch poˇc´ıtaˇc´ıch to bude v´ yˇse zm´ınˇen´a 2
sloˇzka K:\PED\KMIH\verejny\kmm\Komarek\software\Rko-Windows\baliky) a se stisknutou kl´avesou Shift kliknˇete lev´ ym tlaˇc´ıtkem myˇsi na prvn´ı a posledn´ı bal´ıˇcek v t´eto sloˇzce. Jsou-li oznaˇceny vˇsechny bal´ıˇcky, stisknˇete Otevˇ r´ıt a instalace bal´ıˇck˚ u probˇehne. T´ımto by vaˇse Rko mˇelo b´ yt pˇripraveno k pr´aci.
Mal´ a vsuvka: R Commander Prostˇred´ı R m˚ uˇzete jiˇz nyn´ı zaˇc´ıt pouˇz´ıvat a ps´at pˇr´ıkazy v R Console, tedy pˇr´ıkazov´em oknˇe, kter´e se objev´ı po spuˇstˇen´ı. Nicm´enˇe je tu jeˇstˇe moˇznost pouˇz´ıvat nadstavbu, kterou jste nainstalovali v rozˇsiˇruj´ıc´ım bal´ıˇcku Rcmdr neboli R Commander. Spust´ıte jej tak, ˇze v ok´enku R Console zap´ıˇsete pˇr´ıkaz library(Rcmdr) (a odeˇslete jej k vykon´an´ı kl´avesou Enter). Zobraz´ı se v´am okno R Commanderu, v horn´ı ˇca´sti (Script Window) m˚ uˇzete zapisovat pˇr´ıkazy, kter´e pot´e vykon´ate, um´ıst´ıte-li kurzor na pˇr´ısluˇsn´ y ˇra´dek a stisknete tlaˇc´ıtko Submit (pˇr´ıpadnˇe m˚ uˇzete oznaˇcit v´ıce pˇr´ıkaz˚ u najednou a pouˇz´ıt Submit). V doln´ı ˇc´asti Output Window se pak zobrazuj´ı v´ ysledky pˇr´ıkazu. Pouˇzit´ı je tedy v z´asadˇe obdobn´e jako u prost´e R Console, s t´ım rozd´ılem, ˇze zad´avan´e pˇr´ıkazy a jim pˇr´ısluˇsej´ıc´ı v´ ystup jsou v oddˇelen´ ych oknech a oboje lze snadno uloˇzit. Kromˇe toho R Commander usnadˇ nuje mnoho dalˇs´ıch u ´kol˚ u, jako je naˇc´ıt´an´ı a editov´an´ı dat a jin´e operace, kter´e jsou pˇr´ıstupn´e v klikac´ı“ formˇe ” pˇr´ımo z jeho menu, aniˇz by bylo nutn´e pˇresnˇe si pamatovat pˇr´ıkaz. Jeˇstˇe poznamenejme, ˇze ne vˇzdy je jeho pouˇzit´ı u ´plnˇe bezprobl´emov´e. Napˇr´ıklad pˇr´ıkaz pro vykreslen´ı histogramu pˇri pouˇzit´ı R Commanderu ˇspatnˇe zobrazuje graf (pˇrinejmenˇs´ım ve verzi pouˇz´ıvan´e nyn´ı na fakultˇe). Proto pokud budete zaskoˇceni zvl´aˇstn´ım chov´an´ım, vyzkouˇsejte stejn´ y postup jeˇstˇe jednou v R Consoli. V dalˇs´ım textu nebudeme uˇzit´ı R Commanderu pˇredpokl´adat, nicm´enˇe t´emˇeˇr vˇse by mˇelo fungovat bez probl´emu i v nˇem.
3
Jak zaˇ c´ıt aneb R jako kalkul´ ator Pokud pouˇz´ıv´ate R Console, zapisujete jednotliv´e pˇr´ıkazy na ˇr´adek zaˇc´ınaj´ıc´ı > a po dops´an´ı jej odeˇslete stiskem kl´avesy Enter. V R Commanderu je to obdobn´e (viz v´ yˇse). M˚ uˇzete tedy zaˇc´ıt zkouˇset n´asleduj´ıc´ı pˇr´ıkazy a jejich varianty. 3+5-2 ((3*15 + 5)/5) 2^4 sqrt(16) exp(-1) sin(3.14) log(5-4) log10(0.1) log(25, base=5) rnorm(10) max(c(1,-2,9,2)) min(runif(5)) round(pi,3) 11 %/% 5 11 %% 5
Provede a zobraz´ı v´ ysledek. Pˇrednost operac´ı lze usmˇerˇ novat z´avorkami. ˇ Ctvrt´a mocnina ze dvou. V´ ypoˇcet odmocniny. Funkˇcn´ı hodnoty exponenciely: e−1 . V´ ypoˇcet sinu, argument se zadav´a v radi´anech. Pˇrirozen´ y logaritmus. Dekadick´ y logaritmus. Jin´ y z´aklad, zde z´aklad 5. Deset n´ahodn´ ych ˇc´ısel z norm´aln´ıho rozdˇelen´ı. Vybere maxim´aln´ı hodnotu z uveden´ ych, viz vektory. Nejmenˇs´ı ˇc´ıslo z pˇeti n´ahodn´ ych s rovnom. rozdˇelen´ım. Zaokrouhlen´ı ˇc´ısla π na tˇri desetinn´a m´ısta. Celoˇc´ıseln´e dˇelen´ı, v´ ysledek 2. Zbytek po dˇelen´ı, v´ ysledek 1.
N´ apovˇ eda K informac´ım o funkc´ıch vedou n´asleduj´ıc´ı pˇr´ıkazy: help(rnorm) ?rnorm help.search(trigonometric) ?Trig help.start() apropos(plot) ls() rm(aa)
Zobraz´ı n´apovˇedu k funkci rnorm. Jen struˇcnˇejˇs´ı varianta t´ehoˇz. Prohled´av´a syst´em n´apovˇedy. N´apovˇeda k trigonometrick´ ym funkc´ım. Spust´ı HTML verzi n´apovˇedy. Hled´a pˇr´ıkazy maj´ıc´ı ve jm´enˇe dan´ y text. Vyp´ıˇse jiˇz vytvoˇren´e promˇenn´e. Zruˇs´ı promˇennou aa.
4
Promˇ enn´ e Samotn´e v´ ypoˇcty jsou nedostateˇcn´e, ˇcasto je potˇreba promˇennou uloˇzit. x <- 12 x = 12 x
Uloˇz´ı do promˇenn´e x hodnotu 12. Stejn´e jako x <- 12. Zobraz´ı uloˇzenou hodnotu v promˇenn´e x.
Promˇenn´e mohou b´ yt r˚ uzn´ ych typ˚ u, kromˇe ˇc´ıseln´ ych napˇr´ıklad ˇretˇezce (uzavˇren´e v uvozovk´ach nebo apostrofech) nebo logick´e (viz kapitola Logick´e oper´atory).
Vektory a posloupnosti Mnohdy jednotliv´e promˇenn´e nedostaˇcuj´ı, jazyk R ˇcasto pouˇz´ıv´a vektory a posloupnosti hodnot, jak pro v´ ystup tak pro zad´av´an´ı dat. Ostatnˇe jejich potˇreba vypl´ yv´a uˇz ze samotn´e podstaty statistick´ ych probl´em˚ u. vec <- c(10,1, -4) vec seq(1,5) 1:7 1.23:5 v2 <- seq(1,9,by=2) v2 v2[4] v2[3:5] v2[c(1,3,4)] seq(1,3,by=.1) seq(1,7,length.out=5) rep(1:4,2) rep(1:4,each=2) numeric(7)
Uloˇz´ı do promˇenn´e vec hodnoty 10, 1 a -4. Zobraz´ı uloˇzen´e hodnoty vektoru vec. Vytvoˇr´ı vektor pˇrirozen´ ych ˇc´ısel od 1 do 5. Opˇet vektor pˇrirozen´ ych ˇc´ısel od 1 do 7. Aritmet. posloupnost s diferenc´ı 1 mezi 1.23 a 5 s v´ ysledkem: 1.23 2.23 3.23 4.23. Vektor lich´ ych ˇc´ısel od 1 do 9 v promˇenn´e v2. Zobrazen´ı s v´ ysledkem: 1 3 5 7 9. ˇ Ctvrt´a poloˇzka vektoru v2. Tˇret´ı aˇz p´at´a poloˇzka vektoru v2. Prvn´ı, tˇret´ı a ˇctvrt´a poloˇzka vektoru v2. Vektor ˇc´ısel od 1 do 3, n´asleduj´ıc´ı je o 0.1 vˇetˇs´ı. Vektor d´elky length.out=5 z ˇc´ısel od 1 do 7, s v´ ysledkem: 1.0 2.5 4.0 5.5 7.0. Zopakuje dvakr´at posloupnost 1:4 s v´ ysledkem: 1 2 3 4 1 2 3 4 Zopakuje dvakr´at kaˇzd´e ˇc´ıslo posloupnosti 1:4 s v´ ysledkem: 1 1 2 2 3 3 4 4 Vytvoˇr´ı nov´ y vektor obsahuj´ıc´ı sedm nul.
5
D´elku vektoru lze zjistit pomoc´ı pˇr´ıkazu length(), tedy napˇr.: length(v2).
Pracovn´ı sloˇ zka Dˇr´ıve neˇz se pokus´ıme o naˇc´ıt´an´ı nebo ukl´ad´an´ı dat, je potˇreba si vyjasnit, jak´a sloˇzka je aktu´alnˇe zvolena jako pracovn´ı, pˇr´ıpadnˇe ji zmˇenit. Ulehˇc´ı n´am to situaci a nebudeme muset vypisovat kompletn´ı cestu k soubor˚ um na disku postupnˇe pˇres jednotliv´e sloˇzky. getwd() setwd(’D:/rko’) dir() nebo list.files()
Zjist´ıme aktu´aln´ı pracovn´ı sloˇzku. Zmˇen´ıme pracovn´ı sloˇzku na zadanou D:\rko. Jm´ena soubor˚ u v aktu´aln´ı nebo zadan´e sloˇzce.
Naˇ c´ıt´ an´ı a ukl´ ad´ an´ı dat, datov´ e r´ amce V t´eto ˇca´sti budeme naˇc´ıtat data se souboru car.dat, kter´ y je na ˇskoln´ım disku K: ve sloˇzce K:\PED\KMIH\verejny\kmm\Komarkova\statistika\R_materialy. Zkop´ırujete-li si tento soubor napˇr´ıklad na disk D: do sloˇzky D:\rko, m˚ uˇzeme 4 pouˇz´ıvat n´asleduj´ıc´ı pˇr´ıkazy : data <- read.table("D:\\rko\\car.dat") Naˇcte obsah souboru do promˇenn´e data, nerozezn´a, ˇze prvn´ı ˇra´dek obsahuje n´azvy sloupeˇck˚ u a nerozezn´a od sebe jednotliv´e sloupce. data
Zobraz´ı naˇcten´a data.
data <- read.table(’D:/rko/car.dat’, header = TRUE) Naˇcte obsah souboru do promˇenn´e data, hlaviˇcka je spr´avnˇe rozezn´ana jako jm´ena promˇenn´ ych, vˇse je vˇsak st´ale jen v jednom sloupci. 4 Cesta k souboru se zapisuje jako promˇenn´a typu ˇretˇezec, tedy bud’to do uvozovek nebo do apostrof˚ u. Pouˇzit´ı lom´ıtek u cesty k souboru se m˚ uˇze jevit ponˇekud nezvykl´e, pokud pouˇzijete zpˇetn´e lom´ıtko, je potˇreba jej zdvojit, protoˇze zpˇetn´e lom´ıtko je v ˇretˇezc´ıch pouˇz´ıv´ano jako speci´aln´ı znak (viz n´ıˇze). M˚ uˇzete pouˇz´ıt m´ısto zpˇetn´eho lom´ıtka obyˇcejn´e – jako v linuxu – a naˇcten´ı bude rovnˇeˇz bez probl´em˚ u.
6
data <- read.table("D:/rko/car.dat", header=TRUE, sep=";") Naˇcte obsah souboru do promˇenn´e data, v uvozovk´ach u parametru sep je uveden znak, kter´ y oddˇeluje sloupce v souboru. Pokud nen´ı zad´an znak oddˇelovaˇce, pˇredpokl´ad´a se, ˇze oddˇeluj´ı mezery. data<-read.table("D:/rko/car.dat",header=T,sep=";",na.strings="chybi")
Naˇcte obsah souboru do promˇenn´e data, v uvozovk´ach u parametru na.strings je uveden ˇretˇezec, kter´ y v datov´em souboru oznaˇcuje, ˇze v nˇem chyb´ı hodnota. Lze uv´est i v´ıce takov´ ych ˇretˇezc˚ u ve tvaru vektoru. Kromˇe toho lze v tomto pˇr´ıkazu pouˇz´ıt parametr dec, kter´ y oznaˇcuje oddˇelovaˇc cel´e a desetinn´e ˇca´sti ˇc´ısla (napˇr. desetinn´a teˇcka: dec=’.’). V´ ysledkem posledn´ıho uveden´eho pˇr´ıkazu jsou hodnoty uloˇzen´e v promˇenn´e data, kter´a je datov´ ym r´amcem (neboli r´amcem zastˇreˇsuj´ıc´ım nˇekolik promˇenn´ ych z naˇcten´eho souboru), obsah m˚ uˇze vypadat takto: typ druh nahon kon.sila spotr.mesto spotr.dalnice delka sirka 1 Chevrolet.Aveo.4dr osobni predni NA 8.4 6.9 424 168 2 Mercedes-Benz.CL500.2dr osobni zadni 302 14.7 9.8 498 185 3 Ford.F-150.Supercab.Lariat pickup ctyrkolka 300 16.8 13.1 NA NA 4 GMC.Sierra.HD.2500 pickup ctyrkolka 300 NA NA NA NA
Pˇriˇcemˇz k jednomu sloupeˇcku lze pˇristupovat pomoc´ı pˇr´ıkazu data$delka: 424 498
NA
NA
To sam´e provede pˇr´ıkaz data[,"delka"], pˇr´ıpadnˇe pˇr´ıkaz data[,7], pokud potˇrebujete napˇr. jen prvn´ı dvˇe hodnoty pouˇzijete data$delka[1:2] nebo data[1:2,"delka"]. Kromˇe toho existuj´ı jeˇstˇe dalˇs´ı varianty pˇr´ıkazu read.table urˇcen´e pˇr´ımo naˇc´ıt´an´ı CSV soubor˚ u: • read.csv() Naˇc´ıtan´ y soubor obsahuje hlaviˇcku se jm´eny promˇenn´ ych header=TRUE, poˇc´ıt´a s oddˇelovaˇcem sep="," a s desetinnou teˇckou dec=".". • read.csv2() Uvaˇzuje soubor s hlaviˇckou obsahuj´ıc´ı jm´ena promˇenn´ ych header=TRUE, poˇc´ıt´a s oddˇelovaˇcem sep=";" a s desetinnou ˇca´rkou dec=",". Datov´e r´amce m˚ uˇzeme jednoduˇse vytv´aˇret pˇr´ımo v R. Treba takto: jmena <- c("Adam", "Barbara", "Chris", "David") 7
vek <- c(33, 19, 27, 48) vyska <- c(1.81,1.77,1.66,2.03) lide <- data.frame(jmena,vek,vyska) V datov´em r´amci lide jsou nyn´ı sloupce: jmena vek vyska 1 Adam 33 1.81 2 Barbara 19 1.77 3 Chris 27 1.66 4 David 48 2.03 M˚ uˇzeme jednoduˇse pˇridat dalˇs´ı sloupec: lide$vaha <- c(82,91,58,81). To lze udˇelat i n´asleduj´ıc´ım pˇr´ıkazem lide <- transform(lide, bmi=vaha/vyska^2) nebo m˚ uˇzeme s pomoc´ı tohoto pˇr´ıkazu pˇrev´est u ´daj o v´ yˇsce napˇr´ıklad na centimetry lidecm <- transform(lide, vyska = vyska*100). Pˇriˇcemˇz k transformaci m˚ uˇzeme vybrat libovolnou funkci, tedy napˇr´ıklad pˇrirozen´ y logaritmus log() nebo Z-transformaci scale(). Lze tak´e vybrat jen nˇekter´e sloupce lide[,c(’vek’,’vaha’)] nebo vytvoˇrit nov´ y r´amec napˇr. jen s u ´daji o vˇeku, v´ yˇsce a v´aze: lide2 <- subset(lide, select=vek:vaha). Uloˇzit datov´ y r´amec lze pomoc´ı pˇr´ıkazu write.table(), kter´ y m´a obdobn´e parametry jako read.table(), tedy napˇr.: write.table(lide, "D:/rko/lide.csv", sep=’;’, row.names=F) Pouˇz´ıv´ate-li delˇs´ı dobu promˇenn´e z jednoho datov´eho r´amce, m˚ uˇze b´ yt vhodn´e pouˇz´ıt funkci attach(), kter´a umoˇzn´ı pˇristupovat k promˇenn´ ym datov´eho r´amce uvodn´ıho stavu. pˇr´ımo. Funkce detach() vˇse uvede do p˚ attach(lide) jmena[vyska > 2] jmena[(vaha >= 80) & (vaha <= 90)] detach(lide) (Uk´azka zjiˇst’uje jm´ena lid´ı vyˇsˇs´ıch neˇz dva metry a s v´ahou mezi 80 a 90 kilogramy vˇcetnˇe.)
Z´ akladn´ı informace a charakteristiky Informace o datov´ ych r´amc´ıch a jejich jednotliv´ ych promˇenn´ ych a jejich z´akladn´ı statistick´e charakteristiky lze z´ıskat pomoc´ı n´asleduj´ıc´ıch pˇr´ıkaz˚ u: 8
names(lide) summary(lide) min(lide$vek) max(lide$vek) range(lide$vek) mean(lide$vek) median(lide$vek)
Zjiˇstˇen´ı (zmˇena) jmen promˇenn´ ych v datov´em r´amci. Z´akladn´ı charakteristiky jednotliv´ ych promˇenn´ ych. Minim´aln´ı hodnota, kter´e nab´ yv´a promˇenn´a. Maxim´aln´ı hodnota, kter´e nab´ yv´a promˇenn´a. Vrac´ı minimum a maximum. Aritmetick´ y pr˚ umˇer hodnot. V´ ybˇerov´ y medi´an ze zadan´ ych hodnot.
quantile(lide$vek) quantile(lide$vek,probs=c(.1,.9)) var(lide$vaha) sd(lide$vaha) cov(lide$vaha, lide$vyska) cor(lide$vaha, lide$vyska)
Zjist´ı v´ ybˇerov´e kvartily. Vypoˇc´ıt´a zadan´e kvantily. Vypoˇc´ıt´a rozptyl zadan´ ych hodnot. Smˇerodatn´a odchylka. Vypoˇc´ıt´a kovarianci. Vypoˇc´ıt´a koeficient korelace.
Kategori´ aln´ı veliˇ ciny ˇ Casto je potˇreba explicitnˇe ˇr´ıci, kter´a veliˇcina m´a b´ yt povaˇzov´ana za kategori´aln´ı. Vytvoˇr´ıme-li napˇr´ıklad veliˇcinu lide$pohlavi <- c(’M’,’Z’,’M’,’M’), v´ıme, ˇze tato veliˇcina je kategori´aln´ı a nab´ yv´a pouze dvou hodnot. Tento fakt ale mus´ıme pˇr´ımo specifikovat. To lze pˇr´ıkazem: lide$pohlavi <- factor(lide$pohlavi, labels=c(’muz’,’zena’)) Nyn´ı, kdyˇz si nech´ate vypsat vektor lide$pohlavi, zjist´ıte, ˇze kromˇe jednotliv´ ych poloˇzek vektoru je ve v´ ypisu jiˇz i seznam hodnot, kter´ ych promˇenn´a nab´ yv´a: [1] muz zena muz muz Levels: muz zena Konvertovat spojitou promˇennou v diskr´etn´ı lze pomoc´ı pˇr´ıkazu cut(): lide$nad30 <- cut(lide$vek, breaks = c(0,30,100)) V promˇenn´e lide$nad30 je [1] (30,100] (0,30] (0,30] Levels: (0,30] (30,100]
(30,100]
Pˇredch´azej´ıc´ım v´ ypisem jsme z´ıskali kategorizovan´e hodnoty vektoru a z´aroveˇ n u ´rovnˇe, kter´ ych veliˇcina nab´ yv´a. Pokud chceme zjistit pouze u ´rovnˇe kategori´aln´ı 9
veliˇciny, pouˇzijeme pˇr´ıkaz levels(lide$nad30), ale m˚ uˇzeme je t´ımto pˇr´ıkazem i zmˇenit: levels(lide$nad30)=c(’mladsi’,’starsi’) Vytvoˇrit vektor hodnot kategori´aln´ı veliˇciny lze i pomoc´ı pˇr´ıkazu gl(), napˇr´ıklad: gl(2,3,12,labels = c(’A’,’N’)) Chceme tedy dvˇe hodnoty (A a N), kter´e se maj´ı vˇzdy tˇrikr´at zopakovat a pak pouˇz´ıt n´asleduj´ıc´ı, cel´e opakovat tolikr´at, aby vektor mˇel d´elku dvan´act, v´ ysledkem bude: [1] A A A N N N A A A N N N Levels: A N
Tabulky ˇ cetnost´ı Zobrazen´ı absolutn´ıch a relativn´ıch ˇcetnost´ı umoˇzn ˇuj´ı pˇr´ıkazy table() a prop.table(), pokud v´am nevyhovuje zp˚ usob z´apisu v´ıcerozmˇern´ ych tabulek, m˚ uˇzete vyzkouˇset pˇr´ıkaz ftable(). attach(lide) tabulka <- table(pohlavi,nad30) tabulka reltab <- prop.table(tabulka) detach(lide) Podm´ınˇen´e ˇcetnosti lze vypoˇc´ıtat pomoc´ı prop.table(tabulka,1), coˇz jsou podm´ınˇen´e ˇcetnosti v z´avislosti na pohlav´ı (n´alepka pohlav´ı). Zat´ımco prop.table(tabulka,2) n´am vypoˇcte podm´ınˇen´e ˇcetnosti obou pohlav´ı, pokud zn´ame vˇekovou kategorii (n´alepkou je veliˇcina nad30). Margin´aln´ı ˇcetnosti z´ısk´ame z jiˇz vypoˇcten´ ych absolutn´ıch nebo relativn´ıch ˇcetnost´ı pomoc´ı pˇr´ıkazu margin.table(tabulka), kter´ y seˇcte vˇsechny hodnoty v tabulce. Pokud pˇrid´ame dalˇs´ı parametr, z´ısk´ame souˇcty vzhledem k zadan´emu indexu, tedy margin.table(tabulka,1) zjist´ı ˇcetnosti pro obˇe pohlav´ı, atd. Kumulativn´ı ˇcetnosti lze poˇc´ıtat pomoc´ı funkce cumsum().
10
Obecnˇe lze pracovat s tabulkami pomoc´ı pˇr´ıkazu apply(), kter´ y umoˇzn ˇuje aplikovat na jednotliv´e dimenze matice r˚ uzn´e funkce (viz t´eˇz n´ıˇze u funkce tapply()). Chceme-li prov´est sˇc´ıt´an´ı po ˇr´adc´ıch nebo maxima ve sloupc´ıch, pouˇzijeme: apply(tabulka, 1, sum) apply(tabulka, 2, max)
Podm´ınˇ en´ e charakteristiky Charakteristiky kvantitativn´ı promˇenn´e podm´ınˇen´e hodnotou kvalitativn´ıho yˇsku znaku lze z´ıskat pomoc´ı funkce tapply(). N´asleduj´ıc´ı zjiˇst’uje minim´aln´ı v´ ve dvou vˇekov´ ych kategori´ıch nebo pr˚ umˇernou v´ yˇsku, respektive doln´ı a horn´ı kvartil v´ yˇsek obou pohlav´ı. tapply(lide$vyska, lide$nad30, min) tapply(lide$vyska, lide$pohlavi, mean) tapply(lide$vyska, lide$pohlavi, quantile, c(0.25,0.75)) Kromˇe toho lze jako tˇret´ı argument pouˇz´ıt i maximum max, rozptyl var, smˇerodatnou odchylku sd, medi´an median, souˇcet hodnot sum, setˇr´ıdˇen´ı sort a dalˇs´ı funkce.
Logick´ e oper´ atory Logick´e v´ yrazy nab´ yvaj´ı jen dvou hodnot: TRUE nebo FALSE. Jsou d˚ uleˇzit´e napˇr´ıklad pro v´ ybˇer dat, je-li splnˇena urˇcit´a podm´ınka. x <- c(44,10,15,24,32,12,51) x[x > 20] subset(x, x <= 30) ˇ Casto potˇrebujeme spojit dohromady v´ıce podm´ınek, chceme-li napˇr´ıklad jm´ena vˇsech lid´ı, kteˇr´ı mˇeˇr´ı alespoˇ n 1.7 m a m´enˇe neˇz 1.8 m nebo jm´ena tˇech, kteˇr´ı v´aˇz´ı do 60 kg vˇcetnˇe nebo nad 90 kg, posledn´ı dvˇe konstrukce vypisuj´ı vˇek vˇsech lid´ı kromˇe Chrise. Vˇsimnˇete si symbolu ==, kter´ y je porovn´an´ım dvou hodnot, nikoliv pˇriˇrazen´ım jako jednoduch´e rovn´ıtko. lide$jmena[(lide$vyska > 1.7) & (lide$vyska < 1.8)] lide$jmena[(lide$vaha <= 60) | (lide$vaha > 90)] lide$vek[!(lide$jmena == ’Chris’)] lide$vek[lide$jmena != ’Chris’] 11
Grafy K vykreslov´an´ı absolutn´ıch a relativn´ıch ˇcetnost´ı kategori´aln´ıch veliˇcin m˚ uˇzete pouˇz´ıt pˇr´ıkazy: pie(table(lide$pohlavi)) barplot(table(lide$pohlavi)) barplot(prop.table(table(lide$pohlavi))) K zobrazen´ı spojit´ ych veliˇcin lze vyuˇz´ıt krabiˇckov´ y diagram nebo je kategorizovat a vykreslit histogram: boxplot(lide$vyska) hist(lide$vek) hist(lide$vek, breaks = c(0,20,40,60)) hist(lide$vek, breaks = c(0,20,40,60), freq=FALSE) Pˇriˇcemˇz druh´ y z histogram˚ u m´a zvolen´e dˇel´ıc´ı body, nejsou vypoˇc´ıt´any automaticky. V prvn´ıch dvou jsou zobrazeny absolutn´ı ˇcetnosti, zat´ımco tˇret´ı zobrazuje empirickou hustotu. Ke zobrazen´ı vztahu mezi dvˇema kvantitativn´ımi veliˇcinami lze pouˇz´ıt funkci plot(), kter´a vykresl´ı mimo jin´e scatterplot, ale m˚ uˇzete ji vyuˇz´ıt k vykreslen´ı funkˇcn´ı z´avislosti: plot(lide$vyska,lide$vaha) plot(x,log(x+1),type=’l’) Pokud chceme funkci plot vyuˇz´ıt k vykreslen´ı pravdˇepodobnostn´ı funkce, pouˇzijeme pˇr´ıkaz plot(,type=’h’), k vykreslen´ı distribuˇcn´ı a kvantilov´e funkce plot(,type=’s’). K vykreslov´an´ı norm´aln´ıho QQ-grafu lze pouˇz´ıt funkci qqnorm(). K vykreslen´ı v´ıce graf˚ u do jednoho obr´azku lze pouˇz´ıt funkci par, zde se uv´ad´ı do hodnoty parametru, v kolika ˇra´dc´ıch a v kolika sloupc´ıch maj´ı b´ yt grafy uspoˇra´d´any. Vˇsechny funkce pro vykreslov´an´ı graf˚ u maj´ı samozˇrejmˇe mnoho dalˇs´ıch parametr˚ u. Nˇekter´e zde uvedeme v nˇekolika uk´azk´ach: par(mfrow=c(1,3)) pie(table(lide$pohlavi), col=c("yellow","magenta")) xx <- prop.table(table(lide$pohlavi)) lab <- sprintf("%s: %s%%", levels(lide$pohlavi), xx*100) 12
pie(xx, labels = lab, col=c("red","cyan")) barplot(xx, legend = levels(lide$pohlavi), col=c(’red’,’blue’)) par(mfrow=c(2,2)) hist(lide$vek, breaks = c(0,20,40,60), xlab = ’Vek [roky]’, ylab = ’Absolutni cetnost’, main = ’Vekove kategorie’, col = c(’blue’,’orange’,’green’), border = ’gray’) boxplot(lide$vyska, ylab = "vyska [m]", main = "Boxplot vysky") abline(h=2, col = "magenta") x <- 0:10 plot(x,log(x+1),type=’l’,col="brown") abline(h = 1, v = exp(1) - 1, col = "pink") prumer <- mean(lide$vyska) odchylka <- sd(lide$vyska) qqnorm(lide$vyska, main="QQ-graf pro vysku", xlab="Teoreticke kvantily N(0,1)", ylab="Vyberove kvantily") abline(a=prumer, b=odchylka, col="blue")
Ukl´ ad´ an´ı obr´ azk˚ u Jednoduch´ y zp˚ usob je kliknout na jiˇz vykreslen´em obr´azku (grafu) prav´ ym tlaˇc´ıtkem a zvolit v menu, kter´e se objev´ı. Lze obr´azek kop´ırovat do schr´anky jako bitmapu nebo jako metafile a pot´e obr´azek vloˇzit napˇr´ıklad v Malov´an´ı. M˚ uˇzete jej pˇr´ımo jako metafile nebo postscript uloˇzit nebo vytisknout (pokud m´ate nainstalovan´ y PDFCreator, m˚ uˇzete takto vytvoˇrit i postscript). Kromˇe toho existuje postaven´ y pˇr´ımo na pˇr´ıkazech jazyka R. K ukl´ad´an´ı vektorov´ ych obr´azk˚ u slouˇz´ı pˇr´ıkazy pdf() a postscript(), je potˇreba zadat jm´eno souboru a rozmˇery obr´azku v palc´ıch. pdf(file=’D:/obr1.pdf’, width = 5, height = 5) xx <- prop.table(table(lide$pohlavi)) lab <- sprintf("%s: %s%%", levels(lide$pohlavi), xx*100) pie(xx, labels = lab, col=c("red","cyan")) dev.off() Pˇr´ıkaz dev.off() uzav´ır´a a ukonˇcuje ukl´ad´an´ı do souboru. M´ısto pˇr´ıkazu pdf() lze pouˇz´ıt: postscript(file=’D:/obr2.ps’, width = 5, height = 5). Podobnˇe se k ukl´ad´an´ı bitmapov´ ych obr´azk˚ u pouˇz´ıv´a pˇr´ıkaz˚ u jpeg(), bmp() a png(). U bitmapov´ ych obr´azk˚ u se velikost ud´av´a v bodech. 13
N´ ahodn´ e v´ ybˇ ery a rozdˇ elen´ı N´ahodn´ y v´ ybˇer 7 ze 49 hodnot provedeme pomoc´ı funkce: sample(1:49,7) Kromˇe toho lze pomoc´ı parametru replace=T zvolit v´ ybˇer s opakov´an´ım a pomoc´ı prob= zadat vektor pravdˇepodobnost´ı jednotliv´ ych hodnot: sample(c(0,1),100,replace=T,prob=c(0.1,0.9)) Pr´ace s rozdˇelen´ımi pravdˇepodobnosti se realizuje vˇzdy pomoc´ı ˇctveˇrice pˇr´ıkaz˚ u. Pˇr´ıkaz zaˇc´ınaj´ıc´ı na d oznaˇcuje hustotu pravdˇepodobnosti nebo pravdˇepodobnostn´ı funkci. Pˇr´ıkaz zaˇc´ınaj´ıc´ı na p je distribuˇcn´ı funkce, na q zaˇc´ın´a kvantilov´a funkce a koneˇcnˇe p´ısmenem r se oznaˇcuj´ı gener´atory ˇc´ısel s pˇr´ısluˇsn´ ym rozdˇelen´ım. Je vˇzdy potˇreba zadat parametry dan´eho rozdˇelen´ı. Tedy napˇr´ıklad rovnomˇern´e rozdˇelen´ı: x <- seq(-2,6,0.01) #pomocn´ y vektor plot(x, punif(x,0,4),type=’l’) # graf distribuˇ cn´ ı funkce plot(x, dunif(x,0,4),type=’l’) # graf hustoty pravdˇ epodobnosti q <- seq(0,1,0.1) plot(q, qunif(q,0,4),type=’l’) # kvantilov´ a funkce runif(10,0,4) # deset ˇ c´ ısel z dan´ eho rozdˇ elen´ ı Obdobnˇe to funguje pro norm´aln´ı rozdˇelen´ı pnorm(), dnorm(), qnorm() a rnorm(), zde parametry jsou stˇredn´ı hodnota a rozptyl. Binomick´e rozdˇelen´ı m´a pˇr´ıkazy pbinom(), dbinom(), qbinom() a rbinom(): x <- 0:10 setiny <- seq(0,1,0.01) par(mfrow=c(2,2)) plot(x, dbinom(x,10,1/4), main="Pravdep. fce", type="h") plot(x, pbinom(x,10,1/4), main="Distrib. fce", type="s") plot(setiny,qbinom(setiny,10,1/4),main="Kvantilova fce",type="s",) Kde 10 byl poˇcet pokus˚ u a 1/4 je pravdˇepodobnost u ´spˇechu v kaˇzd´em pokusu. Pˇr´ısluˇsnou ˇctveˇrici funkc´ı naleznete samozˇrejmˇe pro mnoho dalˇs´ıch rozdˇelen´ı, ze spojit´ ych napˇr´ıklad Studentovo t-rozdˇelen´ı (*t()), pro F-rozdˇelen´ı (*f()), pro Chi-kvadr´at rozdˇelen´ı (*chisq()), exponenci´aln´ı (*exp()) a dalˇs´ı, z diskr´etn´ıch tˇreba: geometrick´e (*geom()), multinomick´e (*multinom()) nebo Poissonovo (*pois()). Kde hvˇezdiˇcka je m´ısto ˇctveˇrice p´ısmen d, p, q a r.
14
Funkce bal´ıˇ cku vsePackage Abychom funkce tohoto bal´ıˇcku uvedli do provozu, je potˇreba bal´ıˇcek nahr´at, pokud jste jej spr´avnˇe instalovali (viz v´ yˇse), staˇc´ı jej nahr´at pˇr´ıkazem library(vsePackage). K dispozici jsou funkce poˇc´ıtaj´ıc´ı bodov´e a intervalov´e odhady: estim.mean(lide$vyska, conf.level=0.95) estim.var(lide$vyska, conf.level=0.99) U obou pˇr´ıkaz˚ u lze zajistit v´ ypoˇcet jednostrann´ ych interval˚ u pomoc´ı parametru type = ’less’ (levostrann´ y) nebo type = ’greater’ (pravostrann´ y). Kromˇe toho jsou v tomto bal´ıˇcku k dispozici nˇekter´e statistick´e testy a mnoˇzstv´ı dalˇs´ıch funkc´ı.
Statistick´ e testy Jazyk R a pˇr´ıdavn´ y bal´ık vsePackage d´av´a moˇznost pouˇz´ıvat (kromˇe jin´ ych) n´asleduj´ıc´ı testy: Normalita: Shapir˚ uv-Wilk˚ uv test: shapiro.test(x) Jednov´ ybˇ erov´ e, parametrick´ e: Asymptotick´ y test o stˇredn´ı hodnotˇe (vsePackage): asymp.mean.test(x, mu =, alternative =, conf.level =) T-test o stˇredn´ı hodnotˇe norm´aln´ıho rozdˇelen´ı: t.test(x, mu=, alternative =, conf.level =) Testy o smˇerodatn´e odchylce a rozptylu norm´aln´ıho rozdˇelen´ı (vsePackage): onesample.var.test(x, sd =, alternative =, conf.level =) onesample.var.test(x, var =, alternative =, conf.level =) Jednov´ ybˇ erov´ e, neparametrick´ e: Test o poloze spojit´eho rozdˇelen´ı: wilcox.test(x, mu =, alternative =, conf.level =)
15
Dvouv´ ybˇ erov´ e, parametrick´ e: F-test na porovn´an´ı rozptyl˚ u (normalita obou v´ ybˇer˚ u): var.test(x, y, ratio =) var.test(y factor, ratio =) Dvouv´ ybˇerov´ y T-test, shodn´e rozptyly (normalita obou v´ ybˇer˚ u): t.test(x, y, mu =, var.equal = T) t.test(y factor, mu =, var.equal = T) Dvouv´ ybˇerov´ y T-test (zobecnˇen´ y, Welch), r˚ uzn´e rozptyly (normalita obou v´ ybˇer˚ u): t.test(x, y, mu =, var.equal = F) t.test(y factor, mu =, var.equal = F) Dvouv´ ybˇ erov´ e, neparametrick´ e: Dvouv´ ybˇerov´ y Wilcoxon˚ uv test (spojit´e v´ ybˇery): wilcox.test(x, y, mu =) wilcox.test(y factor, mu =) Kolmogorov˚ uv-Smirnov˚ uv test: ks.test(x, y) P´ arov´ e, parametrick´ e a neparametrick´ e: P´arov´ y t-test (normalita rozd´ılu p´ar˚ u): t.test(x, y, mu =, paired = T) P´arov´ y Wilcoxon˚ uv test (spojitost a pˇribliˇzn´a symetrie rozd´ılu p´ar˚ u): wilcox.test(x, y, mu =, paired = T)
Obecnˇe lze oboustrann´ y test zvolit pomoc´ı alternative=’two.sided’, levostrann´ y pomoc´ı volby alternative=’greater’ a koneˇcnˇe pravostrann´ y volbou alternative=’less’. U dvouv´ ybˇerov´ ych test˚ u m˚ uˇzeme bud’to zad´avat dva vektory s v´ ybˇery nebo pouˇz´ıt z´apis y~factor, kde se pomoc´ı faktorizovan´e (viz v´ yˇse) kategori´aln´ı veliˇciny factor se dvˇema hodnotami rozdˇeluje do dvou v´ ybˇer˚ u vektor y.
16
Oˇ setˇ ren´ı chybˇ ej´ıc´ıch hodnot Chybˇej´ıc´ı hodnoty lze u vˇetˇsiny funkc´ı oˇsetˇrit pomoc´ı parametru na.rm = T, pokud potˇrebujeme kompletn´ı p´ary napˇr´ıklad u v´ ypoˇctu koeficientu korelace, pouˇzijeme cov(x, y, use = ’pairwise.complete.obs’). Nebo m˚ uˇzeme z vektoru y odstranit chybˇej´ıc´ı hodnoty pomoc´ı funkce is.na() a negace: bez.na
17