NMST539 | Cvičenie 1
Grafické nástroje v programe R, Sweave a Knit
LS 2017 | Utorok 21/02/17
Úč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, 2016), 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 najlepší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)
Základná 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ý výsledný 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ť ďalšie objekty do již existujúceho obrázku, prípadne meniť rôzne nastavenia a vlastnosti.
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 bol 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 nasledujúcich 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 nejaké dve konkrétne veličíny (z dôvodu obmedzeného vnímania viac-rozmerných grafov sa väčšinou nepoužíva viac, ako dve veličiny 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")
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")
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 resp. Rmd súboru, viď nasledujúce obrázky (otvorené v RStudio).
Domáca úloha
(Deadline: druhé cvičenie / 02.03.2016)
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ávane v priebehu semestra. Výsledny súbor musí mať ucelený format štandardného reportu, obsahovať musí
-
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 inch 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;
|