【问题标题】:How to add sum to zero constraint to GLM in Python?如何在 Python 中将总和为零约束添加到 GLM?
【发布时间】:2015-05-29 10:33:20
【问题描述】:

我使用 statsmodel glm 函数在 Python 中设置了一个模型,但现在我想在模型中添加一个总和为零的约束。

模型定义如下:

import statsmodels.formula.api as smf
model = smf.glm(formula="A ~ B + C + D", data=data, family=sm.families.Poisson()).fit()

在 R 中,要添加约束,我只需执行以下操作:

model <- glm(A ~ B + C + D –1, family=poisson(), data=data, contrasts=list(C="contr.sum", D="contr.sum"))

这将总和为零约束添加到 C 和 D,但我不确定如何在 Python 中实现相同的目标。

我已经看到有一个fit_constraint() 方法可用,但我不太确定如何使用它,或者它是否适合用来实现我的要求。

http://statsmodels.sourceforge.net/devel/generated/statsmodels.genmod.generalized_linear_model.GLM.fit_constrained.html#statsmodels.genmod.generalized_linear_model.GLM.fit_constrained

任何人都可以提供任何建议来应用此约束吗?

【问题讨论】:

  • 这是否将 C 和 D 的总和分别强制为零? Sum 对比编码是否适用于此? statsmodels.sourceforge.net/devel/contrasts.htmlfit_constrained 将为此工作,并将转换设计矩阵。我需要检查,但我认为您需要的只是一个包含两行的限制矩阵,在相应的列中有1,一个用于C 的级别,一个用于D 的级别..

标签: python r numpy statsmodels


【解决方案1】:

这里是一个例子来说明fit_constrained,使用高斯族,因为我没有很快找到一个带有分类变量的泊松例子

import pandas
import statsmodels.api as sm
from statsmodels.formula.api import glm

url = 'http://www.ats.ucla.edu/stat/data/hsb2.csv'
hsb2 = pandas.read_table(url, delimiter=",")

mod = glm("write ~ C(race) - 1", data=hsb2)
res = mod.fit()
print(res.summary())

所有系数相加为零的约束

res_c = mod.fit_constrained('C(race)[1] + C(race)[2] + C(race)[3] + C(race)[4] = 0')
print(res_c.summary())

                 Generalized Linear Model Regression Results                  
==============================================================================
Dep. Variable:                  write   No. Observations:                  200
Model:                            GLM   Df Residuals:                      197
Model Family:                Gaussian   Df Model:                            2
Link Function:               identity   Scale:                   1232.08314649
Method:                          IRLS   Log-Likelihood:                -993.41
Date:                Wed, 25 Mar 2015   Deviance:                   2.4149e+05
Time:                        16:42:37   Pearson chi2:                 2.41e+05
No. Iterations:                     1                                         
==============================================================================
                 coef    std err          z      P>|z|      [95.0% Conf. Int.]
------------------------------------------------------------------------------
C(race)[1]     1.0002    221.565      0.005      0.996      -433.260   435.260
C(race)[2]   -41.1814    267.253     -0.154      0.878      -564.988   482.626
C(race)[3]    -6.3498    235.771     -0.027      0.979      -468.453   455.754
C(race)[4]    46.5311    100.184      0.464      0.642      -149.827   242.889
==============================================================================

Model has been estimated subject to linear equality constraints.

约束以逗号分隔,默认为零:

res_c2 = mod.fit_constrained('C(race)[1] + C(race)[2], C(race)[3] + C(race)[4]')
print(res_c2.summary())

最后一张照片

                 Generalized Linear Model Regression Results                  
==============================================================================
Dep. Variable:                  write   No. Observations:                  200
Model:                            GLM   Df Residuals:                      198
Model Family:                Gaussian   Df Model:                            1
Link Function:               identity   Scale:                   1438.99574167
Method:                          IRLS   Log-Likelihood:                -1008.9
Date:                Wed, 25 Mar 2015   Deviance:                   2.8204e+05
Time:                        16:42:37   Pearson chi2:                 2.82e+05
No. Iterations:                     1                                         
==============================================================================
                 coef    std err          z      P>|z|      [95.0% Conf. Int.]
------------------------------------------------------------------------------
C(race)[1]    13.6286    242.003      0.056      0.955      -460.689   487.946
C(race)[2]   -13.6286    242.003     -0.056      0.955      -487.946   460.689
C(race)[3]   -41.6606    111.458     -0.374      0.709      -260.115   176.794
C(race)[4]    41.6606    111.458      0.374      0.709      -176.794   260.115
==============================================================================

Model has been estimated subject to linear equality constraints.

我不确定 patsy 公式是如何工作的,因此如果有多个分类解释变量,则不会删除任何级别。

【讨论】:

  • 嗯...您发布的内容似乎可以正常工作,但我遇到了一个错误,该错误甚至无法创建模型。我得到AttributeError: 'GLM' object has no attribute 'fit_constrained'
  • 如果模型是“write ~race - 1”,我尝试使用 'race = 1' 作为 fit_constrained。我收到错误:数组不能为空
  • 约翰,在这种情况下没有什么可估计的。 statsmodels 中的模型不是为这种情况设计的。有可能支持在特定情况下,通常空数组行为将主要从 numpy 继承。
猜你喜欢
  • 2018-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多