【问题标题】:How to remove one of the dummy variables in regression如何删除回归中的虚拟变量之一
【发布时间】:2019-06-20 20:01:04
【问题描述】:

假设,有一个分类变量,education 具有不同的值,如 std_10、std_12、graduate、PG 和 Dr。数据集名称为 df,因变量为 Income,另一个独立的连续变量为 Age。我可以使用 C() 使用 Python 为 ols 回归创建一个虚拟变量。但是,我无法删除一个无关紧要的虚拟变量(例如,想要删除毕业生和 PG)并保留其余虚拟变量。

from statsmodels.formula.api import ols
fit = ols('Income ~ C(education) +  Age', data=df).fit() 
fit.summary()

我尝试使用以下代码,但出现错误。

fit = ols('Income ~ C(education[~[[graduate,PG]]) +  Age', data=df).fit() 

我想从虚拟变量中排除研究生和 PG,并在我的模型中保留其余变量。请帮忙。

【问题讨论】:

  • 教育转化为年有帮助吗?这会给你数字数据。
  • 我不想把它转换成数字数据。以后很难向客户解释。我想删除无关紧要的虚拟变量。我可以使用 R 来完成,但无法在 Python 中完成。
  • @shejomamu 由于您只提供了数据描述,而不是易于复制的样本,我只想提醒您如何在SO 上写一个好问题。跨度>
  • @shejomamu 我的建议对你有什么效果?

标签: python linear-regression


【解决方案1】:

我将忽略您对以下内容的评论:

我不想将其转换为数字数据。以后就很难向客户解释了。

假设您的首要任务是洞察力,而不是您如何获得洞察力,我会这样做:


挑战:

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

一些数据:

由于您没有提供任何示例数据,这里有一个 sn-p,它将生成一个数据框,其中包含一些收入年龄的随机数据,以及一些随机放置的教育水平:

片段 1:

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:

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:

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

输出 2:

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:

# 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:

==============================================================================
                 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:

# Explanatory variables, subset 2
regression2 = sm.OLS(df['Income'], df[['Age', 'd_Dr', 'd_Graduate', 'd_PG']]).fit()
regression2.summary()

输出 4:

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

我希望这是你可以使用的东西。如果没有,请随时告诉我。


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

#%%
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()

【讨论】:

  • 非常感谢韦斯特兰的回答。我也很抱歉没有提供样本数据。我正在寻找一种方法来删除可以通过使用 C(education) 函数创建的虚拟变量。这是创建虚拟变量的一种更简单的方法,并且我在 R 中也使用过同样的方法。但是,由于我们没有直接的方法来删除由 C() 函数创建的虚拟变量,所以我使用了 pd.get_dummies()以前用过,也满足我的要求。非常感谢所有的帮助。
  • 没问题!您会考虑将我的建议标记为已接受的答案吗?我注意到你还问了一些其他有趣的问题!并收到了一些很好的答案,但没有将其中任何一个标记为已接受的答案。它受到贡献者的高度赞赏。在这种情况下,如果有更好的建议出现,我会第一个建议接受那个作为最有帮助的答案,而不是我的。
猜你喜欢
  • 2018-01-20
  • 1970-01-01
  • 1970-01-01
  • 2015-01-03
  • 2014-12-24
  • 1970-01-01
  • 2014-02-20
  • 2018-08-19
  • 2018-03-29
相关资源
最近更新 更多