Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何计算scipy中曲线拟合的可能性?_Python_Numpy_Scipy_Statsmodels - Fatal编程技术网

Python 如何计算scipy中曲线拟合的可能性?

Python 如何计算scipy中曲线拟合的可能性?,python,numpy,scipy,statsmodels,Python,Numpy,Scipy,Statsmodels,我有一个非线性模型拟合,如下所示: 暗实线是模型拟合,灰色部分是原始数据 问题的简短版本:我如何得到这个模型拟合的可能性,这样我就可以进行对数似然比测试?假设残差是正态分布的 我对统计学比较陌生,我目前的想法是: 通过曲线拟合得到残差,计算残差方差 用这个等式 将残差的方差代入sigma平方,x_i作为实验,mu作为模型拟合 计算对数似然比 有人能帮我回答这两个完整的问题吗 我的方法正确吗?(我想是的,但如果能确定一下,那就太好了!) python/scipy/statsmodels中是否有现

我有一个非线性模型拟合,如下所示:

暗实线是模型拟合,灰色部分是原始数据

问题的简短版本:我如何得到这个模型拟合的可能性,这样我就可以进行对数似然比测试?假设残差是正态分布的

我对统计学比较陌生,我目前的想法是:

  • 通过曲线拟合得到残差,计算残差方差

  • 用这个等式 将残差的方差代入sigma平方,x_i作为实验,mu作为模型拟合

  • 计算对数似然比

  • 有人能帮我回答这两个完整的问题吗

  • 我的方法正确吗?(我想是的,但如果能确定一下,那就太好了!)

  • python/scipy/statsmodels中是否有现成的函数可以为我实现这一点


  • 我觉得你的公式正确。它应该给您提供与scipy.stats.norm.logpdf(x,loc=mu,scale=sigma)相同的结果。

    既然你已经有了mu和sigma的估计值,我不认为有一个似然比测试的函数可以插入你的结果

    如果您有两个模型的估计值,其中一个嵌套在另一个模型中,那么您可以自己轻松地进行计算

    以下是statsmodels中的方法的一部分,该方法计算LR测试,以比较两个嵌套线性模型
    你的似然函数

    它是高斯分布概率密度函数对数的和

    是为残差拟合mu和sigma的可能性,而不是给定数据的模型的可能性。一句话,你的方法是错误的

    如果你在做非线性最小二乘法,按照@usethedeathstar已经提到的方法,你应该直接进行
    F-test
    。考虑下面的例子,修改后,我们使用<代码> R< /代码>进行代码> F测试< /代码>。最后,我们将讨论如何将其翻译成
    python

    # construct the data vectors using c()
    > xdata = c(-2,-1.64,-1.33,-0.7,0,0.45,1.2,1.64,2.32,2.9)
    > ydata = c(0.699369,0.700462,0.695354,1.03905,1.97389,2.41143,1.91091,0.919576,-0.730975,-1.42001)
    # some starting values
    > p1 = 1
    > p2 = 0.2
    > p3 = 0.01
    
    # do the fit
    > fit1 = nls(ydata ~ p1*cos(p2*xdata) + p2*sin(p1*xdata), start=list(p1=p1,p2=p2))
    > fit2 = nls(ydata ~ p1*cos(p2*xdata) + p2*sin(p1*xdata)+p3*xdata, start=list(p1=p1,p2=p2,p3=p3))
    
    # summarise
    > summary(fit1)
    
    Formula: ydata ~ p1 * cos(p2 * xdata) + p2 * sin(p1 * xdata)
    
    Parameters:
       Estimate Std. Error t value Pr(>|t|)    
    p1 1.881851   0.027430   68.61 2.27e-12 ***
    p2 0.700230   0.009153   76.51 9.50e-13 ***
    ---
    Signif. codes:  0 ?**?0.001 ?*?0.01 ??0.05 ??0.1 ??1
    
    Residual standard error: 0.08202 on 8 degrees of freedom
    
    Number of iterations to convergence: 7 
    Achieved convergence tolerance: 2.189e-06
    
    > summary(fit2)
    
    Formula: ydata ~ p1 * cos(p2 * xdata) + p2 * sin(p1 * xdata) + p3 * xdata
    
    Parameters:
       Estimate Std. Error t value Pr(>|t|)    
    p1  1.90108    0.03520  54.002 1.96e-10 ***
    p2  0.70657    0.01167  60.528 8.82e-11 ***
    p3  0.02029    0.02166   0.937     0.38    
    ---
    Signif. codes:  0 ?**?0.001 ?*?0.01 ??0.05 ??0.1 ??1
    
    Residual standard error: 0.08243 on 7 degrees of freedom
    
    Number of iterations to convergence: 9 
    Achieved convergence tolerance: 2.476e-06
    
    > anova(fit2, fit1)
    Analysis of Variance Table
    
    Model 1: ydata ~ p1 * cos(p2 * xdata) + p2 * sin(p1 * xdata) + p3 * xdata
    Model 2: ydata ~ p1 * cos(p2 * xdata) + p2 * sin(p1 * xdata)
      Res.Df Res.Sum Sq Df     Sum Sq F value Pr(>F)
    1      7   0.047565                             
    2      8   0.053813 -1 -0.0062473  0.9194 0.3696
    
    这里我们有两个模型,
    fit1
    有2个参数,因此余数有8个自由度
    fit2
    有一个附加参数,余数有7个自由度。模型2是否明显更好?否,F值为0.9194,在
    (1,7)
    自由度上,且不显著

    要获得方差分析表:残留DF很容易。剩余平方和:
    0.08202*0.08202*8=0.05381
    0.08243*0.08243*7=0.04756293
    (注意:“剩余标准误差:7个自由度上的0.08243”,等等)。在
    python
    中,您可以通过
    (y_观察到的-y_拟合)**2
    获得它,因为
    scipy.optimize.curve_拟合()
    不会返回剩余值

    F-ratio
    0.0062473/0.047565*7
    ,要得到p值:
    1-scipy.stats.F.cdf(0.9194,1,7)

    把它们放在一起,我们就有了
    python
    等价物:

    In [1]:
    
    import scipy.optimize as so
    import scipy.stats as ss
    xdata = np.array([-2,-1.64,-1.33,-0.7,0,0.45,1.2,1.64,2.32,2.9])
    ydata = np.array([0.699369,0.700462,0.695354,1.03905,1.97389,2.41143,1.91091,0.919576,-0.730975,-1.42001])
    def model0(x,p1,p2):
        return p1*np.cos(p2*x) + p2*np.sin(p1*x)
    def model1(x,p1,p2,p3):
        return p1*np.cos(p2*x) + p2*np.sin(p1*x)+p3*x
    p1, p2, p3 = 1, 0.2, 0.01
    fit0=so.curve_fit(model0, xdata, ydata, p0=(p1,p2))[0]
    fit1=so.curve_fit(model1, xdata, ydata, p0=(p1,p2,p3))[0]
    yfit0=model0(xdata, fit0[0], fit0[1])
    yfit1=model1(xdata, fit1[0], fit1[1], fit1[2])
    ssq0=((yfit0-ydata)**2).sum()
    ssq1=((yfit1-ydata)**2).sum()
    df=len(xdata)-3
    f_ratio=(ssq0-ssq1)/(ssq1/df)
    p=1-ss.f.cdf(f_ratio, 1, df)
    In [2]:
    
    print f_ratio, p
    0.919387419515 0.369574503394
    
    正如@usethedeathstar所指出的:当余数是正态分布时,非线性最小二乘是最大的可能性。因此,F检验和似然比检验是等价的。因为F-比是似然比λ的单调变换


    或者以一种描述性的方式,请参见:

    如果残差是正态分布的,则只需使用最小二乘法即可得到可能性最大的模型。你能展示一下你已经尝试过的吗?只是想知道这不是家庭作业?@usethedeathstar(0)Lol-这不是家庭作业,只是想对一篇研究论文发表评论;2) 模型拟合已经通过残差的最小二乘法完成,我正在尝试进行似然比检验;3) 要做任何基于可能性的工作,我需要先得到可能性,这是我的问题4)我已经在“我当前的想法是……”下写下了我尝试过的东西。最后,对于统计数据的幼稚,我深表歉意:(虽然这个问题写得很好,表达得很清楚,但由于这是一个编程网站,所以可能值得把这个问题转移到这里。@Hooked谢谢你的建议!你能告诉我如何…?我是否手动复制并粘贴这个问题?你可以简单地删除这个问题并重新发布它(格式设置已经完成!)。将注释合并到新问题中不会有任何伤害。祝你好运!非常感谢!这节省了我一周的时间。一个非常快速的后续问题:拟合的剩余值是否不是正态分布(尽管拟合中使用了最小二乘法),f-test是否仍然有效?stats.stackexchange.com上的人对此会有更好的发言权。理论上可能看起来是这样,但事实上f-test在正态性假设方面相当稳健,因此您在大多数情况下仍然可以使用它。希望这会有所帮助。祝您修改顺利!收到了。再次感谢您!