最小的置信区间适合scipy python

时间:2011-04-27 21:50:46

标签: python scipy least-squares confidence-interval

如何在python中计算最小二乘拟合(scipy.optimize.leastsq)的置信区间?

3 个答案:

答案 0 :(得分:8)

我会使用自举方法 见这里:http://phe.rockefeller.edu/LogletLab/whitepaper/node17.html

嘈杂高斯的简单例子:

x = arange(-10, 10, 0.01)

# model function
def f(p):
    mu, s = p
    return exp(-(x-mu)**2/(2*s**2))

# create error function for dataset    
def fff(d):
    def ff(p):
        return d-f(p)
    return ff

# create noisy dataset from model
def noisy_data(p):
    return f(p)+normal(0,0.1,len(x))

# fit dataset to model with least squares    
def fit(d):
    ff = fff(d)
    p = leastsq(ff,[0,1])[0]
    return p

# bootstrap estimation        
def bootstrap(d):
    p0 = fit(d)
    residuals = f(p0)-d
    s_residuals = std(residuals)

    ps = []
    for i in range(1000):
        new_d = d+normal(0,s_residuals,len(d))
        ps.append(fit(new_d))

    ps = array(ps)
    mean_params = mean(ps,0)
    std_params = std(ps,0)

    return mean_params, std_params

data = noisy_data([0.5, 2.1])
mean_params, std_params = bootstrap(data)

print "95% confidence interval:"
print "mu: ", mean_params[0], " +/- ", std_params[0]*1.95996
print "sigma: ", mean_params[1], " +/- ", std_params[1]*1.95996

答案 1 :(得分:4)

我不确定你的置信区间是什么意思。

通常,leastsq对您尝试最小化的函数知之甚少,因此它无法真正给出置信区间。然而,它确实返回了对Hessian的估计,换句话说,它将二阶导数推广到多维问题。

如函数的文档字符串中所示,您可以将该信息与残差(拟合解与实际数据之间的差异)一起使用来计算参数估计的协方差,这是对置信区间的局部猜测。

请注意,它只是一个本地信息,我怀疑只有当你的目标函数是严格凸的时候才能严格地说出结论。我对该声明没有任何证据或参考资料:)。

答案 2 :(得分:2)

估计置信区间(CI)的最简单方法是将标准误差(标准偏差)乘以常数。要计算常数,您需要知道要计算CI的自由度数(DOF)和置信度。 以这种方式估计的CI有时被称为渐近CI。 您可以在Motulsky& Sons的“使用线性和非线性回归拟合模型到生物数据”中阅读更多相关信息。克里斯托普洛斯(google books)。同一本书(或非常相似)可免费提供as a manual for author's software

您还可以阅读how to calculate CI using the C++ Boost.Math library。在该示例中,针对一个变量的分布计算CI。在最小二乘拟合的情况下,DOF不是 N -1,而是 N-M ,其中 M 是参数的数量。在Python中应该很容易做到这一点。

这是最简单的估计。我不知道zephyr提出的bootstrapping方法,但它可能比我写的方法更可靠。