加权拟合后减少卡方过低(接近0)-卷积积分-Python lmfit

时间:2018-08-13 18:49:58

标签: curve-fitting convolution model-fitting

我正在拟合以下数据,其中t:时间(s),G:每秒计数,f:脉冲函数(mm / s):

    t     G     f 
    0   4.58    0
  900   11.73   (11/900)
 1800   18.23   (8.25/900)
 2700   19.33   (3/900)
 3600   19.04   (0.5/900)
 4500   17.21   0
 5400   12.98   0
 6300   11.59   0
 7200   9.26    0
 8100   7.66    0
 9000   6.59    0
 9900   5.68    0
10800   5.1     0

使用以下卷积积分:

更具体地说:

其中:lambda_1 = 0.000431062lambda_2 = 0.000580525

用于执行该拟合的代码是:

#Extract data into numpy arrays
t=df['t'].as_matrix()
g=df['G'].as_matrix()
f=df['f'].as_matrix()
#add parameters
params=Parameters()
params.add('a',value=1)
params.add('b',value=0.7)
params.add('c',value =1)
#define functions
def exp(x,k):
    return np.exp(-x*k)

def residuals(params,x,y):
    A=params['a'].value
    B=params['b'].value
    C=params['c'].value

    dt=x[2]-x[1]
    model = A*(np.convolve(exp(x,lambda_1), f))[:len(x)]*dt+B*np.convolve(exp(x,lambda_2), f)[:len(x)]*dt+C
    weights=1/np.sqrt(y)
    return (model - y)*weights

#perform fit using leastsq
result = minimize(residuals, params, args=(t,g))
final = g + result.residual
print(report_fit(result))

它可以工作,但是当我将要最小化的残差乘以权重(1 / np.sqrt(g)(加权拟合))时,我得到的卡方差极低(大约为0)。考虑到重量(非加权拟合),我得到的卡方值降低了0.254。我想获得的卡方值降低了1。

1 个答案:

答案 0 :(得分:0)

减小的卡方值远低于1意味着您对数据不确定性的估计太大。如果我正确地阅读了您的示例,则您将G的平方根用作G中的不确定性。使用平方根是一种标准方法,用于估算通过对统计数​​据进行计数而得出的值的不确定性。

但是...您的G是一个浮点数,您将其描述为每秒计数。我可能会假设在900秒内每秒计数。

如果这是正确的(并且为简单起见,我们假设在该持续时间内没有明显的不确定性),那么不确定性应比您的不确定性小30倍。也就是说,您正在使用

g_values = [4.58 ,  11.73,  18.23] 
g_uncertainties = sqrt(g_values) = [2.1401, 3.4249, 4.2697]

但计数的不确定性为sqrt(g_values*900),因此每秒计数的不确定性为sqrt(g_values*900)/900 = sqrt(g_values)/30

更正式地说,代表“每时间计数”的值的不确定性将增加计数的不确定性和正交的时间不确定性。但是同样,您时间的不确定性可能很小(或者,至少您的时间数据暗示它低于1秒)。