NMST539 | Cvičenie 1

Grafické nástroje v programe R, Sweave a Knit

LS 2017 | Utorok 21/02/17

podkladový Rmd súbor (kódovanie UTF8)

Úč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:

  1. 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ď.;

  2. 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ď.;

  3. 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;