假设存在一个分类变量,教育程度不同,分别为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,并在模型中保留其余变量。请帮忙。
答案 0 :(得分:3)
我将忽略您对以下内容的评论:
我不想将其转换为数字数据。以后很难向客户解释。
假设您的首要任务是洞察力,而不是方式,那么我将如何做到这一点:
挑战:
您的主要问题似乎是您的分类数据收集在列中,而不被编码为虚拟变量。因此,挑战的要点在于将数据从一列类别变量重新编码为一组伪变量。 pd.get_dummies()
将在一行代码中为您完成此操作。之后,您可以非常轻松地添加和/或删除最终模型中想要的任何变量。
某些数据
由于您未提供任何示例数据,因此以下代码段将生成一个数据框,其中包含一些有关“收入年龄”的随机数据以及一些随机放置的教育水平:
代码段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()