我正在拟合以下数据,其中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.000431062
和lambda_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。
答案 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秒)。