Быстрый способ построить и сравнить две функции плотности.

Введение

Я студент факультета статистики, поэтому обычно работаю с вероятностными распределениями (по Гауссу, хи-квадрат и т. д.). Мне кажется весьма полезным визуализировать распределение, когда я работаю над проблемой вероятности, но я не смог найти интерактивное приложение для этой цели.

В последние несколько недель я начал изучать Shiny, пакет R, который позволяет пользователям легко создавать интерактивные веб-приложения. Только с основами, я сделал это.

ПРИМЕЧАНИЕ. Я не утверждаю, что это самый эффективный способ достижения цели. Я всего лишь хочу показать вам, на что способен Shiny, написав всего несколько строк кода. Вы можете найти все приложение здесь: https://github.com/pablovidal00/Probability-graphicator.git

Создание приложения

Каждое приложение Shiny состоит из двух компонентов: пользовательский интерфейс и сервер.

  • Пользовательский интерфейс заботится о том, как выглядит ваше приложение и как вы можете с ним взаимодействовать.
  • Сервер обрабатывает внутренние вычисления, необходимые для отображения того, что вы запросили.

UI

Во-первых, нам нужно создать страницу и попросить пользователя выбрать дистрибутив с помощью fluidPage и selectInput:

Этот код делает следующее: создает страницу, создает строку, контролирует, сколько места мы занимаем с помощью column (в данном случае мы используем 2), и, наконец, предлагает пользователю выбрать вариант. Переменная ‘ dist ’ будет хранить опцию. С помощью списков разделяются непрерывные и дискретные распределения.

Теперь нам нужно запросить значения параметров. Мы сталкиваемся с проблемой: они зависят от выбранного дистрибутива. К счастью, conditionalPanel позволяет нам контролировать то, что мы отображаем, на основе условия, выраженного на языке JavaScript.

Здесь мы создаем новый столбец, который отображает numericInput только в том случае, если выбрано нормальное распределение. Мы сохраняем среднее значение и стандартное отклонение в переменных, называемых «среднее» и «sd», мы присваиваем им начальное значение. В случае стандартного отклонения мы гарантируем только положительные значения, устанавливающие минимум. Мы должны сделать столько conditionalPanel, сколько дистрибутивов у нас есть.
При этом приложение уже делает половину своей работы! К настоящему времени это выглядит так:

Последним компонентом пользовательского интерфейса является сюжет. В моем приложении я хочу, чтобы он располагался под входами, поэтому я создаю новый файл fluidRow.

Это говорит приложению отобразить график с именем «график», который будет создан на сервере. Теперь пользовательский интерфейс закончен.

Если кто-то хочет построить два распределения, ему следует создать новые столбцы, скопировать и вставить код, запрашивающий распределение и параметры, и добавить новый график. Имена переменных должны быть разными («dist2», «mean2» и т. д.).

Сервер

Сервер принимает три аргумента: input, output и session. Первый ведет себя как список со всеми переменными, созданными в пользовательском интерфейсе, а второй будет списком того, что делает сервер. Например, «input$mean» — это значение, выбранное для параметра «mean», а «output$plot» — это график, который отображает пользовательский интерфейс.

Одно из различий между стандартным R и Shiny заключается в том, что мы можем кодировать только так, как обычно делаем в функции рендеринга. render заботится о построении объекта, который получает пользовательский интерфейс, такого как график, текст и т. д. Итак, как мы можем вызывать переменные, предоставленные пользователем? Ответ reactive . Он говорит Shiny обновлять переменную и везде, где она вызывается, каждый раз, когда пользователь изменяет ее.

Например, «mean» здесь будет меняться каждый раз, когда пользователь изменяет параметр «input$mean». Важно различать их обоих, так как один находится в пользовательском интерфейсе, а другой — на сервере. Для каждого возможного параметра распределения у нас должна быть реактивная переменная. Теперь мы готовы построить сюжет.

Давайте посмотрим на это внимательно

  • «inf» и «max» — это пределы последовательности точек. Шести стандартных отклонений кажется достаточно, чтобы визуализировать распределение.
  • «точки», которые передаются в качестве аргумента функции dnorm, которая возвращает плотность вектора точек.
  • «Плотность» — это то, что будет отображаться по оси Y, а «точки» — по оси X.
  • «yl» — это предел по оси Y, который объявляется с помощью оператора <<-, поэтому его можно использовать в качестве параметра на втором графике для сравнения двух распределений в одном масштабе.
  • Аргументы в plot просто указывают тип (линию), цвет, заголовок оси x, заголовок графика и предел оси y.
  • abline добавляет вертикальную линию в среднее значение распределения.

Как и в других частях приложения, это только для нормального распределения. Чтобы расширить его, просто добавьте любые дистрибутивы, которые вам нравятся, в командах switch и укажите значения, которые они должны принимать.

Результат

Добавляем код, необходимый для второй раздачи, вот как это выглядит.

Выводы

Это приложение могло бы быть намного сложнее, но суть заключалась в том, чтобы представить проект, удобный для начинающих. Вы можете попробовать оптимизировать вычисления, изменить макет приложения или даже использовать ggplot2 для построения графика.