NMSA230 - Úvod do programování v R

Zimný semester 2019/2020 | Cvičenie 5 | St 04/12/19



Knitr & Shine


Program piateho cvičenia NMSA 230
  • Práca s datami a jednoduché simulácie
  • R knižnica Knitr
  • Interaktívne aplikácie prostredníctvom Shine


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)


1. R-ková knižnica ‘Knitr’

Knitr (GNU General Public License) je knižnica pre štatistický program R, ktorá umožňuje integráciu R-kového zdrojového kódu
do HTML jazyka. Výsledkom je súbor html, ktorý je možné prezerať pomocou internetového prehliadača (ako napríklad táto stránka, ktorá bola tiež vytvorená pomocou knižnice ‘Knitr’).

Inštalácia a inicializácia knižnice pomocou štandardných príkazov

install.packages("knitr")
library("knitr")

V niektorých grafických interfacoch (napr. RStudio) je tento balíček nainštalovaný štandardne a volanie príslušnej funkcie je redukované iba na stlačenie príslušného tlačítka v hlavnom menu. Základom je podkladový súbor typu Rmd, ktorý obsahuje jednak zdrojový kód pre html stránku, ale tiež vhodne označené príkazy pre program R. Pri kompilácii podkladového súboru sú R-kové príkazy najprv vyhodnotené a výsledky sú dopĺnené do zdrojového html kódu. Celkovým výstupom je súbor typu html, ktorý je možné prezerať v štandardnom webovom prehliadači.

Niekoľko príkladov aplikácie knižnice ‘Knitr’ v programe R (podkladové súbory je možné otvoriť v programe RStudio a následne skompilovať stlačením tlačítka “Knit” na hlavnej lište):

  • podkladový súbor z prvého cvičenia predmetu NMSA230: Rmd súbor (kódovanie UTF8);
  • podkladový súbor z druhého cvičenia predmetu NMSA230: Rmd súbor (kódovanie UTF8);
  • podkladový súbor z tretieho cvičenia predmetu NMSA230: Rmd súbor (kódovanie UTF8);
  • podkladový súbor zo štvrtého cvičenia predmetu NMSA230: Rmd súbor (kódovanie UTF8);
  • podkladový súbor z piateho cvičenia predmetu NMSA230: Rmd súbor (kódovanie UTF8);


Samostatne


  • Použijte podkladové Rmd súbory uvedené vyššie, otvorte ich v programe RStudio a príslušný Rmd súbor zkompilujte (pomocou tlačítka Knit HTML v menu).
  • Podkladový Rmd súbor doplňte o vlastnú časť R-kového zdrojového kódu. Pridajte minimálne jeden obrázok a finálny Rmd súbor opäť skompilujte a vytvore výsledný HTML súbor.



2. Štatistická analýza a štatistické simulácie

Nasledujúci príkaz načíta reálne data, ktoré zaznamenávajú rôzne informácie o tehotných pacientkách a následných pôrodoch na gynekologickom oddelení v Liptovskom Mikuláši. Data sú v tvare, jako ich předali samotní lekári.

data <- read.csv("http://www.karlin.mff.cuni.cz/~maciak/NMSA230/gynData.csv", header = T, dec = ".", sep = "") 

Data obsahujú množstvo rôznych premenných (väčšina z nich je pre naše účeli nepodstatná) - v prevažnej väčšine sa jedná o rôzne lekárske kritéria, testy a výskyty komplikácii (pozitívny výsledok vs. negatívný výsledok), hodnoty testov na tehotensku cukrovku (veličiny glik1glik4), popisné charakteristiky pacientky (vek, výška, hmotnosť, BMI), popisné charakteristiky narodeného dieťaťa (pohlavie, obvod hlavy a hrudníka, dĺžka, váha, systolický a diastolický krvný tlak a ďalšie).

