Matériel pédagogique

Ces diapositives et les fichiers nécessaires pour les exercices sont distribués séparément dans une archive laboratoire-shiny.zip.

Téléchargez le matériel pédagogique depuis le site du projet «Rapports dynamiques avec Shiny» dans GitHub.

Présentation générale

Ce que c'est

Shiny est une technologie créée par RStudio pour créer des applications web interactives (apps) directement dans R.

Préalables pour exécuter des applications

  • Installer le paquetage shiny (si ce n'est pas déjà fait)
install.packages("shiny")
  • Charger le paquetage dans la session R
library(shiny)

Exercice

Le paquetage shiny est livré avec quelques exemples d'applications que vous pouvez exécuter localement.

  • Exécuter l'exemple 01_hello et analyser le code de l'application
runExample("01_hello")
  • Interrompre l'application 01_hello

  • Exécuter l'exemple 04_mpg et analyser le code de l'application

runExample("04_mpg")
  • Interrompre l'application 04_mpg

Présentation de notre projet

Calcul interactif de l'Expected Shortfall

La mesure de risque Expected Shortfall est équivalente à la prime stop-loss évaluée à la Value at Risk: \[ \begin{aligned} \text{ES}_\alpha(S) &= E[(S - \text{VaR}_\alpha(S))_+] \\ &= \int_{\text{VaR}_\alpha(S)}^\infty (x - \text{VaR}_\alpha(S)) f_S(x)\, dx \\ &= \int_{\text{VaR}_\alpha(S)}^\infty (1 - F_S(x))\, dx. \end{aligned} \]

Nous allons:

  • simuler un échantillon d'une distribution Poisson composée
  • calculer empiriquement \(\text{VaR}_\alpha\) et \(\text{ES}_\alpha\)
  • représenter la région sur la fonction de répartition empirique.

Exercice

Exécuter l'application shortfall livrée avec le matériel pédagogique.

  • Extraire les fichiers de laboratoire-shiny.zip dans un répertoire quelconque

  • Faire de ce répertoire le répertoire de travail de R

  • Démarrer l'application

runApp("shortfall")

Création du graphique (sommaire)

  • Fonction ecdf retourne une fonction pour évaluer la fonction de répartition empirique d'un échantillon

  • Méthode de plot pour tracer la fonction

  • Déterminer les points d'un polygone à remplir

  • Remplir le polygone avec polygon

Création du graphique (étape 1)

Fn <- ecdf(x)
plot(Fn, verticals = TRUE, do.points = FALSE)

Création du graphique (étape 2)

  • Calcul de la VaR
VaR <- quantile(x, 0.9, type = 1)
  • Nœuds de la fonction de répartition
k <- knots(Fn)
  • Sommets du polygone
xx <- rep(c(VaR, k[k > VaR]), each = 2)

Création du graphique (étape 2.5)

plot(Fn, verticals = TRUE, do.points = FALSE)
points(xx, c(1, Fn(head(xx, -1))), pch = 19)

Création du graphique (étape 3)

plot(Fn, verticals = TRUE, do.points = FALSE)
polygon(xx, c(1, Fn(head(xx, -1))), col = "lightskyblue")

Programmation Shiny 101

Structure de fichiers d'une application

Shiny exige une structure de fichiers bien précise pour les applications.

  • Pour une application nommée foobar
    • répertoire foobar
    • code de l'application dans fichier app.R
        mon projet
             |__ foobar
                  |__ app.R
  • Micro-exercice: identifiez l'application shortfall livrée avec le matériel pédagogique

Structure du code d'une application

Le fichier app.R contient au minimum trois éléments.

  1. Création d'un objet ui avec la fonction fluidPage pour décrire l'interface de l'application
    • crée des éléments d'un objet input (implicite)
    • utilise éléments d'un objet output (implicite)
  2. Création d'une fonction server pour effectuer le traitement
    • arguments input et output
    • utilise éléments de l'objet input
    • place contenu dans objet output
  3. Appel à la fonction shinyApp pour construire l'application
    • arguments ui et server

Exercice

Exécuter de nouveau l'exemple 01_hello et examiner son code source.

  • Paquetages chargés au tout début

  • Identifier la création de l'objet ui avec la fonction fluidPage
    • tous les éléments de contenu sont des arguments de la fonction
    • fonction sidebarLayout définit le contenu du panneau latéral et du panneau principal
  • Identifier la création de la fonction server

  • Identifier l'appel à shinyApp

Construction d'une application
pas à pas

1. Entrée et sortie

Contrôles d'entrée de paramètres (widgets)

Exemple de syntaxe


sliderInput(inputId = "lambda",
            label = "Paramètre de Poisson",
            value = 2,
            min = 0,
            max = 20,
            step = 0.1)

Fonctions d'affichage dans l'interface

Exemple de syntaxe


textOutput(outputId = "valeur_lambda")

Fonctions de traitement dynamique (rendering)

Ces fonctions sont utilisées dans la fonction server pour ajouter des éléments à l'objet output.

  • renderPlot: graphiques
  • renderText: chaines de caractères

Liste complète des fonctions

Exemple de syntaxe

Les fonctions render* prennent en argument une expression R.

output$valeur_lambda <- renderText({
    paste("Valeur du paramètre:", input$lambda)
})

Exercice

Compléter le code de l'application exercice-widgets pour obtenir le résultat ci-dessous.

2. Recalcul des valeurs

Sources et destinations réactives (reactive)

Modèle de base que nous avons utilisé précédemment.

  • Source via l'objet input

  • Destination via l'objet output

Éviter les calculs inutiles

Notre application requiert de simuler un échantillon aléatoire.

  • À recommencer lorsque paramètres de la simulation changent
    • modèle de simulation
    • nombre de simulations
  • Ne pas recommencer lorsque les paramètres de la simulation de changent pas
    • niveau de la VaR
    • paramètres du graphique (pas mis en œuvre)
  • Besoin de quelque chose entre la source et la destination réactive

Expression réactive

Une expression réactive est à la fois une destination et une source réactive.

  • Effectue un calcul lorsqu'une source change

  • Fournit son résultat à répétition à des destinations

  • Résultat gardé en mémoire

Exemple de syntaxe

Expression réactive créée avec reactive.

Valeur obtenue par un appel de fonction.

data <- reactive({
    rcomppois(input$n, input$lambda, rgamma(2, 0.002))
})

output$VaR <- renderText({
    paste("Valeur de la VaR:",
          quantile(data(), as.numeric(input$alpha), type = 1))
})

Exercice

Compléter le code de l'application exercice-reactive.