====== Variablen in SoSci Survey ======

In der Anleitung ist vielfach von "Variablen" die Rede. Dieses Kapitel erklärt, was es mit den unterschiedlichen Variablen auf sich hat.

In der Sozialwissenschaft hat man mit Variablen i.d.R. bei der statistischen Auswertung zu tun. Hierbei bezeichnet sie ein Merkmal der Untersuchungseinheit (z.B. Alter, Geschlecht). Variabel ist die Variable insofern, als man zwar weiß, dass es ein solches Merkmal gibt und was man damit in der Auswertung macht -- aber die Ausprägung hängt vom konkreten Fall ab.

In der Programmierung ist eine Variable im Prinzip sehr ähnlich: Die Variable beschreibt einen veränderlichen Wert, den man verwendet. Das kann zum Beispiel eine Antwort des Teilnehmers sein -- aber auch ein Wert, der sich schon mehrfach ändert, während die Fragebogen-Seite noch aufgebaut wird. Die Variable wird dabei stets als Platzhalter für veränderliche (Zahlen-)werte verwendet, so wie man Variablen aus der Mathematik kennt. Technisch ist eine Variable ein Speicherplatz für Daten (z.B. für eine Zahl oder einen Text).

In SoSci Survey können Sie auf die folgenden Arten von Variablen treffen:

  * **PHP-Variablen** sind Bestandteil der Programmiersprache PHP. Sie tauchen direkt im PHP-Code (also ein Element //PHP-Code// beim Zusammenstellen des Fragebogens) auf und beginnen mit einem Dollar-Zeichen (''$''), z.B. ''$alter''. PHP-Variablen werden [[#php-variablen|weiter unten]] ausführlich beschrieben.
  * **Daten-Variablen** speichern die Antworten des Befragten -- sie stehen später im Datensatz als Variablen für die Auswertung zur Verfügung. Jedes Interview erzeugt einen neuen Fall im Datensatz. Eine Liste aller Daten-Variablen eines Befragungsprojekts liefert die ** Variablen-Übersicht**. Der aktuelle Wert einer Daten-Variable, also zum Beispiel die Antwort, die ein Befragter gegeben hat, kann mit der Funktion ''[[:de:create:functions:value|value()]]'' ausgelesen und z.B. für eine [[:de:create:filters|Filterfrage]] verwendet werden.
  * **Interne Variablen** sind spezielle Daten-Variablen. Sie dienen dazu, Werte im Datensatz verfügbar zu machen, die mittels PHP-Code berechnet oder gewürfelt wurden. Weiterhin können interne Variablen die Antworten speichern, die mit [[:de:create:inputs-custom|eigenen Formularelementen]] erhoben wurden.


===== Daten-Variablen =====

Die meisten Fragen erzeugen eine Variable im Datensatz, darüber hinaus können mit dem Fragetyp [[:de:create:questions:internal]] (s. unten) im Datensatz zusätzliche Variablen angelegt werden, die benutzerdefinierte Daten speichern.

Darüber hinaus gibt es im Datensatz [[:de:results:variables|zusätzliche Variablen]] mit Meta- und Paradaten zum jeweiligen Fall.

Die Variablen von Fragen erhalten beim Anlegen eine Kennung, die aus der Frage-Kennung (z.B. "AB01") und (optional) einem Zusatz (z.B. "_01" oder "x1") besteht. Bei Fragen mit untergeordneten Items (z.B. Skalen) entspricht der Zusatz in aller Regel der Nummer des Items.

==== Individuelle Variablen-Namen ====

Im Karteireiter "Variablen" einer Frage können Sie die Kennung einzelner oder mehrerer Variable ändern.

{{ :de:create:scr.variables.custom-labels.png?nolink |Karteireiter Variablen in einer Frage}}

Klicken Sie auf das Bearbeiten-Symbol ({{:de:create:symbol.edit.png?nolink|Knopf zum Beabeiten}}), um die Kennung zu ändern. Tragen Sie die gewünschte neue Kennung für die Variable ein. Die Kennung muss folgenden Regeln folgen:

  * Es können die Buchstaben A bis Z (groß oder klein, keine Umlaute), die Ziffern 0 bis 9 und der Unterstrich (''_'') verwendet werden. Das erste Zeichen muss ein Buchstabe sein.
  * Die Kennungen dürfen maximal 64 Zeichen lang sein.
  * Um mögliche Überschneidungen mit den automatisch zugewiesenen Kennungen zu vermeiden, dürfen das dritte und vierte Zeichen __nicht beide__ Zifferns ein. Die Kennungen "var01", "v01" oder "age" sind  also möglich, nicht aber "va00", "v001" oder "xy123".

Wenn Sie in das Eingabefeld für die Kennung gar nichts eintragen, wird die automatische Kennung wiederhergestellt.

Zum Bestätigen der neue Kennung stehen zwei Knöpfe zur Verfügung:

  * Mit dem Knopf {{:de:create:symbol.check.png?nolink|Knopf zum Bestätigen}} speichern Sie die Kennung nur für die eine Variable.
  * Mit dem Knopf {{:de:create:symbol.checkMulti.png?nolink|Knopf zum Bestätigen für alle nachfolgenden Variablen}} speichern Sie die Kennung zusätzlich für alle nachfolgenden Variablen, wobei SoSci Survey eine Zahl am Ende automatisch hochzählt. Wenn Sie z.B. bei der ersten Variable die Kennung "sus01" eintragen, erhalten die weiteren Variablen die Kennungen "sus02, "sus03" u.s.w.

Die geänderten Kennungen werden als Variablennamen beim [[:de:results:download]] verwendet und sie können in [[:de:create:php-filters|PHP-Filtern]] bzw. der Funktion ''[[:de:create:functions:value]]'' verwendet werden. Die automatisch zugewiesene Kennung bleibt zusätzlich gültig.


===== Interne Variablen =====

Um eine interne Variable anzulegen, erstellen Sie zunächst eine Frage vom Typ [[:de:create:questions:internal|Interne Variablen]]. Innerhalb dieser Frage legen Sie nun eine oder mehrere Variablen an -- so wie Sie in einer Auswahlfrage Auswahloptionen anlegen. Die Beschriftung, die Sie für eine Variable eintragen, erscheint später im Datensatz als Beschriftung für die Variable.

**Wichtig:** Die Kennung einer internen Variable ist 7-stellig, z.B. "IV01_01" oder "AB02_03" -- wenn Sie unsicher sind, sehen Sie in der **Variablen-Übersicht** nach. Verwenden Sie die Kennung der übergeordneten Frage (z.B. "IV01" oder "AB02") nur dann, wenn Sie sich tatsächlich auf alle internen Variablen dieser Frage beziehen (z.B. bei ''urnDraw()'') und nicht auf eine einzelne interne Variable.

Interne Variablen haben unterschiedliche Funktionen: Sie können mit ''[[:de:create:functions:put|put()]]'', im Kontext einer [[:de:create:random_urns|Randomisierung mit Urnen]] oder in Verbindung mit [[:de:create:inputs-custom|eigenen Formularelementen]] verwendet werden.


==== Verwendung mit put() ====

Eine interne Variable kann einen Wert speichern, der im PHP-Code gewürfelt oder ermittelt wurde. Die Funktion ''[[:de:create:functions:put|put()]]'' schreibt den Wert einfach in die Variable.

Im nachfolgenden Beispiel wird der [[:de:general:indices|Summenindex]] für die Skala "SK01" berechnet und in der internen Variable ''SK02_01'' gespeichert. Dies kann sinnvoll sein, wenn man mit seiner Statistik-Software auf Kriegsfuß steht -- oder wenn man den Skalenindex noch im Fragebogen für die [[:de:create:filters|Filterführung]] verwenden möchte.

<code php>
$sum = valueSum('SK01');
put('SK02_01', $sum);
</code>

Weiter unten finden Sie auch ein Beispiel, welches das Ergebnis einer Zufallsziehung mittels ''put()'' für die Auswertung verfügbar macht.


==== Verwendung mit Urnen ====

Die Verwendung von Urnen ist ausführlich im Kapitel [[:de:create:random_urns]] nachzulesen.

In einer Urne können Zettel mit mehreren Werten liegen -- es müssen also u.U. mehrere Werte in mehrere interne Variablen gespeichert werden. Entsprechend erwartete die Funktion ''[[:de:create:functions:urndraw]]'' die Kennung der Frage. Diese Frage muss wiederum genug Variablen enthalten, um die gezogene Kombination speichern zu können.

Der folgende PHP-Code zieht einen Zettel aus der Urne "urne" und speichert die Kombination in den internen Variablen der Frage "IV01".

<code php>
urnDraw('urne', 'IV01');
</code>

Für den trivial und häufigsten Fall, dass in der Urne nur Zettel mit jeweils einer Zahl liegen, benötigt die Frage auch nur eine interne Variable. Die Funktion ''urnDraw()'' verlangt dennoch nach der Frage- und nicht der Variablen-Kennung.


==== Verwendung mit JavaScript ====

Zieht man eine Frage vom Typ "interne Variablen" in den Fragebogen, so sieht man im Fragebogen zwar nichts davon, aber es hat trotzdem zwei Effekte:

  - Auf der Fragebogen-Seite werden versteckte (''%%type="hidden"%%'') Formularfelder mit den Kennungen der internen Variablen angelegt.
  - Beim Abschicken der Seite mit "Weiter" werden die Werte aus den versteckten Formularfeldern ausgelesen und im Datensatz gespeichert.

Auf die versteckten Formularfelder kann man mittels JavaScript zugreifen. So kann man Antworten oder Messwerte, die mittels JavaScript erhoben wurden, bequem im Datensatz speichern.

Das folgende Beispiel geht davon aus, dass man eine Frage vom Typ "interne Variablen" mit der Kennung "PC01" angelegt hat und darin zwei Variablen, welche die Kennungen "PC01_01" und "PC01_02" haben. Auf das versteckte Formularelemente zur Variable "PC01_01" kann man in JavaScript mittels ''%%document.getElementById("PC01_01")%%'' zugreifen. Per JavaScript soll nun die Breite und Höhe des Bildschirms (in [[:de:glossary#pixel|Pixeln]]) ermittelt und im Datensatz gespeichert werden.

Dazu wird die Frage "PC01" in die Fragebogen-Seite hineingezogen -- und darunter der folgende JavaScript-Code als Textbaustein platziert.

<code html>
<script type="text/javascript">
<!--
document.getElementById("PC01_01").value = screen.width;
document.getElementById("PC01_02").value = screen.height;
// -->
</script>
</code>


===== PHP-Variablen =====

Variablen beginnen in PHP mit einem Dollar-Zeichen, z.B. ''$version''. Mit einem einfachen Gleichheitszeichen (''='') wird ihnen ein Wert zugewiesen. Mit einem doppelten Gleichheitszeichen (''=='') wird dieser Wert mit einem anderen Wert verglichen.

**Wichtig:** Eine PHP-Variable gilt nur innerhalb eines //PHP-Code// Elements, sie ist flüchtig, wird also nicht dauerhaft gespeichert. Will man den Wert der Variable später in anderen PHP-Code Elementen verwenden, so muss man die Variable mittels ''[[:de:create:functions:registervariable|registerVariable()]]'' verfügbar machen. Benötigt man den Wert der Variable für die Auswertung, muss er mittels ''[[:de:create:functions:put|put()]]'' in eine interne Variable gespeichert werden.

Im folgenden Beispiel würfelt die Funktion ''[[:de:create:functions:random|random()]]'' die Zahl 1 oder 2. Das Ergebnis dieser Zufallsziehung wird in der Variable ''$version'' abgelegt. Anschließend wird in einer IF-Konstruktion ([[:de:create:filters]]) vergleichen, ob der Wert 1 ist (dann wird der Textbaustein "stimulus1" angezeigt) oder nicht (dann wird "stimulus2" angezeigt).

<code php>
$version = random(1, 2);
if ($version == 1) {
  text('stimulus1');
} else{
  text('stimulus2');
}
</code>

==== Im Datensatz speichern ====

Um den Inhalt einer Variable über das Interview hinaus im Datensatz zu speichern, verwenden Sie eine interne Variable (s. oben) in Verbindung mit der Funktion ''[[:de:create:functions:put|put()]]''.

Bei dem obigen Beispiel sieht man anhand des Datensatzen __nicht__, welcher Stimulus angezeigt wurde. Legen Sie eine interne Variable (z.B. "IV01_01") an und verwenden Sie ''put()'', um das Ergebnis der Zufallsziehung im Datensatz zu speichern:

<code php>
$version = random(1, 2);
put('IV01_01', $version);
if ($version == 1) {
  text('stimulus1');
} else{
  text('stimulus2');
}
</code>


==== Mit Variablen arbeiten ====

Mit Variablen kann man hervorragend rechnen. Im folgenden Beispiel wird dem Teilnehmer auf Seite 1 die Frage "AB01" gestellt -- eine offene Texteingabe für eine Zahl. Auf Seite 2 wird diese Antwort mittels ''value()'' ausgelesen und in die Variable ''$nummer'' gespeichert. Diese Variable wird mit 2 multipliziert (''*'') und das Ergebnis in die Variable ''$ergebnis'' gespeichert.

Anschließend wird die Variable ''$ergebnis'' als Text (String) behandelt und mit zwei anderen Strings verknüpft (''.''). Das Ergebnis dieser Verknüpfung wird an die Funktion ''html()'' zur Anzeige im Fragebogen übergeben.

<code php>
// Auf Seite 2 mit der angegeben Zahl rechnen
$nummer = value('AB01');  // Zuweisen der angegeben Zahl zur Variable $nummer
$nummer = (int)$nummer;   // Sicherstellen, dass es eine Zahl ist
$ergebnis = 2 * $nummer;  // Zahl mit 2 multiplizieren
// Als Text im Fragebogen anzeigen
html('<p>Sie haben die Hälfte von '.$ergebnis.' angegeben</p>');
</code>


==== Variablen dauerhaft verwenden ====

Mitunter ist es notwendig, eine PHP-Variable in mehreren PHP-Code Elementen zu verwenden. Im folgenden Beispiel sollten 10 Fernsehsender in zufälliger Reihenfolge abgefragt werden. In Frage AB01 soll angefragt werden, wie häufig man die Sender nutzt -- in Frage AB02 soll erfragt werden, wie attraktiv man das Programmangebot beurteilt.

Nun ist es natürlich sinnvoll, dass die Sender in beiden Fragen in derselben Reihenfolge abgefragt werden. Dazu wird mittels ''[[:de:create:functions:random_items|random_items()]]'' zunächst eine Liste ([[:de:create:array|Array]]) der Item-Kennungen in zufälliger Reihenfolge erstellt. Diese Liste wird in der Variable ''$items'' abgelegt.

Die Variable ''$items'' wird nicht nur auf der aktuellen Seite benötigt, sondern auch auf der Folgeseite mit Frage "AB02". Daher wird sie mittels ''[[:de:create:functions:registervariable|registerVariable()]]'' für künftige PHP-Code Elemente verfügbar gemacht. Anschließend wird die Frage "AB01" mit der gemischten Reihenfolge angezeigt.

<code php>
$items = random_items('AB01'); // Randomisierte Reihenfolge der Items in Frage AB01
registerVariable('items');
question('AB01', $items);  // Frage mit randomisierten Items stellen
</code>

Auf Seite 2 kann ''$items'' dann einfach verwendet werden.

<code php>
question('AB02', $items);  // Frage mit randomisierten Items stellen
</code>