patsy:Python中的统计建模语法

文章目录

初步

patsy是Python中描述和构建统计模型的库,可以将类似R语言公式的字符串,翻译成构建模型需要的矩阵,是 statsmodels等统计库的底层核心依赖。正常pip安装

复制代码
pip install patsy

简单示例如下

python 复制代码
import numpy as np
from patsy import dmatrices
data = {"x1":np.random.rand(10), "x2":np.random.rand(10), 'y':np.random.rand(10)}
y, X = dmatrices("y ~ x1 + x2", data)

【dmatrices】是patsy中的核心函数,用于构建响应变量矩阵 y y y和特征设计矩阵 x x x,其输入参数中,第一项是patsy的统计语法,第二项是支持字典索引的数据包。

y ~ x1+x2是patsy实现的Wilkinson-Rogers(WR) 语法,其中y, x1, x2来自data的key。

这条语句构建了 y = β 0 + β 1 x 1 + β 2 x 2 y=\beta_0+\beta_1x_1+\beta_2x_2 y=β0+β1x1+β2x2的数学模型,该问题写成矩阵形式即为

y = 1 x 1 x 2 β 0 β 1 β 2 y=\begin{bmatrix}1&x_1&x_2\end{bmatrix}\begin{bmatrix} \beta_0\\ \beta_1 \\ \beta_2 \end{bmatrix} y=1x1x2 β0β1β2

而dmatrices的输出项,即为左侧的 y y y和右侧的 1 x 1 x 2 \begin{bmatrix}1&x_1&x_2\end{bmatrix} 1x1x2矩阵。

就 y ∼ x 1 + x 2 y\sim x_1+x_2 y∼x1+x2这个模型而言,其生成的 y y y矩阵与输入的 y y y是相同的,更多时候,我们关注的是 ∼ \sim ∼右侧模型的矩阵化,为此patsy提供了另一个高频函数【dmatrix】

python 复制代码
from patsy import dmatrix
dmatrix("x1+x2", data)

patsy语法

patsy语法中的运算符及其含义如下表所示。

运算符 示例 模型
~ y~x1 $y=\beta_0+\beta_1x_1
+ y~x1+x2 $y=\beta_0+\beta_1x_1+\beta_2x_2
: y~x1:x2 $y=\beta_0+\beta_1(x_1x_2)
/ y~x1/x2 $y-\beta_0+\beta_1x_1+\beta_2(x_1x_2)
* y~x1*x2 $y=\beta_0+\beta_1x_1+\beta_2x_2+\beta_3(x_1x_2)
** y~(x1+x2)**2 $y=\beta_0+\beta_1x_1+\beta_2x_2+\beta_3x_1x_2

需要注意的是,WR语法默认包含截距项 β 0 \beta_0 β0,如想移除该项,只需减1即可,例如x1-1。

从上表可知,WR语法中,最基础的运算就是+, :,分别用于变量的主效应和纯交互作用,但全交互作用*的使用频率可能比:更高。

函数

在patsy的语法字符串中,可以识别Numpy函数,从而对数据做预处理,例如dmatrix("np.exp(x1)", data),那么输出结果为 1 , e x 1 1, e^{x_1} 1,ex1。

此外,patsy的语法表达式中还内置了一些方法,用于构建非线性基函数或平滑想,比如B样条函数

python 复制代码
x = np.linspace(0., 1., 100)
y = dmatrix("bs(x, df=6, degree=3, include_intercept=True) - 1", {"x": x})
b = np.array([1.3, 0.6, 0.9, 0.4, 1.6, 0.7])

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'Times New Roman'

plt.plot(x, y*b)
plt.plot(x, np.dot(y, b), color='k', linewidth=3);
plt.show()

patsy内置函数包括

函数名 中文名称 关键参数 核心特点 典型适用场景
poly 正交多项式(Orthogonal Polynomials) degree 使用全局多项式,通过正交化消除了高阶多项式常见的多重共线性问题;曲线形状受全局数据影响。 变量间存在相对简单、平滑的全局非线性趋势(如抛物线、S型)。
bs B样条(B-splines) df, knots, degree 局部控制能力强,改变一个节点只影响局部曲线;但在数据边界处容易产生较大的方差(边界不稳定)。 通用的连续变量非线性拟合,对局部变化敏感的数据。
cr 立方回归样条(Cubic Regression Splines) df, knots 在边界处比 bs 更稳定,计算效率通常更高;默认使用惩罚平滑(类似R的mgcv包),是 bs 的极佳替代品。 通用的连续变量非线性拟合,特别是当数据在边界处稀疏或 bs 表现不佳时(首选推荐)。
cc 循环立方样条(Cyclic Cubic Splines) df, knots 强制要求样条在周期的起点和终点处不仅函数值相等,其一阶和二阶导数也完全连续(无缝衔接)。 具有周期性/循环性质的变量。如:一天中的小时、一年中的月份、角度(0-360度)。
te 张量积样条(Tensor Product Splines) df 将一维样条基通过张量积扩展到多维空间,用于捕捉多个连续变量联合的非线性影响 两个或多个连续变量对目标变量存在非可加的、联合的非线性交互作用。

参数中,df为自由度,knots为节点,degree为阶数。

相关推荐
weixin1997010801611 小时前
《淘宝TOP API:落地方案、接口边界与业务踩坑 —— 聚石塔内外价差 10 倍的真相》(附 Python 源码)
开发语言·python
梦想的颜色11 小时前
【编程实战】AI 时代 APP 开发全栈硬核指南:技术选型 + AI 架构 + 模型落地全维度决策
python·flutter·react native·react.js·ai·桌面应用·milvus
Madison-No711 小时前
多语言聊天大模型--测试报告
linux·git·python·selenium·jmeter·自动化·postman
鲲鹏ai11 小时前
盈启鲲鹏数字人招商政策
大数据·人工智能·python
荣码11 小时前
从0到1搭一个生产级RAG系统:串联前面21篇所有知识
java·python
小师兄吃牛肉12 小时前
Java语法 | 多重循环
java·开发语言·python
明如正午12 小时前
用 Python 一键把 ASC 文件转成 BLF(基于 python-can)
python·can·blf·asc
leisoo809713 小时前
融资融券数据怎么查两融指标含义与杠杆观察方法 IG50免费开源股票数据API接口
开发语言·jvm·数据库·python·json
Patrick在香港13 小时前
同一份脚本,mac 正常 Windows 乱码:open() 默认编码实测(附 3.15 终局)
utf-8·windows·python·macos·跨平台·编码·标准库
勿信日志14 小时前
Playwright 元素定位:一个 width>50 过滤器把 42px 的输入框删掉了
python