y_uti のブログ

統計、機械学習、自然言語処理などに興味を持つエンジニアの技術ブログです

コピュラを用いた確率密度の描画

統計学の分野に、コピュラという概念があるようです。年末年始に少し勉強してみました。どうやら、多次元の確率分布について、各次元の周辺分布をある性質を満たす関数 (コピュラ) で組み合わせると結合分布が得られるというお話のようです。利用するコピュラの種類やパラメータを変えることで、さまざまな形の結合分布を考えることができます。いくつかの代表的なコピュラは Wikipedia にも記載されています。
コピュラ (統計学) - Wikipedia

この様子を実際に確認するため、コピュラを用いて確率密度関数を描画するプログラムを実装してみました。プログラムは GitHub で公開しています。
y-uti/php-copula · GitHub

プログラムの実行には PECL::stats が必要です。また、等高線グラフの描画には JpGraph を利用しています。JpGraph は QPL 1.0 と商用ライセンスのデュアルライセンスで提供されています。QPL 版は以下のページからソースコードを入手できます*1
JpGraph - Most powerful PHP-driven charts

以下の実行例では、パラメータ theta = 1.7 のクレイトンコピュラを用いて確率密度を描画します。周辺分布は標準正規分布として、-3 から 3 までの範囲を 0.01 刻みで計算します。

$ php copula.php --copula=clayton --theta=1.7 --dist=normal --range=-3:0.01:3 --writer=contour >clayton.png

実行結果は以下のようになります。多変量正規分布では確率密度を等高線グラフに描くと楕円形になりますが、クレイトンコピュラでは、図のように負の側に大きく伸びた形状になるようです。

パラメータの変更にともなって確率密度の形が変わっていきます。theta = 3.0, theta = 10.0 とした図を以下に示します。theta を大きくするほど、x, y がより強い相関を持つ細長い分布になっていきます。

異なるコピュラを用いると、それぞれ特徴を持った確率密度が得られます。たとえば、グンベルコピュラ (theta = 3.0) やフランクコピュラ (theta = -5.0) を指定して実行すると、以下のような確率密度が得られます。

積コピュラは、二つの確率変数が互いに独立であるような関係を表現します。積コピュラを用いた確率密度は次のような正円になります。

また、フレシェ-ヘフディング境界のコピュラは、それぞれ相関係数が 1 の場合と -1 の場合に対応します。上界と下界を図示すると、それぞれ次のようになりました。

周辺分布を変えると、また違った様子になります。例として、周辺分布を [0, 1] 区間の一様分布としてフランクコピュラ (theta = -5) を用いた確率密度を描いてみます。このグラフは三次元グラフとする方が様子がよく分かるのですが、JpGraph は三次元グラフをサポートしていないようだったので、CSV ファイルに出力して Excel でグラフを描画しました。次のようにオプションを指定してプログラムを実行します*2

$ php copula.php --copula=frank --theta=-5.0 --dist=uniform --min=-0.001 --max=1.001 --range=0:0.01:1 --writer=csv >frank.csv

出力された frank.csv ファイルを Excel で開いて等高線グラフを作成すると、以下のようなグラフが得られます。周辺分布を標準正規分布とした場合には、凹んだ楕円のような形をしていましたが、一様分布として描いてみると、このように鞍のような形になっていることが見て取れます。

*1:ただし、私のプログラムでは、composer でインストールされるように設定しています。

*2:一様分布の区間を [0, 1] にすると端点で微分不可能になって確率密度を描けないため、少しだけ区間を広く取っています。