簡體   English   中英

如何在回歸中刪除其中一個虛擬變量

[英]How to remove one of the dummy variables in regression

假設有一個分類變量,具有不同值的教育為std_10,std_12,graduate,PG和Dr.數據集名稱為df,因變量為Income,另一個獨立連續變量為Age。 我可以使用Python為ols回歸創建一個虛擬變量,使用C()。 但是,我無法刪除其中一個虛擬變量(例如,想要刪除畢業生和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,並在模型中保留其余變量。 請幫忙。

我將忽略你對以下評論:

我不想將其轉換為數字數據。 稍后很難向客戶解釋。

假設你的主要優先事項是洞察力,而不是你如何獲得洞察力,這就是我將如何做到這一點:


挑戰:

您的主要問題似乎是您的分類數據是在列中收集的,而不是編碼為虛擬變量。 因此,您面臨的挑戰在於將數據從一列分類變量重新編碼為虛擬變量集合。 pd.get_dummies()將在一行代碼中為您完成。 之后,您可以非常輕松地添加和/或刪除最終模型中您想要的任何變量。

一些數據:

由於您尚未提供任何樣本數據,因此這里的代碼片段將生成一個包含Income Age的隨機數據的數據框,以及一些隨機放置的教育級別:

小片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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM