statsmodels:打印多个回归模型的摘要

2024-10-01 07:40:59 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python库Statsmodels中,可以用print(results.summary())打印出回归结果,如何在一个表中打印出多个回归的摘要,以便更好地进行比较?在

线性回归,代码取自statsmodels文档:

nsample = 100
x = np.linspace(0, 10, 100)
X = np.column_stack((x, x**2))
beta = np.array([0.1, 10])
e = np.random.normal(size=nsample)
y = np.dot(X, beta) + e

model = sm.OLS(y, X)
results_noconstant = model.fit()

然后我向模型中添加一个常量,并再次运行回归:

^{pr2}$

我想在一张表格中打印出results_noconstant和{}的摘要。这应该是一个非常有用的函数,但是我在statsmodels文档中没有找到任何关于这个函数的说明。在

编辑:我心目中的回归表应该是this,我想知道是否有现成的功能来实现这一点。在


Tags: 函数代码文档modelnp线性summaryresults
3条回答

现在有一个著名的stargazerR软件包的Python version,正是这样做的。在

另请参阅相关问题:https://economics.stackexchange.com/q/11774/24531

我相信有很多方法可以做到这一点。取决于你能/想用什么来达到这个目的。在

最有可能的出发点是相同的:

statsmodels'线性模型.fit()返回^{}类,该类有返回子类的{}方法和一些常规方法。在

其中之一,例如,.tables返回pandas.DataFrame。在

以下是您如何使用它:

import pandas as pd 
results = {'Noconst':results_noconstant.summary2(), 
           'withcon':results_withconstant.summary2()}
df = pd.DataFrame({'Model':[], 'Param':[], 'Value':[]})
for mod in results.keys():
    for col in results[mod].tables[0].columns:
        if col % 2 == 0: 
            df = df.append(pd.DataFrame({'Model': [mod]*results[mod].tables[0][col].size,
                                         'Param':results[mod].tables[0][col].values, 
                                         'Value':results[mod].tables[0][col+1].values}))

print df

结果是:

^{pr2}$

你能做的只是受你使用pandas-powerful Python data analysis toolkit的能力的限制。在

有一个summary_col,AFAIR在文档中仍然缺少它。在

我并没有真正尝试过很多,但我从一个问题中找到了一个相关的例子来删除一些“讨厌的”参数。在

"""
mailing list, and issue https://github.com/statsmodels/statsmodels/pull/1638
"""

import pandas as pd
import numpy as np
import string
import statsmodels.formula.api as smf
from statsmodels.iolib.summary2 import summary_col

df = pd.DataFrame({'A' : list(string.ascii_uppercase)*10,
                   'B' : list(string.ascii_lowercase)*10,
                   'C' : np.random.randn(260),
                   'D' : np.random.normal(size=260),
                   'E' : np.random.random_integers(0,10,260)})

m1 = smf.ols('E ~ D',data=df).fit()
m2 = smf.ols('E ~ D + C',data=df).fit()
m3 = smf.ols('E ~ D + C + B',data=df).fit()
m4 = smf.ols('E ~ D + C + B + A',data=df).fit()

print(summary_col([m1,m2,m3,m4]))

还有改进的余地。在

相关问题 更多 >