• Aucun résultat trouvé

1 ‐ Programme générique de mise en œuvre d’un modèle marginal structural sous SAS 

Dans le document en fr (Page 191-195)

Première partie : calcul des poids selon la formule : 

  |  , |  , ,     Exemple où :  E est une variable à 3 catégories (notée « expo » dans le modèle)  Y l’évènement d’intérêt est une variable en deux catégories  Les facteurs de confusion L sont composés :  ‐ De deux variables v_cat et v_cont ne dépendant pas du temps (v_cat variable catégorielle et v_cont  variable continue)  ‐ De deux variables l_cat et l_cont dépendant du temps (l_cat variable catégorielle et l_cont variable  continue)  Avec les hypothèses suivantes :  ‐ Pour prédire l’exposition à un temps s, il suffit de prendre en compte la variables l_cat et l_cont aux  temps (s‐1) et (s‐2), notées « l_cat_lag1, l_cat_lag2, l_cont_lag1, l_cont_lag2 » ; ainsi que l’exposition  aux  temps  (s‐1)  et  (s‐2),  notée  « expo_lag1,  expo_lag2 »  (Une  hypothèse  alternative  serait  par  exemple de prendre une mesure cumulative de ces variables jusqu’à s). 

‐ Le temps est intégré dans le modèle comme une variable continue, c'est‐à‐dire qu’on suppose une  relation linéaire entre le temps et l’exposition (alternativement, des splines peuvent être utilisés).  ‐ Pour que les poids soient correctement stabilisés, les variables ne dépendant pas du temps V (v_cat  et  v_cont)  sont  intégrées  dans  le  numérateur  des  poids.  Dans  ce  cas,  la  confusion  induite  par  les  variables V n’est plus contrôlée par la méthode d’inverse probability weighting, et ces variables (ne  posant pas le problème de confusion dépendant du temps) doivent être incluses dans le modèle final  permettant d’étudier la relation entre E et Y, comme variables d’ajustement. 

 

« id » est l’identifiant des sujets, et « temps » le temps d’observation.   

/********** Numerateur ***********/ proc logistic;

class v_cat (ref="0" param=ref) expo_lag1 (ref="0" param=ref) expo_lag2 (ref="0" param=ref);

model expo (ref='0') = temps expo_lag1 expo_lag2 v_cat v_cont / link=glogit;

output out=modelnum p=pnum; data modelnum; set modelnum; if expo ne _LEVEL_ then delete; keep id temps pnum;

/* dans modelnum, on a la probabilité prédite par le modèle « numérateur » que chaque individu ait son propre niveau d’exposition */

/********** Denominateur ***********/ proc logistic;

class v_cat (ref="0" param=ref) expo_lag1 (ref="0" param=ref) expo_lag2 (ref="0" param=ref) l_cat_lag1 (ref="0" param=ref) l_cat_lag2 (ref="0" param=ref);

model expo (ref='0') = temps expo_lag1 expo_lag2 v_cat v_cont l_cat_lag1 l_cat_lag2 l_cont_lag1 l_cont_lag2 / link=glogit;

output out=modeldenB1 p=pdenB1; data modelden; set modelden; if expo ne _LEVEL_ then delete; keep id temps pden;

/* dans modelden, on a la probabilité prédite par le modèle « dénominateur » que chaque individu ait son propre niveau d’exposition */ /* remarque : ces commandes doivent être adaptées pour les temps 0 et 1 où les variables _lag1 et _lag2 peuvent ne pas être définies */

/*****************************************/ /*********** Calcul des poids ************/ /*****************************************/ /********** weight numerator *************/ data modelnum; set modelnum;

proc sort; by id temps; data modelnum; set modelnum; by id;

if first.id then wnum=1; retain wnum;

wnum=wnum*pnum;

/* multiplie les probabilités conditionnelles jusqu’à chaque temps s */ /********** weight denominator *************/

data modelden; set modelden; proc sort; by id temps;

data modelden; set modelden; by id;

if first.id then wden=1; retain wden;

wden=wden*pden;

/**** weight ****/

data weight; merge modelnum modelden; by id temps; w=wnum/wden; /* le jeu de données weight contient l’identifiant des sujets, le temps, et le poids w correspondant à  chaque observation sujet‐temps */   

Deuxième partie : modèle final 

