Как удалить одну из фиктивных переменных в регрессии - PullRequest
0 голосов
/ 27 января 2019

Предположим, есть категориальная переменная, образование с различными значениями, такими как std_10, std_12, выпускник, PG и доктор. Имя набора данных - 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 из фиктивных переменных и сохранить остальные переменные в моей модели.Пожалуйста, помогите.

1 Ответ

0 голосов
/ 28 января 2019

Я собираюсь проигнорировать ваш комментарий относительно:

Я не хочу преобразовывать его в числовые данные.Позже становится сложно объяснить клиенту.

Предполагая, что вашим главным приоритетом является понимание, а не как вы получаете это понимание, вот как я это сделаю:


Задача:

Ваша основная проблема заключается в том, что ваши категориальные данные собраны в столбец, а не закодированы как фиктивные переменные.Таким образом, суть вашей задачи заключается в перекодировании ваших данных из столбца категориальных переменных в набор фиктивных переменных.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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...