Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > SAS Base
SAS Base Forum d'entraide sur SAS base : étape data, procédures non statistiques, procédures non graphiques, SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/04/2011, 17h24   #1
Invité de passage
 
Homme
Étudiant
Inscription : mars 2011
Messages : 7
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Santé

Informations forums :
Inscription : mars 2011
Messages : 7
Points : 0
Points : 0
Par défaut Comparer des dates

Bonjour,

J'ai une base de données et j'aimerai savoir pour un patient particulier si il a perdu par exemple 10 cm quelque soit la durée de suivi !! (par exemple entre la première consultation et la deuxième ou entre la 3iem et la 7ieme )
pour moi ça reviens à comparer chaque date avc les autres et voir si la différence fait 10 cm ou non !!
je pensais passer par des "array" mais mes patients n'ont pas tous la mêmes durées de consultation !!

merci pour votre réponse
rimad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 17h35   #2
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Tu peux poster un échantillon de ton fichier car je ne vois pas les différentes date de visite de tes fameux patients...
à moins que c'est la date qui est en colonne
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 17h48   #3
Invité de passage
 
Homme
Étudiant
Inscription : mars 2011
Messages : 7
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Santé

Informations forums :
Inscription : mars 2011
Messages : 7
Points : 0
Points : 0
Id date taille en DS
10 24/03/2004 0.73
10 24/08/2005 0.25
10 20/11/2006 -0.14
10 31/05/2007 0.15
10 15/05/2008 -0.21
11 17/09/1999 1.20
11 12/11/1999 0.00
11 04/08/2000 0.52
11 21/05/2001 0.47
11 05/06/2002 0.58
11 07/04/2003 1.09
13 10/10/2006 -1.32
13 15/09/2008 -0.40
14 10/10/2006 -0.41
14 27/08/2007 2.20
14 15/09/2008 0.27
15 17/08/2006 -1.43
15 20/10/2006 -0.82
15 20/10/2008 0.38
16 17/08/2006 1.70


je voudrai savoir si à un moment donnée au cours des consultation , le patient a perdu 1DS !! et pour ça je pensais faire la différence entre chaque taille avec les autres tailles (en gros faire une double boucle )

merci
rimad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 18h00   #4
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Je ne comprends pas pourquoi t'as du mal, si on suppose que la dernière colonne est la différence consécutive entre deux visites (l'avantage est que les dates de visite de chaque patient se suiveent), ya plus qu'a filtrer à moins que j'ai rien compris...

Code :
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
DATA TEST;
input PATIENT$ DATE ddmmyy10. DIFF ;
format DATE ddmmyy10.;
DIFF=DIFF*100;
cards;
10 05/09/1997 0.20
10 24/11/1997 0.91
10 02/03/1998 1.39
10 19/03/1999 0.77
10 13/09/2000 1.29
10 21/12/2001 0.76
10 07/08/2002 0.93
10 19/11/2003 0.75
10 24/03/2004 0.73
10 24/08/2005 0.25
10 20/11/2006 -0.14
10 31/05/2007 0.15
10 15/05/2008 -0.21
11 17/09/1999 1.20
11 12/11/1999 0.00
11 04/08/2000 0.52
11 21/05/2001 0.47
11 05/06/2002 0.58
11 07/04/2003 1.09
13 10/10/2006 -1.32
13 15/09/2008 -0.40
14 10/10/2006 -0.41
14 27/08/2007 2.20
14 15/09/2008 0.27
15 17/08/2006 -1.43
15 20/10/2006 -0.82
15 20/10/2008 0.38
16 17/08/2006 1.70 
;
run;
DATA test2;
SET test;
IF DIFF<=-10;
run;
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 18h12   #5
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Tu as ce code que tu avais déjà, te permettra de faire la différence des DS et après tu appliques ton filtre sur DIFF_DS en fonction de tes désirs...

