macro SAS9

Fehlerbehebung bei einem Makro für Häufigkeitstabellen

Simon 20/05/2021 1 views

Die Automatisierung wiederkehrender Aufgaben ist eine der großen Stärken von SAS©, insbesondere bei der Verarbeitung großer Umfragen ("large scale surveys"). Das Übergeben von Parametern — wie Beschriftungen (Labels) oder Formaten — innerhalb eines Makros ist jedoch eine häufige Ursache für Syntaxfehler.

Note :
Das Bedürfnis: PROC FREQ mit Metadaten automatisieren
Der Benutzer möchte ein Makro %f_freq zur Generierung von Häufigkeitstabellen erstellen. Seine Anforderungen sind präzise:

Die Ausgabe muss eine Datentabelle sein (OUT=).

Die Variable muss formatiert sein (Wertegruppierung).

Der Variablen in der Ausgabetabelle muss ein spezifisches (oft langes) Label zugewiesen werden, das zuvor über ein %LET definiert wurde.

Der problematische Code:
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 :
Der Fehler: Die Auflösung von Makrovariablen (&)
Wie die Antwort im Forum hervorgehoben hat, liegt der Fehler nicht in der Makrodefinition, sondern in ihrem Aufruf.

Der Benutzer hat geschrieben: %f_freq(Q1, Q1_w., Q1_label);

Das Problem: SAS© interpretiert den dritten Parameter buchstäblich als den Text "Q1_label". Konsequenz: In der Prozedur versucht SAS©, label Q1 = Q1_label; auszuführen, was den Text "Q1_label" als Beschriftung zuweist, anstatt den in der Variablen enthaltenen Text (den "Texte très long...").

Die Lösung: Es muss das Zeichen & (Ampersand) verwendet werden, um SAS© anzuweisen, die Variable aufzulösen, bevor sie an das Makro gesendet wird.
1/* Appel corrigé */
2%f_freq(Q1, Q1_w., &Q1_label);
3 

Der Einfluss von Formaten und Labels auf PROC FREQ

Der Experte, der geantwortet hat, weist auf einen interessanten technischen Punkt hin: "Ich denke, dass das Format und das Label für die Anzeige verwendet werden... Ich glaube nicht, dass sie die Aggregation beeinflussen."

Es ist wichtig, dieses Verhalten in SAS© zu klären:

  1. Formate (FORMAT): Sie beeinflussen die Aggregation. Wenn Sie ein Format anwenden, das Werte gruppiert (z. B. 1, 2, 3 in "Klein" umwandelt), berechnet PROC FREQ die Häufigkeit für "Klein". Dies ist wesentlich für die spontane Rekodierung.

  2. Labels (LABEL): Sie beeinflussen die Berechnung nicht, sind aber entscheidend für Metadaten. Die Anweisung LABEL innerhalb der Prozedur ermöglicht es, die Beschreibung der Variablen in der Ausgabetabelle (OUT=) zu speichern.

Note :
Bewährte Methoden zur Fehlerbehebung
Um solche Verwechslungen zwischen dem Namen einer Variablen und ihrem Inhalt zu vermeiden, hier zwei Tipps aus der Diskussion:

Verwenden Sie %PUT: Bevor Sie eine komplexe Prozedur starten, zeigen Sie die Werte im Log an, um zu überprüfen, was das Makro wirklich empfängt.
1%macro f_freq(var, var_w, var_label);
2 %put NOTE: La variable est &var;
3 %put NOTE: Le label reçu est &var_label;
4 /* ... reste du code ... */
5%mend;
Vorsicht bei Anführungszeichen: Wenn Ihr Label bereits Anführungszeichen enthält (wie in %let Q1_label='...' definiert), stellen Sie sicher, dass Sie in der Anweisung label &var=&var_label; keine weiteren hinzufügen.

Das Schreiben von Makros erfordert besondere Sorgfalt bei der Gültigkeit von Variablen. Denken Sie immer daran: Wenn Sie den Inhalt einer durch %LET definierten Variablen übergeben möchten, müssen Sie beim Aufruf unbedingt das Präfix & verwenden.

References & Docs