Категориальные взаимодействия в statsmodels? - PullRequest
0 голосов
/ 03 апреля 2020

В R у меня есть фрейм данных с двумя категориальными предикторами, один из которых имеет несколько уровней, и категориальный ответ. Я выполняю полиномиальную логистическую c регрессию для каждого из категориальных предикторов, а также взаимодействие двух категориальных предикторов.

library(VGAM)
x1 <- as.factor(rep(c(1,2,3,3,2,1,1,2,3,3,2,1),5))
x2 <- as.factor(rep(c(1,1,1,1,1,1,2,2,2,2,2,2),5))
y <- as.factor(rep(c(1,2,3,1,2,3,1,2,3,1,2,3),5))

Функция vglm VGAM имеет возможность обрабатывать категориальные переменные и их взаимодействий.

M <- vglm(y ~ x1*x2, family=multinomial)

Однако теперь я должен выполнить эту работу в Python, и мне трудно заставить категориальные переменные функционировать так же чисто в statsmodels, как и в R. R прекрасно выполняет категориальное кодирование из факторной переменной, а затем выполняет взаимодействия. statsmodels не сделал этого для меня (пока).

У меня есть функция Python, которая подходит для полиномиальной логистики c регрессий, smf.mnlogit (smf из `import statsmodels.formulas. API как SMF '). Как я могу использовать это с факторными переменными, чтобы получить взаимодействия, которые я получаю в R?

Вот код Python, который я пробовал:

# import packages
#
import pandas as pd
import numpy as np
import statsmodels.api as sm
import statsmodels.formula.api as smf

# Define data
#
x1 = np.array([1,2,3,3,2,1,1,2,3,3,2,1] * 5)
x2 = np.array([1,1,1,1,1,1,2,2,2,2,2,2] * 5)
y = np.array([1,2,3,1,2,3,1,2,3,1,2,3] * 5)

# Make data frame
#
df = pd.DataFrame({'x1': x1, 'x2': x2, 'y': y})

# Make the columns categorical
#
df['x1'] = df['x1'].astype('category')
df['x2'] = df['x2'].astype('category')
df['y'] = df['y'].astype('category')

# fit the multinomial logistic regression
#
mlr = smf.mnlogit(formula='y ~ x1*x2', data=df).fit()

Я получаю следующую ошибку:

ValueError: endog оценивается как массив с несколькими столбцами, имеющими форму (60, 3). Это происходит, когда переменная, преобразованная в endog, не имеет значения c (например, bool или str).

1 Ответ

0 голосов
/ 15 апреля 2020

Я думаю, что категориальные столбцы получают один горячий код, как только они используются в качестве целевой переменной, из-за которой вы получаете эту ошибку. Возможным решением этой проблемы было бы закодировать различные категории в числа, а затем нормализовать их для предоставления функции lo git () (хотя неправильно кодировать строковые категории в целочисленные значения). Рассмотрим следующий пример:

df_log[target] = pd.Categorical(df_log[target])
df_log[target] = df_log[target].cat.codes
min_max_scaler = preprocessing.MinMaxScaler()
df_log[[target]] = min_max_scaler.fit_transform(df_log[[target]])
formula = "target ~ x1 + x2"
model = smf.logit(formula=formula, data=df_log).fit()
...