names(data)
##  [1] "nove"         "povodne"      "glik1"        "glik2"       
##  [5] "glik3"        "glik4"        "Vek"          "Parita"      
##  [9] "GestVek"      "PrekoncHm"    "PorHm"        "Vyska"       
## [13] "BMIinic"      "BMIfinal"     "weightGain"   "pohlavie"    
## [17] "obvodhrud"    "obvodHlava"   "dlzka"        "sTK"         
## [21] "dTK"          "Apgar1"       "Apgar5"       "Apgar10"     
## [25] "cisarskyREX"  "cisarskyVEX"  "DYSTOKIO"     "sposobPorodu"
## [29] "PEE"          "hospit"       "velkyPlod"    "malyPlod"    
## [33] "hmotnost"     "HYPERBILIRUb" "Bilirubin"    "ATB"         
## [37] "POLYCYTEMIA"  "Hematokrit"   "HYPOGLYKEMIA" "Glykemia"    
## [41] "PORANENIE"    "TRANSFUZIE"

Podstatné ale je prehliadnúť si data a uvedomiť si niektoré chyby:

table(data$cisarskyREX)
## 
## neg  pn poz 
## 491   1 213
table(data$cisarskyVEX)
## 
##     neg poz 
##   1 693  11
table(data$hospit)
## 
## neg  nn poz 
## 569   1 135

Tieto chyby opravíme pomerne jednoducho:

data$cisarskyREX[which(data$cisarskyREX == "pn")] <- "poz"
data$cisarskyREX <- factor(data$cisarskyREX, levels = c("neg", "poz"))

data$cisarskyVEX[which(data$cisarskyVEX == "")] <- "neg"
data$cisarskyVEX <- factor(data$cisarskyVEX, levels = c("neg", "poz"))

data$hospit[which(data$hospit == "nn")] <- "neg"
data$hospit <- factor(data$hospit, levels = c("neg", "poz"))

Z určitých expertných dôvodov je pre lekárov doležite rozlíšiť staré a nové kritéria (prvé dva stĺpce v datach). Zavedieme preto novú premennú, ktorá bude súhrnne popisovať výsledky oboch kritérii:

data$kriteria <- rep("neg", dim(data)[1])
data$kriteria[data$nove == "poz" & data$povodne == "neg"] <- "posNove"
data$kriteria[data$nove == "neg" & data$povodne == "poz"] <- "posPovd"
data$kriteria[data$nove == "poz" & data$povodne == "poz"] <- "posBoth"
data$kriteria <- as.factor(data$kriteria)

Samostatne


  • Podívajte sa na data a skuste spočítať niektoré základné popisné charakteristiky. Tieto charakteristiky doplňte o vhodne zvolené obrázky, ktoré budú popisné charakteristiky vizuálne reprezentovať.
  • Pokúste sa pomocou popisných charakteristík povedať niečo o starých a nových kritériach na komplikácie (rozlišujete pacientky v závislosti na výsledkoch starých a nových kriterii, resp. na novo-zavedenej premenne kriteria).
  • Pomocou popisných charakteristík novorodenca sa pokúste ponúknuť odpoveď na otázku, či je rozdiel medzi novonarodeným chlapcom a novonarodenou holkou.



V nasleduúcej časti sa zameriame pouze na hmotnosť novonarodených deti (premenná hmotnost). Histogram zo zaznamenaných pozorovaní vyzera takto:

hist(data$hmotnost, xlab= "Hmotnosť novorodenca", freq = F, ylab= "Relatívny výskyt", main = "", col = "lightblue", breaks = 20)
lines(density(data$hmotnost), col = "red", lwd = 2)
lines(dnorm(seq(1500, 5000, length = 10000), mean(data$hmotnost), sd(data$hmotnost)) ~ seq(1500, 5000, length = 10000), col = "blue", lty = 2)

  • Červenou krivkou je zobrazený neparametrický odhad hustoty, ktorý svojim tvarom pripomína hustotu normálneho rozdelenia s príslušnými parametrami strednej hodnoty a rozptylu.
  • Modrou krivkou je zobrazená teoretická hustota normálneho rozdelenia, kde jako stredná hodnota a rozptyl sú použite empirické odhady získane z dat.

    mean(data$hmotnost)
    ## [1] 3414.851
    var(data$hmotnost)
    ## [1] 237520.5

