首页 文章

最小的置信区间适合scipy python

提问于
浏览
4

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

3 回答

  • 2

    我会使用bootstrapping方法 .
    看这里: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
    
  • 4

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

    通常, leastsq 确实没有给出置信区间 . 然而,它确实返回了对Hessian的估计,换句话说,它将二阶导数推广到多维问题 .

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

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

  • 8

    估计置信区间(CI)的最简单方法是将标准误差(标准偏差)乘以常数 . 要计算常数,您需要知道要计算CI的自由度数(DOF)和置信度 . 以这种方式估计的CI有时被称为渐近CI . 您可以在Motulsky&Christopoulos(google books)的"Fitting models to biological data using linear and nonlinear regression"中阅读更多相关信息 . 同一本书(或非常相似)可免费获得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方法,但它可能比我写的方法更可靠 .

相关问题