---
title: "Statistical distributions"
runtime: shiny
output: html_document
layout: raw
---

```{r, echo=FALSE}
fluidRow(
column(2,
  ## panel selection
  radioButtons(
      "distr", "Distribution",
      c(Bernoulli = "Bernoulli",
        Binomial = "Binomial",
        Poisson = "Poisson",
        Normal = "Normal",
        Lognormal = "Lognormal",
        Uniform = "Uniform",
        Beta = "Beta",
        Gamma = "Gamma"))),
column(5,
  ## these are shown for all panels
  sliderInput("n", label = "Sample size",
              min = 10, max = 1000, value = 100, step = 10),
  sliderInput("seed", label = "Random seed",
              min = 0, max = 100, value = 0, step = 10)),
column(5,
  ## Bernoulli
  conditionalPanel(
    condition = "input.distr == 'Bernoulli'",
      sliderInput("p", label = "Probability",
              min = 0, max = 1, value = 0.3, step = 0.05)),
  ## Binomial
  conditionalPanel(
    condition = "input.distr == 'Binomial'",
      sliderInput("p", label = "Probability",
              min = 0, max = 1, value = 0.3, step = 0.05),
      sliderInput("size", label = "Size",
              min = 1, max = 1000, value = 10, step = 50)),
  ## Poisson
  conditionalPanel(
    condition = "input.distr == 'Poisson'",
      sliderInput("lambda", label = "Mean/Rate",
              min = 0, max = 100, value = 5, step = 5)),
  ## Normal
  conditionalPanel(
    condition = "input.distr == 'Normal'",
      sliderInput("mu", label = "Mean",
              min = -10, max = 10, value = 0, step = 1),
      sliderInput("var", label = "Variance",
              min = 0.001, max = 10, value = 1, step = 0.5)),
  ## Logormal
  conditionalPanel(
    condition = "input.distr == 'Lognormal'",
      sliderInput("mu", label = "Mean",
              min = -10, max = 10, value = -1, step = 1),
      sliderInput("var", label = "Variance",
              min = -10, max = 10, value = 1, step = 1)),
  ## Uniform
  conditionalPanel(
    condition = "input.distr == 'Uniform'",
      sliderInput("a", label = "Minimum",
              min = -10, max = 10, value = -1, step = 0.5),
      sliderInput("b", label = "Maximum",
              min = -10, max = 10, value = 1, step = 0.5)),
  ## Beta
  conditionalPanel(
    condition = "input.distr == 'Beta'",
      sliderInput("shape1", label = "Shape 2",
              min = 0, max = 10, value = 1, step = 0.5),
      sliderInput("shape2", label = "Shape 1",
              min = 0, max = 10, value = 1, step = 0.5)),
  ## Gamma
  conditionalPanel(
    condition = "input.distr == 'Gamma'",
      sliderInput("shape", label = "Shape",
              min = 0.001, max = 10, value = 1, step = 0.5),
      sliderInput("rate", label = "Rate",
              min = 0.001, max = 10, value = 1, step = 0.5))))
fluidRow(renderPlot({
    par(las = 1)
    set.seed(input$seed)
    if (input$distr == "Uniform" && input$b < input$a)
        stop("Maximum must be greater than Minimum")
    y <- switch(input$distr,
        "Bernoulli" = rbinom(1000, 1, input$p),
        "Binomial" = rbinom(1000, input$size, input$p),
        "Poisson" = rpois(1000, input$lambda),
        "Normal" = rnorm(1000, input$mu, sqrt(input$var)),
        "Lognormal" = rlnorm(1000, input$mu, sqrt(input$var)),
        "Uniform" = runif(1000, input$a, input$b),
        "Beta" = rbeta(1000, input$shape1, input$shape2),
        "Gamma" = rgamma(1000, input$shape, input$rate))
    #plot(pt, L, type = "l", col="#3498db",
    #    ylab = "Likelihood", xlab="p",
    #    sub=paste0("Mean = ", round(mean(y[1:input$n]), 2), " (", 
    #        sum(1-y[1:input$n]), " 0s & ", sum(y[1:input$n]), " 1s)"),
    #    main = paste("Estimate =", round(pt[which.max(L)], 2)))
    #abline(v = input$p, lwd = 2, col = "#c7254e")
    #abline(v = pt[which.max(L)], lwd = 2, col = "#18bc9c")
    yy <- y[1:input$n]
    x <- switch(input$distr,
        "Bernoulli" = c(0,1),
        "Binomial" = seq(0, max(yy)+1, by = 1),
        "Poisson" = seq(0, max(yy)+1, by = 1),
        "Normal" = seq(min(yy)-1, max(yy)+1, length.out = 1000),
        "Lognormal" = seq(0.0001, max(yy)+1, length.out = 1000),
        "Uniform" = seq(input$a+0.0001, input$b-0.0001, length.out = 1000),
        "Beta" = seq(0.0001, 0.9999, length.out = 1000),
        "Gamma" = seq(0.0001, max(yy), length.out = 1000))
    d <- switch(input$distr,
        "Bernoulli" = dbinom(x, 1, input$p),
        "Binomial" = dbinom(x, input$size, input$p),
        "Poisson" = dpois(x, input$lambda),
        "Normal" = dnorm(x, input$mu, sqrt(input$var)),
        "Lognormal" = dlnorm(x, input$mu, sqrt(input$var)),
        "Uniform" = dunif(x, input$a, input$b),
        "Beta" = dbeta(x, input$shape1, input$shape2),
        "Gamma" = dgamma(x, input$shape, input$rate))
    xlab <- "x"
    ylab <- "Density"
    main <- paste0(input$distr, " distribution (n = ", input$n, ")")
    if (input$distr %in% c("Bernoulli", "Binomial", "Poisson")) {
        tmp <- table(yy) / input$n
        plot(tmp, ylim=c(0, max(tmp, d)), 
            ylab = ylab, xlab = xlab, main = main,
            col = "#cccccc", lwd = 10)
        points(x, d, pch = 21, col = "#c7254e", type = "b", 
            lty = 2, cex = 2)        
    } else {
        tmp <- hist(yy, plot = FALSE)
        hist(yy, freq = FALSE, ylim=c(0, max(tmp$density, d)), 
            ylab = ylab, xlab = xlab, main = main,
            col = "#ecf0f1", border = "#cccccc")
        lines(x, d, lwd = 2, col = "#c7254e")
    }
}))
```
