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 03/03/2008, 12h03   #1
Invité de passage
 
Femme
Chargée d'études
Inscription : mars 2008
Messages : 42
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Chargée d'études

Informations forums :
Inscription : mars 2008
Messages : 42
Points : 4
Points : 4
Par défaut les Boucles SAS

Bonjour,

j'ai un petit soucis avec sas.. j'ai essayé pas mal de truc mais sans succès

Voici le lien vers mon tableau excel :

http://www.toofiles.com/fr/oip/docum...xemplesas.html

Pour créer les variables "sit", on a utilisé le mois de décembre de chaque année.
0=pas chômage et 1=chômage.
datins=dat d'inscription au chômage.
datann=date de sortie du chômage.

Je souhaite créer des variables pour chaque année et pour chaque ligne qui mettent
1 quand l'individu est au chômage,
0 s'il n'est pas au chômage
et "." quand la séquence ne concerne pas l'année décrite par la variable.

POur vous aider à comprendre voici ce que je souhaite avoir :

http://www.toofiles.com/fr/oip/docum...emplesas2.html

J'ai essayé de faire cela avec une boucle do mais tout ne marche pas..
En fait, j'arrive à mettre les points mais pas pour les séquences passées.

Merci pour votre aide
lahli57 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2008, 12h16   #2
Membre Expert
 
Inscription : mars 2005
Messages : 1 028
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 028
Points : 1 278
Points : 1 278
Envoyer un message via Yahoo à bahraoui
Par défaut Code SAS

Bonjour,

Est ce que c'est possible d'envoyer le code SAS?

Merci.
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2008, 12h24   #3
Invité de passage
 
Femme
Chargée d'études
Inscription : mars 2008
Messages : 42
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Chargée d'études

Informations forums :
Inscription : mars 2008
Messages : 42
Points : 4
Points : 4
oui bien sûr, le voilà.. il doit y avoir plein de fautes dsl

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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
DATA fh.essai;
 SET fh.co97;
IF put (datins, yymmn6.)<=199812 AND put (datann, yymmn6.)>=199812 then ch98=1;
else IF put(datins,yymmn6.)>199812 then ch98=".";
else ch98=0;
 run;
 
 DATA fh.essai2;
 SET fh.co97;
IF put (datins, yymmn6.)<=199912 AND put (datann, yymmn6.)>=199912 then ch99=1;
else IF put(datins,yymmn6.)>199912 OR put (datann, yymmn6.)<199912 AND ch98 ne (".") then ch99=".";
else ch99=0;
 run;
 
  DATA fh.essai3;
 SET fh.co97;
IF put (datins, yymmn6.)<=200012 AND put (datann, yymmn6.)>=200012 then ch00=1;
else IF put(datins,yymmn6.)>200012 then ch00=".";
else ch00=0;
 run;
 
  DATA fh.essai4;
 SET fh.co97;
IF put (datins, yymmn6.)<=200112 AND put (datann, yymmn6.)>=200112 then ch01=1;
else IF put(datins,yymmn6.)>200112  then ch01=".";
else ch01=0;
 run;
 
  DATA fh.essai5;
 SET fh.co97;
IF put (datins, yymmn6.)<=200212 AND put (datann, yymmn6.)>=200212 then ch02=1;
else IF put(datins,yymmn6.)>200212  then ch02=".";
else ch02=0;
 run;
 
  DATA fh.essai6;
 SET fh.co97;
IF put (datins, yymmn6.)<=200312 AND put (datann, yymmn6.)>=200312 then ch03=1;
else IF put(datins,yymmn6.)>200312  then ch03=".";
else ch03=0;
 run;
 
  DATA fh.essai7;
 SET fh.co97;
IF put (datins, yymmn6.)<=200412 AND put (datann, yymmn6.)>=200412 then ch04=1;
else IF put(datins,yymmn6.)>200412  then ch04=".";
else ch04=0;
 run;
 
 DATA fh.essai8;
 SET fh.co97;
IF put (datins, yymmn6.)<=200512 AND put (datann, yymmn6.)>=200512 then ch05=1;
else IF put(datins,yymmn6.)>200512  then ch05=".";
else ch05=0;
 run;
 
 DATA fh.essai9;
 SET fh.co97;
IF put (datins, yymmn6.)<=200612 AND datann = "." then ch06=1;
else IF put(datins,yymmn6.)>200612  then ch06=".";
else ch06=0;
 run;
 
 
 proc sort DATA=fh.co97;
