Python statsmodels GLM:应用0和1时更改类的处理方式
我有一个来自GitHub的股市数据集:Python statsmodels GLM:应用0和1时更改类的处理方式,python,r,logistic-regression,statsmodels,glm,Python,R,Logistic Regression,Statsmodels,Glm,我有一个来自GitHub的股市数据集: import pandas as pd import numpy as np import statsmodels.api as sm Smarket_url = 'https://raw.githubusercontent.com/selva86/datasets/master/Smarket.csv' #Load data Smarket = pd.read_csv(Smarket_url) 我正在使用“statsmodels”包的GLM函数进行逻
import pandas as pd
import numpy as np
import statsmodels.api as sm
Smarket_url = 'https://raw.githubusercontent.com/selva86/datasets/master/Smarket.csv'
#Load data
Smarket = pd.read_csv(Smarket_url)
我正在使用“statsmodels”包的GLM函数进行逻辑回归。我使用R-Studio做了同样的回归,它给了我同样的结果,只是在R中得到的系数在Python中为负,在Python中为正,反之亦然。在python中,我最初使用:
Smarket_model = sm.formula.glm('Direction ~ Lag1 + Lag2 + Lag3 + Lag4 + Lag5 + Volume',
data=Smarket,family=sm.families.Binomial()).fit()
结果如下:
Intercept 0.1260
Lag1 0.0731
Lag2 0.0423
Lag3 -0.0111
Lag4 -0.0094
Lag5 -0.0103
Volume -0.1354
我将问题归结为statsmodels如何对结果变量进行分类:“股票上涨”为0,“股票下跌”为1。因此,我创建了一个numpy数组,将此配置更改为Stock Up=1和Stock Down=0。然后我使用了statsmodel.GML()函数:
#Create numpy array changing zeros to ones and vice versa
change = np.where(Smarket['Direction']=='Up',1,0)
#Add intercept
smarket_vars = sm.add_constant(Smarket[['Lag1','Lag2', 'Lag3', 'Lag4','Lag5','Volume']])
#Fit model
market_model = sm.GLM(change, smarket_vars,family=sm.families.Binomial() ).fit()
这给了我正确的负系数:
const -0.1260
Lag1 -0.0731
Lag2 -0.0423
Lag3 0.0111
Lag4 0.0094
Lag5 0.0103
Volume 0.1354
我的问题是,如何在不必创建更改0和1的numpy数组的情况下获得正确的值?为什么
sm.formula.glm()
假设“股票上涨”是0,“股票下跌”是1?感谢所有读过这些废话并愿意帮助我的人:)嗨,Jorge,我也对此感到困惑,你可以检查这个答案,结果发现底层模块(patsy)将更高频率的类别作为成功“1”。感谢StupidWolf,我一直在代码中收到patsy消息,但不知道它是什么。因此,我想,根据答案,这取决于用户定义哪个类别等于成功。