2010-01-10 81 views
7

我有scipy.stats.linregress一個奇怪的情況似乎返回不正確的標準錯誤:scipy linregress函數錯誤的標準錯誤返回?

from scipy import stats 
x = [5.05, 6.75, 3.21, 2.66] 
y = [1.65, 26.5, -5.93, 7.96] 
gradient, intercept, r_value, p_value, std_err = stats.linregress(x,y) 
>>> gradient 
5.3935773611970186 
>>> intercept 
-16.281127993087829 
>>> r_value 
0.72443514211849758 
>>> r_value**2 
0.52480627513624778 
>>> std_err 
3.6290901222878866 

而Excel中返回如下:

slope: 5.394 

intercept: -16.281 

rsq: 0.525 

steyX: 11.696 

STEYX是Excel的標準誤差函數,返回11.696與scipy的3.63。有人知道這裏發生了什麼?在Python中獲得迴歸的標準錯誤的任何替代方法,而不會去Rpy

回答

4

你可以嘗試statsmodels包:

In [37]: import statsmodels.api as sm 

In [38]: x = [5.05, 6.75, 3.21, 2.66] 

In [39]: y = [1.65, 26.5, -5.93, 7.96] 

In [40]: X = sm.add_constant(x) # intercept 

In [41]: model = sm.OLS(y, X) 

In [42]: fit = model.fit() 

In [43]: fit.params 
Out[43]: array([ 5.39357736, -16.28112799]) 

In [44]: fit.rsquared 
Out[44]: 0.52480627513624789 

In [45]: np.sqrt(fit.mse_resid) 
Out[45]: 11.696414461570097 
+0

輝煌。謝謝你。正是我需要的。 – 2010-01-11 20:07:56

+0

很高興幫助。 :) – ars 2010-01-11 22:36:23

8

我剛剛被SciPy用戶組告知,這裏的std_err表示梯度線的標準誤差,而不是預測的y的標準誤差,如Excel所示。儘管如此,這個函數的用戶應該小心,因爲這並不總是這個庫的行爲 - 它用來輸出與Excel完全一樣的數據,並且轉換看起來是在過去幾個月發生的。

無論如何仍然在Python中尋找等效於STEYX。

1

是的,這是真的 - 漸變的標準估計是什麼linregress的回報; (Y)的標準估計值是相關的,並且您可以通過乘以由Landregress給出的梯度的標準誤差(SEG)來回溯SEE:SEG = SEE/sqrt((X - 平均值X)** 2)

堆棧交換不處理乳膠,但數學是here如果您有興趣,請在「分析樣本數據」標題下。