Variablenfamilien

<< Click to Display Table of Contents >>

Navigation:  Datenmodifikation > Variablen und Codes > Gruppierungen >

Variablenfamilien

Eine Variablen-Familie ist eine Gruppe von Variablen, die eine gemeinsame Ausprägungsmenge haben, z.B. die erste, zweite und dritte Nennung auf eine Frage. Man kann diese Variablen zu einer VARFAMILY zusammenfassen, und diese dann anstelle der Einzelvariablen auswerten.

Intern sind VARFAMILYs (oder: FamilyVars) eine Liste von atomaren Variablen, die parallel angesprochen werden können (MultiQ). Die Texte, Vartitle und Labels der FamilyVar werden an die darunter liegenden atomaren Variablen vererbt.

Dies spielt eine Rolle bei der Ausgabe in SPSS-Syntax, da für SPSS die einzelnen Variablen ausgegeben werden.

Gebildet werden VARFAMILYs mit den Statements VARFAMILY und MAKEFAMILY.

Mit GENERATELABELS steht ein Werkzeug zur Auswertung auftretender Label-Kombinationen in Variablenfamilien (oder anderen MultiQ-Variablenkonstrukten) zur Verfügung.

Die Eigenschaft ALPHA wird im Zusammenhang mit FamiliyVars

entweder von den Variablen vererbt, aus denen diese gebildet wird, oder

es kann explizit eine AlphaFamily generiert werden, und

mittels MULTIFROMSTRING können als Zeichenketten abgelegte Mehrfachnennungsvariablen effizient verarbeitet werden.

Die Arbeit mit Variablen- und Merkmalskombinationen erleichtert die spezielle Variablenfamilie CROSSVAR.

Es stehen spezifische Einstellungsmöglichkeiten zur Auswertungsmethode, Befüllung, Text-Vererbung und Speichermethode von Variablenfamilien zur Verfügung.


VarFamily

Statement zur Bildung einer VARFAMILY

Syntax:

VARFAMILY = <varlist>;

"<varlist>" ist eine Liste von atomaren Variablen.

Beispiel:

VARFAMILY item = item1 TO item4;

TABLE = item BY alter;

Die VARFAMILY hat automatisch dieselben VALUELABELS wie die erste Variable, aus denen sie gebildet wurde. Man kann der VARFAMILY aber auch eigene Valuelabels zuweisen. Mit VARFAMILYs sind keine arithmetischen Operationen oder RECODEs zugelassen. Man kann eine VARFAMILY inhaltlich als eine Variable auffassen, die mehrfach nacheinander Werte an die Auswertungsprozeduren liefert.

VARFAMILYs können auch als Argument eines VARFAMILY-Statement auftreten. Gegeben zum Beispiel der Fall, dass man in den VARFAMILYs (bzw. MULTIQs) GOOD und BAD jeweils die positiven und negativen Nennungen zu einem Produkt erhoben hat, dann kann man mit

VARFAMILY GoodAndBad = GOOD BAD;

USELABELS = Good;

eine VARFAMILY erzeugen, die sowohl die positiven als auch die negativen Nennungen enthält.


MakeFamily

Syntax:

MAKEFAMILY <name> = <value>;

Mit MAKEFAMILY generiert man eine leere VARFAMILY bzw. MultiQ mit n (<value>) Nennungsmöglichkeiten, die dann beispielsweise mit COMPUTE LOAD weiterverarbeitet werden kann.


GenerateLabels

Methode, um aus einzelnen Labels einer VARFAMILY (oder einer anderen Mehrfachnennungsvariablen) die Kombinationen zusammenbauen, die in den empirischen Daten auftreten.

Syntax:

GENERATELABELS <varname>;

Hierfür muss grundsätzlich erst einmal eine atomare Variable berechnet werden, in deren Code alle Codes der MultiQ systematisch eingehen. GENERATELABELS versieht diese Variable dann mit sinnvollen Labels.

Beispiel: Auf die Frage: „Welche Medikamente verordnen Sie in der Regel bei einer Erkältung?“ können in der Variablen 'medikamente5' fünf verschiedene Medikamente genannt werden. Um der Fragestellung nachzugehen, welche Kombinationen hier häufiger genannt werden, muss zunächst für jede Code-Kombination ein eindeutiger Code berechnet werden. Anschließend kann man die Labeltexte für die Kombinationen, die gemeinsam genannt wurden, durch GENERATELABELS erzeugen lassen.