Code :
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
42
DATA TEST;
input PATIENT$ DATE ddmmyy10. DS ;
format DATE ddmmyy10.;
cards;
10 05/09/1997 0.20
10 24/11/1997 0.91
10 02/03/1998 1.39
10 19/03/1999 0.77
10 13/09/2000 1.29
10 21/12/2001 0.76
10 07/08/2002 0.93
10 19/11/2003 0.75
10 24/03/2004 0.73
10 24/08/2005 0.25
10 20/11/2006 -0.14
10 31/05/2007 0.15
10 15/05/2008 -0.21
11 17/09/1999 1.20
11 12/11/1999 0.00
11 04/08/2000 0.52
11 21/05/2001 0.47
11 05/06/2002 0.58
11 07/04/2003 1.09
13 10/10/2006 -1.32
13 15/09/2008 -0.40
14 10/10/2006 -0.41
14 27/08/2007 2.20
14 15/09/2008 0.27
15 17/08/2006 -1.43
15 20/10/2006 -0.82
15 20/10/2008 0.38
16 17/08/2006 1.70 
;
run;
 
DATA TEST2;
SET TEST;
BY PATIENT;
DS2=lag(DS);
IF first.PATIENT then DIFF_DS=0;
else DIFF_DS=DS-DS2;
run;
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 19h54   #6
Invité de passage
 
Homme
Étudiant
Inscription : mars 2011
Messages : 7
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Santé

Informations forums :
Inscription : mars 2011
Messages : 7
Points : 0
Points : 0
disons que ce code me permet effectivement de calculer la différence entre deux dates successives !! mais le problème est que ça se pourrait que la perte de 1 DS est survenu entre la premier date et la dernier date !! ou bien entre la 3ieme et la 5ieme !! et moi j'aimerai savoir la premier fois à quelle moment c'est survenu !! c'est à dire la première fois que la différence entre taille (en DS) fait 1 ( et là je récupère la date et je code pour ce patient flag= 1) et si durant toute la suivie de ce patient on ne trouve pas une différence de taille qui fasse 1 alors je code pour ce patient flag=0 !!

je ne sais pas si j'étais un peu plus claire sur ce que je veux faire !!
je pourrai vous donner un exemple si c'est pas trop claire ce que je dit !!

merci
rimad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 20h05   #7
Invité de passage
 
Homme
Étudiant
Inscription : mars 2011
Messages : 7
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Santé

Informations forums :
Inscription : mars 2011
Messages : 7
Points : 0
Points : 0
exemple si on prend ce patient

101 04/08/2000 0.90
101 21/05/2001 1.20
101 05/06/2002 0.80
101 07/04/2003 0.20
101 06/05/2004 0

si on fait la différence entre les dates successives on dira que ce patient n'a pas perdue de 1DS car la différence entre deux dates successives ne fait jamais 1 !! Pourtant si on regarde la différence entre la 2ieme date et la 4ieme date fait 1 !! donc le patient a bien perdu 1 DS durant toute sa suivie et la première fois qu'il a perdue est le 07/04/2003 !!

je ne sais pas si j'ai été claire
rimad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 20h13   #8
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
J'ai bien compris la complexité de ton problème. Il faut en fait, faire la différence de taille entre :
date1 et date2, date1 et date2, date1 et date4,...
date2 et date3, date2 et date3, date2 et date4,...
....
C'est faisable avec des vecteurs mais je sèche

En tout cas bon courage!
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 20h57   #9
Invité de passage
 
Homme
Étudiant
Inscription : mars 2011
Messages : 7
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Santé

Informations forums :
Inscription : mars 2011
Messages : 7
Points : 0
Points : 0
merci
rimad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 09h31   #10
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 467
Points : 2 823
Points : 2 823
Bonjour Rimad.
Je n'ai pas de solution parfaite à ta question, mais deux pistes qui permettent au moins de construire les flags. Soit avec une proc Means, soit avec une transposition et un array.
Code :
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
42
43
44
45
46
47
48
49
50
51
DATA work.rimad ;
 INPUT Id date : DDMMYY10. taille ;