Formálne by sme mohli otestovať, čí namerané hodnoty výšiek novorodencov pochádzajú z normálneho rozdelenia (nulová hypotéza), alebo pochádzajú z nejakého iného rozdelenia (alternatívna hypotéza). Na testovanie takto definovanej nulovej hypotézy máme v pravdepodobnostnej a štatistickej teórii niekoľko rôznych testov, ktoré ale nie sú ekvivalentné.

  • Kolmogorov-Smirnovov test - v programe R implementovány v príkaze ks.test();
  • ks.test(data$hmotnost,"pnorm",mean=mean(data$hmotnost),sd=sd(data$hmotnost),exact=FALSE)
    ## 
    ##  One-sample Kolmogorov-Smirnov test
    ## 
    ## data:  data$hmotnost
    ## D = 0.048552, p-value = 0.07203
    ## alternative hypothesis: two-sided
  • Shapiro-Wilkův test - v programe R implementovány v príkaze shapiro.test();
  • shapiro.test(data$hmotnost)
    ## 
    ##  Shapiro-Wilk normality test
    ## 
    ## data:  data$hmotnost
    ## W = 0.99016, p-value = 0.0001164
  • Jarque-Bera test - v programe R implementovány v knižnici tseries v príkaze jarque.bera.test();
  • library(tseries)
    jarque.bera.test(data$hmotnost)
    ## 
    ##  Jarque Bera Test
    ## 
    ## data:  data$hmotnost
    ## X-squared = 21.75, df = 2, p-value = 1.893e-05

Rozhodnutie o nulovej a alternatívnej hypotéze je rôzne na základe rôznych testov. Ako si vybrať ten správny test? K odpovedi nám pomôže mala simulačná štúdia, ktorá sa bude zameriavať na sílu jednotlivých testov.

N <- c(10, 50, 100, 200, 500, 1000, 2000, 5000)

power <- NULL
set.seed(1234)
for (n in N){
  p1 <- p2 <- p3 <- NULL
for (i in 1:100){
  x <- rchisq(n, df = 50)
  p1 <- c(p1, as.numeric(ks.test(x,"pnorm",mean=mean(x),sd=sd(x),exact=FALSE)$p.value < 0.05))
  p2 <- c(p2, as.numeric(shapiro.test(x)$p.value < 0.05))
  p3 <- c(p3, as.numeric(jarque.bera.test(x)$p.value < 0.05))
}
power <- rbind(power, c(n, mean(p1), mean(p2), mean(p3)))
}

plot(power[,4] ~ log10(power[,1]), col = "red", type = "l", pch = 21, bg = "red", xlab = "Logarimus rozsahu náhodného výberu", ylab = "Empirická síla testu", ylim = c(0,1))
points(power[,4] ~ log10(power[,1]), pch = 21, bg = "red")
points(power[,3] ~ log10(power[,1]), pch = 21, bg = "blue")
points(power[,2] ~ log10(power[,1]), pch = 21, bg = "green")

lines(power[,3] ~ log10(power[,1]), col = "blue")
lines(power[,2] ~ log10(power[,1]), col = "green")
abline(1,0, col = "black", lty = 3)

legend(1, 1, legend = c("Shapiro-Wilk test", "Jarque-Beta test", "Kolmogorov-Smirnov test"), col = c("blue", "red", "green"), lty= rep(1,3))

Z tohto pohľadu je najsilnejším testom práve Shapiro-Wilkov test. Je potrebné ale pamätať na to, že testy boli spočítane pri konkrétnej alternatíve - skutočné rozdelenie bolo \(\chi^2\) rozdelenie s 50 stupňami voľnosti. Jak sa ale porovnanie v zmysle síly testu zmení, ak zmeníme alternatívu a generovať budeme data z \(t\) rozdelenia s ťažkými chvostmi (t.j. nízke stupne voľnosti)?

N <- c(10, 50, 100, 200, 500, 1000, 2000, 5000)
tdf <- c(2, 5, 10, 50)
set.seed(1234)

PWR <- list()
for (d in 1:length(tdf)){
  power <- NULL
for (n in N){
  p1 <- p2 <- p3 <- NULL
for (i in 1:100){
  x <- rt(n, df = tdf[d])
  p1 <- c(p1, as.numeric(ks.test(x,"pnorm",mean=mean(x),sd=sd(x),exact=FALSE)$p.value < 0.05))
  p2 <- c(p2, as.numeric(shapiro.test(x)$p.value < 0.05))
  p3 <- c(p3, as.numeric(jarque.bera.test(x)$p.value < 0.05))
}
power <- rbind(power, c(n, mean(p1), mean(p2), mean(p3)))
}
PWR[[d]] <- power
}

par(mfrow = c(2,2))
for (d in 1:length(tdf)){
  power <- PWR[[d]]
  plot(power[,4] ~ log10(power[,1]), col = "red", type = "l", pch = 21, bg = "red", xlab = "Logarimus rozsahu náhodného výberu", ylab = "Empirická síla   testu", main = paste("t rozdelenie (df = ", tdf[d],")", sep = ""), ylim = c(0,1))
  points(power[,4] ~ log10(power[,1]), pch = 21, bg = "red")
  points(power[,3] ~ log10(power[,1]), pch = 21, bg = "blue")
  points(power[,2] ~ log10(power[,1]), pch = 21, bg = "green")
  
  lines(power[,3] ~ log10(power[,1]), col = "blue")
  lines(power[,2] ~ log10(power[,1]), col = "green")
  abline(1,0, col = "black", lty = 3)
  
  legend(1, 1, legend = c("Shapiro-Wilk test", "Jarque-Beta test", "Kolmogorov-Smirnov test"), col = c("blue", "red", "green"), lty= rep(1,3), cex = 0.5)
}

Pri danej alternatíve - studentovo \(t\) rozdelenie s 5 stupňami voľnosti sa zdá, že najsilnejším testom je Jarque-Bera test.



Samostatne


  • Dokážete vysvetliť sledovane správanie sa síly jednotlivých testov?
  • Navrhnite podobnú simulačnú štúdiu pre iné alternatívy a pre iné testy.
  • Ako by to vyzera v prípade simulačnej štúdie, ktorej cieľom by bolo porovnávať dosiahnutú hladinu?



N <- c(10, 50, 100, 200, 500, 1000, 2000, 5000)

set.seed(1234)
power <- NULL
for (n in N){
  p1 <- p2 <- p3 <- NULL
for (i in 1:100){
  x <- rnorm(n)
  p1 <- c(p1, as.numeric(ks.test(x,"pnorm",mean=0,sd=1,exact=FALSE)$p.value < 0.05))
  p2 <- c(p2, as.numeric(shapiro.test(x)$p.value < 0.05))
  p3 <- c(p3, as.numeric(jarque.bera.test(x)$p.value < 0.05))
}
power <- rbind(power, c(n, mean(p1), mean(p2), mean(p3)))
}


par(mfrow = c(1,1))
  plot(power[,4] ~ log10(power[,1]), col = "red", type = "l", pch = 21, bg = "red", xlab = "Logarimus rozsahu náhodného výberu", ylab = "Dosiahnutá hladina testu", main = "", ylim = c(0,0.4))
  points(power[,4] ~ log10(power[,1]), pch = 21, bg = "red")
  points(power[,3] ~ log10(power[,1]), pch = 21, bg = "blue")
  points(power[,2] ~ log10(power[,1]), pch = 21, bg = "green")
  
  lines(power[,3] ~ log10(power[,1]), col = "blue")
  lines(power[,2] ~ log10(power[,1]), col = "green")
  abline(0.05,0, col = "black", lty = 2, lwd =2)
  
  legend(1, 0.4, legend = c("Shapiro-Wilk test", "Jarque-Beta test", "Kolmogorov-Smirnov test"), col = c("blue", "red", "green"), lty= rep(1,3))



