macro SAS9

Depurar una Macro para Tablas de Frecuencia

Simon 20/05/2021 0 vistas

La automatización de tareas repetitivas es una de las grandes fortalezas de SAS©, especialmente para procesar grandes encuestas ("large scale surveys"). Sin embargo, el paso de parámetros — como etiquetas (labels) o formatos — dentro de una macro es una fuente frecuente de errores sintácticos.

Note :
La Necesidad: Automatizar PROC FREQ con metadatos
El usuario desea crear una macro %f_freq para generar tablas de frecuencia. Sus restricciones son precisas:

La salida debe ser una tabla de datos (OUT=).

La variable debe estar formateada (agrupación de valores).

Se debe asignar una etiqueta específica (a menudo larga) a la variable en la tabla de salida, definida previamente a través de un %LET.

El código problemático:
1%let Q1_label='Texte très long pour la question 1...';
2 
3%macro f_freq(var, var_w, var_label);
4 PROC FREQ DATA=clean_data order=freq;
5 TABLE &var / out=freqout.freq_&var;
6 FORMAT &var &var_w;
7 label &var=&var_label; /* Assigne le label */
8 RUN;
9%mend;
10 
11/* L'appel qui ne fonctionne pas comme prévu */
12%f_freq(Q1, Q1_w., Q1_label);
Note :
El Error: La resolución de variables macro (&)
Como señaló la respuesta en el foro, el error no se encuentra en la definición de la macro, sino en su llamada.

El usuario escribió: %f_freq(Q1, Q1_w., Q1_label);

El problema: SAS© interpreta el tercer parámetro literalmente como el texto "Q1_label". Consecuencia: En el procedimiento, SAS© intenta ejecutar label Q1 = Q1_label;, lo que asigna el texto "Q1_label" como etiqueta, en lugar del texto contenido en la variable (el "Texte très long...").

La solución: Se debe usar el signo & (ampersand) para indicarle a SAS© que resuelva la variable antes de enviarla a la macro.
1/* Appel corrigé */
2%f_freq(Q1, Q1_w., &Q1_label);
3 

El impacto de los Formatos y Etiquetas en PROC FREQ

El experto que respondió plantea un punto técnico interesante: "Creo que el formato y la etiqueta se usan para la visualización... No creo que afecten la agregación."

Es importante aclarar este comportamiento en SAS©:

  1. Los Formatos (FORMAT) : Estos afectan la agregación. Si aplica un formato que agrupa los valores (por ejemplo, transformar 1, 2, 3 en "Pequeño"), PROC FREQ calculará la frecuencia para "Pequeño". Esto es esencial para la recodificación al vuelo.

  2. Las Etiquetas (LABEL) : No afectan el cálculo, pero son cruciales para los metadatos. La instrucción LABEL dentro del procedimiento permite almacenar la descripción de la variable en la tabla de salida (OUT=).

Note :
Buenas prácticas de depuración
Para evitar este tipo de confusión entre el nombre de una variable y su contenido, aquí hay dos consejos extraídos de la discusión:

Usar %PUT: Antes de iniciar un procedimiento complejo, muestre los valores en el registro (Log) para verificar lo que realmente recibe la macro.
1%macro f_freq(var, var_w, var_label);
2 %put NOTE: La variable es &var;
3 %put NOTE: Le label reçu est &var_label;
4 /* ... reste du code ... */
5%mend;
Atención a las comillas: Si su etiqueta ya contiene comillas (como se define en %let Q1_label='...'), asegúrese de no agregar más en la instrucción label &var=&var_label;.

La escritura de macros requiere un rigor particular sobre el alcance de las variables. Recuerde siempre: si desea pasar el contenido de una variable definida por un %LET, debe utilizar imperativamente el prefijo & al llamarla.

Referencias y Documentos