How to | フィットしたモデルの診断をプロットする方法
診断はデータのモデルを分析する際に重要である.残差プロットおよびてこ比つまり影響力の統計量プロットは,モデルに対する仮定が妥当であるかどうか,およびデータ点の中でフィットに影響を及ぼしすぎるものがあるかどうかについての貴重な情報を提供する.Wolfram言語ではこのようなタイプのグラフィックスはLinearModelFit等の関数を組込みのプロット作成関数と一緒に使って得た結果から作成することができる.
data1 = {{1.36, 15.36}, {1.69, 16.12}, {4.91, 104.62}, {4.85, 110.06}, {4.41, 99.07}, {2.15, 23.83}, {2.98, 48.86}, {1.19, 16.29}, {4.08, 79.91}, {0.05, 0.89}, {3.69, 70.13}, {2.34, 32.07}, {2.32, 29.39}, {1.77, 26.41}, {0.47, 6.64}};線形モデルは推定しなくてはならないパラメータについて線形であるモデルである.形式
のモデルは
では二次だが,パラメータ
,
,
では線形である.
LinearModelFitを使ってこのモデルにフィットさせる:
lm = LinearModelFit[data1, {x, x ^ 2}, x]関数lm[x]に対してPlot を使ってフィットした曲線をプロットすることができるように,FittedModelオブジェクトを
の値について評価することができる.
p1 = Plot[lm[x], {x, 0, 5}]ListPlotを使ってデータをプロットし,Showを使ってフィットした曲線に沿ってデータを表示することができる:
Show[ListPlot[data1], p1]FittedModelオブジェクトに多くの診断と結果を返させることができる.
線形モデルについて残差は,ホワイトノイズのように,平均が0で定数分散であるランダムに正規分布した値であるはずである.残差中の任意傾向はモデルを修正する必要があることを示す場合がある.
"FitResiduals"の特性をFittedModelオブジェクト(lm)と一緒に使って残差を得て,それぞれのデータ点についてその残差をプロットする:
ListPlot[lm["FitResiduals"]]その他のグラフィックスと同様に,枠,ラベル,充填等の機能を加えるオプションを追加することができる.
Frameオプションを使って残差プロットの周りに枠を加え,Fillingオプションを使って点から軸に向かって線を引く:
ListPlot[lm["FitResiduals"], Frame -> True, Filling -> Axis]標準化残差は,残差中の全体的な尺度を実質的に削除するので便利である場合もある.線形と非線形の回帰の場合には,標準化残差は分散が1に等しいホワイトノイズのようになるはずである.
フィットした線形モデルについて標準化残差のプロットを生成する:
ListPlot[lm["StandardizedResiduals"], Frame -> True, Filling -> Axis]先の残差プロットは各データ点の残差を表示するが,各データ点は予測変数に対する残差をプロットする場合にも便利である.以下の例では
が予測変数である.
データの値と関連する残差からペアを作成することによって,予測変数に対する残差をプロットすることができる.予測値はdataにおける各データ点の第1要素である:
xvals = data1[[All, 1]]
の値と残差のペアをTransposeを使って構築し,その後そのペアをListPlotを使ってプロットする:
ListPlot[Transpose[{xvals, lm["FitResiduals"]}]]ListPlot[Transpose[{data1[[All, 1]], lm["FitResiduals"]}], Frame -> True, Filling -> 0, FrameLabel -> {"x", "residual"}, PlotLabel -> "Residual vs. Predictor"]同様に,個々の点がフィットに影響し過ぎるかどうかを判断するために,データ集合内の点の影響力つまりてこ比の統計量をプロットすることができる.
例えば,各データ点についてクック(Cook)距離をプロットする.データ点のクック距離は全体のフィットに対してその点の影響力の統計量を提供する:
ListPlot[lm["CookDistances"], Filling -> 0]その他の点別の診断には"FitDifferences"および"BetaDifferences"が含まれる.これらはそれぞれよくDFFITSおよびDFBETASとして参照される.これらの値はその他のタイプの影響力を判断するために可視化することができる.
"FitDifferences"をプロットすることによって,予測値に対する各点の影響力の統計量を得る:
ListPlot[lm["FitDifferences"], Filling -> 0]診断プロットは,NonlinearModelFit,GeneralizedLinearModelFit,LogitModelFit,ProbitModelFitを使ってフィットした非線形モデルおよび一般線形モデルについても同じような方法で得ることができる.
線形モデルについて使用したものと同じ値を今度は非線形と一般線形のフィットに使う:
data2 = {{1.36, 15.36}, {1.69, 16.12}, {4.91, 104.62}, {4.85, 110.06}, {4.41, 99.07}, {2.15, 23.83}, {2.98, 48.86}, {1.19, 16.29}, {4.08, 79.91}, {0.05, 0.89}, {3.69, 70.13}, {2.34, 32.07}, {2.32, 29.39}, {1.77, 26.41}, {0.47, 6.64}};例えば,ExpをNonlinearModelFitと一緒に使い,データに指数モデルをフィットさせる:
nlm = NonlinearModelFit[data2, a Exp[b + c x ^ (1 / 2)], {a, b, c}, x]もう一度ListPlotおよびPlotを使ってフィットを可視化させることができる:
Show[ListPlot[data2], Plot[nlm[x], {x, 0, 5}]]線形の例と同様に,残差等の点別の診断をListPlotを使ってプロットすることもできる:
ListPlot[nlm["FitResiduals"], Filling -> 0]次の例では形式
のモデルをフィットさせるが,応答(データ中の
の値)は逆ガウス分布に従うと仮定する.これはGeneralizedLinearModelFitのExponentialFamilyオプションを"InverseGaussian"に設定することによって指定される:
glm = GeneralizedLinearModelFit[data2, {x, x ^ 2}, x, ExponentialFamily -> "InverseGaussian", LinkFunction -> Identity]線形や非線形の回帰モデルとは違って,誤差の分散はもはや一定であるとは予測されない.逆ガウスモデルについては,応答値が増加するにつれて誤差も増加すると予想される.
さまざまなタイプの変換残差をこれらのモデルと使用することができる.一度に複数の残差を見たい場合には,まず一緒に見たい残差を指定する:
glmresids = glm[{"FitResiduals", "AnscombeResiduals", "PearsonResiduals", "StandardizedPearsonResiduals"}];線形と非線形の回帰の場合と同様に,"FitResiduals"は応答と予測値の違いである."AnscombeResiduals"はフィット残差を変換して仮定された分布の正規のノイズに近くなるようにする."StandardizedPearsonResiduals" は全体の分散からスケールするのに対し,"PearsonResiduals"は各点における予測分散に基づいてスケールする.
今度は作成しようとしているそれぞれの残差プロットに対するラベルを定義する:
labels = {"fit", "Anscombe", "Pearson", "standardized Pearson"};異なるタイプの残差のプロットを作成し,それぞれにラベルを追加する.ここでは出力をセミコロン(;) を使って抑制し,プロットを次のステップで格子で表示する:
plots = MapThread[ListPlot[#1, Frame -> True, PlotLabel -> #2]&, {glmresids, labels}];Partitionを使って2×2配列を作り,その後GraphicsGridを使って格子でプロットを表示する:
GraphicsGrid[Partition[plots, 2], ImageSize -> 400, PlotLabel -> "Types of Residuals"]