Die Option Fuzz bei Proc Format

Aus SAS-Wiki
Wechseln zu: Navigation, Suche

Von Tanja Petrowitsch aus: Hans-Peter Altenburg, Carina Ortseifen, Tanja Petrowitsch, Grischa Pfister, Wilfried Schollenberger: Tipps & Tricks für den leichteren Umgang mit der SAS Software, KSFE 2007

Eine oft gestellte Frage ist die nach der Häufigkeit einzelner Werte gruppiert nach bestimmten Kategorien. Die Werte werden meist aus vorhandenen Variablen berechnet, etwa durch Differenzbildung zweier Variablen. Die Kategorien werden durch eine Formatzuweisung gebildet.

Bei Dezimalzahlen führt dieses Vorgehen jedoch zu ‚unerwarteten’ Ergebnissen. Diese sind auf die unpräzise Darstellung von Dezimalwerten in SAS zurückzuführen. Z. B. ist die Differenz von 2.3-1.8 SAS-intern nicht 0.5, sondern 0.49999999.

Endet ein Formatintervall dann bei <0.5 und beginnt das nächste bei >= 0.5,

Proc Format;

  Value fabs 0.4 - < 0.5 = ' >=0.4 - <0.5 ' 
             0.5 - < 0.6 = ' >=0.5 - <0.6 ';

Run;

wird der Wert nicht wie erwartet zur 2. Kategorie gezählt, sondern zur ersten. Um die Abweichungen vom erwarteten Wert zu sehen, reicht bei diesem Beispiel die Darstellung mit dem Format Best32. aus. (Beispiele siehe Tabelle 1).

2 Tabellen.JPG

Abhilfe für die falsche Kategorisierung schafft hier die Option Fuzz der Prozedur Format. Der Faktor gibt an, um welchen Wert das Ende des Wertebereichs erweitert wird, mit dem der Wert noch eine Zuweisung findet. Der Default ist 1E-12 für numerische und 0 für Textformate. Wenn ein Wert sowohl in einen Eintrag (Wert oder Range) eines Formats ohne als auch mit Fuzz-Faktor fällt, so wird der Wert dem Format-Eintrag ohne Fuzz-Faktor zugewiesen. (Weitere Details sind in der SAS-Hilfe zu finden). Um eine korrekte Zählung der Werte zu erreichen, muss daher der Fuzz-Faktor entsprechend den Formatgrenzen angepasst werden. Da aber die interne Darstellung von Dezimalstellen nicht gerade sehr übersichtlich ist, kann es durchaus aufwendig sein, den geeigneten Faktor zu finden. Auch die Einteilung der Werte in Kategorien mittels Datenschritt schützt nicht vor der Fehlzuteilung dieser unpräzisen Werte. Abhilfe schafft da entweder die Fuzz-Funktion oder (besser) das Runden vor der Kategorisierung. Und sollte hier mal ein ‚echter’ Wert durch das Runden in der falschen Kategorie landen, dann weiß man wenigstens warum.