<< Click to Display Table of Contents >> Navigation: Datenmodifikation > Berechnung > Berechnung von Tabelleninhalten |
Die Inhalte bestehender Kreuztabellen können mit folgenden Funktionen bearbeitet werden:
•CALCULATECOLUMN: Berechnung neuer Tabellenspalten aus beliebigen, in einer Kreuztabelle abgebildeten Tabellenspalten unter spezifischen Bedingungen
•COLUMNSUMMARY: Berechnung neuer Tabellenspalten aus definierten, in einer Kreuztabelle abgebildeten Tabellenspalten, mit ZEROMISSING und DASHMISSING als Einstellungenmöglichkeiten zur Behandlung leerer Zellen
•USEVISIBLEDIGITSONLY: Einstellungsmöglichkeit für CALCULATECOLUMN und COLUMNSUMMARY Rechnung mit gerundeten Daten
•POSTPROCESS: arithmetische Neuberechnung angesprochener CELLELEMENTs in Verbindung mit IF- oder COMPUTE-Statement
•POSTREPLACE: Textersatz in angesprochenen CELLELEMENTs.
In einem Beispiel wird die kombinierte Anwendung von POSTPROCESS und POSTREPLACE gezeigt.
Die Statements CALCULATECOLUMN, COLUMNSUMMARY, POSTPROCSS und POSTREPLACE beziehen sich immer auf die vorangehend definierte Tabelle.
Mit CALCULATECOLUMN können auf Grundlage von in Kreuztabellen abgebildeteten Tabellenspalten die Inhalte neuer Tabellenspalten berechnet werden.
Syntax:
CALCULATECOLUMN <Zielspalte> [ FORMAT <format> ]
[ FOREGROUND <rules> ] [ BACKGROUND <rules> ]
= <arithmetischer Spaltenausdruck>;
<Zielspalte> ::= <varno> <code> >
<rules> ::= ( { <rule> }*n )
<rule> ::= [ GE | GT ] <number1> [ LT | LE ] <number2> : <color>
Den Rechenresultaten können (ergebnisunabhängig) ein Format sowie (ergebnisabhängig) eine Schrift- und Hintergrundfarben zugewiesen werden. Für FOREGROUND und BACKGROUND, siehe Bedingte Formatierungen.
Um z.B. in die Spalte Code 3 der 2. Variablen im Kopf die Differenz der Spalten zu Code 1 und 2 der ersten Variablen zu berechnen, muss man formulieren:
CALCULATECOLUMN < 2 3 > = < 1 2 > - < 1 1 >;
Man kann beliebig komplexe Audrücke bilden; für die Wurzel aus der Differenz in Spalte 4.5 kann man z.B. schreiben:
CALCULATECOLUMN <2 4.5 > FORMAT "#,##" = EXP( LN( < 1 2 > - < 1 1 > ) / 2 );
Das ist die Exponentialfunktion von dem Logarithmus von x, dividert durch 2. Dieser Ausdruck bedeutet soviel wie x hoch 1/2, und das ist (fast) dasselbe wie die zweite Wurzel. Dieser Ausdruck ist nur für Werte > 0.0 definiert. Bei negativen Argumenten wird der Strich "-" für MISSING ausgegeben.
Übrigens: Die 4.5 für den Code im Beispiel ist kein Tippfehler, hierbei handelt es sich nur um ein selten genutztes Feature von GESStabs: die Codes, die Labels zugeordnet werden, müssen keine ganzen Zahlen sein.
Will man die vorgefundene Differenz als Prozentsatz von der ersten Spalte ausgeben, kann man schreiben:
CALCULATECOLUMN < 2 6 > = ( < 1 2 > - < 1 1 > ) / < 1 1 > * 100.0;
CALCULATECOLUMN kann auch mit Zahlenwerten rechnen, die sich aus Strings ergeben, die mittels eines HISTORY-Statements einer Zelle zugewiesen wurden. Wenn sich der String in eine Zahl wandeln lässt, ist er ein gültiges Argument. Kommata und Punkte werden immer als Dezimaltrenner erkannt.
Die Resultate können, ebenso wie die Ergebnisse von Berechnungen mit COLUMNSUMMARY, für die Weiterverwendung mit GESS ChartFactory weitergegeben werden.
Bedingungen zur Anwendung von CalculateColumn
GESStabs ist schließlich kein Tabellenkalkulationspogramm.
•Die Zielspalte ist in der Tabelle rechts von den Ausgangsspalten.
•Die Tabelle hat nur ein elementares CELLELEMENT: entweder z.B. COLUMNPERCENT oder ABSOLUTE, aber nicht beides, und auch kein zusammengesetztes CELLELEMENT wie ABSCOLPERCENT. Es darf im Ergebnis also nur eine einzige Zahl in der Zelle stehen.
•Dezimalzahlen in den Zellen müssen mit dem Dezimalpunkt versehen sein, Komma geht nicht.
•Diesen zusätzlichen Spalten ist keine sinnvolle Basis oder Total zugeordnet; die Zellen sind formal leer, man sollte die Tabelle also ggf. ohne ABSROW oder TOTALROW (siehe Rahmenelemente) produzieren.
•Entsprechend des vorhergehenden Punktes sollte GLOBALCOLMINIMUM auf Null stehen, oder man muss anders dafür sorgen, dass die zu berechnende Spalte nicht als leer unterdrückt wird.
•Berechnete Spalten können ihrerseits nicht als Ausgangsspalten für weitere CALCULATECOLUMN-Berechnungen dienen (dies ist aber mittels COLUMNSUMMARY möglich).
Zusätzlich zur Berechnung von Spalten mittels CALCULATECOLUMN gibt es hiermit eine weitere Funktion, um in Tabellen weitere Spalten aus bereits bestehenden Spalten zu errechnen. Der Unterschied ist, dass für COLUMNSUMMARY gezielt Quellspalten als Grundlage der Berechnung definiert werden müssen.
Syntax:
COLUMNSUMMARY <zielspalte> [ format "#,#..." ]
= <function> [ <option>( {<quellspalte>}*n );
<zielspalte> ::= < varno code >
<quellspalte> ::= < varno code >
<function> ::= [ MEAN | SUM | MIN | MAX ]
<option> ::= [ ZEROMISSING | DASHMISSING ]
Über beliebige Quellspalten kann man als Summary folgende statistische Kennwerte ausgeben:
MEAN |
Mittelwert |
---|---|
SUM |
Summe |
MIN |
Minimalwert |
MAX |
Maximalwert |
Außerdem können die Resultate sowohl mit CALCULATECOLUMN als auch mit COLUMNSUMMARY-Statements weiterverarbeitet werden.
Beispiel:
COLUMNSUMMARY <1 4> FORMAT "#,#" = MEAN ( <1 1> <1 2> <1 3> );
COLUMNSUMMARY <1 5> FORMAT "#,#" = SUM ( <1 1> <1 2> <1 3> );
COLUMNSUMMARY <1 6> FORMAT "#,#" = MIN ( <1 1> <1 2> <1 3> );
COLUMNSUMMARY <1 7> FORMAT "#,#" = MAX ( <1 1> <1 2> <1 3> );
Man könnte die so berechneten Spalten auch mit CALCULATECOLUMN weiter fortsetzen, zum Beispiel:
CALCULATECOLUMN <1 8> FORMAT "#,#" = <1 7> - <1 6>;
CALCULATECOLUMN <1 9> FORMAT "#,#%" = <1 8> / <1 4> * 100;
CALCULATECOLUMN <1 10> FORMAT "#,#%" = <1 8> / <1 5> * 100;
CALCULATECOLUMN-Ergebnisse können umgekehrt auch als Eingabe für COLUMNSUMMARY dienen, beispielsweise:
COLUMNSUMMARY <1 11> FORMAT "#,#" = SUM ( <1 9> <1 10> );
Die Resultate können ebenso wie die Ergebnisse von Berechnungen mit CALCULATECOLUMN für die Weiterverwendung mit GESS ChartFactory weitergegeben werden.
Mit den Optionen ZEROMISSING und DASHMISSING kann gesteuert werden, ob leere Zellen in die Berechnung eingehen oder ausgeschlossen werden sollen.
Syntax:
DASHMISSING = <char>;
ZEROMISSING = <char>;
Mit DASHMISSING werden Zellen, die mittels '-' als leer gekennzeichnet sind, von den Berechnungen ausgeschlossen. Hier gibt es keine Automatik, weil es z.B. bei der Berechnung eines Mittelwerts über Prozentwerte sinnvoll sein kann, diese Zellen als 0 in die Berechnung einfließen zu lassen. Bei Prozentwerten in Tabellen wird mit '-' oft eine Zellenbesetzung mit Null signalisiert. Bei einem MEAN über MEAN steht das '-' hingegen meist für einen nicht berechenbaren Wert. Da der COLUMNSUMMARY-Operator keine Kenntnis über die Natur der Zahlen hat, muss es hier eine Steuerungsmöglichkeit im Script geben.
Der Vollständigkeit halber kann man mittels ZEROMISSING auch Zellen ausschließen, in denen eine numerische Null steht.
Beide Optionen werden wohl am häufigsten bei MEAN oder MIN benötigt.
Bei SUM ist es ja relativ gleichgültig, ob eine Null addiert wird oder nicht.
Einstellungsmöglichkeit für CALCULATECOLUMN und COLUMNSUMMARY.
Syntax:
USEVISIBLEDIGITSNONLY = [ YES | NO ];
Voreinstellung: NO
Bei den Berechnungen mit CALCULATECOLUMN und COLUMNSUMMARY muss man eine Entscheidung treffen: sollen die beim Rundungsvorgang abgetrennten Stellen in die Berechnung einfließen oder nicht. Numerisch ist es exakter, wenn sie, wie im Default, einfließen. Daraus kann aber ein Wert entstehen, der beim händischen arithmetischen Nachverfolgen nicht plausibel erscheint.
Syntax:
POSTPROCESS <Cellelement> : [ IF-Statement | COMPUTE-Statement ];
Mit POSTPROCESS können numerische Ergebnisse für alle CELLELEMENTs vor der Wandlung in den darzustellenden String arithmetisch neuberechnet werden. Im IF- Statement bzw. COMPUTE-Statement hinter dem Doppelpunkt sind folgende (virtuelle) Variablen ansprechbar:
Variable |
Beschreibung |
---|---|
SELF |
numerischer Wert des angesprochenen CELLELEMENTS, z.B. der MEAN |
CellAbs |
Summe der Gewichte in der aktuellen Zelle |
CellPhys |
absolute Zahl der in diese Zelle eingehenden Fälle |
XAbs |
Summe der Gewichte in der zugehörigen Framecell auf der X-Achse |
YAbs |
Summe der Gewichte in der zugehörigen Framecell auf der Y-Achse |
TtlAbs |
Summe der Gewichte aller Fälle, die in die (sub-)Tabelle eingehen (Total) |
XVarNo |
Zähler der Variablen in der X-Achse der Tabelle |
YVarNo |
Zähler der Variablen in der Y-Achse der Tabelle |
XCode |
Code der Spalte (in der X-Achse) |
YCode |
Code der Zeile (in der Y-Achse) |
StatAbs |
Summe der Gewichte der Fälle, die in eine Statistik eingehen, z.B. in einen MEAN |
StatPhys |
absolute Zahl der Fälle, die in eine Statistik eingehen, z.B. in einen MEAN |
XPhys |
absolute Zahl der Fälle, in der zugehörigen Rahhmenzelle auf der X-Achse |
YPhys |
absolute Zahl der Fälle in der zugehörigen Rahmenzelle auf der Y-Achse |
Den neu berechneten Wert muss man der Variablen SELF zuweisen, der alte String wird überschrieben und durch das neue Ergebnis ersetzt. Zuweisungen an alle anderen virtuellen Variablen wie z.b. CellAbs bleiben wirkungslos.
Beispiele:
Die Mittelwerte bei Zellenbesetzung <= 5 sollen unterdrückt werden:
PRINTSUPPRESSVALUE = -11;
POSTPROCESS MEAN : IF CellAbs LE 5 THEN self = -11;
Die Mittelwerte bei Zellenbesetzung <= 5 bei der 2. und der 4. Variable im Kopf sollen unterdrückt werden:
PRINTSUPPRESSVALUE = -11;
POSTPROCESS MEAN : IF YVarNo IN [ 2 4 ] AND CellAbs LE 5 THEN self = -11;
Ein Mittelwert soll von Stunden in Tage und Stunden umgerechnet werden:
POSTPROCESS MEAN : COMPUTE self = self DIV 24 + ( self MOD 24 ) / 100;
Syntax:
POSTREPLACE <cellelement> : <text1> = <text2> [ IF <text3> ] ;
In der Tabelle werden alle Ausgabezeilen zu dem genannten CELLELEMENT darauf durchsucht, ob "<text1>" in der Ausgabe enthalten ist. Ist das der Fall, wird dieser Text durch "<text2>" ersetzt.
Der Suchtext "<text1>" kann "?" als Wildchar enthalten. Man kann diese Ersetzung mit einer zusätzlichen Bedingung, dass <text3> ebenfalls enthalten sein muss, versehen.
Kombiniertes Anwendungsbeispiel
In einer Tabelle sollen COLUMNPERCENT dargestellt werden. In den Spalten aber, in denen die Basis einen Schwellwert unterschreitet, soll stattdessen die absolute Zellenbesetzung ausgegeben werden, und diese soll mit "N=" gekennzeichnet werden. Dies Problem wird durch eine Kombination aus POSTPROCESS und POSTREPLACE gelöst:
FORMAT COLUMNPERCENT = '#';
CELLELEMENTS = COLUMNPERCENT;
TABLE = #K BY A12;
POSTPROCESS COLUMNPERCENT : IF XABS LT 150 THEN SELF = -CELLABS;
POSTREPLACE COLUMNPERCENT : "-" = "N=";
Das Ganze ist natürlich "getrickst". POSTPROCESS ist eine arithmetische Anweisung und kann nur Zahlenwerte beeinflussen. Die arithmetische Eigenschaft "negativ" übersetzt sich allerdings in einen Textbestandteil, ein "-" vor der Zahl. Dies kann man dann für eine Textersetzung nutzen.
Die Aufgabe war einfach, da für COLUMNPERCENT ein Darstellungsformat ohne Dezimalzeichen verlangt war. Etwas umfangreicher wird es, wenn ein komplexeres Format gefordert ist:
FORMAT COLUMNPERCENT = '#,#%';
CELLELEMENTS = COLUMNPERCENT;
TABLE = #K BY A12;
POSTPROCESS COLUMNPERCENT : IF XABS LT 150 THEN SELF = -CELLABS;
POSTREPLACE COLUMNPERCENT : ",?%" = "" IF '-';
POSTREPLACE COLUMNPERCENT : "-" = "N=";
POSTPROCESS ist unverändert. Mehrere POSTREPLACE werden in der Reihenfolge nacheinander ausgeführt, wie sie in Script stehen. Das erste POSTREPLACE lässt das Dezimalzeichen und %-Zeichen verschwinden, unter der Bedingung, dass ein Minuszeichen gefunden wurde. Das zweite POSTREPLACE ersetzt wie gehabt das "-" durch "N=".
Nächste Stufe: wenn zusätzlich die Ausgabe eines Signifikanztests gefordert ist:
CELLELEMENTS = COLPERCANDSIGN;
SUPPRESSIFLESS COLPERCT FRAMECELL X ABSOLUTE = 150;
ZERODASHCHAR = ' ';
TABLE = #K BY A12;
POSTPROCESS COLUMNPERCENT : IF XABS LT 150 THEN SELF = -CELLABS;
POSTREPLACE COLUMNPERCENT : ".?%" = "" IF '-';
POSTREPLACE COLUMNPERCENT : "-" = "N=";
Hierzu muss man wissen: COLPERCANDSIGN ist eine Textkombination aus COLUMNPERCENT und COLPERCT. Wenn in den Spalten mit n<150 nur die einfache Häufigkeit als vorzeichenlose und nachkommafreie Zahl stehen soll, dann müssen wir zunächst die Ausgabe des Signifikanztests in den betreffenden Spalten unterdrücken. Dazu braucht es ein SUPPRESSIFLESS für den verwendeten Signifikanztest, in diesem Fall also COLPERCT. Wenn ein CELLELEMENT mit SUPPRESSIFLESS unterdrückt wird, steht an der Stelle i.d.R. ein '-'. Das ist der ZERODASHCHAR, der hier dadurch unsichtbar wird, dass wir ihn als Blank darstellen. Der Rest ist bekannt: POSTPROCESS und 2x POSTREPLACE, wie oben.
Alternativ zum "Unsichtbar Machen" durch ein Blank im ZERODASHCHAR könnte man diesen natürlich auch durch ein weiteres POSTREPLACE entfernen:
POSTREPLACE COLPERCT : "-" = "";