確率分布を学ぶアプリを、shinydashboard を使って新しくしてみた & 英訳していただきました。

昨日は花粉がひどいのでShinyで遊んでいました。 一瞬窓を開けただけでハナが出たのでもう外出られません。 でもいいんです。ぼくにはShinyがありました。

shinydashboard で綺麗なShiny

以前Shinyで作成した、 確率分布を学ぶアプリ を、 shinydashboard を使って デザインやUIを一新しました!

いろいろな確率分布のパラメータをいじくるアプリ

以前のデザインより見やすく、綺麗になったと思います! shinydashboard は綺麗なデザインもさることながら、 使い方も簡単だったのでとても便利ですね。 配色のセンスが無いので青一色にしたのがぼくの残念さを物語っています。 他の人ならもっとオシャレにできると思います。

ただデザインを変えるだけなのもつまらないので、 確率分布の期待値や分散 を表示するように変更しました! 確率分布のパラメータを変更すると、きちんと期待値と分散の値も変化します。

値を表示している青色の領域は、valueBoxというshinydashboardの機能です。 カラーも多く用意されているし、アイコンも載せられるのでパッと見オシャレですね。 アイコンはなんとFont-AwesomeGlyphicons が使用可能です。ほんとオーサムですね。 ただ、豊富に用意されすぎていて、期待値と分散にどんなアイコンを使えばよいかわからなくなりました...。 とりあえず、期待値は大事な統計量なので☆マークに、分散はばらつきっぽく↔矢印マークにしてみました。
良い候補を思いついた方は教えて下さい。

英訳していただきました

また、報告が遅れましたが、 @kaz_yosさんがこのアプリを英訳して下さいました!! ものすごく嬉しいです!ありがとうございました!!

関連記事

参考文献

Shiny Dashboard

超幾何級数を扱うhypergeoパッケージ

世の中には興奮することっていっぱいあるけども、
一番興奮するのはやっぱり超幾何級数を扱うときですよね。

超幾何級数についてのWikipediaはこちら
活用例などはこちらがおすすめです。
ちなみに僕は、非心ベータ分布の平均を計算するために用いました。

R言語で超幾何級数を扱うときは, hypergeoパッケージが簡単です。
使い方を軽くメモしておきます。

インストール

CRANにあります。

> install.packages("hypergeo")
> library(hypergeo)

使い方

 _2F_1 を求める。

超幾何級数の中で頻出なのは  _2F_1 でしょうか。

{ \displaystyle
{}_2F_1(a,b;c;z) = \sum_{n=0}^\infty \frac{(a)_n (b)_n}{(c)_n} \frac{z^n}{n!}.
}

ただし,  (a)_n はポッホハンマー(Pochhammer)記号です。

{ \displaystyle
(a)_n = \begin{cases} 1 & n = 0 \\
a(a+1) \cdots (a+n-1) & n > 0
\end{cases}
}

このような 2F1 は hypergeo 関数で求めることができます。
例えば、{a, b, c, z} = {2,3,4,5}のときは、

> hypergeo(2,3,4,5)
[1] 0.1565421+0.1507964i

となり、超幾何級数が計算できました。

一般化された超幾何級数 _pF_q

 _2F_1だけでなく、 _pF_qのように一般化された超幾何級数を求めましょう。

このとき、  _pF_q は次のように定義されます。

{ \displaystyle
{}_pF_q=\sum_{n=0}^{\infty}\frac{(a_1)_n(a_2)_n\dots(a_p)_n}{(b_1)_n(b_2)_n\dots(b_q)_n\;n!}z^n 
}

これを求めるためには、genhypergeo 関数を使いましょう。
genhypergeo 関数のパラメータUに  (a_1)_n(a_2)_n\dots(a_p)_n を、
パラメータLに  (b_1)_n(b_2)_n\dots(b_q)_n を代入します。
例えば、  a_1=1, a_2=2, b_1=3, b_2=3, b_3=3, z=2 のとき、超幾何級数  {}_2F_3 は、

