在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