BY idx ndem ;
run;
proc sort DATA=fh.essai;
BY idx ndem;
run;
proc sort DATA=fh.essai2;
BY idx ndem;
run;
proc sort DATA=fh.essai3;
BY idx ndem;
run;
proc sort DATA=fh.essai4;
BY idx ndem;
run;
proc sort DATA=fh.essai5;
BY idx ndem;
run;
proc sort DATA=fh.essai6;
BY idx ndem;
run;
proc sort DATA=fh.essai7;
BY idx ndem;
run;
proc sort DATA=fh.essai8;
BY idx ndem;
run;
proc sort DATA=fh.essai9;
BY idx ndem;
run;
 
DATA fh.essai1;
merge fh.co97 fh.essai fh.essai2 fh.essai3 fh.essai4 fh.essai5 fh.essai6 fh.essai7 fh.essai8 fh.essai9;
run;
lahli57 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2008, 13h33   #4
Responsable SAS
 
Inscription : septembre 2006
Messages : 1 973
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 1 973
Points : 4 810
Points : 4 810
Bonjour,
Désolé mais je ne vois pas trop ce que tu veux faire?
A quoi correspondend tes essais de macros?
A quoi correspondend tes variables sit?
Dans ton exemple :
date inscription = 200309
date fin chomage = 200312
=>sit97=1, sit98=0, sit03=1 ????
fafabzh6 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2008, 13h53   #5
Invité de passage
 
Femme
Chargée d'études
Inscription : mars 2008
Messages : 42
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Chargée d'études

Informations forums :
Inscription : mars 2008
Messages : 42
Points : 4
Points : 4
j'essaye d'obtenir le tableau n°2 que j'ai mis (voir lien) d'où mes essais..
Les variables sit correspondent aux situations des individus pour chaque année ces variables sont creér grâce à la datins et la datann (date d'inscirption et d'annulation au chômage). On prend décembre de chaque année.

je voudrais faire en sorte que des points apparaissent pour chaque variable sit98 sit 99,...

idx datins datann sit97 sit98 sit99 ....
180 199906 200011 0 0 1
180 197705 199809 1 0 0

notre individu a été au chômage en 1997, pas en 1998 car vuq u'on prend en décembre 1998.
En 1999 il a été au chômage mais pas en 2000.


ce que je voudrais avoir c'est ça :
idx datins datann sit97 sit98 sit99 ....
180 199906 200011 . . 1
180 197705 199809 1 0 .


Tu comprends mieux?? car c'est pas facile à expliquer lol
lahli57 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2008, 15h01   #6
Responsable SAS
 
Inscription : septembre 2006
Messages : 1 973
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 1 973
Points : 4 810
Points : 4 810
Ton programme m'a l'air bon sauf que tu peux tous mettre dans ton data :
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
DATA fh.essai;
 SET fh.co97;
IF put (datins, yymmn6.)<=199812 AND put (datann, yymmn6.)>=199812 then ch98=1;
else IF put(datins,yymmn6.)>199812 then ch98=".";
else ch98=0;
IF put (datins, yymmn6.)<=199912 AND put (datann, yymmn6.)>=199912 then ch99=1;
else IF put(datins,yymmn6.)>199912 OR put (datann, yymmn6.)<199912 AND ch98 ne (".") then ch99=".";
else ch99=0;
IF put (datins, yymmn6.)<=200012 AND put (datann, yymmn6.)>=200012 then ch00=1;
else IF put(datins,yymmn6.)>200012 then ch00=".";
else ch00=0;
IF put (datins, yymmn6.)<=200112 AND put (datann, yymmn6.)>=200112 then ch01=1;
else IF put(datins,yymmn6.)>200112  then ch01=".";
else ch01=0;
IF put (datins, yymmn6.)<=200212 AND put (datann, yymmn6.)>=200212 then ch02=1;
else IF put(datins,yymmn6.)>200212  then ch02=".";
else ch02=0;
IF put (datins, yymmn6.)<=200312 AND put (datann, yymmn6.)>=200312 then ch03=1;
else IF put(datins,yymmn6.)>200312  then ch03=".";
else ch03=0;
IF put (datins, yymmn6.)<=200412 AND put (datann, yymmn6.)>=200412 then ch04=1;
else IF put(datins,yymmn6.)>200412  then ch04=".";
else ch04=0;
IF put (datins, yymmn6.)<=200512 AND put (datann, yymmn6.)>=200512 then ch05=1;
else IF put(datins,yymmn6.)>200512  then ch05=".";
else ch05=0;
IF put (datins, yymmn6.)<=200612 AND datann = "." then ch06=1;
else IF put(datins,yymmn6.)>200612  then ch06=".";
else ch06=0;
 run;
Qu'est ce qui ne marchait pas dans ton programme?
fafabzh6 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2008, 15h11   #7
Invité de passage
 
Femme
Chargée d'études
Inscription : mars 2008
Messages : 42
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Chargée d'études

Informations forums :
Inscription : mars 2008
Messages : 42
Points : 4
Points : 4
le problème est qu'il me faut une valeur par année (dans les variables sit98,sit99...). comme dans l'exemple que je te met là :