Une fois les poids calculés, le modèle final permettant d’étudier la relation entre E et Y après prise en  compte de la confusion dépendant du temps induite par les facteurs L s’écrit :   

proc genmod descending;

class id expo (ref=first param=ref) v_cat (ref=first param=ref); model y = expo1 v_cat v_cont temps / dist=bin;

weight w;

repeated subject=id / type=ind ;

estimate 'msm expo 1 vs 0' expo 1 0 /exp; estimate 'msm expo 2 vs 0' expo 0 1 /exp;  

2 ‐ Programme utilisé pour l’analyse « Quantification et contrôle du healthy worker 

effect dans l’asthme » 

Première partie : calcul des poids sous SAS 

  /***************************************************************/ /*********************** model A : time=1 **********************/ /***************************************************************/ data popA; set pop;

where temps = 1;

/********** Numerator ***********/ proc logistic data=popA;

class gender (ref="2" param=ref) cohorte5 (ref="0" param=ref); model expo1 (ref='0') = gender agedebw cohorte5 / link=glogit; output out=modelnumA1 p=pnumA1;

data modelnumA1; set modelnumA1; if expo1 ne _LEVEL_ then delete;

keep nodos2 temps pnumA1;

/********** Denominator ***********/

/* same model with additional variable : "asthmalag1"

i.e. asthma status up to the previous period (for model A : ever asthma before the first job) */

proc logistic data=popA;

class asthmeevlag1 (ref="0" param=ref) gender (ref="2" param=ref) tabaclag1 (ref="0" param=ref) cohorte5 (ref="0" param=ref);

model expo1 (ref='0') = asthmeevlag1 gender tabaclag1 agedebw cohorte5 / link=glogit;

output out=modeldenA1 p=pdenA1; data modeldenA1; set modeldenA1; if expo1 ne _LEVEL_ then delete; keep nodos2 temps pdenA1;

/************************************************************/ /********* model B : time > 1 (all other periods) ***********/ /************************************************************/ data popB; set pop;

where temps gt 1;

/********** Numerator ***********/ proc logistic data=popB;

class gender (ref="2" param=ref) expocum1lag1 (ref="0" param=ref) cohorte5 (ref="0" param=ref);

model expo1 (ref='0') = temps gender agedebw expocum1lag1 cohorte5 / link=glogit;

output out=modelnumB1 p=pnumB1; data modelnumB1; set modelnumB1; if expo1 ne _LEVEL_ then delete; keep nodos2 temps pnumB1;

/********** Denominator ***********/ proc logistic data=popB;

class asthmeevlag1 (ref="0" param=ref) gender (ref="2" param=ref) tabaclag1 (ref="0" param=ref)

expocum1lag1 (ref="0" param=ref) cohorte5 (ref="0" param=ref);

model expo1 (ref='0') = asthmeevlag1 temps gender tabaclag1 agedebw expocum1lag1 cohorte5 / link=glogit;

output out=modeldenB1 p=pdenB1; data modeldenB1; set modeldenB1; if expo1 ne _LEVEL_ then delete; keep nodos2 temps pdenB1;

/**************************************************/ /****************** weight calculation ************/ /**************************************************/ /********** weight numerator *************/

/* regroup the conditional probabilities obtained with model A (time=1) and model B (time > 1) in the same table */

data modelnumA1; set modelnumA1; rename pnumA1=pnum1;

rename pnumB1=pnum1;

data weightnum1; set modelnumA1 modelnumB1; proc sort; by nodos2 temps;

data weightnum1; set weightnum1; by nodos2;

if first.nodos2 then wnum1=1; retain wnum1;

wnum1=wnum1*pnum1;

/* multiply the conditional probability up to each time s */ /********** weight denominator *************/

data modeldenA1; set modeldenA1; rename pdenA1=pden1;

data modeldenB1; set modeldenB1; rename pdenB1=pden1;

data weightden1; set modeldenA1 modeldenB1; proc sort; by nodos2 temps;

data weightden1; set weightden1; by nodos2;

if first.nodos2 then wden1=1; retain wden1;

wden1=wden1*pden1;

/**** weight ****/

data weight1; merge weightnum1 weightden1; by nodos2 temps;

w1=wnum1/wden1;  

Dans le document en fr (Page 191-195)