3. R-ková knižnica ‘shiny’

Shiny je (open source) knižnica pre štatistický program R (inštalácia pomocou štandardného príkazu install.packages("shiny")), ktorá umožňuje vytvárať hyperaktívne webové aplikácie, pomocou ktorých dokáže koncový úžívateľ jednoducho meniť nastavenia a kontrolovať pribeh výpočtu/analýzy nejakého konkrétneho procesu (napr. štatistickej analýzy datového súboru).

Knižnica shiny umožňuje jednoducho premeňiť R-kový zdrojový kód na interaktívnu webovú aplikáciu (vyžaduje k tomu ale tzv. shiny server, ktorý beží na hosťovskom počítači spolu s programom R a umožňuje tak webovej aplikácii na klientskom počítači plnohodnotne fungovať - vyhodnocovať R-kové príkazy v závislosti na klientských modifikáciach, ktoré uskutočnuje priamo vo svojom internetovom prehliadači).

Inšpirácia a niekoľko príkladov vytvorených pomocou knižnice shine: http://shiny.rstudio.com/gallery/

Pre účely tohto cvičenia nebude potrebne inštalovať shine server na hosťovskom počítači. Niekoľko príkladov si ukážeme pouze lokálne a ako hosťovský server nám bude slúžiť priamo počítač, ktorý ma každý k dispozícii a na ktorom pracuje.

K vytvoreniu funkčnej shine aplikácie je potrebných niekoľko krokov:

  • nainštalovať a načítať knižnicu shine:

    library("shiny")
  • vytvoriť (HTML) stránku pomocou R-kového príkazu fluidPage(), ktorá bude slúžiť ako vstupná informácia pre program R - pomocou tejto stránky užívateľ kontroluje aplikáciu a modifikuje výpočty/analýzy;
  • naprogramovať príslušný R-kový kód, ktorý beží na shiny serveri a ktorý pracuje so vstupnými informáciami a po spracovaní a vyhodnotení R-kového zdrojového kódu pripraví príslušny výstup (ktorý sa uživateľovy zobrazí priamo na webovej stránke);
  • spustit samotnú shiny aplikáciu pomocou príkazu shinyApp();

Najjednoduchší príklad funkčnej shiny aplikácie (ktorá ale v zásade nič nerobí), je vytvorená pomocou nasledujúcej časti R-kového kódu:

library("shiny")

ui <- fluidPage("Hello Word"
   ### su za zadavaju vstupne informacie (inputs) a zobrazuju sa vystupy (outputs)
)

server <- function(input, output){
  ### R-kovy zdrojovy kod, ktory vyuziva list input (vstupne informacie) a vytvara z toho list vystupov (output)
}

### spustenie samotnej aplikacie (otvori webovy prehliadac s pozadovanou strankov vytvorenou vo fluidPage())
shinyApp(ui = ui, server = server) 



Doležité


Pri spustení R-kového kódu uvedeného vyššie, dôjde k otvoreniu webového prehliadača, v ktorom sa otvorí prázdna stránka s uvítaním “Hello World”. Príkazový riadok v R-ku (konzola v RStudio) zostáva aktívna a nie je možné zadavať prostredníctvom konzoly dalšie príkazy. R-ko očakáva, že príkazy bude dostavať prostredníctvom otvoreného a aktivného webového prehliadača. Keďže nateraz nemáme v prehliadači nič vytvorené (príkaz fluidPage() je prázdny), musíme R-ko ukončiť manuálne, buď kliknutím na tlačítko STOP, alebo stlačením kombinácie kláves CTRL + C.



