Rで学ぶロバスト推定

 2011年4月29日
  第13回Tokyo.R
    @sfchaos
本発表の趣旨
 分析データには外れ値がつきもの




           外れ値?
 分析データには外れ値がつきもの




           外れ値?      本当に
                    外して良い?
 分析データには外れ値がつきもの




           外れ値?      本当に
                    外して良い?



 ロバスト推定とは,外れ値を除外せずに,受ける影響
  を小さくして頑健なモデルを推定する方法
 本発表では,ロバスト推定の初歩についてお話します
  .
目次
1.   自己紹介
2.   イントロダクション ~外れ値への対処~
3.   ロバスト推定
4.   まとめ
1.   自己紹介
2.   イントロダクション ~外れ値への対処~
3.   ロバスト推定
4.   まとめ
1. 自己紹介
 TwitterID: @sfchaos
 職業:コンサルタント
   金融工学のモデル構築・データ解析
   最近,大規模データ解析の企画に着手(Hadoop, Mahout,
    CEP等)
 「Rパッケージガイドブック」(東京図書,2011年4月
  刊行)に記事を書かせてもらいました.
   bigmemoryパッケージ(大規模データの管理・分析)
   RTisean/tseriesChaosパッケージ(非線形(カオス)時系
    列解析)
1.   自己紹介
2.   イントロダクション ~外れ値への対処~
3.   ロバスト推定
4.   まとめ
2. イントロダクション ~外れ値への対処~
 動物の体長・脳の大きさに関するデータ(65レコード)




> library(robustbase)
> data(Animals2, package="robustbase")
> plot(Animals2)
2.1 普通に考えると・・・
 外れ値を検出して除去する

        外れ値の
 元データ            外れ値
         検出


                 外れ値の   データの性質や実務
        統計的手法を
                 除去判断    的な観点を考慮
          使用


                 外れ値の    分析対象
                  除去      データ
 例)Mahalanobisの距離を用いた外れ値の除去
  D 2 = ( x − µ )t Σ − 1 ( x − µ )
     Σ   :分散共分散行列




> cen <- apply(Animals2, 2, mean)
> ani2.maha <- mahalanobis(Animals2, cen, cov(Animals2))
> # Mahalanobisの距離を用いた検定統計量がF分布の90%分位点を越える場合は
    外れ値とみなす
> n <- nrow(Animals2); p <- ncol(Animals2)
> ng <- n * (n-p)/ ((n^2 - 1) * p) * ani2.maha > qf(0.9, n, p)
> plot(Animals2, col=ifelse(ng, "red", "black"))
> labels <- paste(which(ng), ":", rownames(Animals2)[ng], sep="")
> text(Animals2[ng, ], labels=labels)
 検出された点を除いても良い?




               row.names         body       brain
       61   Asian elephant     2547.000    4603.00
       62   African elephant   6654.000    5712.00
       65   Brachiosaurus      87000.000   154.50
 仮に外れ値を除去すると・・・




                     新しい外れ値
                   (らしきもの)が出現
                     (screening)

                   高次元では外れ値の除去は
                      難しい問題orz
2.2 外れ値を除去せずに分析してみる
 とりあえずデータをそのまま線形回帰分析に突っ込む




