首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用patsy和statsmodel删除类别

使用patsy和statsmodel删除类别
EN

Stack Overflow用户
提问于 2021-05-07 02:24:10
回答 1查看 65关注 0票数 1

我正在使用statsmodel和patsy来构建逻辑回归模型。我将在这里使用伪代码。让我们假设我有一个数据帧,其中包含一个分类变量,比如国家,有200个级别。我有理由相信它们中的一些是可预测的,所以我构建了一个模型,如

代码语言:javascript
复制
formula = 'outcome ~  C(Country)'

patsy将国家划分为不同的级别,该模型使用所有国家/地区构建。然后我看到以GB为单位的系数很高,所以我只想删除GB。我可以在patsy中做这样的事情吗:

代码语言:javascript
复制
formula = 'outcome ~ C(country) - C(country)[GB]'

我试过了,但没有改变任何事情。

EN

回答 1

Stack Overflow用户

发布于 2021-05-17 04:49:58

我不知道是否有一种方法可以使用patsy公式来子集Category,但是你可以在DataFrame中做到这一点。

例如

代码语言:javascript
复制
import numpy as np
import pandas as pd
import statsmodels.api as sm

# sample data
size = 100
np.random.seed(1)
countries = ['IT', 'UK', 'US', 'FR', 'ES']
df = pd.DataFrame({
    'outcome': np.random.random(size),
    'Country': np.random.choice(countries, size)
})
df['Country'] = df.Country.astype('category')

print(df.Country)

0     ES
1     IT
2     UK
3     US
4     UK
      ..
95    FR
96    UK
97    ES
98    UK
99    US
Name: Country, Length: 100, dtype: category
Categories (5, object): ['ES', 'FR', 'IT', 'UK', 'US']

假设我们想要删除类别"US"

代码语言:javascript
复制
# create a deep copy excluding 'US'
_df = df[df.Country!='US'].copy(deep=True)
print(_df.Country)

0     ES
1     IT
2     UK
4     UK
5     ES
      ..
94    UK
95    FR
96    UK
97    ES
98    UK
Name: Country, Length: 83, dtype: category
Categories (5, object): ['ES', 'FR', 'IT', 'UK', 'US']

即使DataFrame中不再有类别为"US"的元素,该类别仍然存在。如果我们在statsmodels模型中使用这个DataFrame,我们会得到一个singular matrix错误,所以我们需要删除未使用的类别

代码语言:javascript
复制
# remove unused category 'US'
_df['Country'] = _df.Country.cat.remove_unused_categories()
print(_df.Country)

0     ES
1     IT
2     UK
4     UK
5     ES
      ..
94    UK
95    FR
96    UK
97    ES
98    UK
Name: Country, Length: 83, dtype: category
Categories (4, object): ['ES', 'FR', 'IT', 'UK']

现在我们可以拟合一个模型

代码语言:javascript
复制
mod = sm.Logit.from_formula('outcome ~ Country', data=_df)
fit = mod.fit()
print(fit.summary())

Optimization terminated successfully.
         Current function value: 0.684054
         Iterations 4
                           Logit Regression Results                           
==============================================================================
Dep. Variable:                outcome   No. Observations:                   83
Model:                          Logit   Df Residuals:                       79
Method:                           MLE   Df Model:                            3
Date:                Sun, 16 May 2021   Pseudo R-squ.:                 0.01179
Time:                        22:43:37   Log-Likelihood:                -56.776
converged:                       True   LL-Null:                       -57.454
Covariance Type:            nonrobust   LLR p-value:                    0.7160
=================================================================================
                    coef    std err          z      P>|z|      [0.025      0.975]
---------------------------------------------------------------------------------
Intercept        -0.1493      0.438     -0.341      0.733      -1.007       0.708
Country[T.FR]     0.4129      0.614      0.673      0.501      -0.790       1.616
Country[T.IT]    -0.1223      0.607     -0.201      0.840      -1.312       1.068
Country[T.UK]     0.1027      0.653      0.157      0.875      -1.178       1.383
=================================================================================
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67423950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档