開始使用

這個非常簡單的案例研究旨在讓您快速上手 statsmodels。從原始資料開始,我們將展示估計統計模型和繪製診斷圖所需的步驟。我們只會使用 statsmodels 或其 pandaspatsy 相依性提供的函數。

載入模組與函數

安裝 statsmodels 及其相依性後,我們載入一些模組與函數

In [1]: import statsmodels.api as sm

In [2]: import pandas

In [3]: from patsy import dmatrices

pandas 建構於 numpy 陣列之上,以提供豐富的資料結構與資料分析工具。pandas.DataFrame 函數提供標記的 (可能異質的) 資料陣列,類似於 R 的 “data.frame”。pandas.read_csv 函數可用於將逗號分隔值檔案轉換為 DataFrame 物件。

patsy 是一個 Python 函式庫,用於描述統計模型並使用類似 R 的公式建立設計矩陣

注意

這個範例使用 API 介面。請參閱匯入路徑與結構,以了解匯入 API 介面 (statsmodels.apistatsmodels.tsa.api) 與直接從定義模型的模組匯入之間的差異。

資料

我們下載Guerry 資料集,這是支援安德烈-米歇爾·蓋瑞 (Andre-Michel Guerry) 1833 年《法國道德統計論文》的歷史資料集。該資料集以逗號分隔值格式 (CSV) 託管在Rdatasets 儲存庫中。我們可以將檔案下載到本機,然後使用 read_csv 載入,但 pandas 會自動為我們處理這一切

In [4]: df = sm.datasets.get_rdataset("Guerry", "HistData").data

輸入/輸出文件頁面顯示如何從各種其他格式匯入。

我們選取感興趣的變數,並查看最後 5 列

In [5]: vars = ['Department', 'Lottery', 'Literacy', 'Wealth', 'Region']

In [6]: df = df[vars]

In [7]: df[-5:]
Out[7]: 
      Department  Lottery  Literacy  Wealth Region
81        Vienne       40        25      68      W
82  Haute-Vienne       55        13      67      C
83        Vosges       14        62      82      E
84         Yonne       51        47      30      C
85         Corse       83        49      37    NaN

請注意,Region 欄中缺少一個觀測值。我們使用 pandas 提供的 DataFrame 方法將其消除

In [8]: df = df.dropna()

In [9]: df[-5:]
Out[9]: 
      Department  Lottery  Literacy  Wealth Region
80        Vendee       68        28      56      W
81        Vienne       40        25      68      W
82  Haute-Vienne       55        13      67      C
83        Vosges       14        62      82      E
84         Yonne       51        47      30      C

實質動機與模型

我們想知道 1820 年代法國 86 個部門的識字率是否與人均皇家彩券賭注相關。我們需要控制每個部門的財富水準,而且我們也想在迴歸方程式的右側包含一系列虛擬變數,以控制因地區效應而產生的未觀察到的異質性。該模型使用普通最小平方迴歸 (OLS) 進行估計。

設計矩陣 (endog & exog)

若要擬合 statsmodels 涵蓋的大多數模型,您需要建立兩個設計矩陣。第一個是內生變數的矩陣 (即,依變數、反應變數、被解釋變數等)。第二個是外生變數的矩陣 (即,獨立變數、預測變數、迴歸變數等)。OLS 係數估計值通常按以下方式計算

