2017-02-16 10 views
4

私はPythonを使って負の二項回帰を試しています。私は、データセットと一緒に、Rを使用してこの例を見つけました:残念ながら、これは明らかにしなかったPython否定二項回帰 - 結果がRと一致しない

import pandas as pd 
import statsmodels.formula.api as smf 
import statsmodels.api as sm 

df = pd.read_stata("http://www.karlin.mff.cuni.cz/~pesta/prednasky/NMFM404/Data/nb_data.dta") 

model = smf.glm(formula = "daysabs ~ math + prog", data=df, family=sm.families.NegativeBinomial()).fit() 

model.summary() 

http://www.karlin.mff.cuni.cz/~pesta/NMFM404/NB.html

私はこのコードを使用してWebページ上の結果を再現してみました同じ係数。それは以下を与えました:

coef  std err  z  P>|z| [95.0% Conf. Int.] 
Intercept 3.4875  0.236 14.808 0.000 3.026 3.949 
math  -0.0067  0.003 -2.600 0.009 -0.012 -0.002 
prog  -0.6781  0.101 -6.683 0.000 -0.877 -0.479 

これらは、それらのウェブサイトのものにさえ近くありません。 Rコードが正しいと仮定すると、何が間違っていますか?

答えて

6

食い違いの理由は、あなたがパンダとのデータセットで読んでいるとき、prog変数は、デフォルトではタイプfloatとして扱われていることである。一方、Rの例では

df.prog.head() 

0 2.0 
1 2.0 
2 2.0 
3 2.0 
4 2.0 
Name: prog, dtype: float32 

prog変数が明示的因子(カテゴリ)変数にキャストした結果

dat <- within(dat, { 
    prog <- factor(prog, levels = 1:3, labels = c("General", "Academic", "Vocational")) 
    id <- factor(id) 
}) 

あなたがRでフィット要約を見たとき、あなたはprog変数が分割されていることがわかりますN-1のバイナリエンコードされた条件に:

> summary(m1 <- glm.nb(daysabs ~ math + prog, data = dat)) 

Call: 
glm.nb(formula = daysabs ~ math + prog, data = dat, init.theta = 1.032713156, 
    link = log) 

Deviance Residuals: 
    Min  1Q Median  3Q  Max 
-2.1547 -1.0192 -0.3694 0.2285 2.5273 

Coefficients: 
       Estimate Std. Error z value Pr(>|z|)  
(Intercept)  2.615265 0.197460 13.245 < 2e-16 *** 
math   -0.005993 0.002505 -2.392 0.0167 * 
progAcademic -0.440760 0.182610 -2.414 0.0158 * 
progVocational -1.278651 0.200720 -6.370 1.89e-10 *** 

prog変数はあなたが投稿Pythonのフィット要約に表示されますどのようにこれを比較してください。

問題を修正するには、C() functionを使用して変数をstatsmodelsのカテゴリにキャストすることができます。あなたは同じ結果に到着します:

model = smf.glm(formula = "daysabs ~ math + C(prog)", data=df, family=sm.families.NegativeBinomial()).fit() 
model.summary() 

<class 'statsmodels.iolib.summary.Summary'> 
""" 
       Generalized Linear Model Regression Results     
============================================================================== 
Dep. Variable:    daysabs No. Observations:     314 
Model:       GLM Df Residuals:      310 
Model Family:  NegativeBinomial Df Model:       3 
Link Function:     log Scale:     1.06830885199 
Method:       IRLS Log-Likelihood:    -865.68 
Date:    Thu, 16 Feb 2017 Deviance:      350.98 
Time:      10:34:16 Pearson chi2:      331. 
No. Iterations:      6           
================================================================================== 
        coef std err   z  P>|z|  [0.025  0.975] 
---------------------------------------------------------------------------------- 
Intercept   2.6150  0.207  12.630  0.000  2.209  3.021 
C(prog)[T.2.0] -0.4408  0.192  -2.302  0.021  -0.816  -0.065 
C(prog)[T.3.0] -1.2786  0.210  -6.079  0.000  -1.691  -0.866 
math    -0.0060  0.003  -2.281  0.023  -0.011  -0.001 
================================================================================== 
""" 
+0

Aha !! Vクール - ありがとう! –

+0

結果は近づいていますが、それでもまったく同じではありません。切片の係数は2.6150であり、これは2.61526である。私はこれが心配するものではないと思うが、わずかな違いの理由は何だろうか? –

+3

注意:統計モデルGLMは、負の2項数に対して1に等しい尺度を固定しません。したがって、統計モデルはデフォルトでGLMのQuasi-NegativeBinomialになるため、標準エラーはRと異なる場合があります。私はこれがバグかstatsmodelsの機能(https://github.com/statsmodels/statsmodels/issues/2888)か分かりません。 – user333700

関連する問題