How to | 測定誤差でモデルをフィットさせる方法
特に物理科学では,測定誤差を重みとして使い,測定された変動をフィットに組み込むということをよく行う.重みはパラメータの推定値に相対的な影響を与えるが,加重回帰においては誤差分散をそれでもまだ推測する必要があり,このことが結果の誤差推定に影響を与える.重みが測定誤差からのものである場合には,LinearModelFitおよびNonlinearModelFitに対するVarianceEstimatorFunctionおよびWeightsのオプションを使って,希望する結果を得ることができる.
各点の最初の2つの要素が予測値で,3番目の要素が測定値であるデータ集合を定義する:
data = {{0.9, 6.1, 9.5}, {3.9, 6., 9.7}, {0.3, 2.8, 6.6}, {1., 2.2, 5.9}, {1.8, 2.4, 7.2}, {9., 1.7, 7.}, {7.9, 8., 10.4}, {4.9, 3.9, 9.}, {2.3, 2.6, 7.4}, {4.7, 8.4, 10.}};errors = {.4, .4, .2, .4, .1, .3, .1, .2, .2, .2};NonlinearModelFitを使ってこのデータを予測値の対数関数にフィットさせることができる.Weightsオプションを使うと,測定誤差に基づき正規分布に従う変動性をフィットに組み込むことができる.各データ点は
の重みを加えられる.
はそのデータ点の測定誤差である.
Weights だけを使う場合は,分散の大きさはデフォルトの方法を使って推定される.誤差推定は重みと推定分散の大きさに依存する.しかし,重みが測定誤差からのものである場合には,誤差推定が重みのみに依存するようすべきである.
デフォルトの方法を使って分散の大きさを推定して,非線形モデルをフィットさせ,重みに誤差を含める:
nlm = NonlinearModelFit[data, a Log[b x + c y], {a, b, c}, {x, y}, Weights -> 1 / errors ^ 2]フィットの結果についてFittedModel出力オブジェクトであるnlmを調べることができる.
"BestFit"および"ParameterTable"を使って,nlmの最適フィットの関数とパラメータ情報の表を得る:
nlm[{"BestFit", "ParameterTable"}]このような重み付きのフィットについては,パラメータ推定値の標準誤差を得るために誤差分散の大きさを推定する必要がある.線形モデルおよび非線形モデルにデフォルトで使用される典型的な推定値は,加重平方和を含む.
重みがフィットや誤差推定を変更しないということに留意することが大切である.例えば,すべての重みに定数を掛けることで推定分散が増加するが,パラメータ推定値や標準誤差は変わらない.
すべての重みを100倍に増やして同じモデルをフィットさせる:
nlm100 = NonlinearModelFit[data, a Log[b x + c y], {a, b, c}, {x, y}, Weights -> 100 / errors ^ 2]最適フィットの関数と誤差推定値は前と同じであることに注意する:
nlm100[{"BestFit", "ParameterTable"}]それぞれの結果に"EstimatedVariance"を使って分散推定値を比べる.以下では,推定値が重みと同じように100倍に増えたことがわかる:
{nlm["EstimatedVariance"], nlm100["EstimatedVariance"]}上の例における重みはただの重みである.この重みはフィットに相対的な影響を与えるが,推定値と誤差は同じままである.
重みを測定誤差から計算したものとして扱うためには, Weightsに加えてVarianceEstimatorFunctionオプションを使うことができる.VarianceEstimatorFunctionは,使用される分散の大きさの推定器を明示的に定義する.測定誤差については,標準誤差が重みだけから計算されるようにしたいので,分散推定値は定数の1であるべきである:
nlmvar1 = NonlinearModelFit[data, a Log[b x + c y], {a, b, c}, {x, y}, Weights -> 1 / errors ^ 2, VarianceEstimatorFunction -> (1&)]nlmvar1[{"BestFit", "ParameterTable"}]この表とnlmの表を比べることで,パラメータ推定値は等しいが,標準誤差と関連する結果が変わったことが分かる:
{nlm["ParameterTable"], nlmvar1["ParameterTable"]}nlmvar1からの結果にはすべて,重みと,測定誤差からの重みと矛盾しない分散推定値が組み込まれている.重みがパラメータ推定値に影響を与えるのに対し,分散推定値そのものは影響を与えない.フィットの際に定義された分散推定値を無効にしてnlmから測定誤差の結果を得ることは可能である.
最初のフィットからの測定誤差でのフィットに対して同じパラメータの表を得る:
nlm["ParameterTable", VarianceEstimatorFunction -> (1&)]