====== Rotation ======

Von Rotation spricht man, wenn die Items oder Optionen einer Frage jedem Teilnehmer in eine anderen (i.d.R. zufälligen) Reihenfolge dargeboten werden -- oder wenn gar die Reihenfolge von Fragen zufällig variiert wird.

Eine Rotation wird gerne verwendet, um Reihenstellungseffekten zu begegnen. Sehr bekannt sind der Primacy- und Recency-Effekt sowie Kontrast- und Konsistenzeffekte: Die Rotation kommt also speziell dann zum Einsatz, wenn die Reihenfolge von Fragen oder Items das Antwortverhalten in der Gesamtstichprobe maßgeblich verzerren dürfte. Die tatsächlich im Einzelfall verwendete Reihenfolge fließt bei der Rotation in aller Regel nicht in die Auswertung ein.

In Abgrenzung zur Rotation gibt es die [[randomization|Randomisierung]], bei welche Teilnehmer zufällig in Experimentalgruppen eingeteilt werden. Auch dort kann die Reihenfolge von Fragen gezielt variiert werden -- dann ist diese Reihenfolge aber für die Auswertung i.d.R. hochrelevant.

**Tipp:** Lesen Sie zum Verständnis der komplexeren Code-Beispiele (unten) die Kapitel [[php|Einführung in PHP-Code]] und  [[array|Einführung in Arrays]].


===== Sinn und Unsinn der Rotation =====

Vorsicht: Nicht immer ist eine Rotation sinnvoll. Mit rotierten Items kann man sich ebenso problematische Messfehler einhandeln.

__Sinnvoll__ ist eine Rotation dann, wenn man das Aggregat auf die Grundgesamtheit hochrechnen möchte. Wenn man also z.B. vergleichen will, welche Option in einer Mehrfachauswahl die meisten Kreuzchen bekommt oder welches Item in einer Skala am höchsten bewertet wird. Dann gleichen sich Verzerrungen durch die Reihenstellungseffekte im Aggregat statistisch gesehen wahrscheinlich aus.

__Nicht sinnvoll__ ist die Rotation, wenn man die Teilnehmer untereinander vergleichen möchte. Das ist bei nahezu allen Spielarten der Korrelation der Fall, also z.B. bei der Frage ob die Zufriedenheit mit einem Fernsehgenre (in einer Fragebatterie/Skala mit anderen Items zusammen erhoben) auf die Fernsehnutzungsdauer schließen lässt. Rotiert man hier die Items der Skala, so sind einige Teilnehmer nur aufgrund von Reihenstellungseffekten mit dem Fernsehprogramm scheinbar zufriedener. Man handelt sich also durch die Rotation einen Messfehler ein.

Der Messfehler durch Rotation sinkt mit der Anzahl an Items, mit denen man ein Konstrukt misst. In der BFI-S Persönlichkeitsskala mit 3 Items je Persönlichkeitsfaktor fällt der Messfehler geringer aus als im obigen Beispiel mit einem Item. Sofern man sowohl Korrelationen rechnen will als auch die Items untereinander vergleichen, muss man die Vor- und Nachteile abwägen. Vor Einsatz der Rotation sollte man nur eben kurz innehalten und über sein Ziel nachdenken.


===== Rotation der Items oder Optionen einer Frage =====

Die Randomisierung oder Rotation von Items in einer Frage wird wie folgt aktiviert: Die Frage im **Fragenkatalog** öffnen und entweder im ersten Karteireiter oder bei den //Einstellungen für die Items der Frage// bei der Einstellung //Reihenfolge Auswahloptionen// die Option "Zufällig rotieren/mischen" auswählen. Die Randomisierung wird nach dem Speichern der Frage sofort in der Vorschau aktiviert.

Falls einzelne Items (z.B. ein "Sonstiges" mit Texteingabe) von der Rotation ausgenommen werden sollen, öffnen Sie dieses Item im **Fragenkatalog** oder mit dem {{:button.edit.gif?nolink|Bearbeiten}}-Symbol und aktiviert die Option //Dieses Item beim Mischen der Items ausnehmen//.

