如何在Python中绘制分位数残差Q-Q图?参数估计问题咨询
负二项GLM分位数残差Q-Q图及参数提取指南
一、分位数残差Q-Q图的绘制逻辑
你参考的三步法是对的,核心是把计数模型的观测值转换为正态分位数,具体操作:
- 对每个观测,计算给定自变量时,响应值小于等于当前值的条件累积概率;
- 用逆标准正态CDF(
scipy.stats.norm.ppf)把这些概率转成正态分位数; - 将转换后的分位数与理论正态分位数做Q-Q图。
二、smf.glm拟合负二项参数偏离的原因
smf.glm拟合负二项时需要注意:它默认用对数链接,但必须让模型同时估计均值参数和分散参数α。如果手动固定α或者没开启α的优化,拟合结果会严重偏离真实值。更稳妥的方式是用smf.negativebinomial,这个函数专门适配负二项回归,会自动估计两类参数,结果更稳定。
三、提取scipy.stats.nbinom的size和prob参数
statsmodels的负二项模型用均值-分散参数化,而scipy.stats.nbinom用size(形状参数r)和prob(成功概率p)参数化,转换步骤如下:
- 获取每个观测的均值μ:即模型的预测值
model.predict(); - 获取分散参数α:
- 用
smf.negativebinomial拟合时,model.params[-1]就是α(它是模型最后一个估计的参数); - 用
smf.glm的NegativeBinomial族时,model.family.alpha是估计的分散参数;
- 用
- 转换为
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
相关产品推荐
相关产品推荐

