Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > Macro
Macro Forum d'entraide sur le langage Macro de SAS
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 25/02/2011, 12h38   #1
Membre habitué
 
Homme Julien
Ingénieur d'études / Biostatisticien
Inscription : décembre 2009
Messages : 304
Détails du profil
Informations personnelles :
Nom : Homme Julien
Localisation : France

Informations professionnelles :
Activité : Ingénieur d'études / Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : décembre 2009
Messages : 304
Points : 101
Points : 101
Par défaut Macro pour ACP

Bonjour, je cherche une macro qui prend en entrée une matrice avec variables explicatives et variable réponse dichotomique, fait une ACP par statut (c'est à dire on récupère les données correspondant au statut 1 et on fait une ACP dessus, de même pour les données typiques au statut 2). Plot les deux ACP sur un même graphe en 3 dimensions et affiche les ellipses en fonction des deux lots de variables explicatives plottées.

C'est assez répandu dans les analyses descriptives dans le domaine biomédicale, seulement sous SAS tout étant plus dur à faire, avant de me lancer dans cette entreprise j'aurais voulu bénéficier de vos sources pour savoir si ça figure ou non sur le net (mes recherches m'ayant conduit à des macro ACP assez inutiles étant donné que SAS et sa proc PRINCOMP font exactement la même chose et plus rapidement...).

A coté de ça j'ai commencé à faire un brouillon, j'utilise la PROC G3D mais je n'arrive pas à changer les icones des variables par leur nom, pas faute d'avoir regardé la doc du support SAS, savez vous s'il existe une option qui m'aurait échappé ou si une ANNOTATE pourrait permettre celà? De même si je veux faire les ellipses, ANNOTATE peut il me permettre de la faire?

Logiquement ça devrait être réalisable, en effet je dispose aussi de l'extension JMP8 à SAS qui permet de générer des ellipses automatiquement.

Merci pour votre attention à mon topic et pour vos futures réponses et conseils si précieux.
joyeux_lapin13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2011, 19h55   #2
Rédacteur
 
Homme Stéphane
Consultant et formateur SAS et Cognos
Inscription : avril 2009
Messages : 1 791
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Consultant et formateur SAS et Cognos
Secteur : Conseil

Informations forums :
Inscription : avril 2009
Messages : 1 791
Points : 4 012
Points : 4 012
tu fais ces ellipses en 3D dans JMP ?
__________________
N'oubliez pas de cliquer sur lorsque votre problème est réglé !

Moteur de recherche dans les papiers SAS
datametric est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2011, 20h42   #3
Membre habitué
 
Homme Julien
Ingénieur d'études / Biostatisticien
Inscription : décembre 2009
Messages : 304
Détails du profil
Informations personnelles :
Nom : Homme Julien
Localisation : France

Informations professionnelles :
Activité : Ingénieur d'études / Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : décembre 2009
Messages : 304
Points : 101
Points : 101
Oui.
joyeux_lapin13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2011, 08h32   #4
Membre habitué
 
Homme Julien
Ingénieur d'études / Biostatisticien
Inscription : décembre 2009
Messages : 304
Détails du profil
Informations personnelles :
Nom : Homme Julien
Localisation : France

Informations professionnelles :
Activité : Ingénieur d'études / Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : décembre 2009
Messages : 304
Points : 101
Points : 101
Bon aprés mûr réflexion je pense que me contenter de 3 axes et faire les 3 graphes en 2 dimensions restent plus simple et plus visible. Et puis ça résout mon souci pour les noms, par contre une idée pour faire les ellipses automatiquement avec GPLOT?
joyeux_lapin13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2011, 10h15   #5
Rédacteur
 
Homme Stéphane
Consultant et formateur SAS et Cognos
Inscription : avril 2009
Messages : 1 791
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Consultant et formateur SAS et Cognos
Secteur : Conseil

Informations forums :
Inscription : avril 2009
Messages : 1 791
Points : 4 012
Points : 4 012
Globalement il ne faut plus regarder les anciennes proc pour faire des graphiques mais étudier le GTL et toutes les nouvelles SGPLOT, SGCATTER etc... qui facilitent la génération de graphiques. C'est à mon sens une réelle avancée dans SAS qui mérite toute notre attention.

Ma proposition se trouve dans un post de janvier :

http://www.developpez.net/forums/d10...e-correlation/
__________________
N'oubliez pas de cliquer sur lorsque votre problème est réglé !

Moteur de recherche dans les papiers SAS
datametric est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2011, 11h43   #6
Membre habitué
 
Homme Julien
Ingénieur d'études / Biostatisticien
Inscription : décembre 2009
Messages : 304
Détails du profil
Informations personnelles :
Nom : Homme Julien
Localisation : France

Informations professionnelles :
Activité : Ingénieur d'études / Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : décembre 2009
Messages : 304
Points : 101
Points : 101
http://support.sas.com/documentation...#sgplot-ov.htm

En effet il y a la génération d'ellipse automatiquement apparement sur cette page avec une syntaxe toute conne! En espérant que l'on puisse remplacer les icones des variables plottées par leur nom, me reste plus qu'à trouver comment mettre sur un même graphe les deux graphes que j'aurais généré.

Merci Datametric!
joyeux_lapin13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2011, 11h47   #7
Rédacteur
 
Homme Stéphane
Consultant et formateur SAS et Cognos
Inscription : avril 2009
Messages : 1 791
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Consultant et formateur SAS et Cognos
Secteur : Conseil

Informations forums :
Inscription : avril 2009
Messages : 1 791
Points : 4 012
Points : 4 012
Citation:
En espérant que l'on puisse remplacer les icones des variables plottées par leur nom
Je suis désolé mais je ne comprends pas.
__________________
N'oubliez pas de cliquer sur lorsque votre problème est réglé !

Moteur de recherche dans les papiers SAS
datametric est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2011, 16h28   #8
Membre habitué
 
Homme Julien
Ingénieur d'études / Biostatisticien
Inscription : décembre 2009
Messages : 304
Détails du profil
Informations personnelles :
Nom : Homme Julien
Localisation : France

Informations professionnelles :
Activité : Ingénieur d'études / Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : décembre 2009
Messages : 304
Points : 101
Points : 101
Autant pour moi, je me suis mal exprimé, je veux dire que de mémoire avec la proc GPLOT on peut mettre le nom sur les variables directement sur le graphe, j'espère juste qu'avec SGPLOT ça sera aussi facile à faire.
joyeux_lapin13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2011, 15h48   #9
Membre habitué
 
Homme Julien
Ingénieur d'études / Biostatisticien
Inscription : décembre 2009
Messages : 304
Détails du profil
Informations personnelles :
Nom : Homme Julien
Localisation : France

Informations professionnelles :
Activité : Ingénieur d'études / Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : décembre 2009
Messages : 304
Points : 101
Points : 101
Aprés avoir parcouru la page dédiée à la proc SGPLOT j'ai pu pas mal avancé dans ma futur macro, mais je bute sur deux choses malheureusement...

Voici dans un premier temps là où j'en suis:

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
 
/* Séparation des deux status */
DATA TEST1;
SET TEST;
IF Statut = 1;
RUN;
 
DATA TEST2;
SET TEST;
IF Statut = 2;
RUN;
 
/* Calcul des composantes principales propre aux deux Statuts */
ODS OUTPUT EIGENVECTORS = vue1;
PROC PRINCOMP DATA = TEST1 plots(ncomp=3)=ALL;
VAR N1 N2 N3 N4 N5;
RUN;
 
ODS OUTPUT EIGENVECTORS = vue2;
PROC PRINCOMP DATA = TEST2 plots(ncomp=3)=ALL;
VAR N1 N2 N3 N4 N5;
RUN;
 
/* Rename pour bien distinguer les 2 jeux de coordonnées de projection des différentes variables */
DATA vue1;
SET vue1;
RENAME Prin1 = Composante1_St1;
RENAME Prin2 = Composante2_St1;
RENAME Prin3 = Composante3_St1;
DROP Prin4 Prin5;
RUN;
 
DATA vue2;
SET vue2;
RENAME Prin1 = Composante1_St2;
RENAME Prin2 = Composante2_St2;
RENAME Prin3 = Composante3_St2;
DROP Prin4 Prin5;
RUN;
 
/* Fusion des informations en une seule table */
DATA vue;
SET vue1 vue2;
MERGE vue1 vue2;
BY Variable;
RUN;
 
/* Calcul du barycentre propre au premier jeu de coordonnées */
proc sql;
CREATE TABLE vue AS SELECT *,
mean(Composante1_St1) AS B1_St1,
mean(Composante2_St1) AS B2_St1,
mean(Composante3_St1) AS B3_St1
FROM vue;
quit;
 
/* Calcul du barycentre propre au second jeu de coordonnées */
proc sql;
CREATE TABLE vue AS SELECT *,
mean(Composante1_St2) AS B1_St2,
mean(Composante2_St2) AS B2_St2,
mean(Composante3_St2) AS B3_St2
FROM vue;
quit;
 
/* Plot des 2 jeux de coordonnées dans les différents plans */ 
proc sgplot DATA=vue noautolegend;
  VECTOR X = Composante1_St1 Y = Composante2_St1 / XORIGIN = B1_St1 YORIGIN = B2_St2 LINEATTRS = (color = "blue" PATTERN = SOLID);
  scatter x=Composante1_St1 y=Composante2_St1 / DATALABEL = Variable MARKERATTRS = (SYMBOL = CIRCLEFILLED SIZE = 2 COLOR = "blue");
  ellipse x=Composante1_St1 y=Composante2_St2 / alpha = 0.4 LINEATTRS = (color = "blue") outline;
  VECTOR X = Composante1_St2 Y = Composante2_St2 / XORIGIN = B1_St2 YORIGIN = B2_St2 LINEATTRS = (color = "red" PATTERN = SOLID);
  scatter x=Composante1_St2 y=Composante2_St2 / DATALABEL = Variable MARKERATTRS = (SYMBOL = CIRCLEFILLED SIZE = 2 COLOR = "red");
  ellipse x=Composante1_St2 y=Composante2_St2 / alpha = 0.4 LINEATTRS = (color = "red") outline;
run;
 
proc sgplot DATA=vue noautolegend;
  VECTOR X = Composante2_St1 Y = Composante3_St1 / XORIGIN = B2_St1 YORIGIN = B3_St2 LINEATTRS = (color = "blue" PATTERN = SOLID);
  scatter x=Composante2_St1 y=Composante3_St1 / DATALABEL = Variable MARKERATTRS = (SYMBOL = CIRCLEFILLED SIZE = 2 COLOR = "blue");
  ellipse x=Composante2_St1 y=Composante3_St2 / alpha = 0.4 LINEATTRS = (color = "blue");
  VECTOR X = Composante2_St2 Y = Composante3_St2 / XORIGIN = B2_St2 YORIGIN = B3_St2 LINEATTRS = (color = "red" PATTERN = SOLID);
  scatter x=Composante2_St2 y=Composante3_St2 / DATALABEL = Variable MARKERATTRS = (SYMBOL = CIRCLEFILLED SIZE = 2 COLOR = "red");
  ellipse x=Composante2_St2 y=Composante3_St2 / alpha = 0.4 LINEATTRS = (color = "red");
run;
 
proc sgplot DATA=vue noautolegend;
  VECTOR X = Composante1_St1 Y = Composante3_St1 / XORIGIN = B1_St1 YORIGIN = B3_St1 LINEATTRS = (color = "blue" PATTERN = SOLID);
  scatter x=Composante1_St1 y=Composante3_St1 / DATALABEL = Variable MARKERATTRS = (SYMBOL = CIRCLEFILLED SIZE = 2 COLOR = "blue");
  ellipse x=Composante1_St1 y=Composante3_St2 / alpha = 0.4 LINEATTRS = (color = "blue");
  VECTOR X = Composante1_St2 Y = Composante3_St2 / XORIGIN = B1_St2 YORIGIN = B3_St2 LINEATTRS = (color = "red" PATTERN = SOLID);
  scatter x=Composante1_St2 y=Composante3_St2 / DATALABEL = Variable MARKERATTRS = (SYMBOL = CIRCLEFILLED SIZE = 2 COLOR = "red");
  ellipse x=Composante1_St2 y=Composante3_St2 / alpha = 0.4 LINEATTRS = (color = "red");
run;

Alors ça fait tout bien comme je le souhaite, mais je n'arrive pas à tracer le cercle qui pourra faire office de cercle des corrélations, de même pour les axes en abscisse et en ordonnée passant par 0.
Quelqu'un sait comment faire avec SGPLOT?

Aprés, la dernière chose qui me manquerait serait de mettre les parts de variance expliquées à coté de l'intitulé des axes... alors avec la proc princomp on peut facilement les sauver, je pensais du coup fusionner la table à celle des composantes principales, aprés tout le nombre de parts de variance est égale au nombre de variables.
Mais comment envoyer les valeurs dans les labels des axes?

En vous remerciant d'avance.
joyeux_lapin13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2011, 15h56   #10
Rédacteur
 
Homme Stéphane
Consultant et formateur SAS et Cognos
Inscription : avril 2009
Messages : 1 791
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Consultant et formateur SAS et Cognos
Secteur : Conseil

Informations forums :
Inscription : avril 2009
Messages : 1 791
Points : 4 012
Points : 4 012
Après un temps de réflexion plutôt rapide, je serai d'avis que tu passes en proc TEMPLATE qui te permettrait d'affiner ton affichage.
Vérifie, avec tu peux passer des annotations en plus des graphes
__________________
N'oubliez pas de cliquer sur lorsque votre problème est réglé !

Moteur de recherche dans les papiers SAS
datametric est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2011, 07h01   #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
Salut.
Pour les pourcentages sur les axes, tu peux jouer avec les labels, en créant à l'avance des macro-variables. Pour le cercle des corrélations, c'est tout simple... mais pas dans SGPLOT ! Dans la proc TEMPLATE, il faudra utiliser l'élément ELLIPSEPARM avec des paramètres comme SEMIMAJOR=1 SEMIMINOR=1 SLOPE=0 XORIGIN=0 YORIGIN=0 et hop ! un cercle.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
ODS OUTPUT eigenVectors=work.vp Eigenvalues=work.inerties ; 
PROC PRINCOMP DATA=sashelp.shoes ;
  VAR stores sales inventory returns ;
RUN ;
DATA _NULL_ ;
  SET work.inerties ;
  CALL SYMPUTX(CATS("axe",number), CATX(" ","Axe",number,"(",PUT(proportion,NLPCT12.2),")")) ;
RUN ;
PROC SGPLOT DATA=work.vp NOAUTOLEGEND ;
  VECTOR X=prin1 Y=prin2 / XORIGIN=0 YORIGIN=0 DATALABEL=label ;
  LABEL prin1="&axe1" prin2="&axe2" ;
RUN ;
Pour imposer des graduations d'axes, c'est pareil : tout simple dans TEMPLATE mais je ne vois pas par où s'y prendre en SGPLOT.
Bon courage.
Olivier
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2011, 09h57   #12
Membre habitué
 
Homme Julien
Ingénieur d'études / Biostatisticien
Inscription : décembre 2009
Messages : 304
Détails du profil
Informations personnelles :
Nom : Homme Julien
Localisation : France

Informations professionnelles :
Activité : Ingénieur d'études / Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : décembre 2009
Messages : 304
Points : 101
Points : 101
Merci Olivier et Stéphane pour vos conseils, je vais regarder ça tout de suite!
joyeux_lapin13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2011, 11h33   #13
Membre habitué
 
Homme Julien
Ingénieur d'études / Biostatisticien
Inscription : décembre 2009
Messages : 304
Détails du profil
Informations personnelles :
Nom : Homme Julien
Localisation : France

Informations professionnelles :
Activité : Ingénieur d'études / Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : décembre 2009
Messages : 304
Points : 101
Points : 101
Aprés avoir utiliser ta syntaxe Olivier ça marche niquel-chrome!

Par contre je m'attaque au cercle et aux axes et j'ai repris ta syntaxe Datametric, mais j'ai à peu prés les problèmes décrits dans le topic, alors j'ai viré tout ce qui ne marchait pas et me reste ça:

Code :
1
2
3
4
5
6
7
8
9
10
 
PROC TEMPLATE ;
DEFINE STATGRAPH ajout.acp;
BEGINGRAPH;
LAYOUT OVERLAY;
ELLIPSEPARM SEMIMAJOR=1 SEMIMINOR=1 SLOPE=0 XORIGIN = 0 YORIGIN = 0; 
ENDLAYOUT;
ENDGRAPH;
END;
RUN;
Le
Code :
1
2
 
LAYOUT OVERLAY / XGRID=TRUE YGRID=TRUE  XAXISOPTS=(LABEL="Axe n°1" TICKS=(-1 0 1)) AXISOPTS=(LABEL="Axe n°2" TICKS=(-1 0 1)) ;
ne passe absolument pas, pourtant ça semblait être l'idéal pour ajouter les axes...

Ensuite mon autre souci est au sujet de l'ODS HTML:
Code :
1
2
3
4
5
6
7
8
9
10
11
 
ODS HTML GPATH="c:\temp" ;
DATA Ajout;
SET parts_variance1 parts_variance2;
MERGE parts_variance1 parts_variance2;
BY Number;
CALL SYMPUTX(CATS("axe",number), CATX(" ","Axe",number,"(", " ","St1:",PUT(Part_variance_St1,NLPCT12.2)," ", "St2:",PUT(Part_variance_St2,NLPCT12.2),")")) ;
FILE PRINT ODS=(TEMPLATE="ajout.acp");
PUT _ODS_ ;
RUN ;
ODS HTML CLOSE ;
Est-ce bien ce qui permet l'ajout du cercle sur le graphe à venir? non parce que j'ai un souci de droit, à la limite c'est résolvable facilement en voyant avec l'administrateur réseau de ma boîte.
joyeux_lapin13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2011, 15h19   #14
Membre habitué
 
Homme Julien
Ingénieur d'études / Biostatisticien
Inscription : décembre 2009
Messages : 304
Détails du profil
Informations personnelles :
Nom : Homme Julien
Localisation : France

Informations professionnelles :
Activité : Ingénieur d'études / Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : décembre 2009
Messages : 304
Points : 101
Points : 101
Bon j'ai craqué lol! Finalement je l'ai fait à la main dans la macro étant donné que c'est quelque chose de fixe quelque soit l'utilisation, j'ai écris et mergé les coordonnées à la main: (pas de CARDS possible dans une macro...)

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
 
DATA plan1;
X_plan = 1;
Y_plan = 0;
RUN;
 
DATA plan2;
X_plan = 0;
Y_plan = 1;
RUN;
 
DATA plan3;
X_plan = -1;
Y_plan = 0;
RUN;
 
DATA plan4;
X_plan = 0;
Y_plan = -1;
RUN;
 
DATA plan;
SET plan1 plan2 plan3 plan4;
RUN;
 
DATA composantes;
SET composantes plan;
MERGE composantes plan;
RUN;
Puis j'ai tracé 4 vecteurs et une ellipse à la main:
Code :
1
2
3
4
5
 
PROC SGPLOT DATA = composantes NOAUTOLEGEND;
VECTOR X = X_plan Y = Y_plan / XORIGIN = 0 YORIGIN = 0 LINEATTRS = (COLOR = "black" PATTERN = SOLID);
ELLIPSE X = X_plan Y = Y_plan / ALPHA = 0.715 LINEATTRS = (COLOR = "black");
RUN;
Et puis basta lol!

Merci Olivier et Stéphane pour votre intérêt à mon topic et vos conseils / aides.
joyeux_lapin13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h57.


 
 
 
 
Partenaires

Hébergement Web