カーネル密度推定


R ではカーネル密度推定は density 関数で簡単に行うことができます。先日 Tokyo.R で発表した際に density 関数を使ったことある人に挙手をお願いしたところ,ほとんどいないという,自分としては驚きの結果でした[A]。単に R でカーネル密度推定をやったことがある人がいないだけだったのかもしれませんが。

ということで,私の知る限りでカーネル密度推定についてまとめてみたいと思います。簡単のために一次元で話をします。

カーネル密度推定の前に,別の密度推定法であるヒストグラムについて考えてみます。ヒストグラムは階級を区切って,標本を階級に放り込むという繰り返しを行います。階級ありきなので,階級の中身は気にしません。つまり,階級中の標本の偏りは無視しているということです。

ヒストグラムにおける偏りを是正するために,それぞれの標本が持つ推定分布に対する貢献度を同じにしたいと考えます。そこで,原点を中心に左右対称な確率密度関数 を考えます。つまり かつ を満たすものとします。このような関数をカーネル関数と呼びます。カーネル関数の重要な性質として,正の定数 を与えると もまたカーネル関数となることが挙げられます[B]

ここで,標本 に対して を考えてやります。 を中心とした対象な確率密度関数です。ここで

を考えると, は自然な密度推定になります。最初の目標であったそれぞれの標本の貢献度が等しいという条件を満たしています。さらに,先ほどのカーネル関数の特徴を利用して

と書くこともできます。ここで はバンド幅と呼ばれます。このような形で書いておくことで,カーネル関数の標準形をいくつか考えれば,あとはバンド幅の調節で柔軟に変化させることができます[C]。よく使われるカーネル関数は標準正規分布の確率密度関数です[D]

以上が基本的なカーネル密度推定の考え方でえす。以上は一次元の話でしたが,多次元への拡張は容易です。他にも台が でない場合の推定など,複雑な応用の話もあります。

最後に R でコード例を示します。

x <- rnorm(100)
plot(density(x)) 

簡単ですね。最初にも述べた通り, density がカーネル密度推定を行う関数です。デフォルトではカーネル関数に標準正規分布の確率密度関数,バンド幅は bw.nrd0 関数で計算された値が用いられます。詳しくはヘルプを参照してください。

脚注

  1. ベイズ推定をやったことがある人は 1–2 割いました。 []
  2. それぞれの条件を満たすことは簡単な計算で確認できます。 []
  3. バンド幅をどの程度にするべきかという問題もありますが…。 []
  4. この場合にバンド幅は標準偏差に相当します。 []