似乎所有三个函数都可以进行简单的线性回归,例如
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中使用它们,如果这有任何区别。
答案 0 :(得分:12)
这三个是非常不同的,但在非常简单的例子只有一个解释变量的参数估计中重叠。
通过提高普遍性:
scipy.stats.linregress
仅处理具有专门代码的单个解释变量的情况,并计算一些额外的统计数据。
numpy.polynomial.polynomial.polyfit
估计单个变量的多项式的回归,但在额外的统计量方面没有多少回报。
statsmodels
OLS
是一种通用线性模型(OLS)估算类。它没有预先指定解释变量是什么,并且可以处理任何多变量解释变量数组,或公式和pandas DataFrames。它不仅返回估计的参数,还返回大量的统计推断和预测的结果统计和方法。
为了完整性地估算Python中的线性模型(贝叶斯分析之外),我们还应该考虑scikit-learn
LinearRegression
和类似的线性模型,这些模型对于在大量解释中进行选择很有用变量,但没有statsmodels提供的大量结果。
答案 1 :(得分: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