DATALINES ;
10 24/03/2004 0.73
10 24/08/2005 0.25
10 20/11/2006 -0.14
10 31/05/2007 0.15
10 15/05/2008 -0.21
11 17/09/1999 1.20
11 12/11/1999 0.00
11 04/08/2000 0.52
11 21/05/2001 0.47
11 05/06/2002 0.58
11 07/04/2003 1.09
13 10/10/2006 -1.32
13 15/09/2008 -0.40
14 10/10/2006 -0.41
14 27/08/2007 2.20
14 15/09/2008 0.27
15 17/08/2006 -1.43
15 20/10/2006 -0.82
15 20/10/2008 0.38
16 17/08/2006 1.70
;
RUN ;
/**************************************************************/
PROC TRANSPOSE DATA=work.rimad OUT=work.rimad2 PREFIX=taille ;
  VAR taille ;
  BY id NOTSORTED ;
RUN ;
DATA work.rimad2 ;
  SET work.rimad2 ;
  ARRAY tailles taille: ;
  min = MIN(OF tailles{*}) ;
  max = MAX(OF tailles{*}) ;
  flag = (ABS(max-min)>1) ;
RUN ;
/**************************************************************/
PROC SUMMARY DATA=work.rimad ;
  VAR taille ;
  BY id NOTSORTED ;
  OUTPUT OUT=work.diff MIN=minTaille 
					   MAX=maxTaille 
					   MAXID(taille(date))=maxDate 
					   MINID(taille(date))=minDate ;
RUN ;
DATA work.diff (KEEP=id flag min: max:) ;
  SET work.diff ;
  flag = (ABS(maxTaille-MinTaille) > 1) ;
  FORMAT minDate maxDate DDMMYY10. ;
RUN ;
Par contre, pour trouver la 1e date à partir de laquelle on observe une différence de 1 DS, ça me semble plus compliqué parce qu'il faudrait construire toutes les différences entre la taille à la date T et les tailles à T-1, T-2, etc. Ca fait beaucoup de combinaisons possibles au final.
Mais on doit pouvoir y arriver.
Bon courage en tout cas.
Olivier
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 09h40   #11
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 467
Points : 2 823
Points : 2 823
Rectification : j'ai avancé un peu sur l'idée des arrays, sans transposition préalable.
Je suis arrivé là, je te laisse finir, il "suffit" de récupérer le numéro d'élément de l'array où la différence devient > 1.
Code :
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
DATA work.rimad ;
 INPUT Id date : DDMMYY10. taille ;
 FORMAT date DDMMYY10. ;
DATALINES ;
10 24/03/2004 0.73
10 24/08/2005 0.25
10 20/11/2006 -0.14
10 31/05/2007 0.15
10 15/05/2008 -0.21
11 17/09/1999 1.20
11 12/11/1999 0.00
11 04/08/2000 0.52
11 21/05/2001 0.47
11 05/06/2002 0.58
11 07/04/2003 1.09
13 10/10/2006 -1.32
13 15/09/2008 -0.40
14 10/10/2006 -0.41
14 27/08/2007 2.20
14 15/09/2008 0.27
15 17/08/2006 -1.43
15 20/10/2006 -0.82
15 20/10/2008 0.38
16 17/08/2006 1.70
;
RUN ;
PROC SQL NOPRINT ;
  SELECT COUNT(*) INTO : nbMax /* nombre maxi de mesures */
  FROM work.rimad
  GROUP BY id
  ORDER BY 1 DESC ;
QUIT ;
%LET nbMax = &nbMax ;
PROC SORT DATA=work.rimad ;
  BY id date ;
RUN ;
DATA work.diff ;
  SET work.rimad ;
  BY id ;
  ARRAY tailles taille1-taille&nbMax ;
  RETAIN taille1-taille&nbMax ;
  IF FIRST.id THEN DO ;
	CALL MISSING(OF tailles{*}) ;
	mesure = 0 ;
  END ;
  mesure + 1 ;
  tailles(mesure) = taille ;
RUN ;
DATA work.diff ;
  SET work.diff ;
  BY id ;
  ARRAY diff diff1-diff&nbMax ;
  ARRAY tailles taille1-taille&nbMax ;
  IF FIRST.id THEN DO ;
	CALL MISSING(OF diff{*}) ;
	mesure = 0 ;
  END ;
  mesure + 1 ;
  DO i=1 TO mesure-1 ;
    diff(i) = taille-tailles(i) ;
  END ;
RUN ;
Bon courage.
Olivier
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h42.


 
 
 
 
Partenaires

Hébergement Web