Python scipy.stats.linregresse、numpy.polynomy.polynomy.polyfit和statsmodels.api.OLS之间的差异

Python scipy.stats.linregresse、numpy.polynomy.polynomy.polyfit和statsmodels.api.OLS之间的差异,python,python-3.x,numpy,scipy,statsmodels,Python,Python 3.x,Numpy,Scipy,Statsmodels,这三个函数似乎都可以做简单的线性回归,例如 scipy.stats.linregress(x, y) numpy.polynomial.polynomial.polyfit(x, y, 1) x = statsmodels.api.add_constant(x) statsmodels.api.OLS(y, x) 我想知道这三种方法之间是否有真正的区别?我知道statsmodels是建立在scipy之上的,而scipy在很多事情上都有点依赖于numpy,所以我希望它们不会有太大的不同,但魔

这三个函数似乎都可以做简单的线性回归,例如

scipy.stats.linregress(x, y)

numpy.polynomial.polynomial.polyfit(x, y, 1)

x = statsmodels.api.add_constant(x)
statsmodels.api.OLS(y, x)
我想知道这三种方法之间是否有真正的区别?我知道
statsmodels
是建立在
scipy
之上的,而
scipy
在很多事情上都有点依赖于
numpy
,所以我希望它们不会有太大的不同,但魔鬼总是在细节上

更具体地说,如果我们使用上面的
numpy
方法,我们如何获得由其他两种方法默认给出的斜率的
p值


我在Python3中使用了它们,如果这有什么不同的话。

Scipy似乎快了一点——这实际上与我所期望的正好相反

x = np.random.random(100000)
y = np.random.random(100000)

%timeit numpy.polynomial.polynomial.polyfit(x, y, 1)
100 loops, best of 3: 8.89 ms per loop
%timeit scipy.stats.linregress(x,y)
100 loops, best of 3: 1.67 ms per loop

对于只有一个解释变量的非常简单的示例,这三个变量非常不同,但在参数估计上有重叠

通过增加普遍性:

scipy.stats.linregresse
只处理带有专门代码的单个解释变量的情况,并计算一些额外的统计数据

numpy.polynomy.polynomy.polyfit
估计单个变量多项式的回归,但在额外统计方面不会返回太多

statsmodels
OLS
是一个通用线性模型(OLS)估计类。它不预先指定解释变量是什么,可以处理解释变量的任何多元数组,或公式和数据帧。它不仅返回估计的参数,而且还返回用于统计推断和预测的大量结果统计和方法


< Python中的线性模型估计的完备性(贝叶斯分析外),还应考虑<代码> SCIKIT学习< /COD> <代码>线性回归< /代码>和类似的线性模型,这对于选择大量解释变量是有用的,但没有STATSMODEL提供的大量结果。

当你考虑更多的一般代码< NP.PultFult >时,这并不奇怪——它不是真正为线性回归设计的,但是可以将任意顺序的多项式拟合到x和y之间的关系(而
linregresse
只能拟合一条直线)。有趣的是,
polyfit
实际上比
scipy.stats.linregresse
statsmodels.api.OLS
对于小向量要快得多。请使用长度为100-1000左右的系列再试一次。您还可以请求一些额外的参数,例如
cov
(估计量的协方差矩阵;对角线给出平方标准误差),而不需要太多时间代价。因此,对于较小的系列,它似乎优于
numpy