回帰分析のモデル診断
必要性
単純回帰分析の場合は、独立変数と従属変数を考慮してもせいぜい$2$次元なので、分析が適切に行われたかどうかを一目で確認できる。しかし、多重回帰分析の場合、$3$次元を超えると図として描くのが難しく、分析が本当にうまく合っているのか確認しにくい。回帰分析の仮定をきちんと満たしていないのに仮説検定は通過してしまう場合があり、この場合、分析はただ間違ったものになる。
分析が間違うのは主に、(1)データが線形モデルに合わない場合や、(2)分析結果と実際のデータに対する理解との乖離が激しい場合だ。モデル診断model diagnosticsは、データが線形モデルに合っているかどうかを確認するために実施する。
診断法1
データが線形モデルに合わないというのは、簡単に言えば、データが直線の形をしていないということだ。データが線形モデルに合っているかどうかは、標準化された残差プロットを見てモデル診断を行うことで判断する。このような残差分析はかなり独創的な方法であり、高次元では直線を描いてみることが難しいために考案されたものだ。そもそもわざわざ残差というものを計算する理由がまさにこれだと言っても差し支えない。
残差プロットで以下の四つの条件が満たされれば、モデル診断は通過したものと見なす。
- (i) 線形性Linearity: 残差が$0$を中心に対称的に分布していればよい。
- 回帰分析の本質とも言える仮定であり、回帰分析の目標が直線を求めることである以上、線形性を満たさなければ意味がない。もっとも、そもそも回帰分析を使う理由自体が線形性があると推測することにあるので、実際の分析では非常に簡単に満たされる方だ。
- (ii) 等分散性Homoscedasticity: 残差の分布が均一であればよい。
- 特定の区間で変動が急激に小さくなったりすれば、データが同じ過程で得られたとは見なしにくい。たとえば、統計を収集する調査員の違いやミスなどの問題がないか、考慮せざるを得ない。もしデータが後になるほど分散が大きくなったり小さくなったりするなどの問題がある場合は、変数を変換することで部分的に解決できる。
- (iii) 独立性Independecy: 残差同士に何の傾向もなければよい。
- 残差が何らかの傾向を持っているということは、誤差が完全に偶然であるという回帰分析の仮定に反する。独立性が欠けているということは、逆に言えば、我々がまだ知らない規則、たとえば自己相関があり得るという意味になる。この場合、無理に回り道して解決しようとするよりも、時系列分析のようなより適したツールを探す方がよい。程度がひどい場合は一目で分かるほど目立つが、その程度でなければ大きな問題はないと見てもよい。念を押しておきたいのは、独立性をチェックするためにダービン・ワトソン検定をむやみに持ち出さないことだ。ダービン・ワトソン検定は、厳密に言えば、一定の間隔で離れた残差の自己相関を見つけ出すものであって、独立性を見つけてくれるわけではない。一目見ても何らかの傾向があるのに、ダービン・ワトソン検定を通過したからといって独立だと信じてはならない。
- (iv) 正規性Normality: 残差が標準正規分布に従っているように見えればよい。
- 正規性は他の仮定と異なり、シャピロ・ウィルク検定やハルケ・ベラ検定のように客観的な診断が可能だ。それにもかかわらず、問題はそう単純ではない。正規性に深刻な打撃を与えるのは主に異常値だからである。このような場合、異常値に該当するデータを分析者が直接見て、その現象を直接説明できるなら大きな問題にはならない。念を押しておきたいのは、異常値だからといってむやみに除去しないことだ。たとえば、標本が$300$個あり、上下にシックスシグマ($\pm 3 \sigma$)を外れる異常値が$3$個程度あるなら、それは正常だ。異常値が多すぎるのも問題だが、確率分布論と異なり、異常値が過度に少なくても正規分布にきちんと従っているとは言えない。
上の四つの条件は無作為ではなく重要な順に配置されており、直観や経験だけでなく、回帰係数に対する仮説検定の理論的な導出過程を見れば、この序列を理解できる2。実際の統計分析に臨んでいると、すべてのデータがきれいに現れてくれるわけではないので、いくつかの条件と妥協しなければならないこともある。そのとき、正規性は異常値が多かったり、わずかに偏っているなど多少問題があっても、ある程度は諦めることもできる。
このようなモデル診断は相当な部分が目分量に依存しており、データに対する理解が不可欠だ。間違った部分を見つけることが第一の問題であり、間違った部分をどう解決するかが第二の問題だ。この能力を伸ばす方法は、できるだけ実際の分析に臨みながら多くのパターンを見ることが最善である。
コード
以下は残差プロットを出力してくれるRコードだ。
out<-lm(rating~.,data=attitude); summary(out)
win.graph(5,5); plot(rstudent(out),main="표준화된 잔차")
