gpt4 book ai didi

python - 如何在 statsmodels 中使用 gamma GLM 的尺度和形状参数

转载 作者:行者123 更新时间:2023-12-04 08:49:00 24 4
gpt4 key购买 nike

任务
我有看起来像这样的数据:
Data
我想使用 statsmodels 将一个广义线性模型 (glm) 拟合到 Gamma 族中。 .使用这个模型,对于我的每个观察,我想计算观察到小于(或等于)该值的值的概率。换句话说,我想计算:

P(y <= y_i | x_i)


我的问题
  • 如何从 statsmodels 中拟合的 glm 中获取形状和比例参数?根据 this question statsmodels 中的 scale 参数不是以正常方式参数化的。我可以将它直接用作 scipy 中 Gamma 分布的输入吗? ?还是我需要先转型?
  • 我如何使用这些参数(形状和比例)来获得概率?目前我正在使用 scipy为每个 x_i 生成一个分布并从中得到概率。请参阅下面的实现。

  • 我当前的实现
    import scipy.stats as stat
    import patsy
    import statsmodels.api as sm

    # Generate data in correct form
    y, X = patsy.dmatrices('y ~ x', data=myData, return_type='dataframe')

    # Fit model with gamma family and log link
    mod = sm.GLM(y, X, family=sm.families.Gamma(sm.families.links.log())).fit()

    # Predict mean
    myData['mu'] = mod.predict(exog=X)

    # Predict probabilities (note that for a gamma distribution mean = shape * scale)
    probabilities = np.array(
    [stat.gamma(m_i/mod.scale, scale=mod.scale).cdf(y_i) for m_i, y_i in zip(myData['mu'], myData['y'])]
    )

    但是,当我执行此过程时,我得到以下结果:
    data with color
    目前预测的概率似乎都很高。图中的红线是预测均值。但即使对于这条线以下的点,预测的累积概率也约为 80%。这让我怀疑我使用的比例参数是否确实是正确的。

    最佳答案

    在 R 中,您可以使用 1/dispersion 获得形状的估计值(检查此 post)。不幸的是,statsmodels 中分散估计的命名是 scale .所以你确实采取了倒数来获得形状估计。我用下面的例子来展示它:

    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()
    这是一个仅截距模型,我们检查截距和离散度(命名比例):
    [fit.params,fit.scale]
    [array([2.27875973]), 0.563667465203953]
    所以平均值是 exp(2.2599) = 9.582131如果我们使用形状作为 1/dispersion , 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")
    enter image description here
    然后我们像你一样拟合模型:
    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)
    enter image description here

    关于python - 如何在 statsmodels 中使用 gamma GLM 的尺度和形状参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64174603/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com