首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何删除回归中的一个虚拟变量

如何删除回归中的一个虚拟变量
EN

Stack Overflow用户
提问于 2019-01-27 18:26:04
回答 1查看 4.7K关注 0票数 3

假设有一个范畴变量,教育有不同的价值,如std_10,std_12,研究生,PG和博士,数据集名为df,因变量为收入,另一个独立的连续变量为年龄。我可以使用Python为ols回归创建一个虚拟变量,使用C()。但是,我无法删除一个虚拟变量(例如,要删除毕业生和PG),这是微不足道的,并保留了虚拟变量的其余部分。

代码语言:javascript
运行
复制
from statsmodels.formula.api import ols
fit = ols('Income ~ C(education) +  Age', data=df).fit() 
fit.summary()

我尝试使用以下代码,但得到了一个错误。

代码语言:javascript
运行
复制
fit = ols('Income ~ C(education[~[[graduate,PG]]) +  Age', data=df).fit() 

我想将毕业生和PG排除在虚拟变量之外,并保留模型中的其余变量。请帮帮忙。

EN

回答 1

Stack Overflow用户

发布于 2019-01-28 14:04:15

我将无视你对以下问题的评论:

我不想把它转换成数字数据。以后很难向客户解释。

假设您的主要优先事项是洞察力,而不是您如何获得这种洞察力,我将这样做:

的挑战:

您的主要问题似乎是,您的分类数据收集在一列,而不是编码为虚拟变量。因此,挑战的要点在于将数据从一列分类变量重新编码到一组虚拟变量。pd.get_dummies()将在一行代码中为您执行此操作。之后,您可以非常容易地在最终模型中添加和/或删除任何您想要的变量。

一些数据:

由于您没有提供任何样本数据,下面是一个片段,它将生成带有收入年龄随机数据的数据,以及一些随机设置的教育级别:

片段1:

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

# Sample data
np.random.seed(123)
rows = 50
dfx = pd.DataFrame(np.random.randint(90,110,size=(rows, 1)), columns=['Income'])
dfy = pd.DataFrame(np.random.randint(25,68,size=(rows, 1)), columns=['Age'])
df = pd.concat([dfx,dfy], axis = 1)

# Categorical column
dummyVars = ['std_10', 'std_12', 'Graduate', 'PG', 'Dr']
df['education'] = np.random.choice(dummyVars, len(df))
print(df.tail(5))

输出1:

代码语言:javascript
运行
复制
Index  Income  Age   education
45     103     60    std_12
46     108     60        PG
47      94     26    std_12
48     105     41    std_10
49     101     30    std_12

现在,您可以使用pd.get_dummies()将教育列拆分为多个列,每个级别作为一个单独的列,包含零和指示虚拟变量是否发生在给定索引中的列。

代码片段2:

代码语言:javascript
运行
复制
# Split dummy variables
df = pd.concat([df, pd.get_dummies(df['education'].astype('category'), prefix = 'd')], axis = 1)
print(df.tail(5))

输出2:

代码语言:javascript
运行
复制
Index   Income  Age education  d_Dr  d_Graduate  d_PG  d_std_10  d_std_12
45      103   60    std_12     0           0     0         0         1
46      108   60        PG     0           0     1         0         0
47       94   26    std_12     0           0     0         0         1
48      105   41    std_10     0           0     0         1         0
49      101   30    std_12     0           0     0         0         1

现在您可以很容易地看到哪些虚拟变量是重要的,并选择是否将它们保存在您的分析中:

片段3:

代码语言:javascript
运行
复制
# Explanatory variables, subset 1
regression1 = sm.OLS(df['Income'], df[['Age', 'd_Dr', 'd_Graduate', 'd_PG', 'd_std_10', 'd_std_12']]).fit()
regression1.summary()

输出3:

代码语言:javascript
运行
复制
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
Age           -0.0123      0.075     -0.165      0.870      -0.163       0.138
d_Dr          98.8509      3.759     26.300      0.000      91.276     106.426
d_Graduate    98.5567      4.684     21.042      0.000      89.117     107.996
d_PG          97.0613      4.109     23.622      0.000      88.780     105.342
d_std_10     100.2472      3.554     28.209      0.000      93.085     107.409
d_std_12      98.3209      3.804     25.845      0.000      90.654     105.988

不足为奇的是,所有虚拟变量都是无关紧要的,因为我们使用的是(小的)随机样本,但是您可以选择删除最小重要变量,然后像这样重新运行您的分析:

代码片段4:

代码语言:javascript
运行
复制
# Explanatory variables, subset 2
regression2 = sm.OLS(df['Income'], df[['Age', 'd_Dr', 'd_Graduate', 'd_PG']]).fit()
regression2.summary()

输出4:

代码语言:javascript
运行
复制
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
Age            1.9771      0.123     16.011      0.000       1.729       2.226
d_Dr          11.0105      9.601      1.147      0.257      -8.316      30.337
d_Graduate     8.5356     15.304      0.558      0.580     -22.270      39.341
d_PG           6.2942     11.543      0.545      0.588     -16.940      29.529

我希望这是你能用的东西。如果不告诉我,请不要犹豫。

以下是一个简单的复制和粘贴的全部内容:

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

# Sample data
np.random.seed(123)
rows = 50
dfx = pd.DataFrame(np.random.randint(90,110,size=(rows, 1)), columns=['Income'])
dfy = pd.DataFrame(np.random.randint(25,68,size=(rows, 1)), columns=['Age'])
df = pd.concat([dfx,dfy], axis = 1)

# Categorical column
dummyVars = ['std_10', 'std_12', 'Graduate', 'PG', 'Dr']
df['education'] = np.random.choice(dummyVars, len(df))
print(df.tail(5))
#%%

# Split dummy variables
df = pd.concat([df, pd.get_dummies(df['education'].astype('category'), prefix = 'd')], axis = 1)
print(df.tail(5))

# Explanatory variables, subset 1
regression1 = sm.OLS(df['Income'], df[['Age', 'd_Dr', 'd_Graduate', 'd_PG', 'd_std_10', 'd_std_12']]).fit()
regression1.summary()

# Explanatory variables, subset 2
regression2 = sm.OLS(df['Income'], df[['Age', 'd_Dr', 'd_Graduate', 'd_PG']]).fit()
regression2.summary()
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54391462

复制
相关文章

相似问题

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