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

Macro Discussion :

Compiler une macro-variable stockant des macro-instructions


Sujet :

Macro

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 11
    Points : 5
    Points
    5
    Par défaut Compiler une macro-variable stockant des macro-instructions
    Bonjour à tous,

    Petit nouveau sur le forum, je vous contacte déjà pour faire appel à vos connaissances sassistiques !

    Mon problème est simple (du moins à énoncer) :

    Je cherche à compiler une macro-variable qui stockerait du code contenant des macro-instructions (du type %do / %if / %end).

    Pour faire simple, mon problème pourrait se résumer au problème suivant :

    On souhaite construire une macro dont le but serait d'écrire les valeurs successives prises par une macro-variable "i" dans la log (i allant de 1 à 5).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	%macro exemple();
    		%let boucle1 = %str(%do i=1 %to 5; %put &i.; %end;);
    		%let boucle2 = %quote(%do i=1 %to 5; %put &i.; %end;);
    		&boucle1.;
    		&boucle2.;
    	%mend exemple;
    	%exemple();
    J'ai essayé de passer par un %str ou un %quote (vu que l'exemple suivant fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	%let p=%str(proc print data=sashelp.class; run;);
    	&p.;
    ), mais dans les deux cas j'obtiens une erreur (j'imagine que le %do doit être compilé dès le départ..).

    Peut-être aurez-vous une idée à me proposer pour contourner ce souci ?

    Remarque importante : je voudrais éviter d'écrire le code souhaité dans un programme .sas créé via SAS, puis faire un %include ensuite pour exécuter le code créé. J'ai déjà testé cette méthode (qui fonctionnait), mais je pense qu'en utilisant les bonnes macro-fonctions textes on doit pouvoir s'en sortir... Non ?!?

    En vous remerciant par avance pour vos éventuelles idées, je vous souhaite une bonne journée !

    Couillonouss

  2. #2
    Membre du Club
    Inscrit en
    Mars 2012
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Mars 2012
    Messages : 46
    Points : 49
    Points
    49
    Par défaut
    Bonjour!

    J'ai déjà été confronté au même problème.

    J'avais testé avec des call execute, mais ça ne fonctionnait pas... donc je suis preneur pour une solution aussi!

    Niaboc

  3. #3
    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.
    Je ne m'appesantirai pas sur l'utilité supposée de cette syntaxe. Je serais surpris qu'il n'y ait pas de moyen plus simple de faire la même chose, mais bon. Résolvons (si possible) la question.

    Tu ne peux pas créer une telle macro-variable avec un %LET. Aucune fonction de QUOTING n'évitera d'interpréter tout ce qu'il y a à écrire dans ta macro-variable. Par contre, en créant la macro-variable avec un CALL SYMPUTX et une expression entre apostrophes (que le compilateur macro n'a pas le droit d'interpréter du tout), ça fonctionne plus simplement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DATA _NULL_ ;
      CALL SYMPUTX("boucle1",
                   '%macro a ; %do i=1 %TO 5; %put &i.; %end; %mend a; %a',
                   "L") ;
    RUN ;
    &boucle1.
    Bon courage.
    Olivier

  4. #4
    Membre du Club
    Inscrit en
    Mars 2012
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Mars 2012
    Messages : 46
    Points : 49
    Points
    49
    Par défaut
    Ma problématique est :

    il faut que je crée autant de boucle que j'ai de variables en paramètre de ma macro.

    Pour donner une idée de ce que je veux :

    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
    %macro test(nb_var);
    	%do i=1 %to &nb_var;
    		DATA _NULL_ ;
    			CALL SYMPUTX("boucle2",'%put do a&i=1 to 8%str(;);',"L") ;
    		RUN ;
    		&boucle2;
    	%end;
     
    	/*code en fonction de &a1, &a2,..., &&a&i*/
     
    	%do i=1 %to 4;
    		DATA _NULL_ ;
    			CALL SYMPUTX("boucle3",'%put end%str(;);',"L") ;
    		RUN ;
    		&boucle3;
    	%end;
    %mend test;
     
    %test(4)
    Là j'ai mis des %put pour montrer ce que j'aimerais obtenir ; car en écrivant réellement le code %do . %to; ça me met : The %DO statement is not valid in open code.

    Il existe peut-être un moyen plus simple que de générer des boucles? ou de contourner ça?

  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
    Citation Envoyé par niaboc Voir le message
    il faut que je crée autant de boucle que j'ai de variables en paramètre de ma macro.
    Des boucles SAS dans une étape DATA, ou des boucles macros ?

  6. #6
    Membre expérimenté
    Homme Profil pro
    Attaché statisticien
    Inscrit en
    Mai 2011
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Attaché statisticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2011
    Messages : 687
    Points : 1 581
    Points
    1 581
    Par défaut
    Bonsoir,

    le mieux ce serait que tu expose vraiment ce que tu cherche à faire plutôt que de résoudre ton problème de boucle qui n'est pas exactement ce que tu cherche vraiment à faire mais qu'une petite partie, car je rejoins Olivier, je suis dubitatif sur la nécessité d'avoir une telle écriture de code en macro code...

  7. #7
    Membre du Club
    Inscrit en
    Mars 2012
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Mars 2012
    Messages : 46
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par olivier.decourt Voir le message
    Des boucles SAS dans une étape DATA, ou des boucles macros ?
    je cherche bien à générer des boucles macro.

  8. #8
    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
    Alors je pense que le plus simple est de les imbriquer !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    %MACRO boucles (nbBoucles) ;
      %DO i=1 %TO &nbBoucles ;
         %DO j=1 %TO 3 ;
            %PUT bonjour ;
         %END ;
      %END ;
    %MEND boucles ;

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Bonjour à tous !

    Tout d'abord, je m'excuse pour le temps de réponse, et vous remercie pour vos nombreuses réactions !

    Voici ce que je veux faire en réalité : je souhaite faire tourner plusieurs modèles à la suite de manière à identifier celui qui est le plus en adéquation avec mes données.

    Je dispose d'un certain nombre de "couples" de variables (prenons nb_couples=3 ici) :

    • Couple 1 : var1_1 var1_2

    • Couple 2 : var2_1 var2_2

    • Couple 3 : var3_1 var3_2


    NB : var1_2, var2_2, et var3_2 sont des versions "retravaillées" de var1_1, var2_1, et var3_1. (ex : var1_2=log(var1_1) )

    Je souhaite tester les 2^nb_couples ( ici = 2^3 = 8) modèles possibles dans une proc logistic de manière à sélectionner celui qui s'apparente le mieux à mes données :
    y = var1_1 var2_1 var3_1
    y = var1_1 var2_1 var3_2
    y = var1_1 var2_2 var3_1
    y = var1_1 var2_2 var3_2
    y = var1_2 var2_1 var3_1
    y = var1_2 var2_1 var3_2
    y = var1_2 var2_2 var3_1
    y = var1_2 var2_2 var3_2

    Suite à la syntaxe proposée par Olivier, j'ai donc écrit la macro suivante :

    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
     
    	%macro regression(nb_couples);
     
                    /* Ecriture des &nb_couples. blocs "%do" */
    		%do i=1 %to &nb_couples.;
    			data _null_ ;
    				call symputx("boucle",'%do a&i=1 %to 2;',"l") ;
    			run ;
    			&boucle;
    		%end;
     
                    /* Modèle testé */
    		Proc logistic data=table ;
    			model y = %do j=1 %to &nb_couples.;
    							var&j._&&a&j..
    					 %end;	;
    			ods output FitStatistics=stats%do k=1 %to &nb_couples.;%sysfunc(strip(_&&a&k..))%end;;
    		run;
     
                    /* Ecriture de tous les blocs "%end" */
    		%do l=1 %to &nb_couples.;
    			data _null_ ;
    				call symputx("fin_boucle",'%end;',"l") ;
    			run ;
    			&fin_boucle.;
    		%end;
     
    	%mend regression;
     
    	%regression(nb_couples=3);
    Autrement dit, le but serait qu'ici SAS interprète le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    	%do a1=1 %to 2;
    		%do a2=1 %to 2;
    			%do a3=1 %to 2;
    				proc logistic data=table ;
    					model y = var1_&a1. var2_&a2. var3_&a3.	;
    					ods output FitStatistics=stats_&a1._&a2._&a3.;
    				run;
    			%end;
    		%end;
    	%end;
    J'aurais pu passer par une proc SQL pour faire un produit cartésien (qui m'aurait donc donné les 8 modèles à tester) comme ceci :

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    	%macro regression_bis(nb_couples);
     
                    /* Identification de tous les modèles à tester */
     
    		%do i=1 %to &nb_couples.;
    			data a&i.;
    				%do j=1 %to 2;
    					var&i.="var&i._&j."; output;
    				%end;
    			run;
    		%end;
     
    		proc sql;
    			create table prod_cart as
    				select A1.* %do k=2 %to &nb_couples.; 
    								,A&k..*
    							%end;
    				from A1 %do l=2 %to &nb_couples.; 
    								,A&l.
    							%end; ;
    		quit;
     
    		data prod_cart;
    			set prod_cart;
    			concat=var1  %do n=2 %to &nb_couples.;
    							|| " " || var&n.
    						 %end;;
    		run;
     
    		proc sort;
    			by concat;
    		run;
     
                    /* Nombre de modèles à tester */
     
    		%let open = %sysfunc(open(prod_cart,in)) ;
         	        %let nb_obs = %sysfunc(attrn(&open.,nobs)) ;
    	 	%let ferme = %sysfunc(close(&open.)) ;
     
    		%do m=1 %to &nb_obs.;
    			data _null_;
    				set prod_cart;
    				if _n_=&m.;
    				call symput("modele_a_tester",concat);
    			run;
    			proc logistic data=table ;
    				model y = &modele_a_tester.;
    				ods output FitStatistics=stats_&m.;
    			run;
    		%end;
     
    	%mend regression_bis;
     
    	%regression_bis(nb_couples=3);
    , mais j'aurais bien aimé passé directement par des boucles (plus court en code, et en temps je pense ?)

    Après je cherche peut-être trop compliqué..

    En tout cas, avec la syntaxe proposée par Olivier, j'arrive à mes fins donc un grand merci

    Bonne journée !

    Couillonouss

  10. #10
    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
    Sinon, sans utiliser de macros, tu as l'option SELECTION=SCORE de la proc LOGISTIC qui va te tester tous les modèles possibles ; en jouant sur les options START et STOP (toutes deux à la valeur 3) tu n'auras que les modèles à 3 variables.
    Les modèles, dans la sortie, sont triés selon la statistique du score (la dérivée de la vraisemblance) donc le meilleur modèle aura la statistique la plus élevée.

    Bon courage.
    Olivier

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Et avec cette méthode je ne risque pas de tester plus de modèles que nécessaire ?
    En s'appuyant sur l'exemple précédent, je ne veux pas tester le modèle (par exemple) : y = var1_1 var1_2 var2_1 car on a deux fois "var1"
    Merci !
    Couillonouss

  12. #12
    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
    Comme l'évaluation des modèles n'est pas très coûteuse, après tout, ce n'est pas bien grave de faire construire quelques modèles qui ne seront pas utiles au final.
    Tu peux récupérer la liste des modèles évalués avec un ODS OUTPUT, et ensuite tu filtres pour éliminer les modèles que tu ne veux pas. Au final, je pense que ton code sera à la fois plus lisible et plus rapide, car il n'y a qu'une seule proc LOGISTIC et qu'elle dérive ses résultats du modèle complet, donc pas de recherche de maximum de vraisemblance à chaque nouveau modèle testé.

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Ok très bien !

    Je vais donc utiliser cette option qui fera gagner en lisibilité.

    Et si je me retrouve un jour avec autre chose à faire qu'une proc logistic, je pourrais toujours utiliser la syntaxe que tu m'as donnée au départ (à savoir passer par un call symputx).

    Dans tous les cas, je te remercie beaucoup pour ton aide et ta réactivité

    Bonne journée :-)

    Couillonouss

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Euh en fait je pensais que la syntaxe :

    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
     
    	%macro genere_blocs_do(nb_couples);
     
                    /* Ecriture des &nb_couples. blocs "%do" */
    		%do i=1 %TO &nb_couples.;
    			DATA _null_ ;
    				call symputx("boucle",'%do a&i=1 %to 2;',"l") ;
    			run ;
    			&boucle.
    			%put Couple : &i - Compteur : a&&a&i.;
    			DATA _null_ ;
    				call symputx("fin_boucle",'%end;',"l") ;
    			run ;
    			&fin_boucle.		
    		%end;
     
    	%mend genere_blocs_do;
     
    	%genere_blocs_do(nb_couples=2);
    fonctionnait, mais je me suis visiblement trompé...

    Je pensais que celle-ci me retournerait dans la log :

    Couple : 1 - Compteur : a1
    Couple : 1 - Compteur : a2
    Couple : 2 - Compteur : a1
    Couple : 2 - Compteur : a2

    Mais ce n'est pas le cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ERROR: The %DO statement is not valid in open code.
    Du coup, existe-t-il un moyen de "générer" un nombre précis de boucle, sans les imbriquer soi-même à la main ?

  15. #15
    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
    Non, en fait il y a un problème de timing.
    Les boucles %DO doivent être incluses dans des macro-programmes. Tu vas me dire que c'est le cas, mais pas du point de vue de SAS. Car ton but est d'écrire un 2e macro-programme qui inclut les boucles "intérieures".
    Dans l'exemple avec CALL SYMPUTX que je te donnais plus haut, je mettais l'intégralité de la boucle et les %MACRO...%MEND qui l'accompagnent dans la macro-variable. Sinon, je ne pense pas qu'on puisse s'en sortir.

    Une solution avec 2 boucles macro l'une dans l'autre ne donnerait pas le résultat ? Je t'avoue que je n'ai pas les idées assez claires pour faire des tests.

    Bon courage.
    Olivier

  16. #16
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Désolé, j'ai eu des difficultés à exprimer mon problème

    Dans l'exemple avec CALL SYMPUTX que je te donnais plus haut, je mettais l'intégralité de la boucle et les %MACRO...%MEND qui l'accompagnent dans la macro-variable.
    Oui j'ai vu ça, c'est d'ailleurs pour cela que cela fonctionnait bien. Je ne sais pas ce que j'ai testé du coup quand je t'ai dit que c'était ok...
    Faut croire que moi aussi je n'avais pas les idées claires
    Bref, donc comme toi, je pense qu'on ne peut pas s'en sortir (hormis en demandant à SAS de créer un programme dans lequel toutes nos instructions seraient notées, et d'en faire un %include après).

    Et donc oui la solution d'imbriquer les boucles à la main fonctionnerait
    C'est juste que si on avait beaucoup de boucles à générer, ça pourrait être embêtant. Mais dans mon cas, je peux encore les écrire manuellement, sans demander à SAS de les générer pour moi..

    Merci encore !

    Et désolé si je n'ai pas été clair dans mes précédents messages, j'essaierai d'exposer mieux mon problème la prochaine fois

    Bonne soirée

    Couillonouss

  17. #17
    Membre du Club
    Inscrit en
    Mars 2012
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Mars 2012
    Messages : 46
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par olivier.decourt Voir le message
    Sinon, sans utiliser de macros, tu as l'option SELECTION=SCORE de la proc LOGISTIC qui va te tester tous les modèles possibles ; en jouant sur les options START et STOP (toutes deux à la valeur 3) tu n'auras que les modèles à 3 variables.
    Les modèles, dans la sortie, sont triés selon la statistique du score (la dérivée de la vraisemblance) donc le meilleur modèle aura la statistique la plus élevée.

    Olivier
    Pour sélectionner les modèles, je préférerais comparer directement l'AIC (ou le BIC) plutôt que la statistique du score, qui reste, de mémoire, un test de nullité de l'ensemble des coefficients de la régression. La colinéarité peut donc rentrer en jeu?
    Ce qui fait que les modèles les mieux ajustés aux données (qui minimisent l'AIC) ne sont pas toujours ceux qui ont les statistiques de test les plus fortes sur les tests du score, de Wald, etc., la cohérence entre AIC et test du score n'est pas forcément respectée...


    Et du coup j'ai l'impression de rester bloquer sur mon pb : pouvoir générer des boucles %do automatiquement :-(.
    et d'après les échanges avec Couillonous je vois qu'il est délicat de générer ces boucles.

    Merci pour ces échanges, j'ai quand même appris à mieux utiliser l'instruction call symputx!

    Niaboc

  18. #18
    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
    Citation Envoyé par niaboc Voir le message
    Pour sélectionner les modèles, je préférerais comparer directement l'AIC (ou le BIC) plutôt que la statistique du score, qui reste, de mémoire, un test de nullité de l'ensemble des coefficients de la régression
    Oui, moi aussi... mais la proc Logistic ne construit pas réellement tous les modèles, elle se contente de les dériver les uns des autres par un algorithme (Furnival & Wilson) qui ne permet de calculer que des statistiques du score.
    Hosmer et Lemeshow proposent d'en dériver une approximation du C(p) de Mallow, qui ressemble plus à AIC puisqu'il tient compte du nombre de coefficients du modèle. Il faut faire une petite étape Data après la proc Logistic mais ça s'obtient assez facilement, c'est une solution de secours.
    Dans le cas du problème de Couillonouss, de toute façon il ne veut que des modèles à 3 variables quanti, donc il suffit de comparer les scores pour trouver le meilleur car le nombre de coefficients restera toujours le même.

  19. #19
    Membre du Club
    Inscrit en
    Mars 2012
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Mars 2012
    Messages : 46
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par olivier.decourt Voir le message
    Dans le cas du problème de Couillonouss, de toute façon il ne veut que des modèles à 3 variables quanti, donc il suffit de comparer les scores pour trouver le meilleur car le nombre de coefficients restera toujours le même.

    Ah?
    sur des tests que j'ai pu faire récemment, sur des modèles composés du même nombre de variables, l'AIC et le test de score ne donnent pas des résultats toujours cohérents en terme de sélection de modèle. Et j'aurais prioriser l'AIC plutôt que le test de nullité de coefficients dans le cas de Couillonouss.

    Niaboc

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/05/2015, 17h28
  2. Réponses: 4
    Dernier message: 29/11/2011, 18h37
  3. Réponses: 3
    Dernier message: 29/04/2011, 17h02
  4. Des macros qui générent des macros
    Par the-destroyer dans le forum C
    Réponses: 2
    Dernier message: 13/06/2010, 09h21
  5. Réponses: 4
    Dernier message: 08/03/2010, 14h32

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