Проверка гипотез и анализ правдоподобия
Содержание
- использованы материалы курса https://github.com/Intelligent-Systems-Phystech/psad
Введение. Библиотека 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) переменных. Регрессионные МНК коэффиценты вычисляются как обычно:
где 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 этапов :
- выбор класса статистических моделей
- обучение модели с помощью соответствующего метода
- изучеие полученных коэффицентов с помощью 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)