scipy.stats.linregress、numpy.polynomial.polynomial.polyfit 和 statsmodels.api.OLS 之间的差异

Posted

技术标签:

【中文标题】scipy.stats.linregress、numpy.polynomial.polynomial.polyfit 和 statsmodels.api.OLS 之间的差异【英文标题】:Difference(s) between scipy.stats.linregress, numpy.polynomial.polynomial.polyfit and statsmodels.api.OLS 【发布时间】:2015-09-16 13:36:08 【问题描述】:

似乎所有三个函数都可以进行简单的线性回归,例如

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-value

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

【问题讨论】:

【参考方案1】:

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

通过增加通用性:

scipy.stats.linregress 仅处理具有专用代码的单个解释变量的情况,并计算一些额外的统计数据。

numpy.polynomial.polynomial.polyfit 估计单个变量的多项式的回归,但在额外统计数据方面没有返回太多。

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

为了在 Python 中估计线性模型的选项的完整性(贝叶斯分析之外),我们还应该考虑 scikit-learn LinearRegression 和类似的线性模型,它们对于在大量解释变量中进行选择很有用,但不拥有 statsmodels 提供的大量结果。

【讨论】:

【参考方案2】:

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

【讨论】:

当您考虑到np.polyfit 的一般性有多普遍时,这一点也不奇怪 - 它并不是真正为线性回归设计的,而是可以将任意顺序的多项式拟合到 之间的关系x & y(而linregress 只能容纳一行)。 有趣的是,对于 小向量polyfit 实际上比scipy.stats.linregressstatsmodels.api.OLS快很多。用长度为 100-1000 左右的系列再试一次。您还可以请求一些额外的参数,例如cov(估计量的协方差矩阵;对角线给出平方标准误差),而不会花费太多时间。所以对于较小的系列来说,numpy 似乎更胜一筹。

以上是关于scipy.stats.linregress、numpy.polynomial.polynomial.polyfit 和 statsmodels.api.OLS 之间的差异的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Matlab 中为 libSVM 的 nu-SVM 使用变量而不是 nu 参数的数量?

linux提示[-f: 未找到命令

LibSVM 一类分类 nu 参数不是异常值的一小部分吗?

Xamarin Forms 项目错误 NU1201

R语言e1071包中的支持向量机:构建nu-classification类型的支持向量机SVM并分析不同nu值惩罚下模型分类螺旋线型(sprials)线性不可分数据集的表现

nu.xom:Serializer