2014-11-25 1 views
6

나는 지금부터 며칠 동안 싸워야한다는 질문을 받았습니다.최소 제곱 피트의 신뢰 밴드를 계산하십시오.

적합도 (95 %) 신뢰 밴드는 어떻게 계산합니까? 데이터에

피팅 곡선은 모든 물리학의 매일의 일이다 - 그래서 나는이 어딘가에 구현해야한다고 생각 -하지만 난 이것에 대한 구현을 찾을 나도 수학적으로이 작업을 수행하는 방법을 알고 할 수 없다 .

내가 찾은 유일한 것은 선형에 대한 좋은 일을 수행하는 seaborn입니다. 최소 - 스퀘어입니다.

linear-least-square

import numpy as np                                                       
from matplotlib import pyplot as plt 
import seaborn as sns 
import pandas as pd 

x = np.linspace(0,10) 
y = 3*np.random.randn(50) + x 

data = {'x':x, 'y':y} 
frame = pd.DataFrame(data, columns=['x', 'y']) 
sns.lmplot('x', 'y', frame, ci=95) 

plt.savefig("confidence_band.pdf") 
그러나 이것은 단지 선형 최소 광장입니다. 예를 들어 내가 좋아할 때. saturation-eqn과 같은 포화 곡선, 나는 망했다.

확실히, scipy.optimize.curve_fit과 같은 최소 제곱 법의 표준 오차로부터 t- 분포를 계산할 수 있습니다. 그러나 그것은 내가 찾고있는 것이 아닙니다.

도움 주셔서 감사합니다.

답변

6

StatsModels 모듈을 사용하면 쉽게이를 수행 할 수 있습니다.

this examplethis answer도 참조하십시오.

import numpy as np 
from matplotlib import pyplot as plt 

import statsmodels.api as sm 
from statsmodels.stats.outliers_influence import summary_table 

x = np.linspace(0,10) 
y = 3*np.random.randn(50) + x 
X = sm.add_constant(x) 
res = sm.OLS(y, X).fit() 

st, data, ss2 = summary_table(res, alpha=0.05) 
fittedvalues = data[:,2] 
predict_mean_se = data[:,3] 
predict_mean_ci_low, predict_mean_ci_upp = data[:,4:6].T 
predict_ci_low, predict_ci_upp = data[:,6:8].T 

fig, ax = plt.subplots(figsize=(8,6)) 
ax.plot(x, y, 'o', label="data") 
ax.plot(X, fittedvalues, 'r-', label='OLS') 
ax.plot(X, predict_ci_low, 'b--') 
ax.plot(X, predict_ci_upp, 'b--') 
ax.plot(X, predict_mean_ci_low, 'g--') 
ax.plot(X, predict_mean_ci_upp, 'g--') 
ax.legend(loc='best'); 
plt.show() 

Example

+0

불행하게도,이 있지만 아직 일반적인 비선형 함수, 현재 선형 함수에 대한 statsmodels에서만 가능하며, 다음 릴리스에서 일반화 선형 모델을 사용할 수 있습니다. – user333700

0

kmpfitconfidence_band()비선형 최소 제곱 법에 대한 신뢰 밴드를 계산 : 여기

귀하의 질문에 대한 답변입니다. 여기에 포화 곡선 :

from pylab import * 
from kapteyn import kmpfit 

def model(p, x): 
    a, b = p 
    return a*(1-np.exp(b*x)) 

x = np.linspace(0, 10, 100) 
y = .1*np.random.randn(x.size) + model([1, -.4], x) 

fit = kmpfit.simplefit(model, [.1, -.1], x, y) 
a, b = fit.params 
dfdp = [1-np.exp(b*x), -a*x*np.exp(b*x)] 
yhat, upper, lower = fit.confidence_band(x, dfdp, 0.95, model) 

scatter(x, y, marker='.', color='#0000ba') 
for i, l in enumerate((upper, lower, yhat)): 
    plot(x, l, c='g' if i == 2 else 'r', lw=2) 
savefig('kmpfit confidence bands.png', bbox_inches='tight') 

dfdp는 편미분 각 파라미터 p에 대하여 모델 F = A * (1-E^(B 형 *의 X))의 ∂f/∂p (즉 , a 및 b), 배경 링크에 대한 비슷한 질문에 내 answer 참조하십시오. 그리고 여기 출력 :

kmpfit confidence bands