2017-06-08 3 views
0

Quand je lance macro « quantplot » Je cours sur la question montre l'image:variables macro ne résoudra pas SAS

Picture of Error. Essentiellement, ce qui semble se produire est qu'aucune des expressions de cette forme recode_ & variables, out_ & variables, etc. semble renvoyer la valeur correcte. C'est simplement en le lisant comme recode_ et en ignorant la variable macro.

J'ai fourni le code suivant pour les données de l'échantillon:

data test (drop=i); 
do i=1 to 1000; 
a=round(uniform(1)*4,.01); 
b=round(uniform(1)*10,.01); 
c=round(uniform(1)*7.5,.01); 
u = rand("Uniform"); 
y=floor((2)*u); 
output; 
end; 
stop; 
run; 

%macro percentiles(indep_var=,num_groups=); 
%let recodes=recode_%sysfunc(tranwrd(&indep_var,%str(),%str(recode_))); 
proc rank data=test out=test groups=7; 
var &indep_var; 
ranks &recodes; 
run; 
%mend; 
%percentiles(indep_var=a b c); 

Et aussi le code de la macro qui ne fonctionne pas actuellement. S'il vous plaît aider!

/*Plots to determine functional form for quantitative variables*/ 
%macro quantplot(indep_var=,dep_var=); 
    /* Count the number of words in the input */                                 
    %let count=%sysfunc(countw(&indep_var)); 
    /* Loop through the total number of values */                       
    %do i = 1 %to &count;                            
     %let variables=%qscan(&indep_var,&i,%str()); 
     %put(&variables); 
     proc means data=test; 
     %put(&variables); 
      class recode_&variables; 
      var &dep_var; 
      output out = out_&variables mean = pby_&variables; 
     run; 
     data p_&variables; 
      set out_&variables; if _type_=1; 
      lnp = log(pby_&variables/(1-pby_&variables)); 
     run; 
     ods graphics on; 
      proc gplot data = p_&variables; 
       symbol value = star i=join; 
       plot lnp*recode_&variables; 
       plot pby_&variables*recode_&variables; 
      run; 
     ods graphics off; 
    %end; 
%mend; 
%quantplot(indep_var=a b c,dep_var=y); 
+0

Pas lié à votre question mais je suggère d'utiliser sgplot pas gplot. Vous obtenez de meilleurs graphismes, plus de contrôle, et c'est plus facile à utiliser selon moi. – Reeza

+0

https://gist.github.com/statgeek/7cffd06ebc3bc9c78b4f6a5b4538b053 – Reeza

+0

Ma version d'une macro pour automatiser le rang proc. – Reeza

Répondre

5

Le problème est que vous avez introduit macro citant en utilisant% QScan:

%let variables=%qscan(&indep_var,&i,%str()); 

et parfois cette citation n'est pas supprimé automatiquement quand il doit être, et il brise le tokenization de:

class recode_&variables; 

Chaque fois que MPRINT affiche un code qui semble correct, mais qu'il comporte des erreurs, vous devez suspecter un problème de macro. Vous pouvez CITATION la valeur vous-même:

class %unquote(recode_&variables); 

ou modifier votre utilisation de %qscan-%scan.

Votre solution d'utilisation de %sysfunc(strip()) fonctionne car %sysfunc() ne spécifie pas la valeur.

+0

C'était une excellente réponse. Je n'étais pas au courant de beaucoup de ces choses. Je vous remercie! – NicChik