statsmodels中的类别交互?

问题描述 投票:0回答:1

在R中,我有一个带有两个分类预测变量的数据框,其中一个具有多个级别,并且有一个分类响应。我正在对每个分类预测变量以及两个分类预测变量的交互进行多项式逻辑回归。

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

VGAM的vglm函数具有处理分类变量及其相互作用的能力。

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

但是,我现在必须在Python中完成这项工作,而且我很难让分类变量在statsmodels中像在R中一样干净地工作。R可以从因子变量中很好地进行分类编码然后进行交互。 statsmodels尚未为我完成此操作。

[我有适合多项式逻辑回归的Python函数smf.mnlogitsmf来自“ import statsmodels.formulas.api as 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的变量是非数字变量(例如bool或str)时,就会发生这种情况。

python r logistic-regression statsmodels categorical-data
1个回答
0
投票

我认为类别列一旦用作目标变量,就会得到一种热编码,这是由于您遇到此错误。一种可能的解决方案是将各种类别编码为数字,然后进行标准化以将其提供给logit()函数(尽管将字符串类别编码为整数值是不正确的)。考虑以下示例:

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()
© www.soinside.com 2019 - 2024. All rights reserved.