IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SAS Base Discussion :

Repérer des observations ayant lieu simultanément en comparant plusieurs dates


Sujet :

SAS Base

  1. #1
    Candidat au Club
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Février 2014
    Messages : 8
    Points : 4
    Points
    4
    Par défaut Repérer des observations ayant lieu simultanément en comparant plusieurs dates
    Bonjour,
    J’ai une base représentant l’ensemble des prescriptions d’environ 700 médecins sur une année et je voudrais savoir quels patients prennent en même temps trois médicaments ou plus. Ma base est construite comme suit :

    Patient date début date fin médicament
    1 01-févr 28-févr A
    1 01-mars 01-avr A
    1 01-mars 01-juin B
    1 01-mai 01-juil A
    1 01-juin 01-août C
    1 01-juin 01-sept D
    2 … … …
    2 … … …
    2 … … …
    2 … … …

    J’ai donc une ligne par prescription. Sachant qu’il y a autant de médicaments possibles que de médicaments existants.
    Ma première idée est de construire une variable pour chaque jour de l’année (365 variables) et de regarder si pour un patient donné une des variables jours contient plus de trois médicaments. Cette solution n’est toutefois pas très présentable et surement pas optimale. Je vois comment faire sous stata, en utilisant des boucles sur les indicatrices de lignes qui permettraient de comparer toutes les observations, mais ma base de données est trop volumineuse pour être importée sous stata. Je ne vois pas comment réaliser la même programmation sous SAS qui permettrait de comparer toutes les lignes pour un même patient.

    Auriez-vous d’autres suggestions de programmation sous SAS?

    Par ailleurs, j’ai une autre question sur cette base, mais celle-ci me parait plus difficile à réaliser, je la mets donc au second plan au cas où quelqu’un aurait une idée. Je souhaiterais, en effet, garder en mémoire pour chaque patient la période où il a pris simultanément le plus grand nombre de médicaments (ou un nombre de médicaments supérieur à un seuil fixé, par exemple 5 médicaments), ainsi que le nombre de médicaments associé.

    Merci d’avance pour votre aide.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Statisticien/développeur BI
    Inscrit en
    Janvier 2012
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Statisticien/développeur BI
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2012
    Messages : 326
    Points : 1 142
    Points
    1 142
    Par défaut
    Bonjour,

    Je serais passé par une simple proc sql avec une jointure sur une table de référence (les jours de l'année).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    /* table source des prescriptions */
    data prescription;
    input Patient :8. datedeb :date9. datefin :date9. medicament $1.;
    format datedeb datefin ddmmyy8.;
    cards;
    1 01feb14 28feb14 A
    1 01mar14 01apr14 A
    1 01mar14 01jun14 B
    1 01may14 01jul14 A
    1 01jun14 01aug14 C
    1 01jun14 01sep14 D
    2 01mar14 01apr14 A
    2 01jun14 01aug14 C
    3 01may14 01jul14 A
    3 01jun14 01aug14 B
    3 15apr14 01sep14 C
    ;
    run;
     
    /* création de la table des dates de référence */
    data dateref (drop=i);
    format date date9.;
    date="31dec13"d;
    do i=1 to 365;
    DATE=DATE+1;
    output;
    end;
    run;
     
    /* détermination des patients avec + de 2 médicaments simultanément */
    proc sql;
    	create table COUNT as select
    		t1.patient,
    		count(distinct t1.medicament) as nb_medicament
    	from prescription t1
    		left join dateref t2 on (t2.date between t1.datedeb and t1.datefin)
    	group by  patient
    	having nb_medicament > 2
    	order by patient;
    quit;

  3. #3
    Candidat au Club
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Février 2014
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    Merci pour cette réponse.

    J'ai essayé votre code, mais j'obtiens le même résultat que si je compte simplement le nombre de médicaments par médecin sans tenir compte de la simultanéité de la prescription.

  4. #4
    Candidat au Club
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Février 2014
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    La solution marche si je mets qu'un seul jour au sein de la première base de données. Mais cela m'oblige à comparer 365 tables.

  5. #5
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Bonsoir.
    Je pense qu'il va falloir, de toute façon, "déplier" la table initiale en créant une observation par jour de la période. Sinon on va galérer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    DATA prescription;
    input Patient :8. datedeb :date9. datefin :date9. medicament $1.;
    format datedeb datefin ddmmyy8.;
    cards;
    1 01feb14 28feb14 A
    1 01mar14 01apr14 A
    1 01mar14 01jun14 B
    1 01may14 01jul14 A
    1 01jun14 01aug14 C
    1 01jun14 01sep14 D
    2 01mar14 01apr14 A
    2 01jun14 01aug14 C
    3 01may14 01jul14 A
    3 01jun14 01aug14 B
    3 15apr14 01sep14 C
    ;
    run;
    DATA prescription_jours ;
      SET prescription ;
      traitement = 1 ;
      DO date=datedeb TO datefin ;
        OUTPUT ;
      END ;
      FORMAT date DDMMYY8. ;
    RUN ;
    Et si ensuite, on virait les lignes en doublon, au cas où ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    PROC SORT DATA=prescription_jours NODUPKEY ;
      BY patient date medicament ;
    RUN ;
    Bon c'était juste pour être sûr. Vient ensuite la transposition : on va créer une table avec une ligne par patient et jour où il est sous traitement, avec en autant de colonnes ses traitements. Si on souhaite garder la trace du nom des traitements, on peut l'utiliser en variable ID dans la proc Transpose, mais l'étape de comptage qui suivra sera un peu plus pénible à écrire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    PROC TRANSPOSE DATA=prescription_jours OUT=prescription_jours2 PREFIX=trt ;
      BY patient date ;
      VAR traitement ;
    RUN ;
    Enfin on compte combien de cases de traitements sont non vides dans une ligne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DATA patient ;
      SET prescription_jours2 ;
      BY patient ;
      nbTraitements = N(OF trt:) ;
    RUN ;
    Avec la table PATIENT, des tris et des stats devraient permettre à la fois d'isoler les périodes de prises multiples, de maxima, etc.
    Bon courage.
    Olivier

  6. #6
    Candidat au Club
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Février 2014
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    Merci pour cette réponse. L'un de mes problèmes est également le volume de ma base, puisqu'elle est composé de 160 092 patients pour lesquels je dispose en tout de 3 735 726 lignes de prescriptions. Sachant que la puissance du serveur sur lequel je fais tourner mes programmes n'est pas très développé, trop alourdir ma base de données risque de faire planter mes serveurs.

  7. #7
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Bonjour.
    Il y a peu de risques de plantages réels avec les procédures utilisées. Par contre ça sera sans doute un peu long à tourner.
    S'il y a des soucis de place disque, tu peux ajouter en tête de programme, SAS s'occupera de "zipper" (en interne) les bases au fur et à mesure de leur création. J'espère que ça fonctionnera ainsi.
    Éventuellement tu peux zapper la proc Sort NODUPKEY qui sera sans doute la plus coûteuse en temps et en place.
    Bon courage.
    Olivier

  8. #8
    Membre expérimenté
    Homme Profil pro
    Développeur en SAS/ Statisticien
    Inscrit en
    Janvier 2013
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur en SAS/ Statisticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 483
    Points : 1 552
    Points
    1 552
    Par défaut
    Citation Envoyé par pb_sas Voir le message
    Je ne vois pas comment réaliser la même programmation sous SAS qui permettrait de comparer toutes les lignes pour un même patient.
    Bonjour,
    Ce programme permet de réaliser la comparaison de toutes les lignes pour un même patient.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    DATA prescription;
    input Patient :8. datedeb :date9. datefin :date9. medicament $1.;
    format datedeb datefin ddmmyy8.;
    cards;
    1 01feb14 28feb14 A
    1 01mar14 01apr14 A
    1 01mar14 01jun14 B
    1 01may14 01jul14 A
    1 01jun14 01aug14 C
    1 01jun14 01sep14 D
    2 01mar14 01apr14 A
    2 01jun14 01aug14 C
    3 01may14 01jul14 A
    3 01jun14 01aug14 B
    3 15apr14 01sep14 C
    ;
    run;
     
    data compar (keep=Patient datedeb datefin medicament medicament_1 datefin__) ;
    set prescription  (rename=(Patient=Patient_1 datedeb=datedeb_1                      
                               datefin=datefin_1 medicament=medicament_1)) ;
    j+1 ;
    do i=j to nbs ;
    set prescription nobs=nbs  point=i  ;	
    if 	Patient=Patient_1 then do ;  
    	 datedeb=max(datedeb, datedeb_1) ;
    	 datefin=min(datefin, datefin_1) ;
    								     do while (datedeb < datefin);
    									 datefin__=intnx('month',datedeb,1) ;
                                         output ;  	
    									 datedeb=intnx('month',datedeb,1) ;
    									 end ;								  
     			              end;
    end;  
    format datefin__ ddmmyy8.;
    run;
    Mettre tous les médicaments consommés par un même patient sur la même colonne « médicament ».

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    data compar_2  (drop=medicament_1 datefin__);
    set compar ;  
    datefin=datefin__  ;
    output ;
    if medicament ne medicament_1  then do ; medicament=medicament_1 ; output ;	 end ;
    run ;	 
     
    proc sort data=compar_2 NODUPKEY ; by Patient datedeb datefin medicament ;  run ;
    Le programme final affiche le patient, la période concernée, les médicaments consommés et le nombre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    data finale (drop= medicament);	*where (nb_mdc=3) ;
    set compar_2 ;  by Patient datedeb ;
    length cat_mdc $20. ;
    retain cat_mdc nb_mdc ;
    if first.datedeb then do ; cat_mdc=' ' ;  nb_mdc=0 ;   end ;
    nb_mdc+1 ;
    cat_mdc=cats(cat_mdc, medicament) ;
    if last.datedeb then output ;
    run ;

Discussions similaires

  1. [XL-2010] Comparer des valeurs dans deux colonnes, repérer des lignes, pourcentage
    Par vwtroudy dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 23/06/2015, 09h38
  2. Comparer plusieurs dates dans un if
    Par logone dans le forum Langage
    Réponses: 4
    Dernier message: 22/05/2014, 14h04
  3. Réponses: 2
    Dernier message: 18/02/2009, 23h44
  4. Utiliser des procédures au lieu des classes
    Par ahage4x4 dans le forum ASP
    Réponses: 5
    Dernier message: 29/06/2005, 10h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo