首页Python【Python数据分析】6...

【Python数据分析】68.Python建模库介绍——statsmodels介绍


本系列文章配套代码获取有以下三种途径:

  • 可以在以下网站查看,该网站是使用JupyterLite搭建的web端Jupyter环境,因此无需在本地安装运行环境即可使用,首次运行浏览器需要下载一些配置文件(大约20M):

https://returu.github.io/Python_Data_Analysis/lab/index.html
链接:https://pan.baidu.com/s/1MYkeYeVAIRqbxezQECHwcA?pwd=mnsj 提取码:mnsj
  • 前往GitHub详情页面,单击 code 按钮,选择Download ZIP选项:
https://github.com/returu/Python_Data_Analysis

根据《Python for Data Analysis 3rd Edition》翻译整理

—————————————————–

statsmodels(https://www.statsmodels.org/stable/index.html) 是一个Python库,用于拟合多种统计模型,进行统计测试、数据探索和可视化,可以使用conda安装:conda install statsmodels。 

statsmodels中包括以下一些模型:

  • 线性模型、广义线性模型和鲁棒线性模型;

  • 线性混合效应模型;

  • 方差分析(ANOVA)方法;

  • 时间序列过程和状态空间模型;

  • 广义矩量法。

本文我们将使用statsmodels中的一些基本工具,并探索如何使用Patsy公式和pandas DataFrame对象的建模接口。
1.评估线性模型:

statsmodels中的线性回归模型有多种,从基本的(如普通最小二乘法)到复杂的(如迭代重新加权的最小二乘法)。

statsmodels中的线性模型有两个不同的主要接口:基于数组和基于公式。这些接口都是通过以下API模块导入访问的。

1import statsmodels.api as sm
2import statsmodels.formula.api as smf

首先我们根据一些随机数据生成一个线性模型:

 1# 定义随机种子,使得结果可重复
2rng = np.random.default_rng(seed=12345)
3
4# 定义一个用于生成具有特定均值和方差的正态分布数据的辅助函数
5def dnorm(mean, variance, size=1):
6    if isinstance(size, int):
7        size = size,
8    return mean + np.sqrt(variance) * rng.standard_normal(*size)
9
10N = 100
11# np.c_ 用于连接多个矩阵,X的shape为(100,3)
12X = np.c_[dnorm(0, 0.4, size=N),
13          dnorm(0, 0.6, size=N),
14          dnorm(0, 0.2, size=N)]
15eps = dnorm(0, 0.1, size=N)
16beta = [0.1, 0.3, 0.5]
17
18y = np.dot(X, beta) + eps # 已知参数beta的 "真实 "模型

线性模型一般是用截距项来拟合的,sm.add_constant 函数可以在现有的矩阵中添加截距项。

1X_model = sm.add_constant(X)

m.OLS类可以拟合一个普通最小二乘法的线性回归。

1model = sm.OLS(y, X)

模型的 fit 方法返回一个包含估计的模型参数和其他诊断的回归结果对象。

1results = model.fit()
2results.params # array([0.06681503, 0.26803235, 0.45052319])

在 results 上调用 summary 方法可以打印一个模型的详细诊断输出。

1print(results.summary())

上述输出中的参数名称已经被赋予了通用名称 x1,x2,等等。假设所有的模型参数都在一个DataFrame中。

1data = pd.DataFrame(X, columns=['col0''col1''col2'])
2
3data['y'] = y
4
5data[:5]

现在我们可以使用statsmodels公式API和Patsy公式字符串。在使用公式和pandas对象时,我们也不需要使用add_constant

 1results = smf.ols('y ~ col0 + col1 + col2', data=data).fit()
2
3results.params
4# Intercept   -0.020799
5# col0         0.065813
6# col1         0.268970
7# col2         0.449419
8# dtype: float64
9
10results.tvalues
11# Intercept   -0.652501
12# col0         1.219768
13# col1         6.312369
14# col2         6.567428
15# dtype: float64

给定新的样本外数据后,可以计算出给定的模型参数的预测值。

1results.predict(data[:5])
2# 0   -0.592959
3# 1   -0.531160
4# 2    0.058636
5# 3    0.283658
6# 4   -0.102947
7# dtype: float64

statsmodels中,还有许多额外的工具用于线性模型结果的分析、诊断和可视化。除了普通最小二乘法,还有其他类型的线性模型。

2.评估时间序列处理:

statsmodels中的另一类模型是用于时间序列分析的。其中有自回归过程、卡尔曼滤波和其他状态空间模型,以及多变量自回归模型。

首先模拟生成一些具有自回归结构和噪声的时间序列数据:

 1init_x = 4
2
3values = [init_x, init_x]
4N = 1000
5
6b0 = 0.8
7b1 = -0.4
8noise = dnorm(0, 0.1, N)
9for i in range(N):
10    new_x = values[-1] * b0 + values[-2] * b1 + noise[i]
11    values.append(new_x)

这个数据有一个AR(2)结构(两个滞后期),参数为0.8和-0.4。当你拟合一个AR模型时,你可能不知道要包括多少个滞后项,所以你可以用一些更大的滞后项来拟合模型。

 1from statsmodels.tsa.ar_model import AutoReg
2
3MAXLAGS = 5
4
5model = AutoReg(values, MAXLAGS)
6
7results = model.fit()
8
9# 结果中的估计参数首先是截距,然后是前两个滞后期的估计值。
10results.params
11# array([ 0.02346612,  0.8096828 , -0.42865278, -0.03336517,  0.04267874, -0.05671529])

这些模型的更深层次的细节以及如何解释它们的结果,可以在statsmodels文档中查看。

本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments