El paquete shiny permite construir aplicaciones web interactivas (apps) directamente desde R. En esta sesión revisaremos los componentes de la aplicación con un ejemplo sencillo sobre el cálculo del tamaño de la muestra.
El material conceptual esta basado en las lecciones 1 a 4 del tutorial de shiny de Rstudio. Se recomienda también descargar la hoja de referencia del paquete shiny aquí.
La siguiente figura presenta un ejemplo de una apliación shiny que ayuda a calcular el tamaño de la muestra para estimar la media de la población:
Figure 1: Ejemplo de aplicación Shiny
En este ejemplo, el tamaño de la muestra (\(n\)) cambia de acuerdo a tres cantidades relacionados de la siguiente forma:
\[n = \left(\dfrac{z_{1-\alpha/2} \times cv}{er}\right)^2\] donde:
\(z_{1-\alpha/2}\) es el cuantil \(1-\alpha/2\) de la distribución normal estándar. Esta cantidad depende de la confianza que el usuario desee. La confianza es \(1-\alpha\). La aplicación deja fija la confianza en 0.95, de modo que el cuantil utilizado es \(z_{0.975}\).
\(cv\) es el coeficiente de variación de la variable bajo estudio. Este valor lo debe entrar el usuario. En la fórmula debe estar como una fracción aunque el usuario lo entra como porcentaje.
\(er\) es el margen de error relativo con respecto al tamaño de la media. Esto es la mitad de la amplitud del intervalo de confianza. La aplicación deja fija o constante este margen de error en 2%. Es decir, 0.02 en la fórmula.
Así la aplicación provee una casilla para que el usuario ingrese el \(cv\) (en porcentaje) y la aplicación actualiza el tamaño de la muestra en consecuencia.
Una aplicación Shiny tiene tres componentes:
Un objeto que define la disposición de información y espacios en la interface de usuario (ui).
Una función server que contiene el código R que realiza el “trabajo pesado” (cálculos).
Usar la función shinyApp para ejecutar la aplicación. Esta función junta el objeto ui y la función server para montar la aplicación.
Los tres componentes deben ir en un archivo script (.R) llamado app.R. Este archivo script tiene entonces la siguiente plantilla:
library(shiny)
# Objeto UI ----
ui <- ...
# Funcion server ----
server <- ...
# Llamado a shinyApp ----
shinyApp(ui = ui, server = server)
El objeto ui define la interface de usuario y los objetos que se mostraran en cada espacio. Un comando frecuente con el cual se crea el objeto ui es fluidPage. Dentro del comando fluidPage deben ubicarse, principalmente, dos tipos de objetos:
Objetos creado por los comandos del tipo nnnnInput (p.e.: numericInput, sliderInput, selectInput, etc.) que crean un widget para que el usuario entre o defina información para la aplicación. Revise este tipo de comandos aquí.
Objetos creados por comandos del tipo nnnnOutput (p.e.: tableOutput, plotOutput, imageOutput, etc.) que permiten establecer el tipo de resultado que se mostrará. Revise este tipo de comandos aquí.
Dentro del comando fluidPage se pueden poner otros objetos más estéticos tales como el título de la aplicación, texto libre para agregar explicaciones, etc. El contenido del objeto ui para la aplicación del cálculo del tamaño de la muestra es:
# Objeto UI -----
ui <- fluidPage(
# Titulo
titlePanel("Cálculo del tamaño de la muestra"),
# Un parrafo
p("Aplicación para calcular el tamaño de la muestra para estimar la media de la poblacion con una confianza del 95% y un margen de error del 2%. Sólo debe definir el coeficiente de variación de la variable bajo estudio"),
br(), # salto de linea
# Input: Entrada numerica del CV
numericInput(inputId = "cv",
label = "Coeficiente de variación (%)",
min = 0,
max = 500, step = 5,
value = 20),
br(),
br(),
# Titulo para la tabla de resultados
h2("Resultados"),
# Se definen el tipo de resultado con un id
tableOutput(outputId = "tablaRes")
)
La función server contiene el código R que recibe los datos ingresados por el usuario desde los “inputs” y los transforma para producir un objeto o gráfico resultante.
La función server debe incorporar los comandos del tipo renderNnnn (p.e., renderPlot, renderTable, renderText, etc.). Revise este tipo de comandos aquí. Los comandos tipo renderNnnn son correspondientes con los del tipo nnnnOutput ubicados en el objeto ui. P.e., el comando de salida tableOutput se corresponde con el comando renderTable.
La función server para la aplicación del cálculo del tamaño de la muestra es:
# Funcion server -----
server <- function(input, output){
output$tablaRes <- renderTable(
align = "c", digits = 1, bordered = T,
expr = {
# Parametros
conf <- 0.95
z <- qnorm(p = 1-(1-conf)/2)
er <- 0.02
cv <- input$cv/100
# Calculo de n
n <- (z * cv / er)^2
n <- ifelse(cv == 0, 1, n)
# Data.frame resultante:
tibble(
"Confianza (%)" = round(conf*100),
"Error relativo (%)" = round(er*100,1),
"Coef.de variación (%)" = cv*100,
"Tamaño de muestra (n)" = ceiling(n)
)
})
}
El tercer componente del código con la aplicación shiny es una llamada al comando shinyApp el cual junta el objeto ui con la función server:
# Llamada al comando shinyApp ----
shinyApp(ui = ui, server = server)
Para ejecutar la aplicación , presione el botón Run App de la parte superior derecha de la ventana del script de Rstudio como se muestra en la imagen siguiente:
Figure 2: Mostrando la ubicación del botón Run App
Modifique el código de la aplicación sobre el tamaño de muestra para agregarle dos nnnnInput adicionales que le permitan al usuario entrar la confianza y el margen de error relativo.