scipy linregress函数返回的标准误差错误?
我遇到了一个奇怪的情况,使用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?
5 个回答
2
没错,这是真的——linregress返回的就是标准的梯度估计;而标准估计的结果(Y)是相关的,你可以通过乘以linregress给出的梯度的标准误差(SEG)来计算SEE:SEG = SEE / sqrt( sum of (X - average X)**2 )。
Stack Exchange不支持latex格式,不过如果你感兴趣的话,可以在这里找到相关的数学内容,具体在“分析样本数据”这个标题下。
9
我刚刚从SciPy用户组得知,这里的std_err代表的是梯度线的标准误差,而不是像Excel那样的预测y值的标准误差。不过,使用这个函数的用户要小心,因为这个库以前的行为并不是这样——它之前的输出和Excel是完全一样的,而这种变化似乎是在过去几个月发生的。
总之,我还是在寻找Python中与STEYX相等的功能。
6
你可以试试这个叫做 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