Berechnung von Tabelleninhalten

<< 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.


CalculateColumn

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).


ColumnSummary

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.

ZeroMissing, DashMissing

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.


UseVisibleDigitsOnly

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.


PostProcess

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;


PostReplace

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 : "-" = "";