如何使用 Statsmodels.api 获得回归截距
How to get the regression intercept using Statsmodels.api
我正在尝试使用 python 库计算回归输出,但在使用该库时无法获得截距值:
import statsmodels.api as sm
它打印除了截距之外的所有回归分析。
但是当我使用时:
from pandas.stats.api import ols
我的 pandas 代码:
Regression = ols(y= Sorted_Data3['net_realization_rate'],x = Sorted_Data3[['Cohort_2','Cohort_3']])
print Regression
我收到拦截警告,该库将来会被弃用,因此我正在尝试使用 Statsmodels。
我在使用 pandas.stats.api 时收到的警告:
Warning (from warnings module):
File "C:\Python27\lib\idlelib\run.py", line 325
exec code in self.locals
FutureWarning: The pandas.stats.ols module is deprecated and will be removed in a future version. We refer to external packages like statsmodels, see some examples here: http://statsmodels.sourceforge.net/stable/regression.html
我的 Statsmodels 代码:
import pandas as pd
import numpy as np
from pandas.stats.api import ols
import statsmodels.api as sm
Data1 = pd.read_csv('C:\Shank\Regression.csv') #Importing CSV
print Data1
运行一些清理代码
sm_model = sm.OLS(Sorted_Data3['net_realization_rate'],Sorted_Data3[['Cohort_2','Cohort_3']])
results = sm_model.fit()
print '\n'
print results.summary()
我什至试过statsmodels.formula.api:
如:
sm_model = sm.OLS(formula ="net_realization_rate ~ Cohort_2 + Cohort_3", data = Sorted_Data3)
results = sm_model.fit()
print '\n'
print result.params
print '\n'
print results.summary()
但我收到错误:
TypeError: init() takes at least 2 arguments (1 given)
最终输出:
第一个来自 pandas,第二个来自 Stats...。我也希望拦截值来自 pandas 来自 stats:
因此,statsmodels
有一个 add_constant
方法,您需要使用该方法来显式添加拦截值。恕我直言,这比默认添加截距的 R 替代方案要好。
对于你的情况,你需要这样做:
import statsmodels.api as sm
endog = Sorted_Data3['net_realization_rate']
exog = sm.add_constant(Sorted_Data3[['Cohort_2','Cohort_3']])
# Fit and summarize OLS model
mod = sm.OLS(endog, exog)
results = mod.fit()
print results.summary()
请注意,您可以在数组之前或之后添加常量,方法是将 True
(默认)或 False
传递给 sm.add_constant
中的 prepend
kwag
或者,不推荐,但您可以使用 Numpy 显式添加常量列,如下所示:
exog = np.concatenate((np.repeat(1, len(Sorted_Data3))[:, None],
Sorted_Data3[['Cohort_2','Cohort_3']].values),
axis = 1)
你也可以这样做:
df['intercept'] = 1
此处您明确地为截距创建了一个列。
然后你可以像这样使用sm.OLS方法:
lm = sm.OLS(df['y_column'], df[['intercept', 'x_column']])
results = lm.fit()
results.summary()
我正在尝试使用 python 库计算回归输出,但在使用该库时无法获得截距值:
import statsmodels.api as sm
它打印除了截距之外的所有回归分析。
但是当我使用时:
from pandas.stats.api import ols
我的 pandas 代码:
Regression = ols(y= Sorted_Data3['net_realization_rate'],x = Sorted_Data3[['Cohort_2','Cohort_3']])
print Regression
我收到拦截警告,该库将来会被弃用,因此我正在尝试使用 Statsmodels。
我在使用 pandas.stats.api 时收到的警告:
Warning (from warnings module): File "C:\Python27\lib\idlelib\run.py", line 325 exec code in self.locals FutureWarning: The pandas.stats.ols module is deprecated and will be removed in a future version. We refer to external packages like statsmodels, see some examples here: http://statsmodels.sourceforge.net/stable/regression.html
我的 Statsmodels 代码:
import pandas as pd
import numpy as np
from pandas.stats.api import ols
import statsmodels.api as sm
Data1 = pd.read_csv('C:\Shank\Regression.csv') #Importing CSV
print Data1
运行一些清理代码
sm_model = sm.OLS(Sorted_Data3['net_realization_rate'],Sorted_Data3[['Cohort_2','Cohort_3']])
results = sm_model.fit()
print '\n'
print results.summary()
我什至试过statsmodels.formula.api: 如:
sm_model = sm.OLS(formula ="net_realization_rate ~ Cohort_2 + Cohort_3", data = Sorted_Data3)
results = sm_model.fit()
print '\n'
print result.params
print '\n'
print results.summary()
但我收到错误:
TypeError: init() takes at least 2 arguments (1 given)
最终输出:
第一个来自 pandas,第二个来自 Stats...。我也希望拦截值来自 pandas 来自 stats:
因此,statsmodels
有一个 add_constant
方法,您需要使用该方法来显式添加拦截值。恕我直言,这比默认添加截距的 R 替代方案要好。
对于你的情况,你需要这样做:
import statsmodels.api as sm
endog = Sorted_Data3['net_realization_rate']
exog = sm.add_constant(Sorted_Data3[['Cohort_2','Cohort_3']])
# Fit and summarize OLS model
mod = sm.OLS(endog, exog)
results = mod.fit()
print results.summary()
请注意,您可以在数组之前或之后添加常量,方法是将 True
(默认)或 False
传递给 sm.add_constant
中的 prepend
kwag
或者,不推荐,但您可以使用 Numpy 显式添加常量列,如下所示:
exog = np.concatenate((np.repeat(1, len(Sorted_Data3))[:, None],
Sorted_Data3[['Cohort_2','Cohort_3']].values),
axis = 1)
你也可以这样做:
df['intercept'] = 1
此处您明确地为截距创建了一个列。
然后你可以像这样使用sm.OLS方法:
lm = sm.OLS(df['y_column'], df[['intercept', 'x_column']])
results = lm.fit()
results.summary()