> genhypergeo(U=c(1,1),L=c(3,3,3),z=2)
[1] 1.078934

となります。

便利ですね!

超幾何関数 (すうがくの風景)

超幾何関数 (すうがくの風景)

サンドウィッチマンライブツアー2014 [DVD]

サンドウィッチマンライブツアー2014 [DVD]

Shinyで作った確率分布を動かせるページを, NVD3.jsでヌルヌルでインタラクティブなグラフにしました。そしてShinyでD3.jsを使う方法3つ。


今回のブログの内容を、TokyoR#45で発表しました。 上は、その時の発表資料です。

先日、Shinyを使った確率分布を動かせるページを作りました。

Shinyで確率分布を動かして遊べるページ作った - Dimension Planet Adventure 最終章 最終話『栄光なる未来』

そのときはggplot2を使ってグラフを書いていましたが、 それを全てNVD3.jsで作りなおしました!! 少し動作に時間がかかるのが難点ですが、 ヌルヌル動くインタラクティブな操作ができるようになって、 見た目的にちょっと面白いものになっています。

果たしてどれくらいヌルヌルなのか!?
以下のgifをご覧ください!!

f:id:ksmzn:20150114193524g:plain

......あんまりヌルヌルじゃないですが、
これは僕が持っているスクリーンショットアプリのgifがしょぼいだけであり、 実際はもっとヌルヌルです!!

↓ 直接アプリでご覧になって、ヌルヌル動かしてください!!

https://ksmzn.shinyapps.io/statdist/

いろいろな確率分布のパラメータをいじくるアプリ @ksmzn #Shiny

ShinyでD3.jsを使う方法。

軽く調べたところ、3つほど方法がありました。

1. rChartsを使う

これがおそらく最もカンタンな方法です。
rChartsはRで手軽にインタラクティブなグラフを描画できるパッケージで、JavaScript の可視化ライブラリを用いています。

rChartsのクイックスタートのページにも ShinyでrChartsを用いる方法が書いてあり、 それをカスタマイズするのが最もラクです。

僕も最初はこの方法で書いていたのですが、 すごく重くてなかなかグラフが描画されないという問題があり、断念しました。
この方法は、単純なシングルページで使う分には全く問題がないのですが、 僕のアプリのようなnavbarPageを使った複数のページにグラフを載せるようなアプリの場合には 辛かったです。

とはいえ、ほとんどのパターンではこの方法で良いと思われます。

2. d3Networkを使う

ネットワーク図やデンドログラムなどを描画したい場合は、 d3Networkパッケージを使う方法もあるようです。

ただ、今回の目的には適していないため、僕は試しておりません。
このページ↓を見る限り、なかなか便利そうです。

Shinyでもd3.jsを容易に使えるd3Networkパッケージを試した - でたぁっ 感動と失敗の備忘録

追記 TokyoRの会場で、上記ブログ著者のid:mitsunori さんからnetworkD3というパッケージを教えて頂きました。
名前が似てますが、d3Networkの後継っぽいです。
詳細はid:mitsunori さんの記事をご覧ください

networkD3 - でたぁっ 感動と失敗の備忘録

3. 直接D3.jsを使う

結局、この方法を採用しました。
正確に言えば、僕のアプリで直接使ったのは(NVD3.js)http://nvd3.org/です。

この方法を使う場合、とても参考になるサンプルコードがShinyのGalleryにありました。

Shiny - NVD3 line chart output

Shiny - NVD3 line chart output

これは、僕が理解している範囲で言えば、独自のoutputオブジェクトを定義してDataframeをjsに渡し、 nvd3.jsでグラフを記述するというやり方です。

なかなか面倒くさいですが、僕のアプリの場合rChartsよりサクサクとグラフが描画されましたし、 まぁ、こういうやり方とサンプルがあるよ、ということで。
詳しくは、上記コードをご覧ください。

繰り返しになりますが、基本的にはrChartsを使うのが最もカンタンだと思います。

参考文献

夕空のクライフイズム 1 (ビッグコミックス)

夕空のクライフイズム 1 (ビッグコミックス)