Python 如何在statsmodels中使用gamma GLM的比例和形状参数

Python 如何在statsmodels中使用gamma GLM的比例和形状参数,python,statistics,regression,statsmodels,Python,Statistics,Regression,Statsmodels,任务 我有如下数据: 我想使用statsmodels将一个广义线性模型(glm)与gamma族中的模型相匹配。使用这个模型,对于我的每一次观察,我想计算观察到小于(或等于)该值的概率。换句话说,我想计算: p(y在R中,可以使用1/离散度作为形状估计值获得(检查此项)。在statsmodels中,离散度估计值的命名是一个不幸的比例。因此,您采用了此值的倒数来获得形状估计值。我用下面的一个示例来展示它: values = gamma.rvs(2,scale=5,size=500) fit = s

任务

我有如下数据:

我想使用
statsmodels
将一个广义线性模型(glm)与gamma族中的模型相匹配。使用这个模型,对于我的每一次观察,我想计算观察到小于(或等于)该值的概率。换句话说,我想计算:


p(y在R中,可以使用1/离散度作为形状估计值获得(检查此项)。在statsmodels中,离散度估计值的命名是一个不幸的
比例
。因此,您采用了此值的倒数来获得形状估计值。我用下面的一个示例来展示它:

values = gamma.rvs(2,scale=5,size=500)
fit = sm.GLM(values, np.repeat(1,500), family=sm.families.Gamma(sm.families.links.log())).fit()
这是一个仅限截距的模型,我们检查截距和色散(命名比例):

所以平均值是
exp(2.2599)=9.582131
,如果我们使用形状作为1/离散度,
shape=1/0.563667465203953=1.774096
,这就是我们模拟的

如果我使用模拟数据集,它工作得非常好。这是它的外观,形状为10:

from scipy.stats import gamma
import numpy as np
import matplotlib.pyplot as plt
import patsy
import statsmodels.api as sm
import pandas as pd

_shape = 10
myData = pd.DataFrame({'x':np.random.uniform(0,10,size=500)})
myData['y'] = gamma.rvs(_shape,scale=np.exp(-myData['x']/3 + 0.5)/_shape,size=500)

myData.plot("x","y",kind="scatter")

然后,我们像您一样拟合模型:

y, X = patsy.dmatrices('y ~ x', data=myData, return_type='dataframe')
mod = sm.GLM(y, X, family=sm.families.Gamma(sm.families.links.log())).fit()
mu = mod.predict(exog=X) 

shape_from_model = 1/mod.scale

probabilities = [gamma(shape_from_model, scale=m_i/shape_from_model).cdf(y_i) for m_i, y_i in zip(mu,myData['y'])]
并绘制:

fig, ax = plt.subplots()
im = ax.scatter(myData["x"],myData["y"],c=probabilities)
im = ax.scatter(myData['x'],mu,c="r",s=1)
fig.colorbar(im, ax=ax)

如果我理解正确,
mod.scale
实际上是离散度,即1/shape。因此
mod.scale=1/shape
。如果我使用你的代码并检查一下,我确实发现
mod.scale=.1009
。我不理解的是为什么你没有更改
概率的计算。现在你使用
m\I/mod.scale>
作为形状参数。但这等于
mi/dispersion=mi*shape=scale*shape^2
。作为您使用的比例
mod.scale=dispersion=1/shape
。它不应该是
gamma(1/mod.scale,scale=mi*mod.scale)。cdf(y)
?是的,你是对的,很抱歉我写得太晚了,我从错误的笔记本电池中获取了概率…我已更新了代码。现在应该是正确的。感谢您发现错误!
y, X = patsy.dmatrices('y ~ x', data=myData, return_type='dataframe')
mod = sm.GLM(y, X, family=sm.families.Gamma(sm.families.links.log())).fit()
mu = mod.predict(exog=X) 

shape_from_model = 1/mod.scale

probabilities = [gamma(shape_from_model, scale=m_i/shape_from_model).cdf(y_i) for m_i, y_i in zip(mu,myData['y'])]
fig, ax = plt.subplots()
im = ax.scatter(myData["x"],myData["y"],c=probabilities)
im = ax.scatter(myData['x'],mu,c="r",s=1)
fig.colorbar(im, ax=ax)