Проверка гипотез и анализ правдоподобия

Введение. Библиотека statsmodels

В python для всевозможных задач статистического оценивания используется стандартная библиотека statsmodels Раньше была частью scipy , выделилась в самостоятельную, чтоб сделать основным объектом классы статистических моделей. Например , OLS - ordinary least squares , WLS - weighted least squares , RecursiveLS

Для описания матриц плана (design matrices) в ней используется библиотека patsy

Пример

Код к примеру

Пример использует так называемые данные Герри по социальной статистике во Франции в 1830х.

df = sm.datasets.get_rdataset("Guerry", "HistData").data
df.describe()
dept Crime_pers Crime_prop Literacy Donations Infants Suicides Wealth Commerce Clergy Crime_parents Infanticide Donation_clergy Lottery Desertion Instruction Prostitutes Distance Area Pop1831
count 86.000000 86.000000 86.000000 86.000000 86.000000 86.000000 86.000000 86.000000 86.000000 86.000000 86.000000 86.000000 86.000000 86.000000 86.000000 86.000000 86.000000 86.000000 86.000000 86.000000
mean 46.883721 19754.406977 7843.058140 39.255814 7075.546512 19049.906977 36522.604651 43.500000 42.802326 43.430233 43.500000 43.511628 43.500000 43.500000 43.500000 43.127907 141.872093 207.953140 6146.988372 378.628721
std 30.426157 7504.703073 3051.352839 17.364051 5834.595216 8820.233546 31312.532649 24.969982 25.028370 24.999549 24.969982 24.948297 24.969982 24.969982 24.969982 24.799809 520.969318 109.320837 1398.246620 148.777230
min 1.000000 2199.000000 1368.000000 12.000000 1246.000000 2660.000000 3460.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 0.000000 0.000000 762.000000 129.100000
25% 24.250000 14156.250000 5933.000000 25.000000 3446.750000 14299.750000 15463.000000 22.250000 21.250000 22.250000 22.250000 22.250000 22.250000 22.250000 22.250000 23.250000 6.000000 121.383000 5400.750000 283.005000
50% 45.500000 18748.500000 7595.000000 38.000000 5020.000000 17141.500000 26743.500000 43.500000 42.500000 43.500000 43.500000 43.500000 43.500000 43.500000 43.500000 41.500000 33.000000 200.616000 6070.500000 346.165000
75% 66.750000 25937.500000 9182.250000 51.750000 9446.750000 22682.250000 44057.500000 64.750000 63.750000 64.750000 64.750000 64.750000 64.750000 64.750000 64.750000 64.750000 113.750000 289.670500 6816.500000 444.407500
max 200.000000 37014.000000 20235.000000 74.000000 37015.000000 62486.000000 163241.000000 86.000000 86.000000 86.000000 86.000000 86.000000 86.000000 86.000000 86.000000 86.000000 4744.000000 539.213000 10000.000000 989.940000

Удалим строки с пустыми значениями с помощью dropna()

vars = ['Department', 'Lottery', 'Literacy', 'Wealth', 'Region']
df = df.dropna()[vars]
df[-5:]
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

Постановка задачи

Будет использоваться модель обычного метода наименьших квадратов OLS. Решается задача регрессии лотерейных ставок в королевской лотерее Франции в 1820х против показателей грамотности с учётом материального достатка населения. При этом в правой части регерессионного уравнения придётся учитывать "пустые" переменные, которые тем не менее вносят неоднородность в данные по департаментам.

План-матрицы

Для большинства моделей из statsmodels придётся определить 2 план-матрицы - для зависимых (endogenous, response, dependent) и независимых (exogenous, independent, predictor, regressor) переменных. Регрессионные МНК коэффиценты вычисляются как обычно:

β = (XTX)XTy

где y имеет размер N * 1 - это данные из столбца Lottery X размера N * 7 - столбцы Wealth , Literacy и 4 бинарных, отвечающих за регионы.

Используется функция dmatrices библиотеки patsy для формирования план-матриц регрессионных моделей. Там используется синтаксис языка R .

y, X = dmatrices('Lottery ~ Literacy + Wealth + Region', data=df, return_type='dataframe')
y
Lottery
0 41.0
1 38.0
2 66.0
3 80.0
4 79.0
... ...
80 68.0
81 40.0
82 55.0
83 14.0
84 51.0

85 rows × 1 columns

X
Intercept Region[T.E] Region[T.N] Region[T.S] Region[T.W] Literacy Wealth
0 1.0 1.0 0.0 0.0 0.0 37.0 73.0
1 1.0 0.0 1.0 0.0 0.0 51.0 22.0
2 1.0 0.0 0.0 0.0 0.0 13.0 61.0
3 1.0 1.0 0.0 0.0 0.0 46.0 76.0
4 1.0 1.0 0.0 0.0 0.0 69.0 83.0
... ... ... ... ... ... ... ...
80 1.0 0.0 0.0 0.0 1.0 28.0 56.0
81 1.0 0.0 0.0 0.0 1.0 25.0 68.0
82 1.0 0.0 0.0 0.0 0.0 13.0 67.0
83 1.0 1.0 0.0 0.0 0.0 62.0 82.0
84 1.0 0.0 0.0 0.0 0.0 47.0 30.0

85 rows × 7 columns

Важно заметить, что dmatrices

  • разделила Region на несколько индикаторных признаков ({1,0})
  • добавила константу к независимым переменным (exogenous)
  • возвращает pandas dataframe вместо обычного numpy array и позволяет сохранять описательные данные.

Типичная последовательность действий

Как правило работа со statsmodels состоит из 3 этапов :

  1. выбор класса статистических моделей
  2. обучение модели с помощью соответствующего метода
  3. изучеие полученных коэффицентов с помощью summary()

Для МНК (OLS) это выглядит так:

mod = sm.OLS(y, X)    # Describe model
res = mod.fit()       # Fit model
print(res.summary())   # Summarize model, like df.describe()
                            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:                Tue, 12 Apr 2022   Prob (F-statistic):           1.07e-05
Time:                        02:44:16   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.params
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
res.rsquared
0.3379508691928823

Анализ и визуализация результатов

statsmodels содержит также много тестов для оценки качества поолученной (обученной) статистической модели.

И инструменты для отрисовки графиков приближений модели.

sm.graphics.plot_partregress('Lottery', 'Wealth', ['Region', 'Literacy'],
   ....:                              data=df, obs_labels=False)