Da nur auf die gemeinsamen Nennungen abgezielt und unterschiedliche Reihenfolgen ignorieren werden sollen, müssen die Nennungen in der MultiQ standardisiert werden. Das erreicht man am einfachsten durch Sortierung der Werte im Zuge des Kopievorgangs. Hierzu wird die Wertemenge mittels COMPUTE DESCEND in eine neue MultiQ namens MedSort übertragen:

MAKEFAMILY medsort  = 5; 

COMPUTE DESCEND medsort = medikamente5;

LABELS medikamente5 medsort = 

1 Aspirin

2 Paracetamol

3 Ibuprofen

4 Nasic

5 "Vitamin C"

;

Allen auftretenden Kombinationen muss ein eindeutiger Code zu geordnet werden. Diesen Code muss nach einer eindeutigen Vorschrift erzeugt werden - hierzu ein beispielhaftes kleines Macro:

#macro #makecode( &1 &combicode, &faktor )

IF "medsort $&1" NE SYSMISS THEN &combicode = &combicode +  "medsort $&1" * &faktor;

COMPUTE &faktor = &faktor * 100;

#endmacro

COMPUTE combicode = 0;

COMPUTE faktor = 1;

#domacro2( makecode 1:5; combicode faktor ) 

Das DOMACRO2 beginnt immer mit einem Startwert 0 für den Parameter 'combicode' und 1 für 'faktor'. Im Macro wird der Wert der einzelnen Variablen aus der sortierten MultiQ mit "faktor" multipliziert und zum "combicode" addiert und "faktor" mit 100 multipliziert.

Da die numerischen Werte in 'combicode' schnell groß werden können, muss man darauf achten, dass die numerische Genauigkeit ausreicht. Variablen in GESStabs sind als 64-bit-Gleitkommazahlen mit einer 48-bit Mantisse gespeichert. Eine 48-stellige Binärzahl kann ca. 14 Dezimalziffern abbilden: 2^^48 = ca. 2,8*10^^14. Bei 3-stelligen Codes können fünf Nennungen schon 15 Stellen ergeben.  (Das geht oft gut, insbesondere, wenn der erste eingehende Code nur 1- oder 2-stellig ist.)

Jetzt muss für "combicode" ein LABELFORMAT definieren. Dieser String ist genauso aufgebaut wie die Formate für CELLELEMENTS. Der eigentliche Trick liegt darin, dass innerhalb des LABELFORMAT auch @<varname>-Ersetzungen stehen dürfen. Man kann innerhalb des LABELFORMAT also auf die Werte bzw. die Labels von Variablen zugreifen, und diese in das Label einbauen. Wir wollen die jeweiligen Labels von "medsort" als Labeltext haben und anschließend

LABELFORMAT combicode = "@medsort";

GENERATELABELS combicode;

Die eigentliche Generierung findet im Rahmen einer Pseudotabelle statt, diese ermittelt für jeden Fall die aktuelle Wertemenge der Variablen. Wenn für die Zahlenkombination in "combicode" noch kein Label existiert, wird die Textdarstellung der Variablen "medsort" verwendet, gegebenenfalls verkettet, und als Label eingetragen.

Ergebnis für das obenstehende Beispiel:

clip0025

GENERATELABELS ist eine sehr elegante Methode, die tatsächlich auftretenden Kombinationen in einer komplexen atomaren Variablen abzubilden, die dann für Auswertungen zur Verfügung steht.


Verarbeitung von ALPHA-Daten

VarFamily mit Eigenschaft ALPHA

Eine aus ALPHA-Variablen gebildete VARFAMILY hat automatisch auch die Eigenschaft ALPHA. Sollte dies widererwartend zu Problemen führen, kann man diese Eigenschaft mit

ALPHA <varfamilyname> = NO;

ausschalten.

AlphaFamily

VARFAMILYs mit der Eigenschaft ALPHA können auch explizit definiert werden.

Syntax:

ALPHAFAMILY <neueAlphaFamily> = { <alphavar> }*n ;

