-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathNominal Dimensionality Reduction.step
More file actions
1 lines (1 loc) · 24 KB
/
Copy pathNominal Dimensionality Reduction.step
File metadata and controls
1 lines (1 loc) · 24 KB
1
{"creationTimeStamp":"2026-01-08T18:34:57.715091Z","createdBy":"sinsrn","modifiedTimeStamp":"2026-01-08T18:34:57.715091Z","modifiedBy":"sinsrn","id":"ba5b8054-4ce5-4e14-b73e-82e3d6bfe517","name":"Nominal Dimensionality Reduction.step","displayName":"Nominal Dimensionality Reduction.step","localDisplayName":"Nominal Dimensionality Reduction.step","links":[{"method":"GET","rel":"self","href":"/dataFlows/steps/ba5b8054-4ce5-4e14-b73e-82e3d6bfe517","uri":"/dataFlows/steps/ba5b8054-4ce5-4e14-b73e-82e3d6bfe517","type":"application/vnd.sas.data.flow.step"},{"method":"GET","rel":"alternate","href":"/dataFlows/steps/ba5b8054-4ce5-4e14-b73e-82e3d6bfe517","uri":"/dataFlows/steps/ba5b8054-4ce5-4e14-b73e-82e3d6bfe517","type":"application/vnd.sas.data.flow.step.summary"},{"method":"GET","rel":"up","href":"/dataFlows/steps","uri":"/dataFlows/steps","type":"application/vnd.sas.collection","itemType":"application/vnd.sas.data.flow.step.summary"},{"method":"PUT","rel":"update","href":"/dataFlows/steps/ba5b8054-4ce5-4e14-b73e-82e3d6bfe517","uri":"/dataFlows/steps/ba5b8054-4ce5-4e14-b73e-82e3d6bfe517","type":"application/vnd.sas.data.flow.step","responseType":"application/vnd.sas.data.flow.step"},{"method":"DELETE","rel":"delete","href":"/dataFlows/steps/ba5b8054-4ce5-4e14-b73e-82e3d6bfe517","uri":"/dataFlows/steps/ba5b8054-4ce5-4e14-b73e-82e3d6bfe517"},{"method":"POST","rel":"copy","href":"/dataFlows/steps/ba5b8054-4ce5-4e14-b73e-82e3d6bfe517/copy","uri":"/dataFlows/steps/ba5b8054-4ce5-4e14-b73e-82e3d6bfe517/copy","responseType":"application/vnd.sas.data.flow.step"},{"method":"GET","rel":"transferExport","href":"/dataFlows/steps/ba5b8054-4ce5-4e14-b73e-82e3d6bfe517","uri":"/dataFlows/steps/ba5b8054-4ce5-4e14-b73e-82e3d6bfe517","responseType":"application/vnd.sas.transfer.object"},{"method":"PUT","rel":"transferImportUpdate","href":"/dataFlows/steps/ba5b8054-4ce5-4e14-b73e-82e3d6bfe517","uri":"/dataFlows/steps/ba5b8054-4ce5-4e14-b73e-82e3d6bfe517","type":"application/vnd.sas.transfer.object","responseType":"application/vnd.sas.summary"}],"metadataVersion":1,"version":2,"type":"code","flowMetadata":{"inputPorts":[{"name":"input_table","displayName":"input_table","localDisplayName":"input_table","minEntries":1,"maxEntries":1,"defaultEntries":0,"type":"table"}],"outputPorts":[{"name":"output_table","displayName":"output_table","localDisplayName":"output_table","minEntries":1,"maxEntries":1,"defaultEntries":0,"type":"table"},{"name":"rstore_name","displayName":"rstore_name","localDisplayName":"rstore_name","minEntries":0,"maxEntries":1,"defaultEntries":0,"type":"table"}]},"ui":"{\"showPageContentOnly\": true, \"pages\": [{\"id\": \"params\", \"type\": \"page\", \"label\": \"Parameters\", \"children\": [{\"id\": \"section_input_params\", \"type\": \"section\", \"label\": \"Input Parameters\", \"open\": true, \"children\": [{\"id\": \"input_table\", \"type\": \"inputtable\", \"label\": \"Select input table:\", \"required\": true, \"placeholder\": \"\", \"visible\": \"\", \"filter\": false}, {\"id\": \"nominal_vars\", \"type\": \"columnselector\", \"label\": \"Select nominal variables:\", \"include\": null, \"order\": false, \"columntype\": \"a\", \"max\": null, \"min\": 1, \"visible\": \"\", \"table\": \"input_table\"}, {\"id\": \"other_vars\", \"type\": \"columnselector\", \"label\": \"Select other variables to copy:\", \"include\": null, \"order\": false, \"columntype\": \"a\", \"max\": null, \"min\": null, \"visible\": \"\", \"table\": \"input_table\"}, {\"id\": \"method\", \"type\": \"dropdown\", \"label\": \"Select method:\", \"items\": [{\"value\": \"MCA\", \"label\": \"Multiple Correspondence Analysis\"}, {\"value\": \"LPCA\", \"label\": \"Logistic Principal Component Analysis\"}], \"required\": true, \"placeholder\": \"\", \"visible\": \"\"}]}, {\"id\": \"section_output_spec\", \"type\": \"section\", \"label\": \"Output Specification\", \"open\": true, \"children\": [{\"id\": \"num_dimensions\", \"type\": \"numstepper\", \"label\": \"Select number of dimensions:\", \"required\": false, \"integer\": true, \"min\": 1, \"max\": null, \"stepsize\": 1}, {\"id\": \"prefix\", \"type\": \"textfield\", \"label\": \"Specify output prefix:\", \"placeholder\": \"rv_\", \"required\": false}, {\"id\": \"output_table\", \"type\": \"outputtable\", \"label\": \"Specify output table:\", \"required\": true, \"placeholder\": \"\", \"visible\": \"\", \"filter\": false}, {\"id\": \"rstore_name\", \"type\": \"outputtable\", \"label\": \"Specify RStore name:\", \"required\": false, \"placeholder\": \"\", \"visible\": \"\", \"filter\": false}]}]}, {\"id\": \"about\", \"type\": \"page\", \"label\": \"About\", \"children\": [{\"id\": \"section_about_intro\", \"type\": \"section\", \"label\": \"Nominal Dimensionality Reduction\", \"open\": true, \"visible\": \"\", \"children\": [{\"id\": \"section_about_intro_text\", \"type\": \"text\", \"text\": \"This custom step performs dimensionality reduction on nominal variables using the PROC NOMINALDR procedure. In addition to wrapping the main procedure call, this custom step adds runtime guards, helpful defaults and a small cleanup routine for macro variables.\\n\\nNominal variables may contain multiple levels and categories, which lead to a multiplicity of features (taking all possible combinations into account) in downstream machine learning and turn out to be computationally expensive. Also, some machine learning models support only interval variables. This step reduces features by applying a dimensionality reduction technique such as Multiple Correspondence Analysis (MCA) or Logistic Principal Component Analysis (LPCA).\", \"visible\": \"\"}, {\"id\": \"section_about_prerequisites\", \"type\": \"section\", \"label\": \"Prerequisites\", \"open\": false, \"visible\": \"\", \"children\": [{\"id\": \"section_about_prerequisites_text\", \"type\": \"text\", \"text\": \"1. SAS Viya offering or higher (i.e. includes Visual Data Mining and Machine Learning and SAS Studio) \\n2. SAS Viya Monthly version of 2025.05 or later (step developed and tested on SAS Viya monthly cadence of 2025.12)\", \"visible\": \"\"}]}, {\"id\": \"section_about_parameters\", \"type\": \"section\", \"label\": \"Parameters\", \"open\": false, \"visible\": \"\", \"children\": [{\"id\": \"section_about_parameters_input\", \"type\": \"section\", \"label\": \"Input Parameters\", \"open\": false, \"children\": [{\"id\": \"section_about_parameters_input_text\", \"type\": \"text\", \"text\": \"1. Input table(input port, required): connect an input dataset to the input port.\\n2. Select nominal variables (column selector, required): select one or more nominal variables to reduce. \\n3. Other variables to copy (column selector, optional): select any other variables to copy to the output table.\\n4. Method (list box, default MCA): select either MCA (for Multiple Correspondence Analysis) or LPCA (for Logistic Principal Component Analysis). \\n\", \"visible\": \"\"}]}, {\"id\": \"section_about_parameters_output\", \"type\": \"section\", \"label\": \"Output Specification\", \"open\": true, \"visible\": \"\", \"children\": [{\"id\": \"section_about_parameters_output_text\", \"type\": \"text\", \"text\": \"1. Number of dimensions (numeric stepper, optional): specify the number of dimensions to reduce to. \\n2. Output prefix (text field, optional): specify a prefix for the output variables. \\n3. Output table (output port, required): specify an output table connected to the output port. \\n4. RStore name (output port, required): specify a name for the RStore binary. \", \"visible\": \"\"}]}]}, {\"id\": \"section_about_references\", \"type\": \"section\", \"label\": \"References\", \"open\": true, \"children\": [{\"id\": \"about_ref_text\", \"type\": \"text\", \"text\": \"1. Technical Paper, Nominal Variables Dimension Reduction Using SAS\\u00ae, Yonggui Yan, SAS Institute: https://support.sas.com/content/dam/SAS/support/en/technical-papers/nominal-variables-dimension-reduction-using-sas.pdf\\n 2.Documentation, PROC NOMINALDR, SAS Institute: https://go.documentation.sas.com/doc/en/sasstudiocdc/default/pgmsascdc/casml/casml_nominaldr_syntax.htm\"}]}, {\"id\": \"section_about_version\", \"type\": \"section\", \"label\": \"About this step\", \"open\": true, \"children\": [{\"id\": \"about_version_text\", \"type\": \"text\", \"text\": \"Version: 1.0.3 (08JAN2026)\"}, {\"id\": \"about_contact_text\", \"type\": \"text\", \"text\": \"Contact: Sundaresh Sankaran (Sundaresh.sankaran@sas.com)\"}]}]}]}], \"syntaxversion\": \"1.3.0\", \"values\": {\"num_dimensions\": 8, \"prefix\": \"rv_\"}}","localUi":"{\"pages\":[{\"children\":[{\"children\":[{\"filter\":false,\"id\":\"input_table\",\"label\":\"Select input table:\",\"placeholder\":\"\",\"required\":true,\"type\":\"inputtable\",\"visible\":\"\"},{\"columntype\":\"a\",\"id\":\"nominal_vars\",\"include\":null,\"label\":\"Select nominal variables:\",\"max\":null,\"min\":1,\"order\":false,\"table\":\"input_table\",\"type\":\"columnselector\",\"visible\":\"\"},{\"columntype\":\"a\",\"id\":\"other_vars\",\"include\":null,\"label\":\"Select other variables to copy:\",\"max\":null,\"min\":null,\"order\":false,\"table\":\"input_table\",\"type\":\"columnselector\",\"visible\":\"\"},{\"id\":\"method\",\"items\":[{\"label\":\"Multiple Correspondence Analysis\",\"value\":\"MCA\"},{\"label\":\"Logistic Principal Component Analysis\",\"value\":\"LPCA\"}],\"label\":\"Select method:\",\"placeholder\":\"\",\"required\":true,\"type\":\"dropdown\",\"visible\":\"\"}],\"id\":\"section_input_params\",\"label\":\"Input Parameters\",\"open\":true,\"type\":\"section\"},{\"children\":[{\"id\":\"num_dimensions\",\"integer\":true,\"label\":\"Select number of dimensions:\",\"max\":null,\"min\":1,\"required\":false,\"stepsize\":1,\"type\":\"numstepper\"},{\"id\":\"prefix\",\"label\":\"Specify output prefix:\",\"placeholder\":\"rv_\",\"required\":false,\"type\":\"textfield\"},{\"filter\":false,\"id\":\"output_table\",\"label\":\"Specify output table:\",\"placeholder\":\"\",\"required\":true,\"type\":\"outputtable\",\"visible\":\"\"},{\"filter\":false,\"id\":\"rstore_name\",\"label\":\"Specify RStore name:\",\"placeholder\":\"\",\"required\":false,\"type\":\"outputtable\",\"visible\":\"\"}],\"id\":\"section_output_spec\",\"label\":\"Output Specification\",\"open\":true,\"type\":\"section\"}],\"id\":\"params\",\"label\":\"Parameters\",\"type\":\"page\"},{\"children\":[{\"children\":[{\"id\":\"section_about_intro_text\",\"text\":\"This custom step performs dimensionality reduction on nominal variables using the PROC NOMINALDR procedure. In addition to wrapping the main procedure call, this custom step adds runtime guards, helpful defaults and a small cleanup routine for macro variables.\\n\\nNominal variables may contain multiple levels and categories, which lead to a multiplicity of features (taking all possible combinations into account) in downstream machine learning and turn out to be computationally expensive. Also, some machine learning models support only interval variables. This step reduces features by applying a dimensionality reduction technique such as Multiple Correspondence Analysis (MCA) or Logistic Principal Component Analysis (LPCA).\",\"type\":\"text\",\"visible\":\"\"},{\"children\":[{\"id\":\"section_about_prerequisites_text\",\"text\":\"1. SAS Viya offering or higher (i.e. includes Visual Data Mining and Machine Learning and SAS Studio) \\n2. SAS Viya Monthly version of 2025.05 or later (step developed and tested on SAS Viya monthly cadence of 2025.12)\",\"type\":\"text\",\"visible\":\"\"}],\"id\":\"section_about_prerequisites\",\"label\":\"Prerequisites\",\"open\":false,\"type\":\"section\",\"visible\":\"\"},{\"children\":[{\"children\":[{\"id\":\"section_about_parameters_input_text\",\"text\":\"1. Input table(input port, required): connect an input dataset to the input port.\\n2. Select nominal variables (column selector, required): select one or more nominal variables to reduce. \\n3. Other variables to copy (column selector, optional): select any other variables to copy to the output table.\\n4. Method (list box, default MCA): select either MCA (for Multiple Correspondence Analysis) or LPCA (for Logistic Principal Component Analysis). \\n\",\"type\":\"text\",\"visible\":\"\"}],\"id\":\"section_about_parameters_input\",\"label\":\"Input Parameters\",\"open\":false,\"type\":\"section\"},{\"children\":[{\"id\":\"section_about_parameters_output_text\",\"text\":\"1. Number of dimensions (numeric stepper, optional): specify the number of dimensions to reduce to. \\n2. Output prefix (text field, optional): specify a prefix for the output variables. \\n3. Output table (output port, required): specify an output table connected to the output port. \\n4. RStore name (output port, required): specify a name for the RStore binary. \",\"type\":\"text\",\"visible\":\"\"}],\"id\":\"section_about_parameters_output\",\"label\":\"Output Specification\",\"open\":true,\"type\":\"section\",\"visible\":\"\"}],\"id\":\"section_about_parameters\",\"label\":\"Parameters\",\"open\":false,\"type\":\"section\",\"visible\":\"\"},{\"children\":[{\"id\":\"about_ref_text\",\"text\":\"1. Technical Paper, Nominal Variables Dimension Reduction Using SAS®, Yonggui Yan, SAS Institute: https://support.sas.com/content/dam/SAS/support/en/technical-papers/nominal-variables-dimension-reduction-using-sas.pdf\\n 2.Documentation, PROC NOMINALDR, SAS Institute: https://go.documentation.sas.com/doc/en/sasstudiocdc/default/pgmsascdc/casml/casml_nominaldr_syntax.htm\",\"type\":\"text\"}],\"id\":\"section_about_references\",\"label\":\"References\",\"open\":true,\"type\":\"section\"},{\"children\":[{\"id\":\"about_version_text\",\"text\":\"Version: 1.0.3 (08JAN2026)\",\"type\":\"text\"},{\"id\":\"about_contact_text\",\"text\":\"Contact: Sundaresh Sankaran (Sundaresh.sankaran@sas.com)\",\"type\":\"text\"}],\"id\":\"section_about_version\",\"label\":\"About this step\",\"open\":true,\"type\":\"section\"}],\"id\":\"section_about_intro\",\"label\":\"Nominal Dimensionality Reduction\",\"open\":true,\"type\":\"section\",\"visible\":\"\"}],\"id\":\"about\",\"label\":\"About\",\"type\":\"page\"}],\"showPageContentOnly\":true,\"syntaxversion\":\"1.3.0\",\"values\":{\"num_dimensions\":8,\"prefix\":\"rv_\"}}","templates":{"SAS":"/* SAS templated code goes here */\n\n/* -------------------------------------------------------------------------------------------*\n Nominal Dimensionality Reduction - Version 1.0.3\n\n This program uses the SAS procedure NOMINALDR to perform dimensionality reduction on\n nominal variables in a dataset. It supports two methods: Multiple Correspondence Analysis (MCA)\n and Logistic Principal Component Analysis (LPCA). The program also allows for the inclusion of\n additional variables and saving the results in a specified output table or rstore.\n\n Author: Sundaresh Sankaran (original)\n Refactor: Polished after AI-assisted automation\n Version: 1.0.3 (08JAN2026)\n*-------------------------------------------------------------------------------------------- */\n\n%put NOTE: Starting Nominal Dimensionality Reduction program...;\n\n/* -------------------------------------------------------------------------------------------*\n User Parameters\n \n The parameters below allow customization of the aggregation operation,\n including the input file path, aggregation functions, columns to aggregate,\n grouping columns, and output table.\n \n Users can modify these parameters to suit their specific data and analysis needs.\n* -------------------------------------------------------------------------------------------- */\n\n/* input_table takes in the name of the input data set from an input port */\n/* %let input_table=SASHELP.CARS; */\n\n/* nominal_vars takes in the list of nominal variables to be reduced through a column selector */\n/* %let nominal_vars=Make Model Type Origin DriveTrain; */\n\n/* other_vars takes in the list of other variables to copy to output through a column selector */\n/* %let other_vars=MSRP Invoice EngineSize Cylinders Horsepower MPG_City MPG_Highway Weight Wheelbase Length; */\n\n/* num_dimensions takes in the number of dimensions specified for the analysis */\n/* %let num_dimensions=8; */\n\n/* method takes in the method to be used for the analysis, either MCA or LPCA*/\n/* %let method=MCA; */\n\n/* prefix takes in the prefix for the output variables */\n/* %let prefix=mca_rv_; */\n\n/* output_table takes in the name of the output data set with reduced dimensions */\n/* %let output_table=WORK.NEWCARS; */\n\n/* rstore_name takes in the name of the RStore file to save the model binary. */\n/* %let rstore_name=MCASTORE; */\n\n/* -----------------------------------------------------------------------------------------*\n Macros\n\n The macros below follow the structural conventions used in SAS programs for custom step:\n\n - small utility macros for runtime triggers and error flags\n - a focused macro for execution of the main step\n*------------------------------------------------------------------------------------------*/\n\n/* -------------------------------------------------------------------------------------------* \n Macro to initialize a run-time trigger global macro variable to run SAS Studio Custom Steps. \n A value of 1 (the default) enables this custom step to run. A value of 0 (provided by \n upstream code) sets this to disabled.\n\n Input:\n 1. triggerName: The name of the runtime trigger you wish to create. Ensure you provide a \n unique value to this parameter since it will be declared as a global variable.\n\n Output:\n 2. &triggerName : A global variable which takes the name provided to triggerName.\n*-------------------------------------------------------------------------------------------- */;\n\n%macro _create_runtime_trigger(triggerName);\n %global &triggerName.;\n %if %sysevalf(%superq(&triggerName.)=, boolean) %then %do;\n %let &triggerName.=1;\n %end;\n%mend _create_runtime_trigger;\n\n/* -----------------------------------------------------------------------------------------* \n Macro to create an error flag for capture during code execution.\n\n Input:\n 1. errorFlagName: The name of the error flag you wish to create. Ensure you provide a \n unique value to this parameter since it will be declared as a global variable.\n 2. errorFlagDesc: A description to add to the error flag.\n\n Output:\n 1. &errorFlagName : A global variable which takes the name provided to errorFlagName.\n 2. &errorFlagDesc : A global variable which takes the name provided to errorFlagDesc.\n*------------------------------------------------------------------------------------------ */\n\n%macro _create_error_flag(errorFlagName, errorFlagDesc);\n %global &errorFlagName.;\n %let &errorFlagName.=0;\n %global &errorFlagDesc.;\n%mend _create_error_flag;\n\n/* -----------------------------------------------------------------------------------------* \n Macro to safely delete a macro symbol if it exists.\n\n Input:\n 1. sym: The name of the macro symbol to delete.\n*------------------------------------------------------------------------------------------ */\n%macro _safe_symdel(sym);\n %if %symexist(&sym) %then %do; %symdel &sym; %end;\n%mend _safe_symdel;\n\n/*-----------------------------------------------------------------------------------------*\n EXECUTION CODE MACRO \n\n _ndr prefix stands for Nominal Dimensionality Reduction. This macro contains the main \n logic for the Nominal Dimensionality Reduction step. It includes validation, default \n settings, and the execution of the main step.\n*------------------------------------------------------------------------------------------*/\n%macro _ndr_execution_code;\n\n/* Initialize runtime trigger and error flags */\n %_create_error_flag(_ndr_error_flag, _ndr_error_desc);\n\n %if &_ndr_error_flag. = 0 %then %do;\n %if \"%sysfunc(symexist(rstore_name))\"=\"0\" %then %do; \n %let rstore_name_name_base=_TEMP_RSTORE; \n %put NOTE: rstore_name not provided, defaulting to _TEMP_RSTORE.; \n %end;\n %end;\n\n %if &_ndr_error_flag. = 0 %then %do;\n %if %sysevalf(%superq(input_table)=, boolean) %then %do; \n %let _ndr_error_flag=1; \n %let _ndr_error_desc=Input table is required.; \n %put ERROR: &_ndr_error_desc.; \n %end;\n %end;\n %if &_ndr_error_flag. = 0 %then %do;\n %if %sysevalf(%superq(nominal_vars)=, boolean) %then %do; \n %let _ndr_error_flag=1; \n %let _ndr_error_desc=At least one nominal variable is required.; \n %put ERROR: &_ndr_error_desc.; \n %end;\n %end;\n %if &_ndr_error_flag. = 0 %then %do;\n %if %sysevalf(%superq(num_dimensions)=, boolean) %then %do; \n %let num_dimensions=8; \n %put NOTE: num_dimensions not provided, defaulting to 8.; \n %end;\n %end;\n %if &_ndr_error_flag. = 0 %then %do;\n proc NOMINALDR data=&input_table. dimension=&num_dimensions. method=%upcase(&method.) prefix=&prefix.;\n input &nominal_vars. / level=nominal;\n %if %sysevalf(%superq(other_vars)=, boolean) %then %do;output out=&output_table.; %end; %else %do; output out=&output_table. copyVars=(&other_vars.); %end;\n savestate RSTORE=&rstore_name_name_base.; \n run;\n %end;\n %if &_ndr_error_flag. = 0 %then %do;\n %if \"%sysfunc(symexist(rstore_name))\"=\"0\" %then %do;\n %put NOTE: rstore_name not provided, no RStore file will be saved.; \n proc datasets lib = _SASUSR_ nolist;\n delete &rstore_name_name_base.;\n run;\n proc datasets lib = WORK nolist;\n delete &rstore_name_name_base.;\n run;\n %end;\n %else %if \"&rstore_name.\"=\"\" %then %do; \n %put NOTE: rstore_name not provided, no RStore file will be saved.; \n proc datasets lib = _SASUSR_ nolist;\n delete &rstore_name_name_base.;\n run;\n proc datasets lib = WORK nolist;\n delete &rstore_name_name_base.;\n run;\n %end;\n %else %do;\n data &rstore_name.;\n set _SASUSR_.&rstore_name_name_base.;\n run;\n %end;\n %end;\n\n%mend _ndr_execution_code;\n\n/*-----------------------------------------------------------------------------------------*\n END MACROS\n*------------------------------------------------------------------------------------------*/\n/*-----------------------------------------------------------------------------------------*\n EXECUTION CODE\n*------------------------------------------------------------------------------------------*/\n \n/*-----------------------------------------------------------------------------------------*\n Create Runtime Trigger\n*------------------------------------------------------------------------------------------*/\n\n%_create_runtime_trigger(_ndr_run_trigger);\n%put NOTE: Run trigger is &_ndr_run_trigger.;\n\n/*-----------------------------------------------------------------------------------------*\n Execute \n*------------------------------------------------------------------------------------------*/\n/* Basic validation and defaults */\n%if &_ndr_run_trigger. = 1 %then %do;\n %_ndr_execution_code;\n%end;\n%else %do;\n %put NOTE: This step has been disabled by runtime trigger.;\n%end;\n\n%put NOTE: Final summary;\n%put NOTE: Status of error flag - &_ndr_error_flag. ;\n%put &_ndr_error_desc.;\n%put NOTE: Error desc - &_ndr_error_desc. ;\n\n/*-----------------------------------------------------------------------------------------*\n END EXECUTION CODE\n*------------------------------------------------------------------------------------------*/\n/*-----------------------------------------------------------------------------------------*\n Clean up existing macro variables and macro definitions.\n*------------------------------------------------------------------------------------------*/\n\n\n\n%put NOTE: Nominal Dimensionality Reduction program completed.;\n\n%_safe_symdel(_ndr_run_trigger);\n\n%sysmacdelete _create_runtime_trigger;\n%sysmacdelete _create_error_flag;\n\n%_safe_symdel(_ndr_error_flag);\n%_safe_symdel(_ndr_error_desc);\n%sysmacdelete _safe_symdel;"}}