Projet Stat - Evaluation de l`échelle de dépression de Hamilton
Transcription
Projet Stat - Evaluation de l`échelle de dépression de Hamilton
DEVOIR Evaluation de l’échelle de dépression de Hamilton Pierre-François BUSSON M2 MSR – Janvier 2009 SOMMAIRE DESCRIPTION DES DONNEES ...................................................................................................... 4 VALIDATION DE L’ECHELLE DE HAMILTON ............................................................................. 5 1. Temps J0 (première visite) .............................................................................................. 5 Qualité des items ................................................................................................................ 5 Structure dimensionnelle de la mesure............................................................................... 7 Coefficient de Cronbach..................................................................................................... 8 Validation avec une autre échelle....................................................................................... 8 2. Temps J56 (huitième et dernière visite) ......................................................................... 9 Qualité des items ................................................................................................................ 9 Structure dimensionnelle de la mesure............................................................................. 10 Coefficient de Cronbach................................................................................................... 11 Validation avec une autre échelle..................................................................................... 11 REPONSE AU TRAITEMENT SELON LE SEXE ............................................................................. 13 1. Méthode LOCF / ITT..................................................................................................... 13 Méthodologie ................................................................................................................... 13 Résultats ........................................................................................................................... 13 Diagnostic de régression .................................................................................................. 13 Discussion ........................................................................................................................ 14 2. Modèle mixte avec résidus à covariance structurée .................................................... 14 Méthodologie ................................................................................................................... 14 Résultats ........................................................................................................................... 15 Diagnostic de régression .................................................................................................. 15 3. Analyse des données censurées...................................................................................... 16 Méthodologie ................................................................................................................... 16 Résultats ........................................................................................................................... 16 Validité du modèle ........................................................................................................... 17 Discussion ........................................................................................................................ 17 ANNEXE : SCRIPT R ................................................................................................................. 18 INTRODUCTION Lors d’une étude d’épidémiologie clinique, on a évalué l’état de dépression des individus sous traitement à plusieurs reprises (huit visites sont prévues en tout, de J0 à J56), à l’aide d’une hétéroévaluation utilisant l’échelle de dépression de Hamilton (ou HDRS), et d’une autoévaluation utilisant l’échelle de mesure SCL90. L’échelle de Hamilton date de 1967. Elle repose sur l’évaluation par un clinicien de 17 critères représentant la symptomatologie dépressive. Les items de l’échelle sont cotés de 0 à 2 ou de 0 à 4, et la somme de tous les items représente le score de dépression total. Plus le score est élevé, plus la dépression est importante. L’échelle SCL90 est un instrument d’autoévaluation, c'est-à-dire que c’est le patient lui-même qui le remplit. Cette échelle est composée de 90 phrases courtes décrivant des symptômes, les réponses sont cotées de 0 (« non ») à 4 (« oui, extrêmement »). Le patient choisit de cocher la case qui lui semble concorder le mieux avec son ressenti. Ici encore la somme de tous les items aboutit à un score global de dépression. Cependant on peut diviser les items de l’échelle en dix sous-scores représentant un aspect particulier de la dépression, comme la somatisation, l’anxiété, l’hostilité, etc. Afin de s’assurer de la fiabilité des données fournies par l’échelle de Hamilton, nous allons en premier lieu la valider aux temps J0 et J56. La deuxième partie de notre travail consistera à déterminer la présence d’une éventuelle différence de réponse au traitement entre hommes et femmes. Nous utiliserons plusieurs approches pour répondre à cette question. DESCRIPTION DES DONNEES Le nombre de patients ayant participé à cette étude s’élève à 146, dont 56 hommes (38%) et 90 femmes (62%). Le score global à l’échelle de Hamilton avait, à J0 une moyenne de 27,92 et un écart-type de 4,20. Le score global le plus élevé était de 44 et le plus faible de 13. A J56, le score global moyen atteint 7,81, avec un écart-type de 5,54. Les scores s’étalaient entre 0 et 27. 60 0 20 40 Effectifs 80 100 120 Le nombre de visites auxquelles ont participé les patients va de 1 à 8, mais on constate que 120 individus (soit 82%) ont participé aux huit (fig.1). Seuls six patients n’en ont suivi qu’une seule. Cela nous assure un faible taux de censures, mais on peut regretter de ne pas avoir les informations concernant les 26 sujets sortis de l’étude avant la dernière visite. En effet, si la sortie de l’étude est due à un suicide ou une tentative de suicide on pouvait conclure que la dépression s’était aggravée chez le patient. 1 2 3 4 5 6 7 8 Nombre de visites effectuées Fig.1 : Représentation graphique de la distribution du nombre de visites effectuées VALIDATION DE L’ECHELLE DE HAMILTON Nous allons valider l’instrument de mesure aux temps J0 et J56. La première question à se poser est celle du contenu. Il apparaît que les 17 items que contient l’échelle de Hamilton semblent bien correspondre à la pathologie que l’on veut décrire, à savoir la dépression. La validation d’un instrument de mesure se réalise en posant une question d’ordre sémantique : « que mesure l’instrument ? » ; et une question d’ordre métrologique : « que vaut la mesure ? ». 1. TEMPS J0 (PREMIERE VISITE) Qualité des items On s’assure tout d’abord qu’il n’y a pas de donnée manquante ni aberrante dans les réponses aux différentes questions lors de la visite à J0. Toutes les données sont comprises entre 0 et 4, et on a bien 146 lignes pour chaque question. Le taux de non-réponse est donc égal à 0, preuve que les items sont de bonne qualité, ils sont compréhensibles et précis. On peut vérifier que les données ne présentent pas d’effet « plafond » ou « plancher ». Pour cela on réalise les représentations graphiques de la distribution des réponses à chaque question (fig.2 page suivante). Dans l’ensemble les réponses semblent plutôt bien réparties. Il n’y a pas de réponse qui n’ait jamais été choisie. La qualité des items paraît bonne, ici encore. Pour que les items soient de bonne qualité, il faut aussi qu’ils ne soient pas trop corrélés deux à deux. La matrice des coefficients de corrélation de Spearman permet de contrôler ce point. Ici aucune corrélation ne dépasse 0,4. C’est la preuve que les items mesurent tous des aspects différents de la dépression. 1 2 3 2 3 4 2 0 1 2 0 1 2 50 0 20 0 1 2 3 30 0 30 60 0 0 40 40 80 0 1 1 2 3 4 2 0 1 2 0 1 2 3 0 1 2 0 40 80 0 0 40 0 1 1 60 2 80 4 1 2 3 4 50 1 0 50 0 20 0 1 2 3 0 0 20 0 0 80 2 1 2 3 4 40 1 40 80 0 0 80 0 0 20 40 50 0 0 4 0 0 20 0 3 40 80 50 80 40 80 40 0 2 80 1 Fig.2 : Représentations graphiques de la distribution des réponses à chaque question à J0 Structure dimensionnelle de la mesure On peut maintenant se demander s’il est correct d’additionner les réponses aux différents items pour construire un score global. Pour répondre, on utilise le diagramme des valeurs propres de la matrice de corrélation des différents items (fig.3). Si une ou plusieurs valeurs propres se distinguent des autres, cela signifie que la somme des items est une bonne estimation de « l’état réel » de dépression. De plus, si une seule valeur propre se distingue, on pourra conclure à l’unidimensionnalité, c'està-dire que tous les items contribuent à la mesure d’une même facette de la dépression. 1.0 0.5 Eigenvalue 1.5 2.0 Afin de savoir combien de valeurs propres se distinguent, on simule sur le même graphique 20 jeux de données suivant une loi normale. Ces simulations représentent du bruit pur. 5 10 15 Dimension Fig.3 : Diagramme des valeurs propres des 17 items à J0 On remarque que trois valeurs propres se trouvent nettement au dessus des valeurs simulées. Il est donc acceptable de faire la somme des différents items. Par contre l’hypothèse d’unidimensionnalité est rejetée. Cela n’est pas surprenant puisque Hamilton lui-même a mis en évidence six facteurs différents, avant que l’unidimensionnalité soit de nouveau contestée dans plusieurs études. Il est alors possible de réaliser une analyse factorielle à 3 facteurs, afin de voir si une sous-dimension est privilégiée par l’instrument de mesure. On observe que la séparation des différents facteurs n’est pas nette. Quelques items se positionnent clairement dans un des trois facteurs – comme l’item 12 dans le facteur 1 ou l’item 13 dans le facteur 2 – mais dans la plupart des cas on ne peut trancher entre l’un ou l’autre des facteurs. Cela montre que même si l’échelle n’est pas unidimensionnelle, les différentes dimensions ont tendance à se recouper. On retrouve cette hypothèse sur le diagramme des valeurs propres, puisque les points qui se distinguent sont proches les uns des autres. Cependant ces résultats sont à prendre avec précaution, étant donné que la distribution des réponses à certaines questions semble s’écarter d’une loi normale. Coefficient de Cronbach Le coefficient de Cronbach mesure la consistance interne, c'est-à-dire la fiabilité de l’instrument de mesure. Ici il est égal à 0,46. Son intervalle de confiance, calculé par bootstrap vaut [0,22 – 0,61]. C’est un résultat moyen, mais on a déjà vu que l’échelle de Hamilton est quelque peu controversée, ce qui semble être confirmé par l’analyse factorielle. Validation avec une autre échelle Pour valider l’échelle de Hamilton, on peut aussi comparer ses résultats à ceux d’un autre instrument de mesure, comme l’échelle d’autoévaluation SCL90. Pour ce faire, on calcule les coefficients de corrélation entre les sous-scores de l’échelle SCL90 et le score global de l’échelle de Hamilton. On a préalablement retiré tous les patients présentant des valeurs manquantes et aberrantes des données de l’échelle SCL90, ce qui aboutit à un jeu de données comprenant 109 individus. Une Analyse en Composantes Principales focalisée sur le score HDRS permet de représenter graphiquement ces corrélations (fig.4). . r=0 r = 0.2 r = 0.4 r = 0.6 r = 0.8 symptobs depression somatisation symdiv anxiete psycho sensitivite score phobie parano hostilite . Fig.4 : Cercle des corrélations entre les sous-scores SCL90 et le score global HDRS à J0 On remarque que seuls quatre sous-scores sont corrélés significativement avec le score global de Hamilton. C’est assez peu compte tenu du fait que ces deux échelles ont été validées à plusieurs reprises. On peut cependant supposer qu’elles mesurent des aspects quelque peu différents de la dépression, ou alors que l’échelle d’autoévaluation est plutôt représentative de l’état du patient à un moment précis, alors que l’échelle de Hamilton est plutôt une représentation globale de la gravité de la dépression. De plus, le sous-score Dépression a une corrélation entre 0,3 et 0,4 avec le score de Hamilton, ce qui est très correct, puisque l’échelle de Hamilton a avant tout pour but de donner une représentation de la dépression. 2. TEMPS J56 (HUITIEME ET DERNIERE VISITE) Qualité des items Comme pour l’étude à J0, il n’y a pas de donnée manquante ou aberrante dans les réponses aux différentes questions à J56. Toutes les données varient de 0 à 4, et on a bien 120 lignes pour chaque question, ce qui correspond au nombre de patients ayant participé à cette dernière visite. La représentation graphique de la distribution des réponses (fig.5, page suivante) ne permet pas vraiment de mettre en évidence un effet « plafond » ou « plancher », mis à part peut-être sur les questions 16 et 17 qui correspondent à la perte de poids et à la prise de conscience de la maladie. Cependant, toutes les modalités de réponse sont représentées. Les items ne sont pas excessivement corrélés entre eux, puisque la matrice des coefficients de corrélation de Spearman ne contient pas de valeur supérieure à 0,6. On peut donc dire que la qualité des items est correcte, ici aussi. 3 20 40 60 80 4 0 1 2 0 1 2 0 0 1 3 0 1 2 3 4 0 1 2 0 1 2 3 40 0 0 1 2 1 2 1 2 0 1 2 40 0 0 0 80 20 40 60 40 0 2 0 40 0 20 40 20 0 1 4 0 1 2 3 0 40 80 0 3 0 4 2 20 0 2 1 80 0 0 50 20 0 1 60 0 2 40 40 2 20 40 60 1 0 20 40 0 40 0 0 1 80 80 2 0 0 20 40 60 20 40 60 0 1 80 0 Fig.5 : Représentations graphiques de la distribution des réponses à chaque question à J56 Structure dimensionnelle de la mesure Afin de savoir si l’unidimensionnalité est respectée, on réalise le diagramme des valeurs propres à J56 (fig.6). 5 4 3 1 2 Eigenvalue 5 10 15 Dimension Fig.6 : Diagramme des valeurs propres des 17 items à J56 On voit ici que la première valeur propre se distingue très largement. L’unidimensionnalité semble respectée cette fois. On peut donc sans problème additionner les différents items pour construire le score global. L’analyse factorielle n’est pas nécessaire ici, d’une part parce qu’une seule valeur propre se distingue, et d’autre part parce que la normalité de la distribution des réponses aux différents items n’est pas respectée. Coefficient de Cronbach Le coefficient de Cronbach et son intervalle de confiance valent ici 0,82 [0,75 – 0,86]. Ce coefficient est très bon, la mesure est donc très fiable. Validation avec une autre échelle Après avoir éliminés tous les patients présentant des données manquantes ou aberrantes des données SCL90 – il reste alors 92 patients – on calcule les coefficients de corrélation entre les sous-scores de l’échelle SCL90 et le score global de l’échelle de Hamilton. L’ACP focalisée sur le score permet de représenter graphiquement ces corrélations (fig.7). . r=0 r = 0.2 r = 0.4 r = 0.6 r = 0.8 somatisation symptobs depression symdiv anxiete psycho score sensitivite parano phobie hostilite . Fig.7 : Cercle des corrélations entre les sous-scores SCL90 et le score global HDRS à J56 Cette fois, tous les sous-scores présentent une corrélation significative avec le score global. Les résultats à J56 laissent à penser que l’échelle de Hamilton est un bon instrument de mesure. Cependant, les résultats obtenus à J0 nuancent cette affirmation, tout comme l’ont fait plusieurs publications depuis 1976. Malgré que nos résultats à J0 semblent réfuter l’hypothèse d’unidimensionnalité, nous allons par la suite utiliser le score global, puisque plusieurs auteurs s’accordent à dire qu’il a une validité suffisante. REPONSE AU TRAITEMENT SELON LE SEXE La question est maintenant de savoir si la réponse au traitement est différente selon le sexe. On peut créer une variable contenant la différence pour chaque individu entre son score à J0 et son score à J56. La baisse moyenne du score est égale à 16,73 (écart-type = 9,34) chez les hommes, tandis que chez les femmes, elle vaut 17,86 (écart-type = 8,44). A première vue les deux moyennes ne semblent pas différentes, mais il est possible d’analyser ceci plus finement, grâce à différentes approches. 1. METHODE LOCF / ITT Méthodologie La première méthode consiste à faire une analyse en intention de traiter, c’est-à-dire que les patients qui n’ont pas participé à la totalité des visites sont analysés au même titre que ceux qui ont participé aux huit visites. Les données manquantes pour ces patients sont calculés par la méthode LOCF (Last Observation Carried Forward) : lorsqu’on rencontre une donnée manquante, on la remplace par la dernière valeur observée chez le patient. La variable d’intérêt est ici la différence entre le score à J0 et le score à J56. Les 146 patients du jeu de données sont inclus. C’est un modèle de régression qui est mis en place. Il explique la différence de score par le sexe et le score à J0. On ajuste sur le score à J0 car on peut imaginer que l’importance de la différence de score peut varier en fonction du score initial pour un patient donné. Résultats La régression ne nous permet pas d’accepter l’hypothèse selon laquelle la réponse au traitement serait différente selon le sexe. En effet, le « p » correspondant à la variable sexe est égal à 0,65, ce qui est bien au dessus des 5% habituellement requis. Diagnostic de régression Pour valider ce résultat, il faut cependant vérifier que les conditions de validité du modèle sont bien respectées. On constate ici que les résidus s’écartent un peu de la normalité, mais pas suffisamment toutefois pour rejeter la validité du modèle. De plus, l’indépendance des résidus avec les variables expliquées et explicatives semble respectée (fig.8). Les sujets qui se distinguent sont ceux pour lesquels la différence de score est négative, c'est-à-dire ceux qui ont un score plus élevé à J56 qu’à J0. 1 -2 -1 0 Standardized residuals 10 120 2 -3 0 -10 Residuals -20 120 -30 2 Normal Q-Q 2 Residuals vs Fitted 97 97 10 15 20 25 30 -2 Fitted values -1 0 1 2 Theoretical Quantiles Fig.8 : Représentations graphiques des résidus du modèle de régression LOCF / ITT Discussion Ce modèle a permis de conclure à la non-différence de réponse au traitement entre les deux sexes, mais on peut lui trouver quelques inconvénients. D’abord, la méthode LOCF peut induire un biais dans l’analyse puisqu’on ne sait pas ce qui a causé les données manquantes. Enfin, ce modèle ne tient pas compte du fait que les données ont été recueillies de manière répétée chez les patients. Il faut pour cela mettre en place un autre modèle. 2. MODELE MIXTE AVEC RESIDUS A COVARIANCE STRUCTUREE Méthodologie C’est le modèle mixte avec résidus à covariance structurée qui est le mieux adapté aux données avec mesures répétées. 25 20 15 10 Moyenne du score Tout d’abord, on s’assure que les moyennes des scores à chaque visite ont une allure linéaire (fig.9). Si ce n’était pas le cas, il faudrait transformer les données. 1 2 3 4 5 6 7 8 Numéro de visite Fig.9 : Moyennes des scores globaux à chaque visite Le modèle mixte que l’on met en place permet d’expliquer le score gobal par le sexe, en ajustant sur la date de la visite (codée quantitativement). Il implique une matrice de corrélation dont il faut préciser la forme. Les deux plus courantes sont la matrice de Toeplitz, qui prend en compte le fait que deux observations consécutives sont plus corrélées que deux observations non consécutives, et la matrice AR(1), ou auto-régressive, qui considère que les corrélations diminuent en fonction du temps. On peut imaginer que les hommes et les femmes ont une réponse différente au traitement selon le temps. C’est pourquoi le modèle qu’on met en place tient compte d’une interaction entre le sexe et la date de visite. De plus la variable représentant l’identifiant de chaque sujet est emboîtée dans la variable sexe. L’emboîtement apparaît aussi dans le modèle. Résultats C’est le critère d’Akaike qui nous permet de déterminer quelle forme on va préciser pour la matrice de corrélation. Dans notre cas, il est en faveur d’une matrice AR(1). Il apparaît que le modèle mixte avec résidus à covariance structurée ne permet pas non plus de rejeter l’hypothèse selon laquelle la réponse au traitement serait différente entre les hommes et les femmes (p = 0,96). Il semble que la réponse au traitement ne soit pas significativement différente entre les hommes et les femmes en fonction du temps (p = 0,88). Diagnostic de régression On vérifie la normalité des résidus graphiquement (fig.10). La normalité semble très bien respectée ici, le modèle peut donc être considéré comme valide. Normal Q-Q Plot -10 0 Sample Quantiles 300 200 -20 100 0 Frequency 400 10 500 20 600 Histogram of modele$residuals -20 -10 0 modele$residuals 10 20 -3 -2 -1 0 1 Theoretical Quantiles Fig.10 : Représentations graphiques des résidus du modèle mixte. 2 3 3. ANALYSE DES DONNEES CENSUREES Méthodologie Le modèle mixte avec résidus à covariance structurée donne de bons résultats, mais il ne prend pas en compte le fait que certains patients sont sortis de l’étude avant de participer à la huitième et dernière visite. C’est une analyse des données censurées qui va permettre de répondre à la question de la différence de réponse au traitement entre les sexes tout en tenant compte de leur structure particulière. La variable d’intérêt n’est alors plus le score global ou la différence des scores, mais une variable binaire qui sera égale à 1 quand le score aura baissé d’au moins 50% entre la première visite et la dernière de chaque patient, et égale à 0 quand on n’aura pas observé cette baisse. On peut utiliser deux méthodes pour répondre à la question : la première est un simple test du log-rank, et la seconde est le modèle de Cox. Le modèle de Cox a pour variables explicatives le sexe, et le score à J0, qui sert à l’ajustement. Résultats 1.0 On observe une baisse de 50% ou plus entre le premier et le dernier score de Hamilton chez 116 patients (45 chez les hommes, 71 chez les femmes), alors que 30 patients n’ont pas vu de baisse significative de leur score au cours du suivi (11 chez les hommes, 19 chez les femmes). 0.0 0.2 0.4 Survie 0.6 0.8 Hommes Femmes 0 10 20 30 40 50 Tps en jours Fig.11 : Courbes de Kaplan-Meier selon le sexe On voit que les courbes de Kaplan-Meier (fig.11) se croisent. Cela signifie qu’il n’y a pas de différence de réponse au traitement en fonction du sexe, ce qui est en accord avec les résultats précédents. Le test du log-rank confirme ce résultat, de même que le modèle de Cox. Ils donnent des « p » respectivement égaux à 0,77 et 0,86. Validité du modèle 0 -4 -2 Beta(t) for SEXE2 2 La représentation graphique des résidus (fig.12) montre que le modèle de Cox mis en place est valide. En effet, les résidus sont relativement dispersés, et la moyenne a une allure plutôt constante. 8.7 13 17 21 26 33 42 51 Time Fig.12 : Représentation graphique des résidus du modèle de Cox Discussion L’analyse des données de survie permet une nouvelle fois de rejeter la différence de réponse au traitement selon le sexe. Cependant, lors du calcul de la variable binaire à expliquer, on n’a pris en compte que le score obtenu à la dernière visite effectuée. Or pour un certain nombre de patients, le score diminue de plus de 50% par rapport au score à la première visite, puis remonte jusqu’à ne plus être en dessous de ce seuil. Ces individus présentent peut-être un profil particulier qu’il pourrait être intéressant d’étudier, dans le but de rendre le modèle plus juste. ANNEXE : SCRIPT R ######################## ###Stats Descriptives### ######################## ###Fichier Sexe ############### sex <- read.csv2("D:/Documents/Travail/devoir/devoir 2 (Hamilton)/sexe.csv"); str(sex); summary(sex); sex$SEXE <- as.factor(sex$SEXE); table(sex$SEXE); ###Fichier HDRS ############### hdrs <- read.csv2("D:/Documents/Travail/devoir/devoir 2 (Hamilton)/hdrs.csv"); str(hdrs); summary(hdrs); ###Transformation des données #calcul du score total pour chaque patient, à chaque visite hdrs$score <- apply(hdrs[,3:20],1,sum,na.rm=TRUE) #création d'un jeu de données avec seulement les scores totaux hdrs2 <- data.frame(hdrs[,c(1,2,21)]); #patient 128, visite J7 manquante : on supprime la ligne hdrs2 <- hdrs2[-c(703),]; #création d'une nouvelle table avec 1 ligne / individu, 99 étant le codage des données manquantes #on crée d'abord une table remplie de 99 hdrs3 <data.frame(NUMERO=rep(99,146),j0=rep(99,146),j4=rep(99,146),j7=rep(99,146), j14=rep(99,146),j21=rep(99,146),j28=rep(99,146),j42=rep(99,146),j56=rep(99, 146)); #on remplit ensuite la table avec les données de hdrs2 j <- 1; #initialisation de la variable compteur j for(i in 1:146){ #pour chaque ligne de la table hdrs3$NUMERO[i] <- hdrs2$NUMERO[j]; #on attribue le numéro de l'individu à la variable num de la nouvelle table while (hdrs3$NUMERO[i] == hdrs2$NUMERO[j] && j < 1053){ #on répète la boucle pour toutes la visites d'un même individu switch (hdrs2$VISIT[j], #on regarde à quelle visite correspond l'observation et on attribue le score à la colonne correspondante dans la nouvelle table "J0" = (hdrs3$j0[i]<-hdrs2$score[j]), "J14" = (hdrs3$j14[i]<-hdrs2$score[j]), "J21" = (hdrs3$j21[i]<-hdrs2$score[j]), "J28" = (hdrs3$j28[i]<-hdrs2$score[j]), "J4" = (hdrs3$j4[i]<-hdrs2$score[j]), "J42" = (hdrs3$j42[i]<-hdrs2$score[j]), "J56" = (hdrs3$j56[i]<-hdrs2$score[j]), "J7" = (hdrs3$j7[i]<-hdrs2$score[j]) ); j <- j+1; #incrémentation de la variable compteur } } #remplacement des données manquantes (codées 99) par une case vide for(i in 1:146){ #pour chaque ligne de la table for(j in 2:9){ if(hdrs3[i,j]==99){ hdrs3[i,j] <- ''; } } } hdrs3$j4 <- as.numeric(hdrs3$j4) hdrs3$j4 <- as.numeric(hdrs3$j4) hdrs3$j7 <- as.numeric(hdrs3$j7) hdrs3$j14 <- as.numeric(hdrs3$j14) hdrs3$j21 <- as.numeric(hdrs3$j21) hdrs3$j28 <- as.numeric(hdrs3$j28) hdrs3$j42 <- as.numeric(hdrs3$j42) hdrs3$j56 <- as.numeric(hdrs3$j56) str(hdrs3) #statistiques descriptives de j0 et j56 summary(na.omit(hdrs3$j0)) sd(na.omit(hdrs3$j0)) summary(na.omit(hdrs3$j56)) sd(na.omit(hdrs3$j56)) #on a 2 individus pour lesquels on a une donnée manquante en cours de suivi #on remplace cette donnée manquante par celle qui la précède, cela permettra de faire tourner la boucle suivante hdrs3$j4[hdrs3$NUMERO==92] <- hdrs3$j0[hdrs3$NUMERO==92] hdrs3$j7[hdrs3$NUMERO==170] <- hdrs3$j4[hdrs3$NUMERO==170] #statistiques descriptives sur le nombre de visites par patients #création de la variable contenant le nombre de visites hdrs3$nvisit <- 0; for(i in 1:146){ #pour chaque ligne de la table for(j in 2:9){ #pour chaque date de visite if(!is.na(hdrs3[i,j])){ hdrs3[i,10] <- hdrs3[i,10]+1; #incrémentation du nombre de visites } } } summary(hdrs3$nvisit) sd(hdrs3$nvisit) hdrs3$nvisit <- as.factor(hdrs3$nvisit) table(hdrs3$nvisit) barplot(table(hdrs3$nvisit), ylab="Effectifs", xlab="Nombre de visites effectuées", col="#C20000") ################## ####Question 1#### ################## ###1. Qualité des items #aggrégation des résultats aux questions 16A et 16B : hdrs$HAMD16 <- apply(hdrs[,18:19],1,sum,na.rm=TRUE) nrow(hdrs[hdrs$VISIT=="J0",c(3:17,20,22)]) summary(hdrs[hdrs$VISIT=="J0",c(3:17,20,22)]) #graphs des scores à chaque question à j0 par(mfrow=c(5,4)); for(i in c(3:17,22,20)){ barplot(table(hdrs[,i][hdrs$VISIT=="J0"]), col="#C20000") } #graphs des scores à chaque question à j56 par(mfrow=c(5,4)); for(i in c(3:17,22,20)){ barplot(table(hdrs[,i][hdrs$VISIT=="J56"]), col="#C20000") } ###2. Redondance des items #matrice de corrélation des questions à J0 corrj0 <- matrix(,17,17); #création du tableau qui contiendra les corrélations k <- 1; #initialisation des compteurs de lignes / colonnes de la matrice l <- 1; for(i in c(3:17,20,22)){ #pour toutes les questions for(j in c(3:17,20,22)){ #calcul du coefficient de corrélation, arrondi à 2 décimales corrj0[k,l] <round(cor(na.omit(hdrs[,i][hdrs$VISIT=="J0"]),na.omit(hdrs[,j][ hdrs$VISIT=="J0"]),method="spearman"), digits = 2); if(k<17){k <- k+1;}else{k <- 1;} #incrémentation du compteur de lignes } if(l<17){l <- l+1;}else{l <- 1;} #incrémentation du compteur de colonnes } corrj0 #matrice de corrélation des questions à J56 corrj56 <- matrix(,17,17); #création du tableau qui contiendra les corrélations k <- 1; #initialisation des compteurs de lignes / colonnes de la matrice l <- 1; for(i in c(3:17,20,22)){ #pour toutes les questions for(j in c(3:17,20,22)){ #calcul du coefficient de corrélation, arrondi à 2 décimales corrj56[k,l] <round(cor(na.omit(hdrs[,i][hdrs$VISIT=="J56"]),na.omit(hdrs[,j] [hdrs$VISIT=="J56"]),method="spearman"), digits = 2); if(k<17){k <- k+1;}else{k <- 1;} #incrémentation du compteur de lignes } if(l<17){l <- l+1;}else{l <- 1;} #incrémentation du compteur de colonnes } corrj56 ###3. Analyse factorielle library(psy) library(mva) ##Pour J0 #on trace le diagramme des valeurs propres à J0 scree.plot(hdrs[hdrs$VISIT=="J0",c(3:17,22,20)], type = "R", simu = 20) # sélection des colonnes j0 <- hdrs[hdrs$VISIT=="J0",c(3:17,20,22)] # transformation du fichier tp2 en matrice j0 <- as.matrix(j0) # construction d'une matrice de covariance matrcov<-cov(j0,use = "pairwise.complete.obs") # fonction d'analyse factorielle print(factanal(covmat=matrcov,rotation="varimax",factors=3),cutoff=0) ##Pour J56 #on trace le diagramme des valeurs propres à J56 scree.plot(hdrs[hdrs$VISIT=="J56",c(3:17,20,22)], type = "R", simu = 20) ###4. Coefficient de Cronbach library(psy) #on peut appliquer le coeff tel quel car les réponses aux items vont tjs du moins au plus grave cronbach(hdrs[hdrs$VISIT=="J0",c(3:17,20,22)]) cronbach(hdrs[hdrs$VISIT=="J56",c(3:17,20,22)]) #on exécute un bootstrap pour calculer un intervalle de confiance du coefficient #pour J0 : hdrsboot0 <- hdrs[hdrs$VISIT=="J0",c(3:17,20,22)] library(boot) cronboot0=function(data,x){ cron <- cronbach(hdrsboot0[x,])[[3]] } res0 <- boot(hdrsboot0,cronboot0,1000) res0 quantile(res0$t,c(0.025,0.975)) plot(res0) #pour J56 : hdrsboot56 <- hdrs[hdrs$VISIT=="J56",c(3:17,20,22)] library(boot) cronboot56=function(data,x){ cron <- cronbach(hdrsboot56[x,])[[3]] } res56 <- boot(hdrsboot56,cronboot56,1000) res56 quantile(res56$t,c(0.025,0.975)) plot(res56) ###5. Validation avec l'autoévaluation #on prend le fichier duquel on a retiré les valeurs "ND" avec Excel, avant de le ré-exporter en .csv autoeval <- read.csv2("D:/Documents/Travail/devoir/devoir 2 (Hamilton)/autoeval2.csv"); summary(autoeval) #on remplace les valeurs aberrantes par des valeurs manquantes for(i in 1:1034){ for(j in 3:92){ if(!is.na(autoeval[i,j])){ if(autoeval[i,j]!=0 & autoeval[i,j] != 1 & autoeval[i,j] != 2 & autoeval[i,j] != 3 & autoeval[i,j] != 4){ autoeval[i,j] <- ''; } } } } str(autoeval) #on sélectionne seulement les observations à J0 et J56 vu que ce sont celles qui nous intéressent scl <- autoeval[autoeval$VISIT=="J0" | autoeval$VISIT=="J56",] summary(scl) #on vérifie qu'on a bien gardé que les J0 et J56 #on passe les variables en numérique for(i in 3:92){ scl[,i] <- as.numeric(scl[,i]) } str(scl) #calcul des sous-scores scl$somatisation <- scl$Q1 + scl$Q4 + scl$Q12 + scl$Q27 + scl$Q42 + scl$Q48 + scl$Q49 + scl$Q52 + scl$Q53 + scl$Q56 + scl$Q58 + scl$Q40 scl$symptobs <- scl$Q9 + scl$Q10 + scl$Q28 + scl$Q38 + scl$Q3 + scl$Q45 + scl$Q46 + scl$Q51 + scl$Q55 + scl$Q65 scl$sensitivite <- scl$Q6 + scl$Q21 + scl$Q34 + scl$Q36 + scl$Q37 + scl$Q41 + scl$Q61 + scl$Q69 + scl$Q73 scl$depression <- scl$Q5 + scl$Q14 + scl$Q15 + scl$Q20 + scl$Q22 + scl$Q26 + scl$Q29 + scl$Q30 + scl$Q31 + scl$Q32 + scl$Q54 + scl$Q71 + scl$Q79 scl$anxiete <- scl$Q2 + scl$Q17 + scl$Q23 + scl$Q33 + scl$Q39 + scl$Q57 + scl$Q72 + scl$Q78 + scl$Q80 + scl$Q86 scl$hostilite<-scl$Q11+scl$Q24+scl$Q63+scl$Q67+scl$Q74+scl$Q81 scl$phobie<-scl$Q13+scl$Q25+scl$Q47+scl$Q70+scl$Q75+scl$Q82+scl$Q50 scl$parano<-scl$Q8+scl$Q18+scl$Q43+scl$Q68+scl$Q76+scl$Q83 scl$psycho<scl$Q7+scl$Q16+scl$Q35+scl$Q62+scl$Q77+scl$Q84+scl$Q85+scl$Q87+scl$Q90+scl$ Q88 scl$symdiv<-scl$Q19+scl$Q44+scl$Q59+scl$Q60+scl$Q64+scl$Q66+scl$Q89 #on exclue les patients qui ont des valeurs manquantes car le sous-score serait alors sous-estimé scl <- na.omit(scl) #on ne garde que les sous-scores, le numéro et le numéro de visite scl <- scl[,c(1,2,93:102)] #on s'assure que les variables ont le bon format, et pas de donnée manquante summary(scl) str(scl) #on sépare les J0 et J56 scl0 <- scl[scl$VISIT=="J0",] scl56 <- scl[scl$VISIT=="J56",] nrow(scl0) nrow(scl56) #on fusionne les fichiers hdrs et scl hdrsvalid0 <- hdrs[hdrs$VISIT=="J0",c(1,2,21)] hdrsvalid56 <- hdrs[hdrs$VISIT=="J56",c(1,2,21)] hdrsscl0 <- merge(hdrsvalid0,scl0, by.x = "NUMERO", by.y = "NUMERO"); hdrsscl56 <- merge(hdrsvalid56,scl56, by.x = "NUMERO", by.y = "NUMERO"); nrow(hdrsscl0) nrow(hdrsscl56) #on réalise l'acp focalisée sur le score global hdrs, pour J0 et J56 library(psy) fpca(hdrsscl0,3,c(5:14)) fpca(hdrsscl56,3,c(5:14)) ################## ####Question 2#### ################## #remplacement des données manquantes (codées 99) par la dernière valeur observée (LOCF) for(i in 1:146){ #pour chaque ligne de la table for(j in 2:9){ if(hdrs3[i,j]==99){ hdrs3[i,j] <- hdrs3[i,j-1]; } } } summary(hdrs3) #réunion des tables hdrs et sexe hdrs4 <- merge(hdrs3,sex, by.x = "NUMERO", by.y = "NUMERO"); hdrs4$SEXE <- as.factor(hdrs4$SEXE); str(hdrs4) #création de de la différence de score (J0-J56) hdrs4$diff <- hdrs4$j0-hdrs4$j56; summary(hdrs4$diff[hdrs4$SEXE==1]) sd(hdrs4$diff[hdrs4$SEXE==1]) summary(hdrs4$diff[hdrs4$SEXE==2]) sd(hdrs4$diff[hdrs4$SEXE==2]) ###1ère partie – LOCF ##################### #on explique la différence de score par le sexe et le score à la première visite mod <- lm(diff~j0+SEXE,data=hdrs4); summary(mod); #diagnostic de régression par(mfrow=c(1,2)); #permet de mettre 2 graphiques côte à côte hist(mod$residuals) qqnorm(mod$residuals) qqline(mod$residuals) par(mfrow=c(2,2)) plot(mod) ###2è partie - modèle mixte ########################### #on ne garde que les colonnes NUMERO, VISIT et score du jeu de données original hdrs2bis <- data.frame(hdrs[,c(1,2,21)]); #patient 128, visite J7 manquante : on supprime la ligne hdrs2bis <- hdrs2bis[-c(703),]; #on joint ce jeu de données avec les données de sexe hdrs4bis <- merge(hdrs2bis,sex, by.x = "NUMERO", by.y = "NUMERO"); hdrs4bis$SEXE <- as.factor(hdrs4bis$SEXE); #on crée une variable quantitative avec le jour de la visite hdrs4bis$VISITQT <- substring(hdrs4bis$VISIT,2,3) hdrs4bis$VISITQT <- as.integer(hdrs4bis$VISITQT) str(hdrs4bis) hdrs4bis[1:10,] #Représentation graphique des moyennes des scores à chaque visite : c'est linéaire => on ne transforme pas les données plot(c(mean(hdrs4$j0),mean(hdrs4$j4),mean(hdrs4$j7),mean(hdrs4$j14),mean(hd rs4$j21),mean(hdrs4$j28),mean(hdrs4$j42),mean(hdrs4$j56)),ylab="Moyenne du score",xlab="Numéro de visite"); library(nlme); #modèle mixte #matrice de forme Toeplitz modele <- lme(score~SEXE*VISITQT+NUMERO%in%SEXE,random=~1|NUMERO,corr=corCompSymm(),na.action=na.omit,data=hdrs4bis); summary(modele); #matrice de forme AR(1) modele <- lme(score~SEXE*VISITQT+NUMERO%in%SEXE,random=~1|NUMERO,corr=corAR1(),na.action=na.omit,data=hdrs4bis); summary(modele); #diagnostic de régression par(mfrow=c(1,2)); #permet de mettre 2 graphiques côte à côte hist(modele$residuals) qqnorm(modele$residuals) qqline(modele$residuals) par(mfrow=c(2,2)) plot(modele) ################## ####Question 3#### ################## library(survival) #0 = pas de baisse, 1 = baisse de 50% #on a 2 individus pour lesquels on a une donnée manquante en cours de suivi #on remplace cette donnée manquante par celle qui la précède, cela permettra de faire tourner les boucles #et n'aura pas d'influence sur les résultats puisque la baisse de 50% ne se produit pas à ce moment hdrs4$j4[hdrs4$NUMERO==92] <- hdrs4$j0[hdrs4$NUMERO==92] hdrs4$j7[hdrs4$NUMERO==170] <- hdrs4$j4[hdrs4$NUMERO==170] #on crée 2 variables : une pour la variable mesurant la chute ou non du score, l'autre pour le temps avant évènement ou censure hdrs4$baisse <- 0; hdrs4$dvie <- 1; for(i in 1:146){ #pour tous les sujets j <- 3; cdt <- FALSE; while(cdt==FALSE){ #on exécute la boucle tant que la condition est respectée if(!is.na(hdrs4[i,j])){ #si donnée manquante : sortie de la boucle if(j<=9){ #si on a atteint la dernière colonne : sortie de la boucle if(hdrs4[i,11]==0){ #si la chute a déjà eu lieu : sortie de la boucle if(hdrs4[i,j] <= hdrs4[i,2]/2){ #si le score n’est pas <50% du score à J0 hdrs4[i,11] <- 1; #on indique que l'évènement a eu lieu } hdrs4[i,12] <- j-1; #on indique le n° de visite où a eu lieu l'évènement ou la censure j <- j+1; }else{cdt<-TRUE;} }else{cdt<-TRUE;} }else{cdt<-TRUE;} } } #on remplace le numéro de visite par le jour lui correspondant for(i in 1:146){ if(hdrs4[i,12]==1){ hdrs4[i,12]<-0; }else{ if(hdrs4[i,12]==2){ hdrs4[i,12]<-4; }else{ if(hdrs4[i,12]==3){ hdrs4[i,12]<-7; }else{ if(hdrs4[i,12]==4){ hdrs4[i,12]<-14; }else{ if(hdrs4[i,12]==5){ hdrs4[i,12]<-21; }else{ if(hdrs4[i,12]==6){ hdrs4[i,12]<-28; }else{ if(hdrs4[i,12]==7){ hdrs4[i,12]<-42; }else{ if(hdrs4[i,12]==8){ hdrs4[i,12]<-56; }}}}}}}} } table(hdrs4$baisse,hdrs4$SEXE) #on vérifie la cohérence des données summary(hdrs4) hdrs4[c(1:10),] hdrs4[hdrs4$baisse==0,] #calcul de la fonction de survie survie <- survfit(Surv(dvie,baisse)~SEXE,data=hdrs4); #fonction de survie summary(survie) #graph de kaplan-meier (pointillés = Femmes) plot(survie,lty=1:2,col=c("#C20000","black"),xlab="Tps en jours",ylab="Survie",axes=T,mark.time=F,conf.int=F) legend("topright",lty=1:2,col=c("#C20000","black"), c("Hommes","Femmes"),inset = .02) #test du log-rank pour la comparaison de la survie dans les deux groupes survdiff(Surv(dvie,baisse)~SEXE,data=hdrs4) #modele de cox cox <- coxph(Surv(dvie,baisse)~SEXE+j0,data=hdrs4); summary(cox); #validité du modèle diag <- cox.zph(cox,transform="log") diag par(mfrow=c(1,2)) plot(diag)