\[\hat{\beta} = (X'X)^{-1} X'y\]

其中 \(y\) 是每人彩券賭注 (Lottery) 的 \(N \times 1\) 資料欄。\(X\)\(N \times 7\),其中包含截距、LiteracyWealth 變數,以及 4 個區域二元變數。

patsy 模組提供一個便利的函數,可使用類似 R 的公式來準備設計矩陣。您可以在此處找到更多資訊。

我們使用 patsydmatrices 函數來建立設計矩陣

In [10]: y, X = dmatrices('Lottery ~ Literacy + Wealth + Region', data=df, return_type='dataframe')

產生的矩陣/資料框架如下所示

In [11]: y[:3]
Out[11]: 
   Lottery
0     41.0
1     38.0
2     66.0

In [12]: X[:3]
Out[12]: 
   Intercept  Region[T.E]  Region[T.N]  ...  Region[T.W]  Literacy  Wealth
0        1.0          1.0          0.0  ...          0.0      37.0    73.0
1        1.0          0.0          1.0  ...          0.0      51.0    22.0
2        1.0          0.0          0.0  ...          0.0      13.0    61.0

[3 rows x 7 columns]

請注意,dmatrices

  • 將分類 Region 變數分割成一組指標變數。

  • 將常數新增至外生迴歸變數矩陣。

  • 傳回 pandas 資料框架,而非簡單的 numpy 陣列。這很有用,因為資料框架允許 statsmodels 在報告結果時延續元資料 (例如,變數名稱)。

當然,可以變更上述行為。請參閱patsy 文件頁面

模型擬合與摘要

statsmodels 中擬合模型通常涉及 3 個簡單步驟

  1. 使用模型類別來描述模型

  2. 使用類別方法擬合模型

  3. 使用摘要方法檢查結果

對於 OLS,這可以透過以下方式實現

In [13]: mod = sm.OLS(y, X)    # Describe model

In [14]: res = mod.fit()       # Fit model

In [15]: print(res.summary())   # Summarize model
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                Lottery   R-squared:                       0.338
Model:                            OLS   Adj. R-squared:                  0.287
Method:                 Least Squares   F-statistic:                     6.636
Date:                Thu, 03 Oct 2024   Prob (F-statistic):           1.07e-05
Time:                        16:15:27   Log-Likelihood:                -375.30
No. Observations:                  85   AIC:                             764.6
Df Residuals:                      78   BIC:                             781.7
Df Model:                           6                                         
Covariance Type:            nonrobust                                         
===============================================================================
                  coef    std err          t      P>|t|      [0.025      0.975]
-------------------------------------------------------------------------------
Intercept      38.6517      9.456      4.087      0.000      19.826      57.478
Region[T.E]   -15.4278      9.727     -1.586      0.117     -34.793       3.938
Region[T.N]   -10.0170      9.260     -1.082      0.283     -28.453       8.419
Region[T.S]    -4.5483      7.279     -0.625      0.534     -19.039       9.943
Region[T.W]   -10.0913      7.196     -1.402      0.165     -24.418       4.235
Literacy       -0.1858      0.210     -0.886      0.378      -0.603       0.232
Wealth          0.4515      0.103      4.390      0.000       0.247       0.656
==============================================================================
Omnibus:                        3.049   Durbin-Watson:                   1.785
Prob(Omnibus):                  0.218   Jarque-Bera (JB):                2.694
Skew:                          -0.340   Prob(JB):                        0.260
Kurtosis:                       2.454   Cond. No.                         371.
==============================================================================

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

res 物件有許多實用的屬性。例如,我們可以輸入以下內容來擷取參數估計值和 R 平方

In [16]: res.params
Out[16]: 
Intercept      38.651655
Region[T.E]   -15.427785
Region[T.N]   -10.016961
Region[T.S]    -4.548257
Region[T.W]   -10.091276
Literacy       -0.185819
Wealth          0.451475
dtype: float64

In [17]: res.rsquared
Out[17]: np.float64(0.337950869192882)

輸入 dir(res) 以取得完整的屬性清單。

如需更多資訊和範例,請參閱迴歸文件頁面

診斷與規格檢定

statsmodels 可讓您執行一系列實用的迴歸診斷與規格檢定。例如,套用用於線性度的彩虹檢定 (虛無假設是關係正確地建模為線性)

In [18]: sm.stats.linear_rainbow(res)
Out[18]: (np.float64(0.847233997615691), np.float64(0.6997965543621644))

誠然,上面產生的輸出不是很詳細,但我們從閱讀文件字串 (還有 print(sm.stats.linear_rainbow.__doc__)) 得知,第一個數字是 F 統計量,第二個數字是 p 值。

statsmodels 也提供圖形函數。例如,我們可以透過以下方式繪製一組迴歸變數的部分迴歸圖

In [19]: sm.graphics.plot_partregress('Lottery', 'Wealth', ['Region', 'Literacy'],
   ....:                              data=df, obs_labels=False)
   ....: 
Out[19]: <Figure size 640x480 with 1 Axes>
_images/gettingstarted_0.png

文件

可以使用 IPython 工作階段中的 webdoc 來存取文件。

webdoc

開啟瀏覽器並顯示線上文件

更多

恭喜!您已準備好繼續學習目錄中的其他主題


上次更新:2024 年 10 月 03 日