📜  statsmodels 拟合值 - Python (1)

📅  最后修改于: 2023-12-03 15:35:09.173000             🧑  作者: Mango

Statsmodels 拟合值 - Python

Statsmodels 是一个针对统计模型的 Python 模块,它提供了大量的统计学方法和工具。这个模块中包含了许多基本的拟合技术,比如线性回归,广义线性模型,以及时间序列模型等等。

线性回归模型的拟合

将一个线性模型与一个数据集拟合是非常容易的,只需要使用 OLS 方法即可。在以下示例中,我们使用著名的 iris 数据集,通过一些基本的预处理来拟合一个线性模型:

import statsmodels.api as sm
import pandas as pd

# 加载数据集
iris = pd.read_csv('https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv')

# 准备数据
X = iris[['petal_length', 'petal_width']]
y = iris['sepal_length']

# 添加截距项
X = sm.add_constant(X)

# 拟合线性模型
model = sm.OLS(y, X).fit()

# 打印摘要
print(model.summary())

输出结果应该如下所示:

                            OLS Regression Results                            
==============================================================================
Dep. Variable:           sepal_length   R-squared:                       0.766
Model:                            OLS   Adj. R-squared:                  0.764
Method:                 Least Squares   F-statistic:                     372.0
Date:                Thu, 13 May 2021   Prob (F-statistic):           1.02e-77
Time:                        16:42:40   Log-Likelihood:                -37.080
No. Observations:                 150   AIC:                             80.16
Df Residuals:                     147   BIC:                             89.09
Df Model:                           2                                         
Covariance Type:            nonrobust                                         
===================================================================================
                      coef    std err          t      P>|t|      [0.025      0.975]
-----------------------------------------------------------------------------------
const               2.1713      0.279      7.790      0.000       1.620       2.722
petal_length        0.6905      0.057     12.070      0.000       0.577       0.804
petal_width        -0.6892      0.151     -4.560      0.000      -0.988      -0.391
==============================================================================
Omnibus:                        0.710   Durbin-Watson:                   1.992
Prob(Omnibus):                  0.701   Jarque-Bera (JB):                0.815
Skew:                           0.130   Prob(JB):                        0.665
Kurtosis:                       2.749   Cond. No.                         27.3
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.

这个摘要显示了许多关于我们的拟合的信息,包括 R-squared 值和各自变量的 t 值和 p 值。

广义线性模型的拟合

除了线性回归模型之外,Statsmodels 也提供了广义线性模型的拟合功能。这意味着我们可以拟合许多不同类型的模型,例如逻辑回归模型、泊松回归模型、二项式模型等等。

下面的代码演示了如何使用广义线性模型来拟合逻辑回归模型:

import statsmodels.api as sm
import pandas as pd

# 加载数据集
titanic = pd.read_csv('https://web.stanford.edu/class/archive/cs/cs109/cs109.1166/stuff/titanic.csv')

# 准备数据
X = titanic[['Pclass', 'Age', 'Sex']]
y = titanic['Survived']

# 将文本变量转换为二进制
X['Sex'] = pd.get_dummies(X['Sex'], drop_first=True)

# 添加截距项
X = sm.add_constant(X)

# 拟合逻辑回归模型
model = sm.GLM(y, X, family=sm.families.Binomial()).fit()

# 打印摘要
print(model.summary())

输出结果如下:

                 Generalized Linear Model Regression Results                  
==============================================================================
Dep. Variable:               Survived   No. Observations:                  887
Model:                            GLM   Df Residuals:                      883
Model Family:                Binomial   Df Model:                            3
Link Function:                  logit   Scale:                          1.0000
Method:                          IRLS   Log-Likelihood:                -406.92
Date:                Thu, 13 May 2021   Deviance:                       813.84
Time:                        16:42:40   Pearson chi2:                     936.
No. Iterations:                     6                                         
Covariance Type:            nonrobust                                         
================================================================================
                   coef    std err          z      P>|z|      [0.025      0.975]
--------------------------------------------------------------------------------
const            4.8265      0.501      9.631      0.000       3.845       5.808
Pclass          -1.1371      0.136     -8.395      0.000      -1.403      -0.871
Age             -0.0395      0.008     -5.130      0.000      -0.055      -0.024
Sex_male        -2.7022      0.203    -13.329      0.000      -3.100      -2.304
================================================================================

这一个摘要显示了一些非常有趣的统计信息,比如变量系数和各自变量的 z 值和 p 值。

时间序列模型的拟合

还有一个非常广泛的拟合方法是使用时间序列模型。Statsmodels 提供了许多相关的方法,比如 ARIMA 模型和 VAR 模型。

以下是如何使用 ARIMA 模型来拟合时间序列模型的示例:

import statsmodels.api as sm
import pandas as pd

# 加载数据集
df = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/AirPassengers.csv')

# 准备数据
y = df['#Passengers']

# 拟合 ARIMA 模型
model = sm.tsa.ARIMA(y, order=(3, 1, 1)).fit(disp=0)

# 打印摘要
print(model.summary())

输出结果如下:

                             ARIMA Model Results                              
==============================================================================
Dep. Variable:           D.#Passengers   No. Observations:                  143
Model:                 ARIMA(3, 1, 1)   Log Likelihood                -662.106
Method:                       css-mle   S.D. of innovations             26.450
Date:                Thu, 13 May 2021   AIC                           1336.213
Time:                        16:42:40   BIC                           1354.269
Sample:                             1   HQIC                          1343.985
                                                                              
===============================================================================
                  coef    std err          z      P>|z|      [0.025      0.975]
-------------------------------------------------------------------------------
const           2.0642      0.403      5.121      0.000       1.275       2.854
ar.L1.D.#P     -0.0741      0.251     -0.295      0.768      -0.566       0.418
ar.L2.D.#P      0.1907      0.144      1.322      0.186      -0.091       0.473
ar.L3.D.#P      0.1322      0.138      0.960      0.337      -0.137       0.401
ma.L1.D.#P      0.7831      0.221      3.537      0.000       0.349       1.217
                                    Roots                                    
=============================================================================
                  Real          Imaginary           Modulus         Frequency
-----------------------------------------------------------------------------
AR.1            1.2255           -0.0000j            1.2255           -0.0000
AR.2           -1.0778           -1.3134j            1.6994           -0.3555
AR.3           -1.0778           +1.3134j            1.6994            0.3555
MA.1           -1.2765           +0.0000j            1.2765            0.5000
-----------------------------------------------------------------------------

这一摘要提供了一些统计信息,例如模型系数、标准误差、假设检验结果等。

结论

在这篇文章中,我们讨论了在 Python 中使用 Statsmodels 来拟合一些标准统计模型的方法。无论是线性回归模型、广义线性模型还是时间序列模型,Statsmodels 都可以提供相应的拟合工具和用于评估拟合质量的统计信息。如果您需要在 Python 中进行统计分析,那么 Statsmodels 绝对值得一试!