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为阶数。

相关推荐
第九序言T7 小时前
Python 数据处理进阶(十八)批量处理同结构文件:一个文件夹一次跑完
开发语言·python·自动化·pandas·数据处理
Java后端的Ai之路7 小时前
CAS并发控制-从CPU指令到企业级乐观锁
vue.js·人工智能·python·cas·乐观锁
qq_426003967 小时前
UI自动化高频次登录login限流解决方案
python·ui·自动化
Sakura_j_h_8 小时前
EasyEDA PCB 快速设计Skills
c++·python·github
quantdash_cc9 小时前
如何验证历史行情的交易日期是否完整覆盖研究区间?
python·数据分析·pandas·量化交易·股票数据·quantdash
I Am a robert girl9 小时前
当智能体学会“串通”:从长程交互中读懂涌现式合谋
python·多智能体系统·多智能体协作·llm agent·涌现式合谋·对齐问题·激励机制设计
云和数据.ChenGuang10 小时前
光哥说Python RAG 系统需要哪些评估指标:从检索到生成的全链路评测指南
网络·人工智能·python·算法·langchain
专注仿真10 小时前
线性回归和逻辑回归算法详解
开发语言·人工智能·python·大模型训练·控制算法
wflynn11 小时前
GitHub 今日推荐|Edge0:让大号 MoE 模型在一台 Mac 上流式跑起来
python·开源·github
2601_9679801111 小时前
python之用scapy分层解析pcap报文(Ethernet帧、IP数据包、TCP数据包、UDP数据包、Raw数据包)
python·scapy·pcap·协议分析·网络数据包