> ans.lm <- lm(brain ~ body, data=Animals2)
> abline(ans.lm, col="blue")
 ダメポ。・゚・(ノД`)・゚・。




> ans.lm <- lm(brain ~ body, data=Animals2)
> abline(ans.lm, col="blue")
2.3 そこでロバスト回帰が登場!!
 望んでいた結果が得られる.




> library(robustbase)
> ans.lmrob <- lmrob(brain ~ body, data=Animals2)
> abline(ans.lmrob, col="red")
1.   自己紹介
2.   イントロダクション ~外れ値への対処~
3.   ロバスト推定
4.   まとめ
3.1 そもそも線形回帰って?
 faithfulデータ(272レコード)
残差
 残差の二乗の和が最小となる回帰直線を選ぶ.




              N
          min ∑ ri   2

              i= 1
 普通の線形回帰では,



               残差

               >
3.2 ロバスト推定
 ロバスト推定には,M推定法,L推定法,R推定法等
  が知られている.
 今日は,M推定法についてお話します.
 簡単のため,データは2次元のものに限って説明しま
  す.
3.3 普通の回帰分析とM推定の考え方の違い
 線形回帰の場合は,すべての点を同じ重みで考えて
  いる.




                N
          min ∑ ri 2 = 1 ⋅ ri 2
               i= 1
 M推定では,モデルへの当てはまりが悪い点の重み
  を低く設定することにより影響を小さくする.




                          N
                     min ∑ ρ (ri )
※実際は,M推定は
  最尤推定の一般化になっているが,
  ここでは説明を割愛              i= 1
3.4 実データに対するロバスト推定
① phonesデータセット
  1950年~73年までのベルギーにおける電話回数(単位:
   百万件).
  1964年~69年は電話時間が記録されている.
 念のため,線形回帰もやってみる.




> phones.lm <- lm(phones$calls ~ phones$year)
> abline(phones.rl, col="blue")
 ロバスト回帰
     悪くはないが,少し傾きがきつい?




> phones.rl <- rlm(phones$calls ~ phones$year, maxit=100)
> abline(phones.rl, col="green")
 重み付け関数を変更する.




> phones.rl <- rlm(phones$calls ~ phones$year, maxit=100, phi=phi.square)
> abline(phones.rl, col="red")
② お待ちかね(?)のAnimals2データセット
 線形回帰とロバスト線形回帰
     思い通りになっていないけど,phonesデータセットの場合と
      同じ現象だから大丈夫!




> abline(lm(brain ~ body, data=Animals2), col="blue")
> abline(rlm(brain ~ body, data=Animals2, maxit=100), col="green")
 よし,できた! ・・・あれ?




> abline(rlm(brain ~ body, data=Animals2, psi=psi.bisquare), col="pink")
 パラメータを変えれば,きっと合うよね
  ・・・合わないorz




> plot(Animals2)
> # 重み関数の形を変えてフィッティングを繰り返す
> for (i in 1:20) abline(rlm(brain ~ body, data=Animals2, maxit=100,
+                        psi=psi.bisquare, c=i), col=i)
 パラメータを変えれば,きっと合うよね
  ・・・合わないorz


  M推定には,残差に関する外れ値にはロバストだが,
   説明変数の外れ値にはロバストではないという
          問題点がある.


> plot(Animals2)
> # 重み関数の形を変えてフィッティングを繰り返す
> for (i in 1:20) abline(rlm(brain ~ body, data=Animals2, maxit=100,
+                        psi=psi.bisquare, c=i), col=i)
 MM推定という方法を用いると,この問題は解決する
  ことが多い.




> plot(Animals2)
> abline(rlm(brain ~ body, data=Animals2, method="MM"), col="red")
 最新の手法が入っているrobustbaseパッケージの
  lmrob関数を使っても同様の結果が得られる.




> plot(Animals2)
> abline(lmrob(brain ~ body, data=Animals2), col="red")
 高次元のデータに対しては,2次元のデータのように
  視覚的に外れ値を検出できるわけではない.
  → パラメータをチューニングしながら
    試行錯誤する必要あり
1.   自己紹介
2.   イントロダクション ~外れ値への対処~
3.   ロバスト推定
4.   まとめ
4. まとめ
 ロバスト推定とは,外れ値を除去することなく,与える
  影響が小さくなるようにモデルを推定する方法
 M推定法は最も簡単なロバスト推定法であるが,説
  明変数の外れ値に対してはロバストではない.
 各種ロバスト推定法の適用にあたっては,パラメータ
  のチューニングが必要.
Tokyo.R 翻訳プロジェクトWiki
 Tokyo.Rの主催者@yokkunsさんが立ち上げたWikiで
  ,パッケージのTask Viewやvignette,Rの公式マニュ
  アル等のドキュメントを現在,約10名で翻訳中
 Please join us!

Rで学ぶロバスト推定