Hiermit kann aus atomaren Variablen vom Typ ALPHA eine VARFAMILY vom Typ ALPHA erzeugt werden.

Damit lassen sich ALPHA-Fragen, für die in der Befragung mehrere Nennungen vorgesehen sind  (1. Nennung, 2. Nennung usw.), leicht zusammengefasst in einer Tabelle auswerten.

Wenn <neueAlphaFamily> bereits existiert, ist dies ein Syntaxfehler, ebenso, wenn eine der angesprochenen atomaren Variablen nicht vom Typ ALPHA ist.

Mit der ALPHAFAMILY kann man wie mit einer VARFAMILY Tabellen erzeugen.

Weitere Operationen sind nicht zulässig: man kann sie nicht als Argument von CLONEVAR verwenden, man kann auch keine sinnvollen COMPUTE damit durchführen, Vergleiche mit EQ, NE, IN etc. sind teilweise syntaktisch unzulässig oder ergeben keine sinnvoll verwertbaren Ergebnisse.

Inhaltlich passiert neben der Überwachung von Fehlerzuständen bei der Abarbeitung des ALPHAFAMILY-Statements dasselbe wie in folgendem Macro:

#macro #alfafam( &neu &elemente )

 VARFAMILY &neu = &elemente;

 VALUELABELS &neu = ;

 ALPHA &neu = yes;

 USELABELS &elemente = &neu;

#endmacro

Hinweis:

Die atomaren ALPHA-Variablen dürfen nur in je einer AlphaFamily enthalten sein. Wird eine der Ausgangsvariablen in mehr als einer AlphaFamily verwendet, ist das ein Syntaxfehler. Die folgenden Anweisungen z.B. sind fehlerhaft, da nenn1 und nenn2 in zwei verschiedenen AlphaFamily enthalten sind:  

ALPHAFAMILY alleNennungen = nenn1 nenn2 nenn3 nenn4;

ALPHAFAMILY Nennung1und2 = nenn1 nenn2;

Durch das erste ALPHAFAMILY-Statement haben die Variablen nenn1, nenn2, nenn3, nenn4 und alleNennungen eine gemeinsame Abbildung von ALPHA-Werten auf den internen numerischen Code.

Durch das zweite ALPHAFAMILY-Statement würde aber eine gemeinsame Abbildung für Nennung1und2, nenn1 und nenn2 erzeugt und diese überschriebe die gemeinsame Abbildung für alleNennungen und alle nenn1 .. nenn5.

EVALFAMVALONCE ist als Default YES, d.h. wenn ein String in mehr als einer Variablen vorkommt, aus denen die AlphaFamily erzeugt wird, wird er nur einmal ausgewertet.

Mit NO kann man dieses Verhalten ändern, siehe unten.

MultiFromString

Syntax:

MULTIFROMSTRING [ DELIMITED <delimiter> ] [ DECIMALS <decimalchar> ] <newvar> 
= <alfavar>;

Defaults:

DELIMITED: ','

DECIMALS: '.'

Das Statement MULTIFROMSTRING dient der effizienten Verarbeitung von Variablen mit Mehrfachnennungen oder offenen Antworten, deren numerisch interpretierbare Labels im Datensatz als Strings (ALPHA) abgelegt sind. Das klingt nach einem Spezialfall, kommt aber zunehmend in extern gelieferten Datensätzen vor.  

<newvar> und <alfavar> müssen existierende Variablen sein. <newvar> muss eine FAMILYVAR sein. <alfavar> kann auch eine numerische Variable sein (entscheidend ist nur, dass es für den gegenwärtigen Code ein Label gibt, das sich numerisch interpretieren lässt). Es werden so viele Codes in <newvar> abgelegt, wie in dem Labelstring erkannt werden. (Trivialerweise natürlich nur auch nur so viele Werte, wie die FAMILYVAR aufnehmen kann.)

Mit DELIMITED wird optional das Trennzeichen in der <alfavar> benannt, mit DECIMALS das Dezimalzeichen.

Existiert das Label zum gegenwärtigen Code nicht, oder enthält es keine als Zahlen interpretierbare Sub-Strings, ist die resultierende Variable MISSING. Wenn z.B. eine Alpha-Variable f3_alpha in einem SPSS-Datensatz den String "3,6,18" enthält, ist sie eigentlich als Mehrfachnennungsvariable mit den Werten 3, 16 und 18 zu deuten.