Všetky hodnoty, ktoré potrebujeme R-ku predať ako vstupné hodnoty, sú automaticky uložené v liste (R object) s názvom input a na jednotlivé zložky listu sa odkazujeme pomocou ID nálepky pri vstupe. Analogicky, všetky výstupy, ktoré server pripraví, aby boli dostupné prostredníctvom klientskej webovej stránky, sa ukladajú do listu (R object) s názvom output a na jednotlivé zložky sa opať odkazujeme pomocou príslušných ID nálepiek.

Nasledujúci príklad umožnuje vykresliť histogram pre náhodný výber z normálneho rozdelenia \(N(\mu, \sigma^2)\) o rozsahu \(n \in \mathbb{N}\), kde všetky tri parametre (\(\mu\), \(\sigma^2 > 0\) aj \(n \in \mathbb{N}\)) môže nastaviť užívateľ prostredníctvom webového prehliadača.
Histogram a odhad hustoty sa interaktvívne vykreslí priamo v prehliadači, hneď po zadaní vstupných hodnot.

library("shiny")

ui <- fluidPage(
  
  title = "Simple Example",
  
  sidebarPanel(
    sliderInput(inputId = "mean", label = "Choose Mean Value", min = -100, max = 100, value = 0),
    sliderInput(inputId = "var", label = "Choose Variance Value", min = 0, max = 10, value = 1),
    numericInput("number", label = "Number of Observations", value = 10),
    numericInput("breaks", label = "Number of Breaks", value = 10)
  ),
  
  mainPanel(
    plotOutput(outputId = "density")
  )
)

server <- function(input, output){
  output$density <- renderPlot({sample <- rnorm(input$number, input$mean, sqrt(input$var))
                                hist(sample, breaks = input$breaks, col = "blue", freq = F)
                                lines(density(sample), col = "red", lwd = 2)
                                })
}

shinyApp(ui = ui, server = server)



Ak ste príkazy zadali správne, vo webovom prehliadači by ste mali vidieť niečo podobné:

Pomocou nástrojov na zadávanie vstupných hodnôt na ľavej strane je možné modifikovať nastavenie generátoru náhodných čísel, na základe čoho sa vygeneruje nový/iný náhodný výber a príslušne sa prekresli histogram a odhad hustoty.

Príkazový riadok v RStudio zostáva naďalej aktívny a nie je možné zadavať nové príkazy - program R totiž očakáva vstupné hodnoty, ktoré budu zadané prostredníctvom nástrojov na webovej stránke. V prípade, že chceme R sekciu ukončiť, je nutné stlačiť tlačítko STOP alebo kombináciu kláves CTRL + C.

Doležité


Všimnite si, akým sposobom funguje zadávanie vstupných hodnot a akým spôsobom sú tieto hodnotý predané programu R na sever.
  • v knižnici shiny je niekoľko rôzných nástrojov na zadávanie vstupných hodnôt - viď napr. http://shiny.rstudio.com/tutorial/lesson3/
  • každý príkaz, ktorý umožnuje zadávať vstupné hodnoty, musí mať priradené jednoznačné ID - pozri prvý argument v príkazoch vyššie. S týmto ID je potom vstupná hodnota predaná v liste input do R-ka: napr. vstupná hodnota pre voľbu strednej hodnoty je uložena v input$mean;
  • fiktívny server - v našom prípade užívateľský počítač - využíva hodnoty uložené v liste input a v sérii R-kových príkazov pripraví príslušný výstup/výstupy, ktoré analogicky uloži do listu output.
  • v druhej časti príkazu fluidPage() umiestňujeme na webovú stránku pripravené výstupy, ktoré predal server po spracovaní R-kom.
  • analogicky ako v prípade zadávania vstupných hodnôt, aj pre vykresľovanie výstupov je v knižnici shiny k dispozícii niekoľko užitočných nástrojov - viď napr. http://shiny.rstudio.com/tutorial/lesson4/;



Samostatne


