--- 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") } })) ```