You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

scikit-learn中TweedieRegressor的p值计算偏差及方差协方差矩阵疑问

带权重Tweedie GLM的方差协方差矩阵估算与scikit-learn p值匹配方案

一、带权重GLM的方差协方差矩阵正确计算逻辑

对于带权重的Tweedie族GLM,方差协方差矩阵的正确估算需要结合样本权重和Tweedie分布的方差结构,公式为:

vcov = (XᵀWX)⁻¹ XᵀWVWX (XᵀWX)⁻¹

其中各参数定义:

  • X:包含截距项的特征矩阵(若模型带截距)
  • W:对角样本权重矩阵(无权重时为单位矩阵)
  • V:对角方差矩阵,对角元素为Tweedie分布的方差,即var(y) = μ^p(μ是模型拟合值,p是Tweedie幂参数)

statsmodels默认采用这种基于模型假设的方差估计,而scikit-learn的TweedieRegressor未直接提供该矩阵,需要手动实现。

二、scikit-learn匹配statsmodels p值的具体步骤

1. 对齐模型核心参数

先确保两个工具的模型设置完全一致:

  • 确认Tweedie幂参数power完全相同(如均为1.5对应复合泊松分布)
  • 确认链接函数一致(默认均为log,若修改需同步)
  • 同步截距设置(两个模型要么都带截距,要么都不带)
  • 样本权重完全复用

2. 手动计算方差协方差矩阵

用Python代码实现核心计算(需导入numpy和scipy.stats):

import numpy as np
from scipy import stats
from sklearn.linear_model import TweedieRegressor

# 假设已拟合好scikit-learn模型model,特征矩阵X,样本权重weights(可选)
model = TweedieRegressor(power=1.5, fit_intercept=True)
model.fit(X, y, sample_weight=weights)

# 构造带截距的特征矩阵
X_with_intercept = np.hstack([np.ones((X.shape[0], 1)), X])
# 获取拟合值
mu = model.predict(X)
# 计算Tweedie方差
var = mu ** model.power
# 构造权重矩阵
W = np.diag(weights) if weights is not None else np.eye(X.shape[0])

# 计算(XᵀWX)及其逆
XtWX = X_with_intercept.T @ W @ X_with_intercept
inv_XtWX = np.linalg.inv(XtWX)
# 计算中间项XᵀWVWX
XtWVWX = X_with_intercept.T @ W @ np.diag(var) @ W @ X_with_intercept
# 最终方差协方差矩阵
vcov = inv_XtWX @ XtWVWX @ inv_XtWX

3. 计算匹配的p值

基于得到的方差协方差矩阵计算标准误和p值:

# 提取系数(包含截距)
coef = np.hstack([model.intercept_, model.coef_])
# 计算标准误
se = np.sqrt(np.diag(vcov))
# 计算z统计量
z_scores = coef / se
# 计算双侧p值
p_values = 2 * (1 - stats.norm.cdf(np.abs(z_scores)))

三、p值差异的核心原因

之前的差异大概率是因为手动计算时误用了OLS风格的方差估计(仅用(XᵀWX)⁻¹),忽略了Tweedie分布的方差结构V矩阵,导致标准误被严重低估,最终p值远小于statsmodels的结果。

内容的提问来源于stack exchange,提问作者Sue

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 11:47:46