Statsmodels est un logiciel d'analyse statistique qui s'exécute sur un langage de programmation appelé Python. Python doit être installé sur votre PC pour exécuter l'exemple statsmodels. Si vous ne l'avez pas encore installé, reportez-vous à Installation du notebook Jupyter. Le notebook Jupyter est très utile pour exécuter des modèles de statistiques.
La plupart sont basés sur la référence statsmodels.
L'équation d'estimation généralisée est un modèle qui vise à estimer l'effet moyen des valeurs observées des panels, des grappes et des données de mesure itératives dans une population de données corrélées au sein du cluster et non corrélées en dehors du cluster. , Modèle linéaire généralisé. Bien que l'on dise qu'il existe une corrélation au sein du cluster, on peut dire que la cause de la corrélation n'a pas été identifiée ou ne peut pas être identifiée. La structure moyenne et la structure de corrélation peuvent être traitées séparément. GLM
Dans l'hypothèse
Estimez le modèle comme.
Dans GEE
--Relaxez l'hypothèse que la variable dépendante $ y_i $ suit la famille de distribution exponentielle.
Estimez le modèle dans cet ordre. Par conséquent, il est possible de gérer la diversité des données, mais cela nécessite également la quantité d'informations.
Thall et Vail (1990) ont analysé la période de référence de 8 semaines et 4 crises consécutives aux deux semaines chez 59 patients épileptiques. Aucun traitement n'est administré au patient pendant la période de référence. Après la période de référence, les patients reçoivent au hasard un placebo ou un progavide. Les observations post-prescription sont effectuées pendant 4x2 = 8 semaines.
Détails des données: Utilisation: épilepsie Format: 236 lignes et 9 colonnes
y: Nombre d'attaques en 2 semaines trt: traitement, placebo ou progavide base: nombre d'attaques au cours de la période de référence de 8 semaines âge: âge, âge du sujet V4: variable indicatrice 0/1 pour 4 périodes sujet: numéro du sujet, 1 à 59. période: période, 1 à 4. lbase: normaliser le logarithmique et la moyenne du nombre d'attaques pendant la période de référence à zéro lage: Journal des âges, normalisé à une moyenne nulle
Les crises épileptiques correspondent à des événements récurrents dans l'analyse du temps de survie. Les données d'événement de récurrence sont obtenues en mesurant à plusieurs reprises la survenue de crises chez le même sujet, et peuvent être considérées comme un type de données longitudinales et de données de mesures répétées. On considère qu'il n'y a pas de corrélation dans le nombre de crises d'épilepsie chez différents sujets, mais il est naturel de penser qu'il y a une corrélation dans les résultats si les mesures sont faites pour le même sujet.
Un total de 4 observations ont été faites à des intervalles de 8 semaines avant l'administration du médicament et 2 semaines après l'administration du médicament, et le nombre d'attaques a été examiné pour chaque section. Seul l'âge du sujet est une covariable.
Tout d'abord, initialisez pour obtenir les données.
import statsmodels.formula.api as smf
data = sm.datasets.get_rdataset('epil', package='MASS').data
Examinez l'état des données.
data.head(10)
y trt base age V4 subject period lbase lage
0 5 placebo 11 31 0 1 1 -0.756354 0.114204
1 3 placebo 11 31 0 1 2 -0.756354 0.114204
2 3 placebo 11 31 0 1 3 -0.756354 0.114204
3 3 placebo 11 31 1 1 4 -0.756354 0.114204
4 3 placebo 11 30 0 2 1 -0.756354 0.081414
5 5 placebo 11 30 0 2 2 -0.756354 0.081414
6 3 placebo 11 30 0 2 3 -0.756354 0.081414
7 3 placebo 11 30 1 2 4 -0.756354 0.081414
8 2 placebo 6 25 0 3 1 -1.362490 -0.100908
9 4 placebo 6 25 0 3 2 -1.362490 -0.100908
Comparons la distribution du nombre de crises d'épilepsie après s'être vu prescrire un médicament ne contenant pas l'ingrédient actif appelé placebo et un antiépileptique de type GABA appelé progavide. Le nombre de données est de 112 pour les premiers et de 124 pour les seconds.
data[data.trt!="placebo"].y.hist()
data[data.trt=="placebo"].y.hist()
data[data.trt!="placebo"].y.count(),data[data.trt=="placebo"].y.count()
(124, 112)
Faisons un graphique de fréquence du nombre d'attaques et du nombre d'âges au cours de la période de référence standardisée.
data.lbase.hist()
data.lage.hist()
Ensuite, nous obtenons des statistiques descriptives. Écart moyen et standard du nombre d'attaques au cours de la période de référence
data.base.mean(),data.base.std()
(31.220338983050848, 26.705051109822254)
Écart moyen et standard du nombre d'attaques après progavide
data[data.trt!="placebo"].y.mean(),data[data.trt!="placebo"].y.std()
(7.959677419354839, 13.92978863002629)
Écart moyen et standard du nombre de crises pendant la période de référence des patients ayant reçu Progavid
data[data.trt!="placebo"].base.mean(),data[data.trt!="placebo"].base.std()
(31.612903225806452, 27.638405492528324)
Écart moyen et standard du nombre d'attaques après application du placebo
data[data.trt=="placebo"].y.mean(),data[data.trt=="placebo"].y.std()
(8.580357142857142, 10.369426989352696)
Écart moyen et standard du nombre d'attaques au cours de la période de référence des patients ayant reçu le placebo
data[data.trt=="placebo"].base.mean(),data[data.trt=="placebo"].base.std()
(30.785714285714285, 25.749111266541444)
Le journal de l'âge du sujet et du nombre d'attaques au cours de la période de référence est tracé.
plt.scatter(data.lage,data.lbase)
rg=sm.OLS(data.lbase,data.lage).fit()
plt.plot(data.lage,rg.fittedvalues)
Estimez le modèle. Il essaie de suivre la distribution de Poisson pour le nombre d'attaques.
independence()
Pour la matrice de corrélation de travail, on suppose que les données appariées des mesures répétées de chaque patient sont indépendantes. «sujet» indique des groupes.
fam = sm.families.Poisson()
ind = sm.cov_struct.Independence()
mod = smf.gee("y ~ age + trt + base", "subject", data,
cov_struct=ind, family=fam)
res = mod.fit()
print(res.summary())
GEE Regression Results
===================================================================================
Dep. Variable: y No. Observations: 236
Model: GEE No. clusters: 59
Method: Generalized Min. cluster size: 4
Estimating Equations Max. cluster size: 4
Family: Poisson Mean cluster size: 4.0
Dependence structure: Independence Num. iterations: 2
Date: Sat, 02 Nov 2019 Scale: 1.000
Covariance type: robust Time: 13:06:54
====================================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------------
Intercept 0.5730 0.361 1.589 0.112 -0.134 1.280
trt[T.progabide] -0.1519 0.171 -0.888 0.375 -0.487 0.183
age 0.0223 0.011 1.960 0.050 2.11e-06 0.045
base 0.0226 0.001 18.451 0.000 0.020 0.025
==============================================================================
Skew: 3.7823 Kurtosis: 28.6672
Centered skew: 2.7597 Centered kurtosis: 21.9865
==============================================================================
Ensuite, prenez la valeur moyenne du nombre d'attaques pour chaque sujet et le logarithme de la variance et effacez-la.
yg = mod.cluster_list(np.asarray(data["y"]))
ymn = [x.mean() for x in yg]
yva = [x.var() for x in yg]
plt.grid(True)
plt.plot(np.log(ymn), np.log(yva), 'o')
plt.plot([-2, 6], [-2, 6], '-', color='grey')
plt.xlabel("Log variance", size=17)
plt.ylabel("Log mean", size=17)
exchangeable() Dans ce cas, on suppose que les données appariées des mesures répétées de chaque patient pour la matrice de corrélation de travail ont la même corrélation.
fam = sm.families.Poisson()
ex = sm.cov_struct.Exchangeable()
mod = smf.gee("y ~ age + trt + base", "subject", data,
cov_struct=ex, family=fam)
res = mod.fit()
print(res.summary())
GEE Regression Results
===================================================================================
Dep. Variable: y No. Observations: 236
Model: GEE No. clusters: 59
Method: Generalized Min. cluster size: 4
Estimating Equations Max. cluster size: 4
Family: Poisson Mean cluster size: 4.0
Dependence structure: Exchangeable Num. iterations: 2
Date: Thu, 31 Oct 2019 Scale: 1.000
Covariance type: robust Time: 07:23:48
====================================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------------
Intercept 0.5730 0.361 1.589 0.112 -0.134 1.280
trt[T.progabide] -0.1519 0.171 -0.888 0.375 -0.487 0.183
age 0.0223 0.011 1.960 0.050 2.11e-06 0.045
base 0.0226 0.001 18.451 0.000 0.020 0.025
==============================================================================
Skew: 3.7823 Kurtosis: 28.6672
Centered skew: 2.7597 Centered kurtosis: 21.9865
==============================================================================
fig = res.plot_isotropic_dependence()
fig.get_axes()[0].set_ylim(0, 1)
rslts = res.params_sensitivity(0., 0.9, 5)
dp = [x.cov_struct.dep_params for x in rslts]
age_params = np.asarray([x.params[2] for x in rslts])
age_se = np.asarray([x.bse[2] for x in rslts])
plt.grid(True)
plt.plot(dp, age_params, '-', color='orange', lw=4)
plt.plot(dp, age_params + age_se, '-', color='grey')
plt.plot(dp, age_params - age_se, '-', color='grey')
plt.axvline(res.cov_struct.dep_params, ls='--', color='black')
plt.xlabel("Autocorrelation parameter", size=14)
plt.ylabel("Age effect", size=14)
plt.plot(res.fittedvalues, res.resid, 'o', alpha=0.5)
plt.xlabel("Fitted values", size=17)
plt.ylabel("Residuals", size=17)
Autoregressive() Dans ce cas, on suppose que les données appariées des mesures répétées de chaque patient pour la matrice de corrélation de travail sont autocorrélées.
fam = sm.families.Poisson()
au = sm.cov_struct.Autoregressive()
mod = smf.gee("y ~ age + trt + base", "subject", data,
cov_struct=au, family=fam)
res = mod.fit()
print(res.summary())
GEE Regression Results
===================================================================================
Dep. Variable: y No. Observations: 236
Model: GEE No. clusters: 59
Method: Generalized Min. cluster size: 4
Estimating Equations Max. cluster size: 4
Family: Poisson Mean cluster size: 4.0
Dependence structure: Autoregressive Num. iterations: 11
Date: Sat, 02 Nov 2019 Scale: 1.000
Covariance type: robust Time: 13:08:52
====================================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------------
Intercept 0.4123 0.422 0.977 0.329 -0.415 1.240
trt[T.progabide] -0.0704 0.164 -0.430 0.667 -0.391 0.250
age 0.0274 0.013 2.108 0.035 0.002 0.053
base 0.0223 0.001 18.252 0.000 0.020 0.025
==============================================================================
Skew: 3.9903 Kurtosis: 30.1753
Centered skew: 2.7597 Centered kurtosis: 21.9865
==============================================================================
fig = res.plot_isotropic_dependence()
fig.get_axes()[0].set_ylim(0, 1)
rslts = res.params_sensitivity(0., 0.9, 5)
dp = [x.cov_struct.dep_params for x in rslts]
age_params = np.asarray([x.params[2] for x in rslts])
age_se = np.asarray([x.bse[2] for x in rslts])
plt.grid(True)
plt.plot(dp, age_params, '-', color='orange', lw=4)
plt.plot(dp, age_params + age_se, '-', color='grey')
plt.plot(dp, age_params - age_se, '-', color='grey')
plt.axvline(res.cov_struct.dep_params, ls='--', color='black')
plt.xlabel("Autocorrelation parameter", size=14)
plt.ylabel("Age effect", size=14)
La question de savoir si l'administration du médicament à l'étude réduisait ou non le nombre d'attaques par rapport au placebo a été testée en modifiant la matrice de corrélation de travail, mais le résultat selon lequel elle est significative lors de l'utilisation de l'équation d'estimation généralisée de cette étude clinique est Je ne peux pas comprendre.
Regardons le cas où les résultats des essais cliniques sont évalués à l'aide de l'équation d'estimation générale en utilisant les données des crises d'épilepsie des mêmes 59 personnes.
Tout d'abord, changez la structure des données et mettez le nombre d'attaques pendant la période de référence dans $ y_ {ij}
import pandas as pd
yy=pd.DataFrame(np.arange(59)+1,columns=['subject'])
yy['period']=np.log(8)
yy['y']=np.NaN
yy['trt']=0#np.NaN
yy['btrt']=0
data['btrt']=1
data['period']=np.log(2)
ii=0
for i in range(len(data)):
if data.subject.iloc[i]==yy.subject.iloc[ii]:
yy.iloc[ii,2]=data.base.iloc[i]
yy.iloc[ii,3]=data.trt.iloc[i]
yy.iloc[ii,0]=data.subject.iloc[i]
ii+=1
if ii>=59:
break
yy=pd.concat([data,yy],axis=0,join='inner')
for i in range(len(yy)):
if yy.iloc[i,1]=='progabide':
yy.iloc[i:i+1,1]=1
if yy.iloc[i,1]=='placebo':
yy.iloc[i:i+1,1]=0
mod = smf.gee("y ~ btrt + trt ", "subject", yy,
cov_struct=ex, family=fam,offset='period')
res = mod.fit()
print(res.summary())
GEE Regression Results
===================================================================================
Dep. Variable: y No. Observations: 295
Model: GEE No. clusters: 59
Method: Generalized Min. cluster size: 5
Estimating Equations Max. cluster size: 5
Family: Poisson Mean cluster size: 5.0
Dependence structure: Exchangeable Num. iterations: 6
Date: Sat, 02 Nov 2019 Scale: 1.000
Covariance type: robust Time: 23:30:28
==============================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
Intercept 1.3240 0.168 7.883 0.000 0.995 1.653
btrt 0.0560 0.106 0.530 0.596 -0.151 0.263
trt 0.0705 0.213 0.331 0.740 -0.346 0.487
==============================================================================
Skew: 3.3538 Kurtosis: 15.0311
Centered skew: 2.0882 Centered kurtosis: 6.6169
==============================================================================
Aucun résultat n'est obtenu indiquant que le groupe d'étude des essais cliniques est significatif. C'est un peu différent là-bas. Ajoutez l'âge du sujet, qui est une covariable.
import pandas as pd
yy=pd.DataFrame(np.arange(59)+1,columns=['subject'])
yy['period']=0
yy['y']=np.NaN
yy['trt']=0#np.NaN
yy['btrt']=0
yy['age']=0
data = sm.datasets.get_rdataset('epil', package='MASS').data
data['btrt']=1
ii=0
for i in range(len(data)):
if data.subject.iloc[i]==yy.subject.iloc[ii]:
yy.iloc[ii,2]=data.base.iloc[i]
#yy.iloc[ii,3]=data.trt.iloc[i]
yy.iloc[ii,0]=data.subject.iloc[i]
yy.iloc[ii,5]=data.age.iloc[i]
ii+=1
if ii>=59:
break
#print(yy.head(200))
yy=pd.concat([data,yy],axis=0,join='inner')
for i in range(len(yy)):
if yy.iloc[i,1]=='progabide':
yy.iloc[i,1]=1
if yy.iloc[i,1]=='placebo':
yy.iloc[i,1]=0
yy[yy.trt==0].count()
mod = smf.gee("y ~ age + btrt + trt ", "subject", yy,
cov_struct=ind, family=fam,offset='period')
res = mod.fit()
print(res.summary())
GEE Regression Results
===================================================================================
Dep. Variable: y No. Observations: 295
Model: GEE No. clusters: 59
Method: Generalized Min. cluster size: 5
Estimating Equations Max. cluster size: 5
Family: Poisson Mean cluster size: 5.0
Dependence structure: Independence Num. iterations: 2
Date: Sat, 02 Nov 2019 Scale: 1.000
Covariance type: robust Time: 23:48:30
==============================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
Intercept 3.9937 0.614 6.503 0.000 2.790 5.197
age -0.0198 0.021 -0.954 0.340 -0.060 0.021
btrt -4.3316 0.154 -28.050 0.000 -4.634 -4.029
trt -0.1014 0.335 -0.303 0.762 -0.758 0.555
==============================================================================
Skew: 2.6891 Kurtosis: 13.3017
Centered skew: 0.3066 Centered kurtosis: 3.7456
==============================================================================
Le fait qu'il ne devienne pas significatif reste inchangé.
Les références:
Analyse des données d'événements de récurrence Wiki notebooks for GEE repeated measures of epileptic seizure counts