- rreg - Stataでロバスト回帰する
回帰分析したいけれど、外れ値をどうにかしてやりたい。良くある事だと思います(当社比)。
Stataではいくつかの方法がありますが、そのうちの1つであるrregについて、使用方法を学んだので、備忘録的にまとめておきたいと思います。
rregコマンドについては、下記の様に説明されています。なるほど、わからん。
rreg first performs an initial screening based on Cook’s distance> 1 to eliminate gross outliers before calculating starting values and then performs Huber iterations followed by biweight iterations, as suggested by Li(1985).
(Stata help fileから引用)
rregは、開始値を計算する前に、最初にCookの距離> 1に基づく初期スクリーニングを行い、総外れ値を除去し、Li(1985)によって提案されたように、Huber反復処理に続いてバイウェイト反復処理を行います。
(DeepL Proによる翻訳を少し編集)
Stataのヘルプファイルに準拠して、私が触った記録です。なお、使用したStataのバージョンは16です。
autoデータで回帰してみる(Example 1)
* データ読み込み
sysuse auto, clear
* 普通に回帰分析
regress mpg weight foreign
* 今回のテーマ:ロバスト回帰分析
rreg mpg weight foreign
まず、最初の例では、Stataユーザが親の顔よりも見ているautoデータを用います。車の重さ・値段・燃費とかがまとめられているサンプルデータセットです。
回帰分析では、mpg(燃費、Mile Per Gallonの略)をweight(車体重量、ポンド)とforeign(米国車=0、外国車=1)で回帰しようとしています。
結果がこちらになります。
[result]
* 普通の回帰分析の結果
------------------------------------------------------------------------------
mpg | Coef. Std. Err. t P>|t| [95% Conf. Interval]
-------------+----------------------------------------------------------------
weight | -.0065879 .0006371 -10.34 0.000 -.0078583 -.0053175
foreign | -1.650029 1.075994 -1.53 0.130 -3.7955 .4954422
_cons | 41.6797 2.165547 19.25 0.000 37.36172 45.99768
------------------------------------------------------------------------------
[result]
* 今回のテーマ:ロバスト回帰分析
------------------------------------------------------------------------------
mpg | Coef. Std. Err. t P>|t| [95% Conf. Interval]
-------------+----------------------------------------------------------------
weight | -.0063976 .0003718 -17.21 0.000 -.007139 -.0056562
foreign | -3.182639 .627964 -5.07 0.000 -4.434763 -1.930514
_cons | 40.64022 1.263841 32.16 0.000 38.1202 43.16025
------------------------------------------------------------------------------
weightの回帰係数は、2つの分析で近い値になっていますが、foreignの回帰係数は大きく異なっています。何があったのでしょうか?
rregでは、解析上の重み(外れ値は重みが軽い)を計算し、その重みに従った解析を行っています。重みが軽い(極論、重み=0もある)のはどのような車だったのかを見ることで何か分かるかも知れません。
* 推定された重みを新しい変数wに格納する。
rreg mpg weight foreign, genwt(w)
* 推定された重みを表示する。
summarize w, detail
表示した結果がこちらです。
[results]
Robust Regression Weight
-------------------------------------------------------------
Percentiles Smallest
1% 0 0
5% .0442957 0
10% .4674935 0 Obs 74
25% .8894815 .0442957 Sum of Wgt. 74
50% .9690193 Mean .8509966
Largest Std. Dev. .2746451
75% .9949395 .9996715
90% .9989245 .9996953 Variance .0754299
95% .9996715 .9997343 Skewness -2.287952
99% .9998585 .9998585 Kurtosis 6.874605
Smallestのところを見て下さい。3つのデータで重み=0になっています。つまり、解析から除外されたということです。どんな車が解析から除外されたのか見てみようと思います。
* 算出された重みで並び替え
sort w
* 算出された重みが小さいトップ5をリストアップ
list make mpg weight w in 1/5, sep(0)
結果がこちら。
[results]
+-------------------------------------------+
| make mpg weight w |
|-------------------------------------------|
1. | VW Diesel 41 2,040 0 |
2. | Subaru 35 2,050 0 |
3. | Datsun 210 35 2,020 0 |
4. | Plym. Arrow 28 3,260 .04429567 |
5. | Cad. Seville 21 4,290 .08241943 |
+-------------------------------------------+
車に詳しい人(?)なら、次の2つのことに気づくと思います。
一番上に上がっている「VW Diesel」は、このデータ中で唯一のディーゼル車です(外れ値)。また、Plymouth Arrowの車体重量は正確ではありません。Google先生によるとPlymouth Arrowの車体重量は2,200ポンドですが、ここでは3260ポンドと記載されています。
まぁ、なにかしら外れ値になる要因があるのでしょう、きっと(匙を投げた)。
重みをつけてregressしたらどうなる?
rregで重みが算出されたので、この重みを使ってregressで回帰分析して見ようと思います。
* pweightとして重みを付けたregress
regress mpg weight foreign [pweight=w]
* aweightとして重みをつけたregress
regress mpg weight foreign [aweight=w]
pweight(サンプリングされる確率の逆数で重みとして指定)の場合と、aweight(分散に反比例する重みとして指定)の場合でやっています。
[results]
* pweightの場合
------------------------------------------------------------------------------
| Robust
mpg | Coef. Std. Err. t P>|t| [95% Conf. Interval]
-------------+----------------------------------------------------------------
weight | -.0063976 .0003491 -18.33 0.000 -.0070942 -.005701
foreign | -3.182639 .612648 -5.19 0.000 -4.405159 -1.960119
_cons | 40.64022 1.213473 33.49 0.000 38.21878 43.06167
------------------------------------------------------------------------------
* aweightの場合
------------------------------------------------------------------------------
mpg | Coef. Std. Err. t P>|t| [95% Conf. Interval]
-------------+----------------------------------------------------------------
weight | -.0063976 .0003317 -19.29 0.000 -.0070596 -.0057356
foreign | -3.182639 .5671798 -5.61 0.000 -4.314428 -2.050849
_cons | 40.64022 1.123826 36.16 0.000 38.39766 42.88278
------------------------------------------------------------------------------
出力結果を並べて記載しました。両方の場合で回帰係数の点推定値はrregで行った場合と一致しています。しかし、標準誤差はrregよりも小さくなっていますので、注意が必要です。
説明変数を入れない場合はどうなる?(Example 2)
次は、rregに説明変数を入れずに実行します。
* 説明変数なしのモデル
rreg mpg
[results]
------------------------------------------------------------------------------
mpg | Coef. Std. Err. t P>|t| [95% Conf. Interval]
-------------+----------------------------------------------------------------
_cons | 20.68825 .641813 32.23 0.000 19.40912 21.96738
------------------------------------------------------------------------------
この場合rregは、平均値のロバスト推定を行います。
mpgの平均値のロバスト推定は20.69(95%信頼区間 19.41, 21.97)でした。この結果を非ロバスト推定と比較します。
* 非ロバスト推定で平均値を出す。
ci means mpg
[results]
Variable | Obs Mean Std. Err. [95% Conf. Interval]
-------------+---------------------------------------------------------------
mpg | 74 21.2973 .6725511 19.9569 22.63769
非ロバスト推定では、21.30(95%信頼区間 19.96, 22.64)でした。
ロバスト推定の平均値がやや低い値になったのは、燃費が良すぎる外れ値で軽い重みが付与されたからだと考えられます。
沼へようこそ
Stata ユーザーコミュニティには、ロバスト統計の分野があり、活発な議論が行われています。沼にようこそ。
利益相反(COI)の開示
金銭・経済的なCOIもありません。ただし、金銭を頂くことを拒否している訳ではありません。何か贈りたい方は是非お願いします(ダイマ)。