scipy linregress function ошибочная стандартная ошибка возврата? - PullRequest
7 голосов
/ 11 января 2010

У меня странная ситуация с scipy.stats.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 против 3,63 у Сципи. Кто-нибудь знает, что здесь происходит? Любой альтернативный способ получения стандартной ошибки регрессии в Python, без перехода в Rpy ?

Ответы [ 4 ]

8 голосов
/ 11 января 2010

Я только что сообщил группе пользователей SciPy, что std_err здесь представляет стандартную ошибку линии градиента, а не стандартную ошибку предсказанных значений y, согласно Excel. Тем не менее, пользователи этой функции должны быть осторожны, потому что это не всегда было поведением этой библиотеки - она ​​использовалась для вывода точно в формате Excel, и переключение, по-видимому, произошло в последние несколько месяцев.

В любом случае, все еще ищем эквивалент STEYX в Python.

6 голосов
/ 11 января 2010

Вы можете попробовать 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
2 голосов
/ 06 февраля 2018

да, это правда - стандартная оценка градиента - это то, что возвращает linregress; стандартная оценка оценки (Y) связана, однако, и вы можете вернуться обратно в SEE, умножив стандартную ошибку градиента (SEG), которую дает linregress: SEG = SEE / sqrt (сумма (X - среднее значение) Х) ** 2)

Stack Exchange не обрабатывает латекс, но математика здесь здесь , если вам интересно, под заголовком «Анализ данных образца».

0 голосов
/ 22 февраля 2019

Расчет "std err on y" в Excel на самом деле стандартное отклонение значений y.

То же самое для str err на x. Число «2» на последнем этапе - это степень свободы приведенного вами примера.

>>> x = [5.05, 6.75, 3.21, 2.66]
>>> y = [1.65, 26.5, -5.93, 7.96]
>>> def power(a):
        return a*5.3936-16.2811

>>> y_fit = list(map(power,x))
>>> y_fit
[10.956580000000002, 20.125700000000005, 1.032356, -1.934123999999997]
>>> var = [y[i]-y_fit[i] for i in range(len(y))]
>>> def pow2(a):
        return a**2

>>> summa = list(map(pow2,var))
>>> summa
[86.61243129640003, 40.63170048999993, 48.47440107073599, 97.89368972737596]
>>> total = 0
>>> for i in summa:
        total += i
>>> total
273.6122225845119
>>> import math
>>> math.sqrt(total/2)
11.696414463084658
...