0

私は、一部のデータに合わせてoptimize.least_squaresを使用したいので、Pythonでoptimize.leastsqメソッドを使用して適合パラメータの標準誤差を取得することを確認していましたが、パラメータには(物理的な理由から)境界があります。たとえば、パラメータAは[0でなければなりません。 、1]。共分散行列を使用し、残差を乗算する方法は、パラメーターの範囲外に広がるエラーバーにつながることがわかります。統計的に正しく厳密に行うべきことは何ですか? エラーバーを許可された境界で人為的に切り取りますか、またはエラーバーが境界内に収まるように処理する他の方法はありますか?

import numpy as np
from scipy import optimize
import random

def f( x, p0, p1, p2):
    return p0*x + 0.4*np.sin(p1*x) + p2

def ff(x, p):
    return f(x, *p)

# These are the true parameters. 

p0 = 1.0 #In the fit we will bound p0 from 0 to 1 for e.g., some physical/modeling reason
p1 = 40
p2 = 2.0

# These are initial guesses for fits:
pstart = [0.8,40,2]

# Generate data with a bit of randomness
# (the noise-less function that underlies the data is shown as a blue line)

xdata = np.array(np.linspace(0., 1, 120))
np.random.seed(42)
err_stdev = 0.2
yvals_err =  np.random.normal(0., err_stdev, len(xdata))
ydata = f(xdata, p0, p1, p2) + yvals_err

def fit_leastsq(p0, datax, datay, function, bounds1):

    errfunc = lambda p, x, y: function(x,p) - y

    all_results= optimize.least_squares(errfunc, p0, args=(datax, datay),bounds=bounds1 )
    pfit=all_results.x
    J=final_results.jac #the jacobian matrix
    pcov=np.linalg.inv(2*J.T.dot(J)) #This calculates the inverse Hessian which is used to approximate the covariance

    s_sq = (errfunc(pfit, datax, datay)**2).sum()/(len(datay)-len(p0))
    pcov = pcov * s_sq

    error = [] 
    for i in range(len(pfit)):
        try:
            error.append(np.absolute(pcov[i][i])**0.5)
        except:
            error.append( 0.00 )
    pfit_leastsq = pfit
    perr_leastsq = np.array(error) 
    return pfit_leastsq, perr_leastsq 

#Set Bounds on Parameters 
bounds=([0,0,0],[1,40,2.5]) #this means first parameter is restricted 0-1, second is 0-40, and this is 0-2.5

pfit, perr = fit_leastsq(pstart, xdata, ydata, ff, bounds)

print("\n# Fit parameters and parameter errors from lestsq method :")
print("pfit = ", pfit)
print("perr = ", perr)

私が得る結果は次のとおりです。

# Fit parameters and parameter errors from lestsq method :
pfit =  [ 1.         39.97612883  1.98430673]
perr =  [0.07545234 0.07611141 0.01546065]

パラメータの perr が境界の範囲外にあることに注意してください。おそらく、方向エラーを取得する方法はありますか? つまり、たとえば、最初のパラメーターのエラーバーは負の方向だけになりますか?

4

1 に答える 1