Биномиальный GLM с `statsmodels` - PullRequest
0 голосов
/ 17 апреля 2020

Мне нужно применить модель GLM к моим данным, которая очень похожа на пример в пакете lme4 R для метода glmer. Используя их данные cbpp, пример в R выглядит примерно так:

library(lme4)
head(cbpp)
m1 <- glmer(cbind(incidence, size - incidence) ~ period + (1 | herd),
            family=binomial, data=cbpp)
summary(m1)

herd    incidence   size    period
1   2   14  1
1   3   12  2
1   4   9   3
1   0   5   4
2   3   22  1
2   1   18  2

Generalized linear mixed model fit by maximum likelihood (Laplace
  Approximation) [glmerMod]
 Family: binomial  ( logit )
Formula: cbind(incidence, size - incidence) ~ period + (1 | herd)
   Data: cbpp

     AIC      BIC   logLik deviance df.resid 
   194.1    204.2    -92.0    184.1       51 

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.3816 -0.7889 -0.2026  0.5142  2.8791 

Random effects:
 Groups Name        Variance Std.Dev.
 herd   (Intercept) 0.4123   0.6421  
Number of obs: 56, groups:  herd, 15

Fixed effects:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept)  -1.3983     0.2312  -6.048 1.47e-09 ***
period2      -0.9919     0.3032  -3.272 0.001068 ** 
period3      -1.1282     0.3228  -3.495 0.000474 ***
period4      -1.5797     0.4220  -3.743 0.000182 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
        (Intr) perid2 perid3
period2 -0.363              
period3 -0.340  0.280       
period4 -0.260  0.213  0.198

Все мои данные обрабатываются в Python, поэтому вместо того, чтобы записывать данные на диск, создайте Rscript для запустить на данных, а затем снова прочитать результат обратно к Python, думал, возможно ли будет сделать модель GLM в Python, вероятно, с пакетом statsmodels . Однако, пытаясь реализовать это с помощью statsmodels, я получаю результаты, отличные от результатов, полученных с помощью R, поэтому я считаю, что неправильно определяю термины формулы. То, что я пробовал:

import pandas as pd
import statsmodels.api as sm

df = pd.read_csv('cbpp.Rdataset.lme4.tsv')
df['prop'] = df['incidence'] / df['size']  # the incidence proportion
df.head()
formula = 'prop ~ period + (1 | herd)'

mod = sm.GLM.from_formula(formula=formula, data=df,
                           family=sm.families.Binomial())
res = mod.fit()
print(res.summary())

, что приводит к:

herd    incidence   size    period  prop
0   1   2   14  1   0.142857
1   1   3   12  2   0.250000
2   1   4   9   3   0.444444
3   1   0   5   4   0.000000
4   2   3   22  1   0.136364
                 Generalized Linear Model Regression Results                  
==============================================================================
Dep. Variable:                   prop   No. Observations:                   56
Model:                            GLM   Df Residuals:                       53
Model Family:                Binomial   Df Model:                            2
Link Function:                  logit   Scale:                          1.0000
Method:                          IRLS   Log-Likelihood:                -13.743
Date:                Fri, 17 Apr 2020   Deviance:                       8.0863
Time:                        12:52:50   Pearson chi2:                     8.61
No. Iterations:                     6                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          z      P>|z|      [0.025      0.975]
------------------------------------------------------------------------------
Intercept     -0.2391      1.228     -0.195      0.846      -2.645       2.167
period        -0.6000      0.442     -1.358      0.174      -1.466       0.266
1 | herd      -0.0700      0.101     -0.695      0.487      -0.267       0.127
==============================================================================

Перехваты сильно различаются между двумя методами ...

Как можно указать модель R выше в statsmodels?

...