【问题标题】:How to get the regression intercept using Statsmodels.api如何使用 Statsmodels.api 获得回归截距
【发布时间】:2016-12-14 15:46:19
【问题描述】:

我正在尝试使用 python 库计算回归输出,但使用该库时无法获得截距值:

import statsmodels.api as sm

它打印除截距之外的所有回归分析。

但是当我使用时:

from pandas.stats.api import ols

我的熊猫代码:

Regression = ols(y= Sorted_Data3['net_realization_rate'],x = Sorted_Data3[['Cohort_2','Cohort_3']])
print Regression  

我收到拦截并警告说这个库将来会被弃用,所以我正在尝试使用 Statsmodels。

我在使用 pandas.stats.api 时收到的警告:

警告(来自警告模块): 文件“C:\Python27\lib\idlelib\run.py”,第 325 行 self.locals 中的执行代码 FutureWarning:pandas.stats.ols 模块已弃用,将在未来版本中删除。我们指的是像 statsmodels 这样的外部包,这里有一些例子: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() 至少需要 2 个参数(给定 1 个)

最终输出: 第一个来自 pandas 第二个来自 Stats.... 我希望拦截值也是来自 stats 的 pandas 的一个:

【问题讨论】:

  • 您导入了ols,但没有使用它。试试:sm_model = ols(...
  • 是的,我用过它...... ols 给了我结果,但也警告说将来使用该库..pandas.stats.api 将被弃用,所以我正在尝试使用其他库...statsmodels.api

标签: python statsmodels


【解决方案1】:

所以,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)

【讨论】:

【解决方案2】:

你也可以这样做:

df['intercept'] = 1

在这里,您明确地为截距创建了一个列。

然后你可以像这样使用 sm.OLS 方法:

lm = sm.OLS(df['y_column'], df[['intercept', 'x_column']])
results = lm.fit()
results.summary()

【讨论】:

    猜你喜欢
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 2012-05-27
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 2018-10-30
    相关资源
    最近更新 更多