2016-10-09 33 views
0

これらのデータポイントのx座標とy座標の両方にエラーのあるデータポイントがあります。したがって、私はpythonのODRツールを使って、最適な傾きとこの傾きの誤差を計算したいと考えています。私は私の実際のデータのためにそれをやってみましたが、良い結果は得られません。直交距離回帰(ODR)の簡単な理解

import numpy as np 
import matplotlib.pyplot as plt 
from scipy.odr import * 

def linear_func(B, x): 
    return B[0]*x+B[1] 

x_data=np.array([0.0, 1.0, 2.0, 3.0]) 
y_data=np.array([0.0, 1.0, 2.0, 3.0]) 
x_err=np.array([1.0, 1.0, 1.0, 1.0]) 
y_err=np.array([5.0, 5.0, 5.0, 5.0]) 

linear=Model(linear_func) 
data=RealData(x_data, y_data, sx=x_err, sy=y_err) 
odr=ODR(data, linear, beta0=[1.0, 0.0]) 
out=odr.run() 
out.pprint() 

pprint()線が得られる:

Beta: [ 1. 0.] 
Beta Std Error: [ 0. 0.] 
Beta Covariance: [[ 5.20000039 -7.80000026] 
[ -7.80000026 18.1999991 ]] 
Residual Variance: 0.0 
Inverse Condition #: 0.0315397386692 
Reason(s) for Halting: 
    Sum of squares convergence 

resutlingベータ値は、1.0と0.0すべき私はだろう示されている次のようにそのため、私は最初の単純な例でODRを使用することを試みました見通ししかし、なぜ標準誤差、Beta Std Errorも、データポイント上の私のエラーがかなり大きい場合は両方ともゼロですか?誰かがいくつかの洞察力を提供できますか?

答えて

1

ここに矛盾は見られません。あなたのサンプルモデルはあなたのデータに完全に合っているので、データに渡す重みは重要ではありません。さらに、最初の推測beta0=[1.0, 0.0]は最適解を与えるパラメータベクトルであるため、ODR機械はパラメータの反復改善を見つけることができず、ゼロ反復後に終了します。指定されたデータについては、sum of squares()がゼロであるため、見つかった解は他の解よりも無限に優れているため、関連するエラーはゼロです。

ODR.run()関数内で実際に何が起こるかを確認するには、回帰を実行する前にodr.set_iprint(init=2, iter=2, final=2)を追加します。エラーがないゼロになり、どちらかあなたのx_datay_data場合、またはに等しくない場合NITERは整数になりますか

--- STOPPING CONDITIONS: 
     INFO =  1 ==> SUM OF SQUARES CONVERGENCE. 
     NITER =  0   (NUMBER OF ITERATIONS) 

注:具体的には、次の出力は、ODRは、直ちに停止状態に達したことを確認しますbeta0が最適解と一致しません。その場合、ODRによって返されるエラーは非ゼロになりますが、それでも信じられないほど小さくなります。

+0

素敵な答え、Vlasありがとうございました。私が理解できないことは、斜面に基本的な誤差がない理由です。私はODRが、エラーバーがあるデータがあれば、その値と同様に、ラインの傾きに固有の誤差を計算することになっていたと考えました。この方法でなければ、斜面の固有の誤差をどのようにして計算しますか? – user4437416

+0

'Beta Std Error'の値は、あなたが渡した絶対的なエラーを反映しません - データポイントに割り当てられた相対的な"重み "だけです。これらの値がどのように計算されているかを完全には理解していませんが、おそらくordpack [documentation](http://docs.scipy.org/doc/external/odrpack_guide.pdf)を読んで理解することができます。 –

+0

'x_err'と' y_err'の絶対的なスケーリングを考慮する一つの方法は、パラメータの不確実性を 'B_err = np.sqrt(np.diag(out.cov_beta))'とすることです - 対角成分の平方根共分散行列。上のリンク先の '4.B'セクションは、これがどれほど近似しているかについて少し詳しく説明しています。 –

関連する問題