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 :

Optimisation d'une proc ttest ou autres procédures statistiques sur 50 000 datasets


Sujet :

Macro

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 71
    Points : 67
    Points
    67
    Par défaut Optimisation d'une proc ttest ou autres procédures statistiques sur 50 000 datasets
    Bonjour,

    J'aimerais savoir si vous avez des conseils d'optimisation quant à réaliser une proc ttest ou autre sur un très grand nombre de dataset (50 000).
    Pour chaque ttest effectué, je récupère la p-valeur avec un "call symput" puis je l'insert dans mon dataset final via la "proc sql; insert into ".

    Merci par avance.

  2. #2
    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,

    avec un peu de code que tu aurais écrit ce serait plus concret.

    D'abord pour la sortie de la Ttest tu peux sans doute avoir une sortie sous forme de table, ce papier http://www.ats.ucla.edu/stat/sas/faq/odsexample.htm , en parle.

    Sinon tu as une Ttest à faire sur 50 000 échantillons.

    Tout dépend de la taille de tes échantillons, mais par exemple il peut être préférable de regrouper tes échantillons en "paquets" de calcul.

    Par exemple si tu as des échantillons de taille de 10 000 , si tu mets 1 000 échantillons dans une même table (avec une variable identifiant ayant une modalité unique pour chaque échantillon ) il te restera plus qu'à faire une Ttest sur sur ce paquet via un "BY Identifiant_echantillon" dans ta Ttest.
    Au lieu de faire 1 000 appel à la Ttest sur de petites tables de 10 000 observations tu n'en fera plus qu'une sur 10 000 000 d'observations, et tu auras autant de résultat que d'échantillon (le résultat étant propre à chaque modalité du by).

    Pour tes 50 000 échantillons, tu n'auras plus qu'à faire 50 paquets de calculs (la variable d'identifiant de l'échantillon doit en tenir compte pour que tu y retrouve tes petits à la fin).

    La grosse différence, surtout si tu travaille sur disque dur c'est qu'au lieu d'aller chercher 50 000 "petites" tables correspondant à tes 50 000 échantillons, ce qui va te faire "gratter" ton disque dur comme pas possible, tu ne vas charger que 50 gros paquets de calculs et tu aura (beaucoup beaucoup) gagné en temps d'accès disque, ce qui se répercutera sur le temps total de calcul : si tes fichiers sont petits, SAS passe son temps à attendre que le disque dur réagisse..., sans compter que lancer 1 000 Ttest contre une fois seulement cela doit également faire la différence, sans compter qu'avoir une seule note au lieu de 1 000 notes si tu n'a pas mis l'option "nonotes" ça fera aussi la différence.

    En espérant t'avoir aidé.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 71
    Points : 67
    Points
    67
    Par défaut
    Bonjour jerome_pdv2,

    Merci pour ta réponse. Transformer les datasets pour utiliser le "by" dans la procédure ttest est une bonne idée. Je vais regarder si je peux l'adapter à mes données.

    Pour information mon code avec des données bidons était quelque chose comme ça :
    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
    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
    data RES;					
    	length FLAG $ 200;
    	input FLAG $ PVAL ;
    	datalines;
    	;
    run;
     
    data tab_flag;
    	length flag $ 200;
    	input flag $;
    	cards;
    	(var2_ge_17_and_var2_le_19)
    	(var2_ge_17_and_var2_lt_22)
    	(qte_ge_30_and_qte_lt_34)
    	(prix_ge_19_and_prix_lt_27)
    	(var2_ge_17_and_var2_le_20)_and_(qte_ge_30_and_qte_lt_34)
    	(var2_ge_17_and_var2_le_21)_and_(qte_ge_30_and_qte_lt_34)_and_(prix_ge_20_and_prix_lt_25)
    	;
    run;
     
    data tab_flag;
    	set tab_flag;
    	flag=translate(flag," ","_"); /*** remplace les _ par des blancs (@Jerome_pdv2) **/
    run;
     
    data tab1;
    	input id annee qte prix varex var2;
    	cards;
    	1 2005 30 25.3 46 18
    	2 2006 31 28.3 41 17
    	3 2006 32 19.6 124 18
    	4 2006 32 31 64 19
    	5 2005 33 22 78 15
    	6 2006 34 20 35 22
    	7 2005 31 28.3 45 13
    	8 2005 32 19.6 98 21
    	9 2005 32 31 83 19
    	10 2005 34 20 77 14
    	;
    run;
     
     
    %macro STATDES_TTEST;
    	data _null_;
    		set tab_flag end=eof;
    		call symputx ("FLAG"||left(put(_n_,8.)),FLAG);
    		if eof then call symput ("NBFLAG",_n_);
    	run;
     
    	%do i=1 %to &NBFLAG.;
     
    		ODS NORESULTS;
    		proc ttest data=TAB1 (where=(&&FLAG&i.));
    			var varex;
    			class annee;
    			ods output ttests = TEST;
    			ods output equality = VAREQ;
    		run;
    		ODS RESULTS;
     
    		%let PVAL=NA; /* initialise PVAL */
     
    		/* on obtient la pvaleur quand les variances sont égales ou non */
    		data _null_;
    			merge TEST VAREQ;
    			by VARIABLE;
    			if Probf LT 0.05 then do;
    				if VARIANCES='Unequal' then call symput("PVAL",put(PROBT,6.4));
    			end;
    			if Probf GE 0.05 then do;
    				if VARIANCES='Equal' then call symput("PVAL",put(PROBT,6.4));
    			end;
    		run;
     
    		proc sql;
    			insert into RES
    			set FLAG="&&FLAG&i..",PVAL=&PVAL.;
    		quit;
     
    	%end;
     
    %mend STATDES_TTEST;
    %STATDES_TTEST;

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 71
    Points : 67
    Points
    67
    Par défaut
    La réponse dans un autre sujet http://www.developpez.net/forums/d15...lant-datasets/

    Merci

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 16/03/2009, 10h36
  2. [ASE]optimisation d'une proc stock trés lente
    Par 461219 dans le forum Adaptive Server Enterprise
    Réponses: 8
    Dernier message: 04/01/2008, 14h23
  3. Réponses: 2
    Dernier message: 16/02/2007, 19h49
  4. Réponses: 11
    Dernier message: 26/11/2005, 14h00
  5. Réponses: 15
    Dernier message: 26/03/2004, 18h53

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