Python statsmodels如何对输入为字符串的endog变量进行编码?

Python statsmodels如何对输入为字符串的endog变量进行编码?,python,python-3.x,logistic-regression,statsmodels,Python,Python 3.x,Logistic Regression,Statsmodels,我对使用statsmodels进行统计分析还不熟悉。大多数情况下,我都会得到预期的答案,但对于statsmodels在以字符串形式输入时定义逻辑回归的endog依赖变量的方式,我有一些不太了解的地方 用于说明该问题的数据框示例可定义如下所示。yN、yA和yA2列表示定义endog变量的不同方式:yN是编码为0、1的二进制变量;yA是编码为“y”、“n”的二进制变量;yA2是一个编码为“x”、“y”和“w”的变量: import pandas as pd df = pd.DataFrame({'

我对使用statsmodels进行统计分析还不熟悉。大多数情况下,我都会得到预期的答案,但对于statsmodels在以字符串形式输入时定义逻辑回归的endog依赖变量的方式,我有一些不太了解的地方

用于说明该问题的数据框示例可定义如下所示。yN、yA和yA2列表示定义endog变量的不同方式:yN是编码为0、1的二进制变量;yA是编码为“y”、“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())
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
==============================================================================
这将产生以下结果,这正是我所期望的:

                 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个结果,它仍然会产生如下相同的结果:

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())
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
==============================================================================

输出表中的Dep.Variable单元格可以识别,但存在差异,但结果相同。当endog变量作为字符串变量输入时,statsmodels使用什么规则对其进行编码?

警告:此行为不是故意的,是通过patsy和statsmodels的交互作用产生的

首先,patsy对字符串公式和数据进行所有转换,以创建相应的设计矩阵,并可能对响应变量进行转换。 如果响应变量endog或y是字符串,则patsy将其视为分类变量,并使用分类变量的默认编码,并构建相应的伪变量数组。此外,AFAIK patsy按字母数字对级别进行排序,从而确定列的顺序

模型的主要部分,无论是GLM还是Logit/Probit,都只是获取patsy提供的数组,并在可能的情况下以模型适当的方式对其进行解释,并且不需要太多具体的输入检查

在本例中,patsy创建具有两列或三列的虚拟变量数组。statsmodels将其解释为成功,失败才是关键。所以字母数字顺序中最低的类别定义了成功。行和对应于观察中的试验次数,在本例中为1。 如果它对三列有效,则必须缺少输入检查,这意味着它是针对rest二进制响应的第一个响应。我想这是实现细节的结果,而不是设计的结果

一个相关的问题是离散模型Logit。 目前还没有明确的解决方案,不需要对用户的意图进行大量的事后猜测

所以现在最好对二进制模型使用数值,特别是因为定义成功和参数符号的内容取决于分类级别名称的字母数字顺序。
例如,请在将您的成功级别重命名为z而不是n之后再尝试。

非常感谢您花时间给出了这样一个信息丰富的答案。对我目前正在进行的项目非常有价值。