BookmarkSubscribeRSS Feed
ari2495
Obsidian | Level 7

Hi, I got this code to apply to my dataset and to substitute with my variables. there is a macro, that I do not know how to use. I would be very thankful if you could tell me where to substitute my variables (I neither have the dateset where this code worked, so i cannot compare to understand). 

%macro AUC_test (input= , pd_est= , default_flag= , Segmento= );

data campione_&segmento.;
set &input.;
*where MOD_RATING_ALLA_DATA_RIF= "&segmento.";
run;
/* AUC calculation */
	proc freq data = campione_&segmento. noprint;
	table &pd_est. * &default_flag.   / missing measures;
	output out=_smd measures;
	run;

	data _smd_&pd_est._&segmento.;
	set _smd (keep = _smdrc_ e_smdrc n);
	format AUC 17.15;
	format Esito $6.;
	AUC = (_smdrc_ + 1)/2;
	if AUC<= 0.65 then Esito= "ROSSO";
	else if 0.65<AUC<= 0.8 then Esito= "GIALLO";
	else if AUC>0.8 then Esito= "VERDE";
	Segmento="&segmento.";
	run;

%mend;

/*BASE*/
%AUC_test (input = Discr  , pd_est = PD0Base , default_flag = flag_default_finale, Segmento= IMP );
%AUC_test (input = Discr  , pd_est = PD0Base , default_flag = flag_default_finale, Segmento= POE );
%AUC_test (input = Discr  , pd_est = PD0Base , default_flag = flag_default_finale, Segmento= PRI );
%AUC_test (input = Discr  , pd_est = PD0Base , default_flag = flag_default_finale, Segmento= SMB );
/*WEIGHTED*/
%AUC_test (input = Discr  , pd_est = PD_weighted , default_flag = flag_default_finale, Segmento= IMP );
%AUC_test (input = Discr  , pd_est = PD_weighted , default_flag = flag_default_finale, Segmento= POE );
%AUC_test (input = Discr  , pd_est = PD_weighted , default_flag = flag_default_finale, Segmento= PRI );
%AUC_test (input = Discr  , pd_est = PD_weighted , default_flag = flag_default_finale, Segmento= SMB );

data AUC_Base;
set _smd_pd0base_imp _smd_pd0base_poe _smd_pd0base_pri _smd_pd0base_smb;
run;
data AUC_Weighted;
set _smd_pd_weighted_imp _smd_pd_weighted_poe _smd_pd_weighted_pri _smd_pd_weighted_smb;
run;
8 REPLIES 8
fja
Lapis Lazuli | Level 10 fja
Lapis Lazuli | Level 10

Hello!
Hugh ... long answer. First off ... the code seems to be intended to run as is, i.e. the macro is defined _and_ used there.
The adaption to your tables is done in the /* BASE */ and /* WEIGHTED */ sections of the code, where the Macro is called. Nevertheless, there are some assumptions on the structure of your data coded there.
My question is, how much do you understand of the macro code? I.e. can you "read" macros? And then: Do the SAS statements within the macro make sense to you? That was a way to keep the answers to your question short.
And of course: The person who provided you with the code should be able to tell you how to use it.
--FJa

ari2495
Obsidian | Level 7
Hi, thanks for answer. I understand a little of the code, and the person who provided it to me cannot explain
fja
Lapis Lazuli | Level 10 fja
Lapis Lazuli | Level 10

Lovely. Does that person know how to create a dataset to work with it? There needs to be a MOD_RATING_ALLA_DATA_RIF variable containing codes for "segments" (i.e. those values in "segmento" further in the code).

ari2495
Obsidian | Level 7
Let me explain better: I received this code as a model, and I need to customize it to my variables and dataset, but actually I do not know where to modify. For example, between pd est = pd weighted, which one is the variable of the final dataset, and which one instead is the variable of the original dataset to modify? Then I also need to understand where to specify the reference for macro
fja
Lapis Lazuli | Level 10 fja
Lapis Lazuli | Level 10

If (and only if) your dataset meets the demands on its structure you needed to adjust these lines:


@ari2495 wrote:
/*BASE*/
%AUC_test (input = Discr  , pd_est = PD0Base , default_flag = flag_default_finale, Segmento= IMP );
%AUC_test (input = Discr  , pd_est = PD0Base , default_flag = flag_default_finale, Segmento= POE );
%AUC_test (input = Discr  , pd_est = PD0Base , default_flag = flag_default_finale, Segmento= PRI );
%AUC_test (input = Discr  , pd_est = PD0Base , default_flag = flag_default_finale, Segmento= SMB );
/*WEIGHTED*/
%AUC_test (input = Discr  , pd_est = PD_weighted , default_flag = flag_default_finale, Segmento= IMP );
%AUC_test (input = Discr  , pd_est = PD_weighted , default_flag = flag_default_finale, Segmento= POE );
%AUC_test (input = Discr  , pd_est = PD_weighted , default_flag = flag_default_finale, Segmento= PRI );
%AUC_test (input = Discr  , pd_est = PD_weighted , default_flag = flag_default_finale, Segmento= SMB );

Where Discr needs to be your input table, PD0Base and PD_weighted columns with the pds and the Segmento= needs to be given a valid segment code (i.e. one in your table).

ari2495
Obsidian | Level 7
thanks, i'm going to try.
can i ask you, what is, in the where statement, --> where MOD_RATING_ALLA_DATA_RIF= "&segmento."; MOD_RATIN?G? is it a variable?
fja
Lapis Lazuli | Level 10 fja
Lapis Lazuli | Level 10

The WHERE statement filters / selects observations that meet a certain condition. In this case it filters any observation with a variable that contains the "segmento" argument of the macro.

fja
Lapis Lazuli | Level 10 fja
Lapis Lazuli | Level 10



@ari2495 wrote:

data AUC_Base;
set _smd_pd0base_imp _smd_pd0base_poe _smd_pd0base_pri _smd_pd0base_smb;
run;
data AUC_Weighted;
set _smd_pd_weighted_imp _smd_pd_weighted_poe _smd_pd_weighted_pri _smd_pd_weighted_smb;
run;

And these lines as well ... as the macro produces intermediate tables reflecting the arguments given to it.

 

Ready to join fellow brilliant minds for the SAS Hackathon?

Build your skills. Make connections. Enjoy creative freedom. Maybe change the world. Registration is now open through August 30th. Visit the SAS Hackathon homepage.

Register today!
Mastering the WHERE Clause in PROC SQL

SAS' Charu Shankar shares her PROC SQL expertise by showing you how to master the WHERE clause using real winter weather data.

Find more tutorials on the SAS Users YouTube channel.

Discussion stats
  • 8 replies
  • 495 views
  • 1 like
  • 2 in conversation