Statsmodels:更改输出中的变量名称/标签



在R-风格公式框架下定义分类变量的引用级别时,使用Statsmodels时,输出中变量的名称相当大,例如:

import statsmodels.api as sm
import statsmodels.formula.api as smf
sm.Logit.from_formula("y~ c(my_variable, ,Treatment(reference= 'reference_level')) "

将输出

C(x,Treatment(reference='reference_level'))[some_value] 

作为模型摘要中的变量名称。

如何在不链接变量名的情况下将此输出标签重命名为可读性更强的标签?

谢谢。

在后台,公式api使用Patsy将公式字符串应用于数据。长名字来自这个过程。

快速解决方法是,当您调用summary()时,您可以选择包含xname参数。xname是应用于汇总系数表的每一行的标签列表。xname的长度必须与Result(fit()返回的对象(上的params属性的长度相同。

fit = sm.Logit.from_formula("variable ~ C(type,Treatment(reference= 'B'))",data=data).fit()
fit.summary(xname=["label 1", "label 2", "label 3", "etc."])

查看Summary对象以了解更多自定义设置。

您可以使用pd.Categorical来设置级别。参考将优先。例如,在以下数据集中,reference = 'B':

import statsmodels.api as sm
import statsmodels.formula.api as smf 
import pandas as pd
import numpy as np
np.random.seed(222)
data  = pd.DataFrame({'variable':np.random.randint(0,2,100),
'type': np.random.choice(['A','B','C'],100)
})
fit = sm.Logit.from_formula("variable ~ C(type,Treatment(reference= 'B'))",data=data).fit()
fit.summary()
coef   std err z   P>|z|   [0.025  0.975]
Intercept                               0.1542  0.393   0.392   0.695   -0.617  0.925
C(type, Treatment(reference='B'))[T.A] -0.4261  0.515   -0.828  0.408   -1.435  0.583
C(type, Treatment(reference='B'))[T.C]  0.2288  0.517   0.443   0.658   -0.784  1.241

如果你使用pd.分类,你会得到相同的结果:

data['type'] = pd.Categorical(data['type'],categories=['B','A','C'],ordered=True)
fit = sm.Logit.from_formula("variable ~ type",data=data).fit()
fit.summary()
coef   std err z   P>|z|   [0.025  0.975]
Intercept   0.1542  0.393   0.392   0.695   -0.617  0.925
type[T.A]   -0.4261 0.515   -0.828  0.408   -1.435  0.583
type[T.C]   0.2288  0.517   0.443   0.658   -0.784  1.241

最新更新