Všimnite si, akým sposobom funguje zadávanie vstupných hodnot a akým spôsobom sú tieto hodnotý predané programu R na sever.
  • Využijte ďalšie možnosti, ktoré ponúka knižnica shine a pokuste sa vytvorit interaktívnu aplikáciu, pomocou ktorej budete analyzovať nejaky datový súbor, ktorý je k dispozícii v programe R, avšak analýza bude závisieť na uživateľských nastaveniach (napr. výber premenných, voľba podsúboru dat, voľba hladiny spoľahlivosti a pod.).
  • Pokuste sa využiť rôzne možnosti zadávania vstupných informácii a tiež rôzne možnosti prezentovania výstupu.
  • Využijte rôzne varianty k peknému a účelnému usporiadaniu nástrojov na zadávanie vstupných informacii a panelov na vykresľovanie spočítaných výstupov.
  • Komplexnejšia ukážka s využitim viacerých panelov pre rôzne varianty výstupov je napr. nižšie:

    library("shiny")
    
    ui <- fluidPage(
      
      title = "Simple Example",
      
      sidebarPanel(
        sliderInput(inputId = "mean", label = "Choose Mean Value", min = -100, max = 100, value = 0),
        sliderInput(inputId = "var", label = "Choose Variance Value", min = 0, max = 10, value = 1),
        numericInput("number", label = "Number of Observations", value = 10),
        numericInput("breaks", label = "Number of Breaks", value = 10)
      ),
      
      mainPanel(
        tabsetPanel(
          tabPanel("Plot",  plotOutput(outputId = "density")), 
          tabPanel("Summary", verbatimTextOutput("summary")),
          tabPanel("Regression", plotOutput(outputId = "regression")),
          tabPanel("Regression Summary", verbatimTextOutput("regsum"))
        )
      )
    )
    
    server <- function(input, output){
      
      output$density <- renderPlot({set.seed(1234)
                                    data <- data.frame(1:input$number, rnorm(input$number, input$mean, sqrt(input$var)))
                                    hist(data[,2], breaks = input$breaks, col = "blue", freq = F)
                                    lines(density(data[,2]), col = "red", lwd = 2)
                                    })
      
      output$summary <- renderPrint({set.seed(1234)
                                     data <- data.frame(1:input$number, rnorm(input$number, input$mean, sqrt(input$var)))
                                     summary(data[,2])})
      
      output$regression <- renderPlot({set.seed(1234)
                                       data <- data.frame(1:input$number, rnorm(input$number, input$mean, sqrt(input$var)))
                                       plot(data[,2] ~ data[,1])
                                       model <- lm(data[,2] ~ data[,1], data = data, xlab = "Observation Number", ylab = "Observation Value")
                                       abline(model$coeff[1], model$coeff[2], col = "red", lwd = 2)})
      
      output$regsum <- renderPrint({set.seed(1234)
                                    data <- data.frame(1:input$number, rnorm(input$number, input$mean, sqrt(input$var)))
                                    plot(data[,2] ~ data[,1])
                                    model <- lm(data[,2] ~ data[,1], data = data, xlab = "Observation Number", ylab = "Observation Value")
                                    summary(model)})
    }
    
    shinyApp(ui = ui, server = server)
  • Vyskúšajte, čo výššie uvedený skript robí a pokuste sa ho podľa vlastných nápadov vhodne modifikovať. Vygenerovaná webová stránka by mala vyzerať podobne:




Domáca úloha

(Deadline: 6. cvičenie | St: 18.12.2019)

  • Vytvorte jednoduchú simulačnú štúdiu - napr. pre zistenie skutočného pokrytia intervalu spolahlivosti, skutočnej dodržanej hladiny testu, síly testu, konzistencie nejakého konkrétneho odhadu a podobne.
  • Vytvorte tabulku s hlavnými výsledkami simulácie a simulácie doplňte o vhodný obrázok, ktorý bude výsledky ilustrovať.
  • Tabulku spolu s vytvoreným obrázkom doplňte do Váško zápočtového PDF súboru.