В 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).