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

如何在Python中绘制分位数残差Q-Q图?参数估计问题咨询

负二项GLM分位数残差Q-Q图及参数提取指南

一、分位数残差Q-Q图的绘制逻辑

你参考的三步法是对的,核心是把计数模型的观测值转换为正态分位数,具体操作:

  1. 对每个观测,计算给定自变量时,响应值小于等于当前值的条件累积概率;
  2. 用逆标准正态CDF(scipy.stats.norm.ppf)把这些概率转成正态分位数;
  3. 将转换后的分位数与理论正态分位数做Q-Q图。

二、smf.glm拟合负二项参数偏离的原因

smf.glm拟合负二项时需要注意:它默认用对数链接,但必须让模型同时估计均值参数和分散参数α。如果手动固定α或者没开启α的优化,拟合结果会严重偏离真实值。更稳妥的方式是用smf.negativebinomial,这个函数专门适配负二项回归,会自动估计两类参数,结果更稳定。

三、提取scipy.stats.nbinom的size和prob参数

statsmodels的负二项模型用均值-分散参数化,而scipy.stats.nbinom用size(形状参数r)和prob(成功概率p)参数化,转换步骤如下:

  1. 获取每个观测的均值μ:即模型的预测值model.predict();
  2. 获取分散参数α:
    • 用smf.negativebinomial拟合时,model.params[-1]就是α(它是模型最后一个估计的参数);
    • 用smf.glm的NegativeBinomial族时,model.family.alpha是估计的分散参数;
  3. 转换为scipy参数:
    • size = 1 / α
    • prob = size / (size + μ)

代码示例

import statsmodels.formula.api as smf
import scipy.stats as stats
import matplotlib.pyplot as plt
import numpy as np

# 拟合负二项模型(推荐用法)
model = smf.negativebinomial('y ~ x1 + x2 + ...', data=df).fit()

# 获取均值μ和分散参数α
mu = model.predict()
alpha = model.params[-1]

# 转换为scipy.nbinom的参数
size = 1 / alpha
prob = size / (size + mu)

# 计算分位数残差
cdf_vals = stats.nbinom.cdf(df['y'], n=size, p=prob)
# 截断边界值,避免norm.ppf(0/1)报错
cdf_vals = np.clip(cdf_vals, 1e-10, 1 - 1e-10)
quantile_residuals = stats.norm.ppf(cdf_vals)

# 绘制Q-Q图
stats.probplot(quantile_residuals, plot=plt)
plt.title('负二项模型分位数残差Q-Q图')
plt.show()

四、避坑提醒

  • 用smf.glm拟合负二项时,必须让模型自动估计α,不能手动固定;
  • 计算CDF后一定要截断边界值,否则会出现无穷值导致绘图失败;
  • 数百变量的大DataFrame用smf.negativebinomial完全能处理,拟合效率足够。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 14:20:49