SciPy的linregress功能错误的标准错误返回?
-
19-09-2019 - |
题
我有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对比SciPy的的3.63。任何人都知道是怎么回事吗?获得在python回归的标准误差的任何替代方式,而不去RPY
解决方案
您可以尝试 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
其他提示
我刚刚被由该std_err这里表示梯度线,而不是标准的错误的预测的y的标准误差,按照Excel中SciPy的用户组通知。不过这个功能的用户应该小心,因为这并不总是这个库的行为 - 它用来输出完全一样Excel和转换似乎都发生在过去几个月。
反正仍在寻找一个相当于STEYX在Python。
是,这是真实的 - 梯度的标准估计是什么linregress返回;估计(Y)的标准估计是相关的,但,也可以通过标准误差乘以梯度(SEG)的回入看到linregress给你:SEG = SEE / SQRT((X的总和 - 平均X)** 2)
堆栈Exchange不处理乳胶但数学是这里如果你有兴趣,在“分析样本数据”的标题。
在EXCEL “Y上STD ERR” 的计算是实际的标准偏差Y的值的强>
这对于x上的std ERR相同。 “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
这会给你的等效使用Python STEYX:
fit = np.polyfit(x,y,deg=1)
n = len(x)
m = fit[0]
c = fit[1]
y_pred = m*x+c
STEYX = (((y-y_pred)**2).sum()/(n-2))**0.5
print(STEYX)
不隶属于 StackOverflow