NMST539 | Cvičenie 1
Grafické nástroje v programe R, Sweave a Knit
LS 2017/2018 | Pondelok 19/02/18
Účelom prvého cvičenia z predmetu NMST539 je oboznámiť sa s niektorými grafickými nástrojmi v programe R (Development Core Team, 2017), ktoré su užitočné pri vyzualizácii rôznych dátovych súborov. Výuka cvičení z predmetu NMST539 bude počas celého semestra prebiehat s využitím počítačov a štatistického programu R, v ktorom sa budú jednotlivé úlohy riešiť.
Program R (dostupný pod GNU GPL licenciou) je k dispozícii k stiahnutiu (free of charge) na adrese
https://www.r-project.org
K dispozícii sú distribúcie s priamou podporou pre OS Windows, Linux aj Macintosh.
Základnú inštaláciu programu R je možne jednoducho rozšíriť pomocou dodatočných knižníc (balíčkov), ktoré sú k dispozícii na rôznych online repozitároch (zoznam hlavných repozitárov je na adrese https://cran.r-project.org/mirrors.html). Jednotlivé R knižnice sú tvorené samotnými užívateľmi softwaru R a ich správne fungovanie nie je garantované - je preto namieste určitá opatrnosť a hlavne aktívne premýšľanie pri ich používaní.
Pre užívateľov programu R sú k dispozícii aj rôzne grafické rozhrania, ktoré je možne dodatočne nainštalovať a umožňujú (v určitých smeroch) jednoduchšiu a prehľadnejšiu prácu. Najznámejší a pravdepodobne aj jeden z najpoužívanejších R interfacov je RStudio.
Užitočné materiály pre prácu so štatistickým softwarom R
-
Bína, V., Komárek, A. a Komárková, L.: Jak na jazyk R. (PDF súbor)
-
Komárek, A.: Základy práce s R. (PDF súbor)
-
Kulich, M.: Velmi stručný úvod do R. (PDF súbor)
-
De Vries, A. a Meys, J.: R for Dummies. (ISBN-13: 978-1119055808)
1. Grafika v programe R
K dispozícii je veľký výber rôznych funkcii a príkazov určených k vytváraniu rôznych grafických výstupov. Dodatočné príkazy a funkcie je možne získať pri rozšírení základnej inštalácie po pridaní niektorého z dodatočných balíčkov (packages) - tie sú špecificky zamerané na konkrétnu oblasť, balíček často poskytuje komplexnú sadu nástrojov na riešenie určitého špecifického problému.
Grafické funkcie v programe R možeme podľa spôsobu fungovania začleniť do troch základných kategórii:
-
Funkcie, ktoré vytvárajú nové grafické rozhranie Pri volaní ktorejkoľvek fukcie z tejto kategórie automaticky dôjde k vytvoreniu nového grafického okna (graph window) v ktorom sa vykresli samotný obrázok (graf). Toto okno je ponechané ako aktívne a pomocou ďalších funkcii z druhej skupiny (viď nižšie) je možné dopĺňať dodatočne objekty do již existujúceho obrázku, prípadne meniť rôzne nastavenia a vlastnosti a dotvoriť tak finálny graficky výstup, obrázok.
Základné príkazy (napr.): plot() , dotchart() , hist() , barplot() , pie() , boxplot() , pairs() , atď.;
-
Funkcie, ktoré dopĺňajú již vytvorený graf Do druhej kategórie patria funkcie a príkazy, ktoré fungujú len v prípade, že bola pred ich použitím zavolaná niektorá funkcia z prvej kategórie a vytvorené okno je stále aktívne. Pomocou príkazov a funkcii z tejto kategórie je možné dopĺňať ďalšie (často netriviálne) objekty do již existujúceho grafu (grafického okna - graph window).
Základné príkazy (napr.): points() , lines() , abline() , text() , legend() , atď.;
-
Funkcie určené na manipuláciu s grafmi Do tejto kategórie patria funkcie a príkazy, ktoré primárne nie su schopné vytvárať obrázok, ani dopĺňať objekty do již existujúceho obrázku, ale služia na jednoduchú manipuláciu s vytvorenými grafickými oknami (napr. uloženie obr., vytvorenie niekoľkýh grafov v jednom okne, vytvorenie nového okna, a pod.)
Základné príkazy (napr.): dev.new() , X11() , dev.off() , postscript() , pdf() , png() , par() , layout() , atď.;
Pomocou R helpu zistite, k čomu jednotlivé príkazy a funkcie slúžia, ako sú implementované, aké dodatočné parametre je možné pri volaní funkcie využiť a každú z uvedených funkcii použijte aspoň v jednom grafe, ktorý samostatne vytvoríte.
Na úvod použijeme data mtcars ktoré sú štandardne obsiahnuté v distribúcii Rka. Pozrieme sa na základné popisné charakteristiky pomocou štandardných R funkcii
head(mtcars)
dim(mtcars)
summary(mtcars)
a nasledujúcim kódom vykreslíme obrázok, ktorú nam odhalí určitú časť závislostnej štruktúry v datach.
x <- mtcars[order(mtcars$mpg),] # sort by mpg
x$cyl <- factor(x$cyl) # it must be a factor
x$color[x$cyl==4] <- "red"
x$color[x$cyl==6] <- "blue"
x$color[x$cyl==8] <- "darkgreen"
dotchart(x$mpg,labels=row.names(x),cex=.7,groups= x$cyl,
main="Gas Milage for Car Models\ngrouped by cylinder",
xlab="Miles Per Gallon", gcolor="black", color=x$color)
Alternatívný náhľad dostaneme prostredníctvom matice scatterplotov, pomocou príkazu pairs() :
pairs(mtcars[,c(1,3,4,6)], col=mtcars$cyl, pch = mtcars$am)
Sofistikovanejšie verzie aj s odhadom hustoty a regresnej závislosti možeme konštruovať pomocou knižnice library(car) príkazom scatterplot.matrix() :
library(car)
scatterplot.matrix(~mpg+disp+drat+wt|cyl, data=mtcars, main="")
Existujú samozrejme mnohé iné možnosti a ďalšie grafiké nástroje v Rku, pomocou ktorých vytvoriť ‘case-specific’ obrázky a grafy. Hlavný dôraz je pritom kladený na vizuálnu stránku, graf by mal dostatočne názorne zobrazovať podstatnú štruktúru datového súboru.
V prípade menšieho počtu premenných je celkom zaujímavou možnosťou aj zobrazenie marginálnych hustot pre dve konkrétne veličíny (z dôvodu obmedzeného vnímania viac-rozmerných grafov sa väčšinou nepoužíva vyšší počet veličin súčastne):
library(MASS)
library("RColorBrewer")
colors <- brewer.pal(5, "Reds")
z <- kde2d(mtcars[,1], mtcars[,4], n=5)
plot(mtcars[,c(1,4)], xlab="Miles per Galon", ylab="Horse Power", pch=21, bg = "yellow")
contour(z, drawlabels=FALSE, nlevels=4, col=colors, add=TRUE)
Knižnica MASS je potrebná k spočítaniu jadrového odhadu dvojrozmernej hustoty (príkaz kde2d() ) a knižnica RColorBrewer je potrebná na vytvorenie farebnej palety, podľa ktorej sú vyfarbené kontúry.
Boxploty
Predstavu o štruktúre datového súboru získame (aj keď len v určitej obmedzenej miere) aj pomocou boxplotov
boxplot(mpg ~ cyl, col = brewer.pal(3, "Blues"), xlab = "number of cylinders", ylab = "miles per galon", main= "")
prípadne verzia, ktorá zohľadňuje dve rôzne kategorické premenné (v tomto konkrétnom prípade spotrebu udávanu v míľach prejdených na jeden galón a identifikátor automatickej prevodovky: Automatic = 0 a Manual = 1).
boxplot(mpg ~ cyl + am, col = c(brewer.pal(3, "Greens"), brewer.pal(3, "Blues")), xlab = "No. of cylinders(.)Auto Transmission Indicator")
Alebo dokonca zložitejší prípad zobrazujúci spotrebu v závislosti na dvoch rôznych faktoroch a 95% konfidenčným intervalom pre skutočnú hodnotu médianu (s voľbou parametru notched = TRUE ).
boxplot(mpg ~ cyl * am, col = c(brewer.pal(3, "Greens"), brewer.pal(3, "Blues")), xlab = "Number of Cylinders", ylab = "Miles per Galon | Automatic Transmission", main= "", notch = T)
Alebo celkom sofistikovany ‘histogram’, ktorý inkorporuje aj odhad hustoty (pomocou príkazu vioplot() z knižnice ‘vioplot’).
library(vioplot)
x1 <- mtcars$mpg[mtcars$cyl==4]
x2 <- mtcars$mpg[mtcars$cyl==6]
x3 <- mtcars$mpg[mtcars$cyl==8]
vioplot(x1, x2, x3, names=c("4 cyl", "6 cyl", "8 cyl"), col="gold")
title("Violin Plots of Miles Per Gallon")
Podobný, ale interpretačne odlišný graficky výstup dostaneme pomocou príkazu pirateplot() z knižnice ‘yarrr’. Pre správnu interpretáciu obrázku je vhodné naštudovať príslušný manuál k danej knižnici.
#install.packages("yarrr")
library("yarrr")
pirateplot(mpg ~ cyl, data = mtcars, xlab = "number of cylinders", ylab = "miles per galon", main= "", inf.method = "iqr")
Funkcia pirateplot() umožňuje rôzne ďalšie modifikácie a požadované užívateľské nastavenia výsledného grafického vystupu (viď manuál).
Napr. s intervalmi spoľahlivosti namiesto boxplotov
pirateplot(mpg ~ cyl, data = mtcars, xlab = "number of cylinders", ylab = "miles per galon", main= "", inf.method = "ci")
Parallel Coordinates Plot
S využitím knižnice MASS je možné zavolať funkciu parcoord() , ktorá je užitočna, keď chceme vizuálne posúdiť mieru korelácie medzi jednotlivými sledovanými premennými. Ako by ste nasledujúci graf interpretovali? Resp. aké závery je možné z tohto grafu vyvodiť?
library(MASS)
attach(mtcars)
colorVector <- rep("brown", dim(mtcars)[1])
colorVector[am == 0] <- "brown1"
colorVector[cyl == 6] <- "blue4"
colorVector[cyl == 6 & am == 0] <- "blue1"
colorVector[cyl == 4] <- "darkgreen"
colorVector[cyl == 4 & am == 0] <- "green"
parcoord(mtcars, col = colorVector, lty = gear)
Samozrejme existuje mnoho iných možnosti, ako graficky nahliadnuť do štruktúry datového súboru, ktorý chceme následne štatisticky analyzovať. Vždy je potrebné zvážiť, aký graf a ktoré grafické nástroje sú ideálne vzhľadom k problému a akým spôsobom vytvorený graf/obrázok náležite okomentovať a interpretovať.
Knižnica ggplot2
Alternatívu ku klasickým grafickým nástrojom, ktoré su k dispozícii v programe R, ponúka dodatočna knižnica ggplot2 , ktorú naištalujete a inicializujete štandardnými príkazmi
install.packages("ggplot2")
library(ggplot2)
Základnou funkciou v tejto knižnici je funkcia qplot() , ktorá na rozdiel od štandardnej funkcie plot() , ponúka ďaleko väčšie možnosti pri vytváraní grafov a obrázkov (pozri help ?qplot() ).
V datovom súbore mtcars najprv upravíme niektoré premenné - faktorizujeme ich a priradíme príslušne názvý jednotlivých úrovni.
mtcars$gear <- factor(mtcars$gear,levels=c(3,4,5), labels=c("3gears","4gears","5gears"))
mtcars$am <- factor(mtcars$am,levels=c(0,1), labels=c("Automatic","Manual"))
mtcars$cyl <- factor(mtcars$cyl,levels=c(4,6,8), labels=c("4cyl","6cyl","8cyl"))
Následne už možeme použiť funkciu qplot() a vykresliť odhad hustoty pre spotrebu (miles per gallon) v závislosti na počte prevodových stupňov (premenná gear ).
qplot(mpg, data=mtcars, geom="density", fill=gear, alpha=I(.5), main="Distribution of Gas Milage", xlab="Miles Per Gallon", ylab="Density")
Pomocou tej istej funkcie qplot() , ale s inou voľbou parametru geom = "..." , je možne celkovo meniť vzhľad a typ výsledného grafu.
qplot(gear, mpg, data=mtcars, geom=c("boxplot", "jitter"), fill=gear, main="Mileage by Gear Number", xlab="", ylab="Miles per Gallon")
Prípadne vykresliť regresnú závislosť spotreby na váhe automobilu (aj s príslušnými pásmi spoľahlivosti pre regresnú přímku).
qplot(wt, mpg, data=mtcars, geom=c("point", "smooth"), method="lm", formula=y~x, color=cyl, main="Regression of MPG on Weight", xlab="Weight", ylab="Miles per Gallon")
Užitočné
Knižnica ggplot2 funguje na princípe postupných vrstiev (layers), v ktorých sa vykresľuje výsledný graf. Jednotlivé vrstvy sa prídávajú pomocou vhodných príkazov, ako napr. geom_points() , geom_abline() , geom_area() geom_bar() , geom_contour() , geom_polygon() , atď. (zoznam napr. na stránke http://sape.inf.usi.ch/quick-reference/ggplot2/geom).
Jednoduchý príklad s využitím niekoľkých vrstiev:
dataSum <- plyr::ddply(mtcars, "gear", plyr::summarise, mean = mean(mpg), sd = sd(mpg))
ggplot() +
geom_point(data = mtcars, aes(x = gear, y = mpg)) +
geom_point(data = dataSum, aes(x = gear, y = mean), colour = 'red', size = 3) +
geom_errorbar(data = dataSum, aes(x = gear, y = mean, ymin = mean - sd, ymax = mean + sd), colour = 'red', width = 0.4) +
ggtitle("Car consumption summary given the number of gears")
2. Práca so Sweave a Knit
Jednoduchý návod na používanie Sweave a tiež Knit (ktorým bol vytvorený tento dokument) je na webovej stránke
https://support.rstudio.com/
Povedane stručne a veľmi jednoducho, Sweave je knižnica a tiež funkcia v programe R (teda Sweave() ), ktorá integruje Rko a LaTeX. Analogicky je tomu tak v pripade knižnice a funkcie Knit (resp. Knit() ), ktorá integruje (kompiluje) Rko do HTML kódu.
Základom je vytvorenie klasického tex súboru (pre Sweave) a html súboru (pre Knit). Príslušné súbory sa ako Rnw (Sweave) a Rmd (Knit).
Do týchto suborov je potom možné okrem tex kódu a html kódu vkládať aj vhodne označený R kód. Volaním funkcie Sweave("nazov_suboru.Rnw") alebo Knit(nazov_suboru.Rmd) program R prejde celý dokument, a tex kód(prípadne html kód) ignoruje, R kód spracuje a výstupom je súbor tex (po použití Sweave), alebo html (po použití Knit). S týmito súbormi je ďalej možné pracovať ako s klasickými tex a html súbormi.
V prípade, že použijeme k práci user-friendly interface (asi jedna z najlepších možnosti je RStudio )
https://www.rstudio.com
tak je možné okamžite vytvárať PDF a HTML súbory priamo z Rnw a Rmd súborov a to pouze stlačením príslučného tlačítka v menu RStudia.
Podrobnejší návod na prácu so Sweave napr. tu:
http://gosset.wharton.upenn.edu/
Pre názornú ukážku ako vkládať R kód do Rnw súboru slúži táto malá ukážka: download Rnw súbor (v UTF 8 kódovaní) Následná kompilácia a teda aj automatické vytvorenie finálneho PDF súboru sa dosiahne pomocou stlačenia tlačítka Compile PDF (v interface RStudio) - viď nasledujúci obrázok.
Ako názorná ukážka fungovania programu Knit môže slúžiť aj podkladový Rmd súbor k tejto stránke: download Rnw súbor (v UTF 8 kódovaní) Následná kompilácia a vytvorenie finálneho HTML dokumentu pomocou stlačenia tlačítka Knit HTML - viď obrázok nižšie.
Domáca úloha
(Deadline: druhé cvičenie / 26.02.2018)
Jednou z podmienok získania zápočtu z predmetu NMST539 je odovzdanie PDF reportu na konci semestra, ktorý bude obsahovať vypracované domáce úlohy, postupne zadávané v priebehu semestra. Výsledný PDF súbor musí mať ucelený a dobre čitateľný format štandardného reportu a musí obsahovať
-
titulnú stranu, resp. hlavičku;
-
úvod a základný popis datového súboru, s ktorým budete pracovať;
-
prehľadne štrukturované kapitoly/sekcie, ktoré sa budu venovať jednotlivým úloham;
-
záver, prípadne diskusia;
Pomocou nasledujúceho príkazu nainštalujte knižnicu SMSdata s rôznými datovými súbormi:
install.packages(pkgs="http://www.karlin.mff.cuni.cz/~hlavka/sms2/SMSdata_1.0.tar.gz", repos=NULL, type="source")
Zo zoznamu datových súborov ktoré sú v knižnici k dispozícii a ktorý získate príkazom
data(package = "SMSdata")
si vyberte jeden dataset na základe ktorého vypracujete jednotlivé úlohy počas semestru. K dispozícii je 21 dátových súborov, ktoré do Rka stačí načítať pomocou príkazu data(nazov_datasetu) , napríklad
data(plasma)
-
vyberte si jeden dátový súbor a načítajte ho v programe R;
-
vytvorte
Rnw súbor, ktorý bude obsahovať základný popis datového súboru, niektoré dôležité popisné štatistiky a ich stručnú interpretáciu;
-
využijte niektoré grafické nástroje v programe R a vhodne ich aplikujte na niektoré premenné v zvolenom datovom súbore; vytvorte niekoľko vhodných obrázkov a výsledne obrazky náležite okomentujte a interpretujte;
|