statsmodels如何编码作为字符串输入的endog变量?

时间:2018-01-18 02:37:34

标签: python python-3.x logistic-regression statsmodels

我很擅长使用statsmodels进行统计分析。我大部分时间都得到了预期的答案,但有些事情我不太了解statsmodels在作为字符串输入时为逻辑回归定义endog(依赖)变量的方式。

示例问题的Pandas数据框示例如下所示。 yN,yA和yA2列表示定义endog变量的不同方式:yN是编码为0,1的二进制变量; yA是二进制变量编码' y' n' n'和yA2是一个变量编码的' x' y'和' w':

import pandas as pd

df = pd.DataFrame({'yN':[0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1],
                   'yA':['y','y','y','y','y','y','y','n','n','n','n','n','n','n','n','n','n','n','n','n',],
                   'yA2':['y','y','y','w','y','w','y','n','n','n','n','n','n','n','n','n','n','n','n','n',],
                   'xA':['a','a','b','b','b','c','c','c','c','c','a','a','a','a','b','b','b','b','c','c']})

数据框如下所示:

   xA yA yA2  yN
0   a  y   y   0
1   a  y   y   0
2   b  y   y   0
3   b  y   w   0
4   b  y   y   0
5   c  y   w   0
6   c  y   y   0
7   c  n   n   1
8   c  n   n   1
9   c  n   n   1
10  a  n   n   1
11  a  n   n   1
12  a  n   n   1
13  a  n   n   1
14  b  n   n   1
15  b  n   n   1
16  b  n   n   1
17  b  n   n   1
18  c  n   n   1
19  c  n   n   1

我可以运行一个标准'使用0/1编码的endog变量和分类exog变量(xA)的逻辑回归如下:

import statsmodels.formula.api as smf
import statsmodels.api as sm

phjLogisticRegressionResults = smf.glm(formula='yN ~ C(xA)',
                                       data=df,
                                       family = sm.families.Binomial(link = sm.genmod.families.links.logit)).fit()

print('\nResults of logistic regression model')
print(phjLogisticRegressionResults.summary())

这会产生以下结果,正如我所期望的那样:

                 Generalized Linear Model Regression Results                  
==============================================================================
Dep. Variable:                     yN   No. Observations:                   20
Model:                            GLM   Df Residuals:                       17
Model Family:                Binomial   Df Model:                            2
Link Function:                  logit   Scale:                             1.0
Method:                          IRLS   Log-Likelihood:                -12.787
Date:                Thu, 18 Jan 2018   Deviance:                       25.575
Time:                        02:19:45   Pearson chi2:                     20.0
No. Iterations:                     4                                         
==============================================================================
                 coef    std err          z      P>|z|      [0.025      0.975]
------------------------------------------------------------------------------
Intercept      0.6931      0.866      0.800      0.423      -1.004       2.391
C(xA)[T.b]    -0.4055      1.155     -0.351      0.725      -2.669       1.858
C(xA)[T.c]     0.2231      1.204      0.185      0.853      -2.137       2.583
==============================================================================

但是,如果我使用二进制endog变量编码运行相同的模型' y'和' n' (但与前一个例子中直观的0/1编码完全相反)或者如果我包含一个变量,其中一些' y'代码已被' w' (即现在有3个结果),它仍然产生如下相同的结果:

phjLogisticRegressionResults = smf.glm(formula='yA ~ C(xA)',
                                       data=df,
                                       family = sm.families.Binomial(link = sm.genmod.families.links.logit)).fit()


                 Generalized Linear Model Regression Results                  
==============================================================================
Dep. Variable:     ['yA[n]', 'yA[y]']   No. Observations:                   20
Model:                            GLM   Df Residuals:                       17
Model Family:                Binomial   Df Model:                            2
Link Function:                  logit   Scale:                             1.0
Method:                          IRLS   Log-Likelihood:                -12.787
Date:                Thu, 18 Jan 2018   Deviance:                       25.575
Time:                        02:29:06   Pearson chi2:                     20.0
No. Iterations:                     4                                         
==============================================================================
                 coef    std err          z      P>|z|      [0.025      0.975]
------------------------------------------------------------------------------
Intercept      0.6931      0.866      0.800      0.423      -1.004       2.391
C(xA)[T.b]    -0.4055      1.155     -0.351      0.725      -2.669       1.858
C(xA)[T.c]     0.2231      1.204      0.185      0.853      -2.137       2.583
==============================================================================

...和...

phjLogisticRegressionResults = smf.glm(formula='yA2 ~ C(xA)',
                                       data=df,
                                       family = sm.families.Binomial(link = sm.genmod.families.links.logit)).fit()


                       Generalized Linear Model Regression Results                        
==========================================================================================
Dep. Variable:     ['yA2[n]', 'yA2[w]', 'yA2[y]']   No. Observations:                   20
Model:                                        GLM   Df Residuals:                       17
Model Family:                            Binomial   Df Model:                            2
Link Function:                              logit   Scale:                             1.0
Method:                                      IRLS   Log-Likelihood:                -12.787
Date:                            Thu, 18 Jan 2018   Deviance:                       25.575
Time:                                    02:29:06   Pearson chi2:                     20.0
No. Iterations:                                 4                                         
==============================================================================
                 coef    std err          z      P>|z|      [0.025      0.975]
------------------------------------------------------------------------------
Intercept      0.6931      0.866      0.800      0.423      -1.004       2.391
C(xA)[T.b]    -0.4055      1.155     -0.351      0.725      -2.669       1.858
C(xA)[T.c]     0.2231      1.204      0.185      0.853      -2.137       2.583
==============================================================================

The Dep。输出表中的可变单元格可识别但存在差异但结果相同。当statogodels作为字符串变量输入时,statsmodel使用什么规则来编码endog变量?

1 个答案:

答案 0 :(得分:3)

警告:此行为不是设计的,而是通过patsy和statsmodel的交互实现的。

首先,patsy完成字符串公式和数据的所有转换,以创建相应的设计矩阵,并可能转换响应变量。 在响应变量endog或y是字符串的情况下,patsy将其视为分类,并使用分类变量的默认编码并构建相应的虚拟变量数组。此外,AFAIK patsy按字母数字排序水平,这决定了列的顺序。

模型的主要部分,无论是GLM还是Logit / Probit,只需要获取patsy提供的数组,并在模型中以适当的方式解释它,如果可能的话,并且没有太多特定的输入检查。

在示例中,patsy使用两列或三列创建虚拟变量数组。 statsmodels将其解释为"成功","失败"计数。因此,字母数字顺序中的最低类别定义了成功"。行总和对应于观察中的试验次数,在这种情况下为1。 如果或者它适用于三列必须缺少输入检查,这意味着它是第一个反对它的二进制响应。 (我想,这是实施细节的结果,而不是设计。)

相关问题在于离散模型Logit。 https://github.com/statsmodels/statsmodels/issues/2733 目前还没有明确的解决方案,不需要再次猜测用户的意图。

所以现在最好将数值用于二进制模型,尤其是因为定义了成功"并且参数的符号取决于分类级别名称的字母数字排序。 例如,尝试重命名"成功"水平到" z"而不是" n"。