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 STAT Discussion :

Macro SAS sur ACP


Sujet :

SAS STAT

  1. #1
    Membre régulier Avatar de Nono Sto
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 350
    Points : 74
    Points
    74
    Par défaut Macro SAS sur ACP
    Pour affiner mon analyse de mon ACP sur les taux d'intérêt j'essaye de faire une macro.
    les individus sont les dates d'observations et les variable la durée de l'emprunt affecté aux taux d'interet:

    voici un exemple avec une observation et 2 variables:

    1 ans 2 ans
    04/01/2000 5% 7%

    L'esprit est le suivant:

    résultat de l'ACP
    Pourcentage explicatif global des facteurs:

    Facteur 1 Facteur 2 Facteur 3
    valeur propre 12, 45 1,82 0,438

    % expliqué 83% 12% 3%
    %cumulatif 83% 95% 98%

    et je souhaite avoir le pourcentage explicatif des facteurs sur chacune des variable c'est à dire les différentes maturité des taux d'interet:

    Maturité Taux Facteur 1 Facteur 2 Facteur 3
    1 ans x% x% x%
    2 ans x% x% x%
    3 ans x% x% x%
    .
    .
    .
    15 ans x% x% x%

    Pour l'instant je ne suis arrivé qu'a produire l'inverse c-à-d le pourcentage explicatif des facteurs sur chacun des individus:

    obsrevations Facteur 1 Facteur 2 Facteur 3
    1/1/2000 x% x% x%
    2/1/2000 x% x% x%
    3/1/2000 x% x% x%
    .
    .
    .
    20/1/2011 x% x% x%

    à l'aide de cette macro
    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
    TITLE 'Analyse en composantes principales';
    PROC PRINCOMP DATA = ACP_GR.German_Rate_reduit OUT = ACP_GR.ACPDepout OUTSTAT = ACP_GR.ACPDepstat N=15;
    VAR VAR2--VAR16;
    RUN;
    QUIT;
     
    DATA C;                                                           
    SET ACP_GR.ACPDepout;                                                                
    ARRAY k{*} Prin1-Prin15; 
    disto=USS(OF k{*});                                               
    QLT1=Prin1*Prin1/disto;                                    
    QLT2=Prin2*Prin2/disto;
    QLT3=Prin3*Prin3/disto;                  
    KEEP Prin-Prin3 QLT1-QLT3 ;                            
    RUN;
     
    PROC PRINT DATA=C;                                                   
    ID ;                                          
    VAR Prin1-Prin3 QLT1-QLT3 ;                                        
    TITLE 'Coordonnees et qualite de representation des individus sur les axes';   
    RUN;
    Comment je pourrait la modifier pour atteindre le bon résultat.

    Merci

  2. #2
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    ça donne quoi si tu faisais une transposition de ta table avant d'appeler la macro?

  3. #3
    Membre régulier Avatar de Nono Sto
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 350
    Points : 74
    Points
    74
    Par défaut
    Je ne vois pas comment faire

  4. #4
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    Avec une proc transpose, les lignes deviennent des colonnes et inversement (regardes la synthaxe et des exemples sur l'aide de SAS).
    Tu l'apppliques sur ta table ACP_GR.ACPDepout

  5. #5
    Membre régulier Avatar de Nono Sto
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 350
    Points : 74
    Points
    74
    Par défaut
    voici mon nouveaux code

    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
    TITLE 'Analyse en composantes principales';
    PROC PRINCOMP DATA = ACP_GR.German_Rate_reduit OUT = ACP_GR.ACPDepout OUTSTAT = ACP_GR.ACPDepstat N=15;
    VAR VAR2--VAR16;
    RUN;
    QUIT;
     
    PROC TRANSPOSE DATA=ACP_GR.ACPDepout OUT= ACP_GR.trans;
    RUN;
     
     
     
    DATA C;                                                           
    SET ACP_GR.trans;                                                                
    ARRAY k{*} Prin1-Prin15; 
    disto=USS(OF k{*});                                               
    QLT1=Prin1*Prin1/disto;                                    
    QLT2=Prin2*Prin2/disto;
    QLT3=Prin3*Prin3/disto;                  
    KEEP Prin1-Prin3 QLT1-QLT3 ;                            
    RUN;
     
    PROC PRINT DATA=C;                                                   
    ID ;                                          
    VAR Prin1-Prin3 QLT1-QLT3 ;                                        
    TITLE 'Coordonnees et qualite de representation des individus sur les axes';   
    RUN;
    et voici le rapport:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     Des valeurs manquantes ont été générées à la suite d'une opération sur des valeurs manquantes.
          Chaque emplacement est défini par : (Nombre de fois) à la (Ligne):(Colonne).
          31 à la 118:7    31 à la 119:11   31 à la 120:11   31 à la 121:11
    NOTE:  31 observation(s) lue(s) dans la table ACP_GR.TRANS.
    NOTE: La table WORK.C a 31 observation(s) et 6 variable(s).
    NOTE: L'étape DATA a utilisé (Durée totale du traitement) :
          temps réel          0.01 secondes
          temps UC            0.01 secondes
    le retour print n'affiche que des point dans le tableau

  6. #6
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    Stockes dans une autre table, j'ai éssayé ça marche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    proc transpose data=test out=test2;run;

  7. #7
    Membre régulier Avatar de Nono Sto
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 350
    Points : 74
    Points
    74
    Par défaut
    j'ai reussi à transposé ma table

    je n'arrive pas à réecrire la macro en conséquence

    ci joint mes table peut etre que si tu a visualisation tu pourrais voir ou je me plante

    la prmiere image est la table transposé, la deuxieme l'original

  8. #8
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    Si tu peux mettre quelques lignes de ta table sur laquelle tu à appliquer la Princomp

  9. #9
    Membre régulier Avatar de Nono Sto
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 350
    Points : 74
    Points
    74
    Par défaut
    Voici un exemple





    les observation sont les date, les VAR sont les taux

  10. #10
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    En fait, il faut transposer dabord la table avant de faire l'ACP. Adaptes ça à ton exemple. C'est une image que tu m'as envoyer, je vais pas me taper tout ça dans l'editor

    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
    data test;
    input a $ b c;
    cards;
    A 90 67
    B 67 98
    C 43 12
    D 44 33
    ;
    run;
     
    proc transpose data=test out=idlabel name=Test
         prefix=sn;
       id a ;
     
           idlabel a ;
    run;
     
    proc princomp data=idlabel out=idlabel2 OUTSTAT = ACP_GR;
    run;
     
    data idlabel2;
    set idlabel2;
    keep test prin1-prin4;
    run;
     
     
    DATA C;                                                           
    SET idlabel2;                                                                
    ARRAY k{*} Prin1-Prin2; 
    disto=USS(OF k{*});                                               
    QLT1=Prin1*Prin1/disto;                                    
    QLT2=Prin2*Prin2/disto;
    QLT3=Prin3*Prin3/disto;
    QLT4=Prin4*Prin4/disto;
    *KEEP Prin-Prin2 QLT1-QLT2 ;                            
    RUN;

  11. #11
    Membre régulier Avatar de Nono Sto
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 350
    Points : 74
    Points
    74
    Par défaut
    Ce n'est pas possible il y a trop de ligne ,

    lorsqu'on transpose cela fait 2800 variable, il ya un moyen je pense a partir des vecteur propre d'extraire cette info mais je ne sais pas comment par les macro, celle de debut donner un bon point de depart je crois que c'est la dessus qu'il faut travailler mais j'ai aucune piste

  12. #12
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    Les composantes principales sont des combinaisons linéaires de tes anciennes variables par définition.

    et tu veux avoir : le pourcentage explicatif des facteurs sur chacune des variable c'est à dire les différentes maturité des taux d'interet

    Je ne comprends rien

  13. #13
    Membre régulier Avatar de Nono Sto
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 350
    Points : 74
    Points
    74
    Par défaut
    J'y suis presque il me faut une aide sur le code.

    Je vais essayer d'etre plus clair tout en présentant ce que j'ai pu trouver.

    En effet j'ai attend mon objectif cependant j'ai du tricher:

    1er étape:
    ACP classique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    PROC CONTENTS DATA = ACP_GR.German_Rate VARNUM;
    RUN;
     
    PROC STANDARD DATA = ACP_GR.German_Rate VARDEF = df MEAN = 0 STD = 1 OUT = ACP_GR.German_Rate_reduit;
    VAR VAR2--VAR16;
    RUN;
     
    TITLE 'Analyse en composantes principales';
    PROC PRINCOMP DATA = ACP_GR.German_Rate_reduit OUT = ACP_GR.ACPDepout OUTSTAT = ACP_GR.ACPDepstat N=15;
    VAR VAR2--VAR16;
    RUN;
    QUIT;
    puis extraction des valeurs propre et de la matrice des vecteurs propre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    data VAL_P VEC_P;
    set ACP_GR.ACPDepstat;
    	select(_type_);
    	when('EIGENVAL') output VAL_P;
    	when('SCORE') output VEC_P;
    	otherwise;
    	end;
    run;
    inversion de la matrice des vecteurs propres

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PROC TRANSPOSE DATA=Work.VEC_P OUT= ACP_GR.VEC_P;
    RUN;
    Puis je calcule le pourcentage explicatif des facteurs sur chacun des taux
    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
     
    DATA EXP;                                                           
    SET ACP_GR.VEC_P;                                                                
    ARRAY k{*} Prin1-Prin15; 
    disto=USS(OF k{*});                                               
    QLT1=Prin1*Prin1*12.4550;                                    
    QLT2=Prin2*Prin2*1.8120;
    QLT3=Prin3*Prin3*0.4380;                  
    KEEP Prin1-Prin3 QLT1-QLT3 ;                            
    RUN;
     
    PROC PRINT DATA=EXP;                                                   
    ID ;                                          
    VAR Prin1-Prin3 QLT1-QLT3 ;                                        
    TITLE 'Pourcentage explicatif des facteurs sur les variations de taux 2000-2010';   
    RUN;
    Actuellement mon problème est que je rentre manuellement dans le code les valeurs propres (ici 12.4550, 1.8120 et 0.4380), je souhaite donc integre à ma table EXP le vecteur des valeurs propres pour faire la multiplications.

    Ce pendant pour cela je dois aussi transposé le vecteur des valeurs propre avant d'integrer cela ne marche pas (voir l'image)

    Enfin je sais que je peux eviter les transpositions pour faire mes calcul, mais je ne sais pas comment remplacer Prin(i) dans mes commande par le nom de la variable ( ici on a par exemple pour la premiere Listed Federal securities / residual maturity of 1.0 years / daily data)

  14. #14
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    Si tu arrives à poster quelques lignes de ta table dans une instruction cards, je pourrais t'aider

  15. #15
    Rédacteur

    Homme Profil pro
    SAS ALLIANCE SILVER. Consultant et formateur SAS et Cognos.
    Inscrit en
    Avril 2009
    Messages
    2 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 2 497
    Points : 6 064
    Points
    6 064
    Par défaut
    Nono Sto, tu peux faire un double SET pour fusionner tes tables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    data res;
    if _n_=1 then SET VAL_P (keep= variable...) ;
    set VEC_P;
    run;
    N'oubliez pas de cliquer sur lorsque votre problème est réglé !

  16. #16
    Membre régulier Avatar de Nono Sto
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 350
    Points : 74
    Points
    74
    Par défaut
    Merci

    je vais essayer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DATA test;
    input a $ b c;
    cards;
    DATE             1.0 year rate  2.0 years rate     3.0 years rate
    1/1/2000           5%                  5%                 5%
    2/1/2000           5%                  5%                 5%
    3/1/2000           5%                  5%                 5%
    4/1/2000           5%                  5%                 5%
    ;
    run;

  17. #17
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    Tu transposes tes deux tables, tu fusionnes et voilà.
    J'espere bien que ça répond à tes attentes

    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
    PROC TRANSPOSE DATA=VEC_P OUT= VEC_P;
    RUN;
     
    DATA VAL_P ;
    SET VAL_P ;
    drop _nAME_ _TYPE_;
    run;
     
     
    PROC TRANSPOSE DATA=VAL_P OUT= VAL_P;
    RUN;
     
    proc sort data=VAL_P;
    by _NAME_;
    run;
     
    proc sort data=VEC_P;
    by _NAME_;
    run;
     
    DATA VEC_VAL;
    merge VAL_P VEC_P;
    by _NAME_;
    run;
     
    DATA EXP;                                                           
    SET VEC_VAL;                                                                
    ARRAY k{*} Prin1-Prin2; 
    disto=USS(OF k{*});                                               
    QLT1=Prin1*Prin1*COL1;                                    
    QLT2=Prin2*Prin2*COL1;
    KEEP Prin1-Prin2 QLT1-QLT2 ;                            
    RUN;

  18. #18
    Membre régulier Avatar de Nono Sto
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 350
    Points : 74
    Points
    74
    Par défaut
    Merci beaucoup
    je crois que l'on brule cependant j'ai un message d'erreur et sa plante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     proc sort DATA=Work.VAL_P;
    34   BY _NAME_;
    ERROR: Variable _NAME_ introuvable.
    35   run;
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     DATA VEC_VAL;
    42   merge Work.VAL_P Work.VEC_P;
    43   BY _NAME_;
    44   run;
     
    ERROR: Variable BY _NAME_ inexistante dans la table d'entrée WORK.VAL_P.

  19. #19
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    Tu peux vérifier dans les deux tables en affichant le nom des variables. ça m'étonne que ça marche pas

  20. #20
    Membre régulier Avatar de Nono Sto
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 350
    Points : 74
    Points
    74
    Par défaut
    J'ai fait des erreur de frappe il reconnait bien _NAME_

    Cependant il se passe quelque chose de bizarre, lors de la fusion toute les donné ce melange

    ce qui fausse complétement les calcule

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. pb de macro SAS -moyenne sur plusieurs variables
    Par sas_debutant dans le forum Macro
    Réponses: 3
    Dernier message: 31/10/2009, 00h47
  2. [VBA-E] Macro Atteindre sur Excel
    Par Sertec dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 15/12/2006, 17h31
  3. [débutant][macros] préscisions sur #define
    Par Spartan03 dans le forum Débuter
    Réponses: 2
    Dernier message: 25/04/2006, 17h44
  4. Envoi de mail via un macro vba sur excel
    Par momolamoto dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 30/12/2005, 18h51
  5. Macro VBA sur Access
    Par beurnoir dans le forum Access
    Réponses: 3
    Dernier message: 12/10/2005, 16h46

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