http://www.toofiles.com/fr/oip/docum...emplesas2.html


et moi j'obteins cela :
http://www.toofiles.com/fr/oip/docum...emplesas3.html
lahli57 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2008, 15h27   #8
Responsable SAS
 
Inscription : septembre 2006
Messages : 1 973
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 1 973
Points : 4 810
Points : 4 810
Tu as donc clairement un problème de logique dans tes IF, je te conseille de les re-vérifier!!
D'ailleurs au lieu d'en faire pleins, tu devrais tous regrouper dans un seul if vu que tout tes if se basent sur les mêmes champs date inscription et date annulation.
Code :
1
2
3
4
5
6
7
DATA ...
SET ....
IF .... THEN
ELSE IF .... THEN
ELSE IF .....
END IF;
END;
fafabzh6 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2008, 16h13   #9
Invité de passage
 
Femme
Chargée d'études
Inscription : mars 2008
Messages : 42
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Chargée d'études

Informations forums :
Inscription : mars 2008
Messages : 42
Points : 4
Points : 4
oui je vois bien que c'est un pb logique c'est là tout le pb loll..
j'ai revérifié mais sans succès...

Je vais encore vérifier.. on ne sait jamais..
lahli57 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2008, 16h47   #10
Responsable SAS
 
Inscription : septembre 2006
Messages : 1 973
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 1 973
Points : 4 810
Points : 4 810
Pour résoudre un problème logique il faut décomposer son problème clairement et évaluer les différents cas de figure.
Par exemple tu sais déjà que ta date d'inscription est toujours inférieure à ta date d'annulation. Donc ton premier niveau va être la date d'inscription et ton second niveau ta date d'annulation (dont je n'ai pas bien compris personnellement le sens)
Code :
1
2
3
4
5
6
7
8
IF dateIns = 1997
     IF dateannul=1998
     elseif dateannul=1999
     ........
elseif dateIns=1998
     IF dateannul=1998
     elseif dateannul=1999
     ........
Autre question quelle est la différence entre le 0 et le "."?

Bon courage
fafabzh6 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2008, 17h10   #11
Membre Expert
 
Inscription : mars 2005
Messages : 1 028
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 028
Points : 1 278
Points : 1 278
Envoyer un message via Yahoo à bahraoui
Code :
1
2
3
4
5
6
7
8
9
10
DATA co97;
format datins yymmn6.;
input datins yymmn6. ch98 ch99 ch01 ch02 ;
cards;
200812 1 1 1 .
200712 1 1 1 1
200612 0 1 1 1
199812 1 1 0 1
;
run;
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2008, 12h09   #12
Membre Expert
 
Inscription : mars 2005
Messages : 1 028
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 028
Points : 1 278
Points : 1 278
Envoyer un message via Yahoo à bahraoui
Voir fichier joint
Fichiers attachés
Type de fichier : zip t2.zip (558 octets, 2 affichages)
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2008, 13h39   #13
Invité de passage
 
Femme
Chargée d'études
Inscription : mars 2008
Messages : 42
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Chargée d'études

Informations forums :
Inscription : mars 2008
Messages : 42
Points : 4
Points : 4
Merci pour les réponses, c'est sympa..
Par contre, en faisant tout ça , je me suis aperçue d'un autre problème..
Je vous le montre sur cet exemple car pas facile de l'expliquer

http://www.toofiles.com/fr/oip/docum...classeur1.html
lahli57 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2008, 13h52   #14
Invité de passage
 
Femme
Chargée d'études
Inscription : mars 2008
Messages : 42
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Chargée d'études

Informations forums :
Inscription : mars 2008
Messages : 42
Points : 4
Points : 4
Citation:
Envoyé par fafabzh6 Voir le message
Pour résoudre un problème logique il faut décomposer son problème clairement et évaluer les différents cas de figure.
Par exemple tu sais déjà que ta date d'inscription est toujours inférieure à ta date d'annulation. Donc ton premier niveau va être la date d'inscription et ton second niveau ta date d'annulation (dont je n'ai pas bien compris personnellement le sens)
Code :
1
2
3
4
5
6
7
8
IF dateIns = 1997
     IF dateannul=1998
     elseif dateannul=1999
     ........
elseif dateIns=1998
     IF dateannul=1998
     elseif dateannul=1999
     ........
Autre question quelle est la différence entre le 0 et le "."?

Bon courage


le 0 correspond pas au chômage et le "." la séquence ne correspond pas à l'année intérrogée par la variable.
Par exemple, si la variable créee est ch98 et que la séquence correspond à une inscription au chômage entre juin 97 et sept 97 dans ce cas la variable ch98 doit être renseignée par .


dsl mais ça n'est pas facile à expliquer..
lahli57 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2008, 14h36   #15
Responsable SAS
 
Inscription : septembre 2006
Messages : 1 973
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 1 973
Points : 4 810
Points : 4 810
Et pour savoir si l'individu n'est au chômage (valeur 0) as-tu une information te permettant de savoir s'il travaille, ..., en gros comment fais-tu pour affirmer qu'il ne travaille pas pendant une période donnée?
fafabzh6 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2008, 15h14   #16
Invité de passage
 
Femme
Chargée d'études
Inscription : mars 2008
Messages : 42
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Chargée d'études

Informations forums :
Inscription : mars 2008
Messages : 42
Points : 4
Points : 4
Nous avons la date d'entrée au chômage et celle de sortie.
lahli57 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2008, 15h49   #17
Responsable SAS
 
Inscription : septembre 2006
Messages : 1 973
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 1 973
Points : 4 810
Points : 4 810
Donc j'en reviens toujours à la même question comment fais tu à partir de ces deux dates pour avoir ton 0:
Si par exemple la personne est inscrite le 18/10/1997 et annule son inscription le 15/05/2002.
Alors sit97=1, sit98=1,sit99=1,sit00=1,sit01=1.
Que valent alors sit95,sit96,sit02,sit03???
fafabzh6 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/03/2008, 19h42   #18
Candidat au titre de Membre du Club
 
Inscription : mars 2008
Messages : 13
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 13
Points : 13
Points : 13
Bonjour,

Je te propose l'approche suivante. A toi ensuite d'adapter avec ta définition (.,0,1) et avec la mise en forme que tu souhaites (un proc transpose devrait suffir).
- Tu verras notamment que j'ai ajouté la possibilité d'avoir des valeurs manquantes dans tes données.
- J'ai aussi utilisé la fonction MDY pour travailler avec des dates plus facilement.
- J'ai utilisé 2 macro-variables pour définir une boucle par année.

Véronique

La référence SAS, blog pour se former au SAS
www.sasreference.fr




Créer un jeu de donnée pour illustrer l'exemple
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
DATA co97;
   format datin datout date9.;
 
   informat datin datout date9.;
   input id datin datout ;
   datalines;
1 10DEC2005 12DEC2005
2 10NOV2004 10NOV2004
3 10JAN2006 10FEB2006
4 10NOV2004 10FEB2006
5 .         .
6 .         10NOV2004
7 .         10DEC2005
8 .         10JAN2006
9 10NOV2004 .
10 10DEC2005 .
11 10JAN2006 .
;
run;
Trouver l'année de début la plus ancienne et l'année de fin la plus récente. J'ai pris en compte la possibilité qu'il y est des incohérences dans les données. Mais cela serait mieux de vérifier avant qu'il n'y est pas de date de fin plus récente que de date de début ou de date de début plus récente que de date de fin.

Code :
1
2
3
4
5
6
7
8
proc sql;
   CREATE TABLE minmax AS
   SELECT min(year(datin)) AS min_datin, 
          min(year(datout)) AS min_datout, 
          max(year(datin)) AS max_datin, 
          max(year(datout)) AS max_datout
   FROM co97;
quit;
Garder une année de début et une de fin pour définir l'intervalle. Saubegarder ces données dans des macro-variables.

Code :
1
2
3
4
5
DATA rnge;
   SET minmax;
   call symputx('first_yr',min(min_datin,min_datout));
   call symputx('last_yr',max(max_datin,max_datout));
run;
Dupliquer les données autant de fois qu'il y a d'années et ajouter une variable année pour distinguer les observations entre elles.

Code :
1
2
3
4
5
6
7
DATA co97bis;
   SET co97;
   do i=&first_yr. TO &last_yr;
       yr=i;
       output;
   end;
run;
Définir la variable ch_ny en faisant attention aux valeurs manquantes.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
proc sort DATA=co97bis;
   BY yr;
run;
 
DATA ch_ny;
   SET co97bis;
   BY yr;
   IF missing(datin) AND missing(datout) then ch_ny=.;
   else IF .z <datout < mdy(01,01,yr) then ch_ny=0;
   else IF datin > mdy (12,31,yr) then ch_ny=0;
   else IF mdy(01,01,yr) <= datin   <= mdy(12,31,yr) then ch_ny=1;
   else IF mdy(01,01,yr) <= datout   <= mdy(12,31,yr) then ch_ny=1;
   else IF .z < datin < mdy(01,01,yr) AND datout > mdy(12,31,yr) then ch_ny=1;
   else IF missing(datin) OR missing(datout) then ch_ny=.;
   else ch_ny=0;
run;
Voir le résultat

v_bourcier 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 08h14.


 
 
 
 
Partenaires

Hébergement Web