【R】Cook's Distance の中身について
今回の記事は R で Cook's Distance を計算した時に,一部 "NaN" を返され,プログラムがエラーを出力.原因究明をおこなった.
【Cook's Distance】
回帰分析時に,モデル式に悪影響を与えている値を特定する手法として,Cook's Distance がある.
Cook's Distance の詳細については以下 Wikipedia のページを参照.
Cook's Distance を一言でまとめるならば,
個々のデータが回帰式の推定に及ぼす影響を表した距離
である.
この距離を用いてデータセットに含まれる外れ値を除去する,Cook's Distance を用いた外れ値除去法が有名である.
この手法は,重回帰分析を行い,モデルの係数に大きな影響を与えるデータを外れ値とみなす.
具体的には,Cook's Distance は,あるデータをモデル推定の計算から除外した場合に,すべてのケースの残差がどの程度変化するかを示す距離であり,この距離が大きい値を示すデータを外れ値とみなし,データセットから除外する.
【Rにおける Cook's Distanceについて】
Rでは Cook's Distance を計算してくれる関数が用意されている.
この関数に回帰分析結果のモデルを引数として渡すだけで計算してくれる.
しかし,今回以下に示すように15番の Cook's Distance 計算結果が NaN となってしまっている.この原因とは...
【cooks.distance 関数の中身】
そもそも cooks.distance 関数はどういった処理をおこなっているのか調べてみることに.
sink() を用いてコンソール画面に出力される内容を txt ファイルに出力し, getS3method("cooks.distance", "lm") で中身を調べてみた.
処理内容が以下.
処理内容についてまず5行目
p <- model$rank
これは回帰式のランクを変数pに代入している.この記事冒頭でも示したWikiには,ランクは予測因子の数という記述がある.恐らくこれには切片も含まれているのだろう
(じゃないと数が合わない) .
そしてその次の行
res <- ((res/(sd * (1 - hat)))^2 * hat) / p
ここで Cook's Distance を計算している模様.
恐らくその次の7行目が NaN を出力した原因.
res[is.infinite(res)] <- NaN
NaN を代入している.この一文はどのような処理をおこなっているのか.
まず,is.infinite() について,この関数は値が無限かどうかを調べる.
そしてこの代入は変数 res の中身が Inf となっているところ,真偽値でいう TRUE のものに NaN を代入するということである.
さて,NaN の発生元は判明した.
あとは原因究明.