Beispiel: Mit der Sequenz

MAKEFAMILY f3  = 10;

MULTIFROMSTRING f3 = f3_alpha;

kann man das oben erwähnte Label "3,6,18" in eine GESStabs-konforme Variablenfamilie (bzw. MultiQ) umwandeln. Die Werte von ALPHA-Variablen werden intern in VALUELABELS gespeichert.

Zweites Beispiel: Ein Datumsstring in der Form "TT-MM-JJJJ" in einer Variable namens datestring kann auf diese Weise in eine MULTIQ namens datum1 mit drei Werten gewandelt werden.

MAKEFAMILY datum1  = 3;

EVALFAMVALONCE datum1 = no;

MULTIFROMSTRING DELIMITED "-" datum1 = datestring;

Datum1_$1 enthält dann den Tag, Datum1_$2 den Monat, Datum1_$3 das Jahr.

Das Ausschalten von EVALFAMVALONCE an dieser Stelle ist notwendig, da sonst z.B. "01-01-01" in eine MULTIQ mit nur einer Nennung "1" ausgepackt würde.


Spezielle Variablenfamilien

CrossVar

Syntax:

CROSSVAR <newvar> = <var1> <var2> ;

Mit CROSSVAR lässt sich eine spezielle Variablenfamilie erzeugen, die alle Ausprägungskombinationen aus allen beteiligten Variablen enthält. Hiermit kann man beispielsweise mehrfache Kreuztabellen in TABLE darstellen.

Definiert man zum Beispiel:

CROSSVAR "Alter * Geschlecht" = Alter Geschlecht;

kann anschließend mit

TABLE = Parteipräferenz BY "alter * Geschlecht";

die Abhängigkeit der Parteipräferenz von der Kombination aus Alter und Geschlecht dargestellt werden. Die VALUELABELS der Variablen, aus der die CROSSVAR gebildet wird, werden in geeigneter Weise übernommen. In eine CROSSVAR können auch mehr als zwei Variablen eingehen.


Einstellungen für FamilyVars

EvalFamValOnce

EvalFamValOnce = Abkürzung für: EVALuate FAMiliyvariables VALues ONCE

Syntax:

EVALFAMVALONCE <Varlist> = [ YES | NO ];

Bei der Benutzung von VARFAMILYs kann es je nach der inhaltlichen Dimension der Variablenfamilie sinnvoll sein, mehrfach identisch kodierte Variablen in der Familie nur einmal auszuwerten, oder aber alle Nennungen, unabhängig von der Identität mit bereits verarbeiteten Nennungen. Der Parameter YES bedeutet, dass alle Werte der Variablenfamilie pro Fall nur einmal ausgewertet werden (= Voreinstellung). Der Parameter NO bewirkt, dass mehrfach identische Werte je Fall ausgewertet werden. In der Varlist dürfen nur Namen von VARFAMILYs stehen.

Die ALPHAFAMILY verhält sich in Bezug zu EVALFAMVALONCE wie jede andere VARFAMILY bzw. MULTIQ.

IgnoreMultiQOverflow

Ausgabe einer Fehlermeldung, wenn maximale Anzahl der Werte für MultiQ/ VARFAMILY erreicht ist.

Siehe Prüfungen.

NoInheritText, NoInheritTitle

Ein-/Ausstellen der Vererbung von Vartext und Vartitle der VARFAMILY auf ihre atomaten Einzelvariablen, analog zu VARGROUP.

Normalize

Syntax:

NORMALIZE;
NORMALIZE = <varlist>;

In den MultiQ-Variablen bzw. VARFAMILYs kann die interne Speicherbelegung nach Recodierung etc. manchmal etwas unkonventionell aussehen, z.B. ist ein Code mehrfach enthalten etc. Mit NORMALIZE wird die Standardspeicherung, nach der die atomaren Bestandteile jeweils maximal einmal gezählt werden, wieder hergestellt.

Dies ist manchmal wünschenswert, wenn mit COPYFILE erzeugte ASCII-Datensätze an Dritte weitergegeben werden sollen. Für die interne Verarbeitung mit GESStabs macht dies keinen Unterschied.