Почему statsmodels не может воспроизвести мои результаты R логистической регрессии?
Меня смущает, почему мои модели логистической регрессии в R и statsmodels не согласуются.
Если я подготовлю некоторые данные в R с
# From https://courses.edx.org/c4x/MITx/15.071x/asset/census.csv
library(caTools) # for sample.split
census = read.csv("census.csv")
set.seed(2000)
split = sample.split(census$over50k, SplitRatio = 0.6)
censusTrain = subset(census, split==TRUE)
censusTest = subset(census, split==FALSE)
а затем запустить логистическую регрессию с
CensusLog1 = glm(over50k ~., data=censusTrain, family=binomial)
я вижуРезультаты лайк
Estimate Std. Error z value Pr(>|z|)
(Intercept) -8.658e+00 1.379e+00 -6.279 3.41e-10 ***
age 2.548e-02 2.139e-03 11.916 < 2e-16 ***
workclass Federal-gov 1.105e+00 2.014e-01 5.489 4.03e-08 ***
workclass Local-gov 3.675e-01 1.821e-01 2.018 0.043641 *
workclass Never-worked -1.283e+01 8.453e+02 -0.015 0.987885
workclass Private 6.012e-01 1.626e-01 3.698 0.000218 ***
workclass Self-emp-inc 7.575e-01 1.950e-01 3.884 0.000103 ***
workclass Self-emp-not-inc 1.855e-01 1.774e-01 1.046 0.295646
workclass State-gov 4.012e-01 1.961e-01 2.046 0.040728 *
workclass Without-pay -1.395e+01 6.597e+02 -0.021 0.983134
...
но я использую те же данные в Python, сначала экспортируя из R с
write.csv(censusTrain,file="traincensus.csv")
write.csv(censusTest,file="testcensus.csv")
а затем импортировать в Python с
import pandas as pd
census = pd.read_csv("census.csv")
census_train = pd.read_csv("traincensus.csv")
census_test = pd.read_csv("testcensus.csv")
Я получаю ошибки и странные результаты, которые не имеют никакого отношения к тем, которые я получаю в R.
Если я просто попробую
import statsmodels.api as sm
census_log_1 = sm.Logit.from_formula(f, census_train).fit()
Я получаю ошибку:
ValueError: operands could not be broadcast together with shapes (19187,2) (19187,)
Даже если подготовить данные сpatsy
с помощью
import patsy
f = 'over50k ~ ' + ' + '.join(list(census.columns)[:-1])
y, X = patsy.dmatrices(f, census_train, return_type='dataframe')
пытаясь
census_log_1 = sm.Logit(y, X).fit()
приводит к той же ошибке. Единственный способ избежать ошибок - использоватьGLM
census_log_1 = sm.GLM(y, X, family=sm.families.Binomial()).fit()
но это производитРезультаты которые полностью отличаются от тех, которые были созданы (как я думал, было) эквивалентным R API:
coef std err t P>|t| [95.0% Conf. Int.]
----------------------------------------------------------------------------------------------------------------
Intercept 10.6766 5.985 1.784 0.074 -1.055 22.408
age -0.0255 0.002 -11.916 0.000 -0.030 -0.021
workclass[T. Federal-gov] -0.9775 4.498 -0.217 0.828 -9.794 7.839
workclass[T. Local-gov] -0.2395 4.498 -0.053 0.958 -9.055 8.576
workclass[T. Never-worked] 8.8346 114.394 0.077 0.938 -215.374 233.043
workclass[T. Private] -0.4732 4.497 -0.105 0.916 -9.288 8.341
workclass[T. Self-emp-inc] -0.6296 4.498 -0.140 0.889 -9.446 8.187
workclass[T. Self-emp-not-inc] -0.0576 4.498 -0.013 0.990 -8.873 8.758
workclass[T. State-gov] -0.2733 4.498 -0.061 0.952 -9.090 8.544
workclass[T. Without-pay] 10.0745 85.048 0.118 0.906 -156.616 176.765
...
Почему логистическая регрессия в Python дает ошибки и результаты, отличные от результатов, полученных R? Разве эти API на самом деле не эквивалентны (я заставлял их работать раньше для получения идентичных результатов)? Требуется ли дополнительная обработка наборов данных, чтобы их можно было использовать в statsmodels?