为啥 NegativeBinomialP 与 R 相比给出不同的系数?
Posted
技术标签:
【中文标题】为啥 NegativeBinomialP 与 R 相比给出不同的系数?【英文标题】:Why NegativeBinomialP gives different coefficients compared to R?为什么 NegativeBinomialP 与 R 相比给出不同的系数? 【发布时间】:2022-01-08 12:48:06 【问题描述】:在 python 中重复以下 R 练习以达到相同的结果,我几乎没有困难。我错过了什么?
R 练习 https://stats.idre.ucla.edu/r/dae/negative-binomial-regression/
数据链接 https://www.dropbox.com/s/mz4stp72eco3rfq/sampleNBdata2.dat?dl=0
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.distributions.discrete as distr
from statsmodels.discrete.discrete_model import NegativeBinomialP, NegativeBinomial, Poisson, GeneralizedPoisson
from statsmodels.discrete.count_model import (ZeroInflatedNegativeBinomialP, ZeroInflatedPoisson,
ZeroInflatedGeneralizedPoisson)
import statsmodels.discrete._diagnostics_count as dia
import statsmodels.api as sm
f=open('sampleNBdata2.dat')
id=[]
gender=[]
math=[]
daysabs=[]
prog=[]
x=[]
f.readline()
d=
d['Academic']=1
d['Vocational']=2
d['General']=3
for line in f:
l=line.split(',')
id.append(l[1])
gender.append(l[2])
math.append(l[3]) #independent
daysabs.append(int(l[4])) #dependent y
prog.append(l[5]) #independent
#x.append([int(l[3]),d[l[5]], ] )
x.append([int(l[3]),int(l[5]), ] )
print(x,daysabs)
endog=np.array(daysabs)
exog=np.array(x)
print("endog",endog.shape)
print("exog",exog.shape)
#model_nb = NegativeBinomial(endog, exog, loglike_method='nb2')
model_nb = NegativeBinomialP(endog, exog, p=2)
res_nb = model_nb.fit(method='bfgs', maxiter=5000, maxfun=5000)
print(endog)
print(exog)
print(res_nb.summary())
Python 输出 R输出
【问题讨论】:
看起来您没有向 statsmodels 中的 exog 添加拦截。它不会自动添加,除非使用公式。prog
在 R 中是分类的,而您将其转换为数字 AFAICS。使用 pandas 和公式,则默认行为类似于 R。
【参考方案1】:
以下代码以几乎相似的系数再现 R 的结果。
df=pd.read_csv('sampleNBdata.dat')
data=pd.concat((df,pd.get_dummies(df['prog'],drop_first=False)),axis=1)
endog=data['daysabs']
data['intercept'] = 1
exog=data.drop(['prog','daysabs','id','gender','Unnamed: 0','General'],axis=1)
model_nb = NegativeBinomialP(endog, exog, p=2)
res_nb = model_nb.fit(method='bfgs', maxiter=5000, maxfun=5000)
print(res_nb.summary())
【讨论】:
以上是关于为啥 NegativeBinomialP 与 R 相比给出不同的系数?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 auc 与 sklearn 和 R 的逻辑回归如此不同
为啥将 %dopar% 与 foreach 一起使用导致 R 无法识别包?
在 R 中,为啥 factorial(100) 与 prod(1:100) 的显示不同?
为啥 R PerformanceAnalytics 中的 TrackingError 函数与使用其发布的公式的手动计算不一致