**Hinweis:** Die Rotation betrifft natürlich nur die Darstellung im Fragebogen. Die Antworten des Befragten auf ein bestimmtes Item werden immer unter derselben Kennung gespeichert.

**Hinweis:** In welcher Reihenfolge die Items im Fragebogen angezeigt werden, wird nicht im Datensatz abgespeichert. Falls Sie diese Information benötigen, rotieren Sie die Items mittels PHP-Code (s. unten).


===== Manuelle Rotation von Items oder Optionen =====

Sie können die Items bzw. Optionen einer Frage auch mittels PHP-Code rotieren. Dazu wird zunächst mittels ''[[:de:create:functions:getitems]]'' eine Liste der Items/Optionen abgerufen, dann per ''shuffle()'' gemischt und schließlich wird die Frage mittels ''[[:de:create:functions:question]]'' mit der gewünschten Item-Abfolge als Parameter angezeigt.

<code php>
$items = getItems('AB01', 'all');
shuffle($items);
question('AB01', $items);
</code>

Dieses Vorgehen bietet die Möglichkeit, die angezeigte Reihenfolge im Datensatz abzuspeichern. Dies erfolgt mithilfe interner Variablen und dem Befehl ''[[:de:create:functions:put#beispielrandomisierung_i|put()]]''.

Beachten Sie allerdings, dass sich hier (anders als bei der Rotation per Knopfdruck) die Reihenfolge ändert, sobald der Teilnehmer die Seite neu lädt oder den Zurück-Knopf im Fragebogen verwendet. Verwenden Sie ''registerVarible()'' und ''isset()'', um dies zu verhindern. So wird die Zufallsabfolge nur beim ersten Laden der Seite gewürfelt -- beim nächsten laden ist die Variable ''$itemsAB'' bereits gesetzt (''isset()'' steht für "is set") und der Teil wird übersprungen.

<code php>
if (!isset($itemsAB)) {
  $itemsAB = getItems('AB01', 'all');
  shuffle($itemsAB);
  registerVariable($itemsAB);
}
question('AB01', $itemsAB);
</code>

**Hinweis:** Nach eine mittels ''registerVariable()'' gespeicherte Variable auf allen Seiten des Fragebogens verfügbar ist, können Sie denselben PHP-Code __nicht__ verwenden, um die Items einer anderen Frage zu rotieren. Denn die Variable ist ja bereits gesetzt. Verwenden Sie für die andere Frage einfach einen anderen Variablen-Namen (z.B. ''$itemsCD'').


===== Parallele Rotation von zwei Fragen =====

Mit der manuellen Rotation (s. oben) können Sie in zwei oder mehr Fragen dieselbe rotierte Item-Abfolge verwenden. Falls die Fragen auf unterschiedlichen Seiten stehen, verwenden Sie auch hierfür ''[[:de:create:functions:registervariable]]'' -- genau wie im Beispiel oben -- um die Abfolge für weitere PHP-Code-Elemente verfügbar zu machen.

<code php>
if (!isset($itemsAB)) {
  $itemsAB = getItems('AB01', 'all');
  shuffle($itemsAB);
  registerVariable($itemsAB);
}
question('AB01', $itemsAB);
</code>

Auf derselben oder späteren Seiten kann die Reihenfolge, wie sie in ''$itemsAB'' gespeichert ist, einfach für andere Fragen verwendet werden.

<code php>
question('AB02', $itemsAB);
</code>


===== Rotation von Items über mehrere Seiten =====

Falls Sie in einer Frage sehr viele Items haben, möchten Sie diese vielleicht auf mehrere Seiten verteilen. Normalerweise würden Sie das erledigen, indem Sie die Frage beim **Fragebogen zusammenstellen** mehrfach einfügen und jeweils bei den Anzeige-Einstellungen ({{:button.settings.png?nolink|Anzeige-Einstellungen}}-Knopf) unterschiedliche Items angeben, z.B. "1-10", "11-20", etc.

Falls Sie die Verteilung der Items mit einer Randomisierung kombinieren möchten, benötigen Sie ein paar Zeilen [[php|PHP-Code]].

<code php>
// Das isset() vermeidet, dass die Rotation etwa wg. fehlenden Antworten verändert wird
if (!isset($itemsAB01)) {
  // Alle Items der Frage AB01 auflisten
  $itemsAB01 = getItems('AB01', 'all');
  // Liste Mischen
  shuffle($itemsAB01);
  // Die Liste in Teillisten à 20 Items teilen
  $itemsAB01 = array_chunk($itemsAB01, 20);
  // Die Variable für andere Seiten verfügbar machen
  registerVariable($itemsAB01);
}

// Die Items über mehrere Seiten verteilt anzeigen
$i = loopPage(count($itemsAB01));
question('AB01', $itemsAB01[$i]);
</code>

Mit der Funktion ''[[:de:create:functions:looppage|loopPage()]]'' kann man innerhalb einer Fragebogen-Seite mehrere unterschiedliche Seiten anzeigen. Alternativ zu den letzten beiden Zeilen kann man die benötigte Anzahl an Seiten im Fragebogen einfügen und jeweils den entsprechenden Item-Bereich anzeigen:

<code php>
// Erste Seite
question('AB01', $itemsAB01[0]);

// Zweite Seite
question('AB01', $itemsAB01[1]);

// Dritte Seite
question('AB01', $itemsAB01[2]);
</code>

Beachten Sie bitte, dass sich auf den Seiten nur noch der Index in eckigen Klammern ändert. Der Index beginnt bei 0, nicht bei 1 (s. Beispiel oben).

**Wichtig:** Wenn man beim **Fragebogen zusammenstellen** direkt eine Seite mit Items startet, dann erhält man die Fehlermeldung, die Variable ''$itemsAB01'' sei unbekannt. Man muss zum Testen jeweils ab der Seite starten, wo die Randomisierung damit die Variable ''$itemsAB01'' definiert wird.


===== Rotation mehrerer Fragen =====

In seltenen Fällen sollen nicht nur die Items einer Frage rotiert werden, sondern gleich die Fragen. Dies erfordert ein wenig Programmierung mittels [[php|PHP-Code]].

Das folgende Beispiel zeigt, wie man die Reihenfolge von 5 Fragen auf einer Seite im Fragebogen rotieren kann (zur Erklärung von Arrays s. [[filter-items#arrays|Items in eine anderen Frage übernehmen]]):

<code php>
if (!isset($fragen)) {
  $fragen = array(  // Liste der Frage-Kennungen
    'AB01',
    'AB02',
    'CC03',
    'DE01',
    'DE02'
  );
  // Die Liste zufällig mischen
  shuffle($fragen);
  // Die Rotation für eine eventuelle Wiederholung der Seite zwischenspeichern
  registerVariable($fragen);
}
// Die Liste der Fragen Kennung für Kennung durchgehen
// und jeweils die entsprechende Frage anzeigen
foreach ($fragen as $kennung) {
  question($kennung);
}
</code>

**Hinweis:** Sollten Sie eine ähnliche Rotation an unterschiedlichen Stellen im Fragebogen verwenden, muss der Name der Variable ''$fragen'' variiert werden, also z.B. bei der ersten Verwendung ''$fragen1'', bei der zweiten Verwendung ''$fragen2''.


===== Fragen über mehrere Seiten rotieren =====
   
Die Rotation von Fragen über mehrere Seiten ist nur geringfügig anspruchsvoller. Das folgende Beispiel zeigt, wie 6 Fragen auf 2 Seiten verteilt werden können:

<code php>
// PHP-Code auf Seite 1

// Das Mischen der Liste nur einmalig ausführen
if (!isset($fragen)) {
  // Liste der Frage-Kennungen erstellen
  $fragen = array(
    'AB01', 'AB02',
    'CC02', 'CC03',
    'DE01', 'DE02'
  );
  // Die Liste zufällig mischen
  shuffle($fragen);
  // Die Listen auf allen Seiten verfügbar machen
  registerVariable($fragen);
}

// Die ersten drei Kennungen der Liste anzeigen
question($fragen[0]);
question($fragen[1]);
question($fragen[2]);
</code>

<code php>
// PHP-Code auf Seite 2

// Die nächsten drei Kennungen der Liste anzeigen
question($fragen[3]);
question($fragen[4]);
question($fragen[5]);
</code>

Falls Sie die Fragen einzeln auf jeweils einer eigenen Seite anzeigen möchten, kann dies mittels ''[[:de:create:functions:looppage|loopPage()]]'' relativ einfach erledigt werden. Das folgende Code-Beispiel setzt nach der Definition der Reihenfolge an (also zwei Zeilen unter dem ''registerVariable()'' im obigen PHP-Code)

<code php>
$i = loopPage(count($fragen));
question($fragen[$i]);
</code>


===== Fragen zusammen mit weiterem Inhalt rotieren =====

Noch einen Schritt weiter muss man gehen, um weitere Daten (z.B. ein Bild als Stimulus) mit den Fragen zusammen zu rotieren. Wenn also vor Frage 1 immer "bild1.png" und vor Frage 2 immer "bild2.gif" angezeigt werden soll. Aber vom Prinzip her ändert sich nichts. Im folgenden Beispiel zeigt jede Seite nur eine Kombination aus Bild und Frage -- es können aber (wie im vorigen Beispiel) mehrere Fragen auf einer Seite gestellt werden.

<code php>
if (!isset($blocks)) {
  $blocks = array(  // Liste der Frage-Kennungen und zugehöriger Bilder
    array('AB01', 'bild1.png'),
    array('AB02', 'bild2.gif'),
    array('AB03', 'bild3.jpg'),
    array('AB04', 'bild4.png')
  );

  // Die Liste mischen
  shuffle($blocks);
  // Die Listen auf allen Seiten verfügbar machen
  registerVariable($blocks);
}

// Anzeige der Blöcke
$i = loopPage(count($blocks));
// Bild anzeigen
html('<p><img src="'.$blocks[$i][1].'" alt="Wahlplakat"></p>');
// Frage anzeigen
question($blocks[$i][0]);
</code>

Alternativ können mehrere Seiten im Fragebogen eingefügt und jeweils ein Block angezeigt werden. Dies kann z.B. hilfreich sein, wenn die Blöcke nicht direkt hintereinander angezeigt werden sollen.

<code php>
html('<p><img src="'.$blocks[0][1].'" alt="Wahlplakat"></p>');
question($blocks[0][0]);
</code>

<code php>
html('<p><img src="'.$blocks[1][1].'" alt="Wahlplakat"></p>');
question($blocks[1][0]);
</code>


===== Seiten rotieren =====

Es sind natürlich auch mehrere Fragen pro Block denkbar -- allerdings lässt sich so etwas in aller Regel einfacher mittels ''[[:de:create:functions:setpageorder|setPageOrder()]]'' lösen. Dabei werden unterschiedliche Seiten des Fragebogens in (z.B.) zufälliger Reihenfolge dargeboten.

Die Seitenabfolge muss auf der Seite __vor__ der ersten zu rotierenden Seite erfolgen. Außerdem muss beim **Fragebogen zusammenstellen** jeder Seite eine eindeutige Kennung zugeteilt werden. Im folgenden Beispiel wäre das "B1", "B2", ... "B5". Auch die darauffolgende Seite muss eine Kennung erhalten (z.B. "SD").

<code php>
if (!isset($seiten)) {
  // Liste der Seiten definieren
  $seiten = array('B1','B2','B3','B4','B5');
  // Liste mischen
  shuffle($seiten);
  // Die Seite ergänzen, wo es nachher weiter geht
  $seiten[] = 'SD';
  // Reihenfolge zwischenspeichern, um spätere Änderung zu vermeiden
  registerVariable($seiten);
}
setPageOrder($seiten);
</code>

**Hinweis:** Wann immer Sie ''isset()'' einsetzen, um eine spätere Veränderung der Reihenfolge (z.B. durch Verwendung des Zurück-Knopfes) zu vermeiden, können Sie die Variable (hier: ''$seiten'') nur einmal im Fragebogen verwenden. Sollten Sie mehrere derartige Bereiche benötigen, variieren Sie den Namen der Variable, z.B. ''$seiten1'' und ''$seiten2''.


===== Rotation von Frageblöcken =====

Ebenso wie einzelne Seiten können auch Blöcke mehrere Seiten rotiert werden. Der einzige Unterschied ist, dass jedem dieser Blöcke unter **Fragebogen zusammenstellen** eine Kennung für die jeweils erste und letzte Seite zugeordnet werden (z.B. "B1Start" und "B1End", "B2Start" und "B2End" u.s.w.). Und auch die erste Seite nach dem Bereich bekommt wieder eine Kennung ("SD").


==== Zufällige Rotation ====

**Wichtig:** Wenn Sie mehrere Seiten(blöcke) im Fragebogen rotieren möchten, verwenden sie den Befehl ''[[:de:create:functions:setpageorder|setPageOrder()]]'' anstatt des folgenden PHP-Codes.

<code php>
if (!isset($blocks)) {
  // Liste der Seiten definieren
  $blocks = array('B1Start-B1End','B2Start-B2End','B3Start-B3End');
  // Liste mischen
  shuffle($blocks);
  // Die Seite ergänzen, wo es nachher weiter geht
  $blocks[] = 'SD';
  // Reihenfolge zwischenspeichern, um spätere Änderung zu vermeiden
  registerVariable($blocks);
}
setPageOrder($blocks);
</code>


==== Systematische Rotation ====

Mitunter ist es nicht nur erforderlich, Reihenfolge-Effekte zu randomisieren, sondern aktiv zu kontrollieren. Dies lässt sich erreichen, indem man eine Variante (Reihenfolge) mittels [[:de:create:questions:random|Zufallsgenerator]] zieht und dann mittels `setPageOrder()` festlegt.

Bei 3 Blöcken (siehe obigens Beispiel) wären das 6 mögliche Varianten der Reihenfolge. Im Zufallsgenerator würde man also 6 Zettel/Codes wie folgt vorbereiten:

<code>
1 = B1Start-B1End, B2Start-B2End, B3Start-B3End
2 = B1Start-B1End, B3Start-B3End, B2Start-B2End
3 = B2Start-B2End, B1Start-B1End, B3Start-B3End
4 = B2Start-B2End, B3Start-B3End, B1Start-B1End
5 = B3Start-B3End, B1Start-B1End, B2Start-B2End
6 = B3Start-B3End, B2Start-B2End, B1Start-B1End
</code>

Bei **Fragebogen zusammenstellen** auf der Fragebogen-Seite unmittelbar vor "B1Start" wird dann der Zufallsgenerator (z.B. "RG01") in die Fragebogen-Seite gezogen. Darunter wird der folgende PHP-Code platziert:

<code php>
$order = value('RG01', 'label');
setPageOrder($order, 'SD');
</code>

"SD" wäre auch hier wieder die Seite, die auf B3End folgt, also gene Seite, wo es in allen Gruppen nach Abarbeiten der Seitenabfolge weitergehen soll.


===== Rotation und Mischen von Blöcken ======

Sollen zusätzlich zu den Blöcken (jeweils bestehend aus mehreren Seiten) auch noch deren Seiten gemischt werden? Dann benötigt man verschachtelte Arrays und muss ''shuffle()'' sowohl auf die inneren wie auch auf die äußeren Arrays anwenden.

Die Seiten innerhalb der Blöcke müssen in diesem Fall in einem Array einzeln angegeben werden ('''B1Start','B1B','B1C','B1End'''). Die Angabe eines Bereichs (z.B. '''B1Start-B1End''') würde keine Rotation innerhalb dieses Bereichs erlauben.

<code php>
if (!isset($blocks)) {
  // Liste der Seiten definieren
  $blocks = array(
    // Block 1
    array('B1A', 'B1B', 'B1C'),
    // Block 2
    array('B2A', 'B2B', 'B2C', 'B2D'),
    // Block 3
    array('B3A', 'B3B')
  );
  // Jeden einzelnen Block in sich mischen
  for ($i=0; $i<count($blocks); $i++) {
    shuffle($blocks[$i]);
  }
  // Liste der Blöcke mischen
  shuffle($blocks);
  // Die Seite ergänzen, wo es nachher weiter geht
  $blocks[] = 'SD';
  // Reihenfolge zwischenspeichern, um spätere Änderung zu vermeiden
  registerVariable($blocks);
}
setPageOrder($blocks);
</code>