簡體   English   中英

如何計算scipy曲線擬合的可能性?

[英]How to calculate the likelihood of curve-fitting in scipy?

我有一個非線性模型擬合,如下所示:

曲線擬合

暗實線是模型擬合,灰色部分是原始數據。

問題的簡短版本:我如何得到這個模型擬合的可能性,所以我可以進行對數似然比檢驗? 假設殘差是正態分布的。

我對統計數據比較陌生,我目前的想法是:

  1. 從曲線擬合中獲取殘差,並計算殘差的方差;

  2. 使用此等式 正態分布的對數似然 並將殘差的方差插入西格瑪平方,x_i作為實驗,mu作為模型擬合;

  3. 計算對數似然比。

這兩個完整版的問題可以幫助我嗎?

  1. 我的方法是否正確? (我想是這樣,但確保真的很棒!)

  2. 在python / scipy / statsmodels中是否有任何現成的函數可以為我執行此操作?

你的可能性

在此輸入圖像描述

這只是高斯分布的概率密度函數的對數之和。

在此輸入圖像描述

是否可以為您的殘差擬合mu和sigma ,而不是您的模型給出數據的可能性。 總之,你的方法是錯誤的

你正在做非線性最小二乘,按照@usethedeathstar已經提到的那樣,你應該直接進行F-test 考慮以下示例,從http://www.walkingrandomly.com/?p=5254修改,我們使用R進行F-test 我們將討論如何將其轉換為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)自由度上並不重要。

要獲得ANOVA表:Residue DF很簡單。 殘差平方和: 0.08202*0.08202*8=0.053810.08243*0.08243*7=0.04756293 (注意: '剩余標准誤差:7自由度下0.08243'等)。 python ,你可以通過(y_observed-y_fitted)**2得到它,因為scipy.optimize.curve_fit()不返回scipy.optimize.curve_fit()

F-ratio0.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比是似然比λ的單調變換

或者以描述性方式,請參閱: http//www.stata.com/support/faqs/statistics/chi-squared-and-f-distributions/

你的公式對我來說是正確的。 它應該給你與scipy.stats.norm.logpdf(x, loc=mu, scale=sigma)相同的結果

既然你已經有mu和sigma的估計,我認為似乎沒有函數比測試,你可以插入你的結果。

如果您有兩個模型的估計值,其中一個嵌套在另一個模型中,那么您可以自己輕松地計算它。

http://en.wikipedia.org/wiki/Likelihood-ratio_test

以下是statsmodel中用於比較兩個嵌套線性模型的LR測試的方法的一部分https://github.com/statsmodels/statsmodels/blob/master/statsmodels/regression/linear_model.py#L1531

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM