Dies ist eine alte Version des Dokuments!
Der Zufallsgenerator ist ein funktionaler Baustein für den Fragebogen. Das Element zieht aus einer vorgegebenen Liste von Elementen (Zettel) eines und speichert dessen Wert in eine Variable. Der gezogene Wert kann mittels value()
ausgelesen und in einem Filter verwendet werden, um Inhalte des Fragebogens zufällig zu variieren. So lassen sich Teilnehmer etwa zufällig zu Experimentalgruppen zuordnen.
Der Zufallsgenerator ist eine Weiterentwicklung der Urnen-Funktion und sorgt (wie die Urne) standardmäßig dafür, dass alle Zettel gleich häufig gezogen werden (Option Art der Ziehung). Das ist vor allem dann wichtig, wenn die Experimentalgruppen gleich groß sein sollen. Bei einer uneingeschränkten Zufallsauswahl hingegen kann es (gerade bei überschaubaren Stichproben) passieren, dass die Gruppengrößen massiv abweichen.
Die ausführlichen Beispiele zur Verwendung von Filtern im Rahmen experimenteller Stimuli im Kapitel Randomisierung sind auch auf den Zufallsgenerator übertragbar. Anstatt des Befehls urnDraw()
ist das Zufallsgenerator-Element auf der Fragebogen-Seite zu platzieren. Die gezogenen Zahl lässt sich dann (wie in der Anleitung zu Urnen) über value()
auslesen.
Tipp: Sollte die zufällige Variation nicht wie gewünscht funktionieren, liefern die Debug-Informationen im Fragebogen in aller Regel schnell eine Antwort. Mehr dazu s. Problemlösung bei Filterfragen.
In diesem Beispiel wird die Verwendung in einem Experiment mit 3 Experimentalgruppen (jeweils ein Bildstimulus) und einer Kontrollgruppe (kein Bildstimulus) beschrieben.
Datei.jpg
ist etwas anderes als datei.JPG
).1 = stimulusA.jpg 2 = stimulusB.jpg 3 = stimulusC.jpg 4 = Kontrollgruppe
Unter Fragebogen zusammenstellen ziehen Sie den Zufallsgenerator auf die Seite, wo das Bild erscheinen soll. Darunter (!) platzieren Sie folgenden PHP-Code (s. auch Einführung in PHP-Code):
// Auslesen der numerischen Codes (1 bis 4) $code = value('ZG01'); // Die Kontrollgruppe muss anders behandelt werden if ($code == 4) { // Kontrollgruppe - nichts anzeigen } else { // Die Beschriftung ist als Wertelabel hinterlegt - im Beispiel ist das der Bildname $bild = value('ZG01', 'label'); // Das HTML-Tag <img> zeigt ein Bild an, der Dateiname wird mit src angegeben html(' <div style="margin: 3em; text-align: center"> <img src="'.$bild.'" alt="" /> </div> '); }
Nicht jede experimentelle Variation ist mit der Anzeige eines einzelnen Bildes erledigt. Der folgende PHP-Code zeigt, wie an anderer Stelle zusätzlich noch ein weiteres Bild variiert wird. Die Variation erfolgt parallel zum ersten Bild – wer also oben Bild 1a zu sehen bekam, der sieht an dieser Stelle nun Bild 1b.
Diesmal wird der Dateiname für das Bild nicht direkt im Zufallsgenerator hinterlegt (wie oben), sondern in einem Array (Einführung in Arrays), welches jeder Experimentalgruppe (1 bis 4) mittels =>
einen Dateinamen zuweist.
// Auslesen der numerischen Codes (1 bis 4) $code = value('ZG01'); // Die Kontrollgruppe muss (auch hier) anders behandelt werden if ($code == 4) { // Kontrollgruppe - nichts anzeigen } else { // Array, welches für jede Gruppe ein Bild hinterlegt $bilder = array( 1 => 'stimulusA2.jpg', 2 => 'stimulusB2.jpg', 3 => 'stimulusC2.jpg' ); // Mit eckigen Klammern wird ein Element aus dem Array gelesen $bild = $bilder[$code]; // Anzeige des Bildes wie oben html(' <div style="margin: 3em; text-align: center"> <img src="'.$bild.'" alt="" /> </div> '); }
Hinweis: Dieser PHP-Code funktioniert nur, wenn im selben Interview vorher schon die Seite mit der Zufallsgenerator-Frage aufgerufen wurde. Falls Sie das Interview zum Testen direkt auf der Seite mit dem PHP-Code (aber ohne Zufallsgenerator, der ja schon weiter vorne steht) starten, erhalten Sie eine Fehlermeldung.
Anstatt eines Bildes kann natürlich auch die angezeigte Frage variiert oder ein Textbaustein eingebunden werden. Der folgende PHP-Code zeigt einen individuellen Textbaustein an (anzulegen unter Textbausteine u. Beschriftungen – und in den Gruppen 1 und 2 die Frage AB01
, in den anderen Gruppen die Frage BB01
.
// Auslesen der numerischen Codes (1 bis 4) $code = value('ZG01'); // Textbaustein variieren if ($code == 1) { text('text EG1'); } elseif ($code == 2) { text('text EG2'); } elseif ($code == 3) { text('text EG3'); } elseif ($code == 4) { text('text KG'); } // Frage variieren if (($code == 1) or ($code == 2)) { question('AB01'); } else { question('BB01'); }
Tipp: Sehen Sie sich neben text()
und question()
auch die Befehle replace()
und setPageOrder()
an.
In diesem Beispiel geht es um 300 Bilder, die von Teilnehmern bewertet werden sollen. Dabei soll jeder Teilnehmer 20 unterschiedliche Bilder bewerten – jedes Bild auf einer eigenen Seite.
AB01
bis AB20
– die Funktion „Frage duplizieren“ oben über einer zum Bearbeiten geöffneten Frage spart hier viel Zeit. Falls es nur eine Bewertung pro Bild ist, können Sie auch eine Frage mit 20 Items anlegen.
Legen Sie unter Fragebogen zusammenstellen eine (!) Seite für die Anzeige der Bilder und ggf. zugehöriger Fragen an. Auf dieser Seite platzieren Sie den Zufallsgenerator und darunter folgenden PHP-Code (s. auch Einführung in PHP-Code). Der Befehl loopPage()
sorgt dafür, dass dieselbe Seite mehrfach mit unterschiedlichem Inhalt angezeigt wird. Der Befehl sprintf()
formatiert eine Zahl – im PHP-Code wird eine zweistellige Zahl mit führender 0 erstellt (also z.B. wird 3 zu „03“).
// loopPage(20) liefert eine Zahl von 0 bis 19 (eins mehr bei jeder Wiederholung) $i = loopPage(20); // Hier die Zahl der zu zeigenden Bilder eintragen // Das ausgewählte Bild anzeigen $varID = 'ZG03x'.sprintf('%02d', $i + 1); // Die Variablennamen lauten ZG03x01 bis ZG03x20 $img = value($varID, 'label'); // Das HTML-Tag <img> zeigt ein Bild an, der Dateiname wird mit src angegeben html(' <div style="margin: 3em; text-align: center"> <img src="'.$img.'" alt="" /> </div> '); // Die passende Frage-Kennung erstellen und die Frage mittels question() anzeigen question(id('AB', $i + 1)); // Frage-Kennungen AB01 bis AB20
Falls Sie nicht 20 Fragen (AB01
bis AB20
), sondern nur eine Frage AB01 mit 20 Items erstellt haben, ersetzen Sie die letzten 3 Zeilen wie folgt. Das +1 hinter der Variable $i
ist erforderlich, weil loopPage()
bei 0 zu zählen beginnt und nicht bei 1.
// Das passende Item aus der Frage mittels question() anzeigen question('AB01', $i+1);
Im folgenden Beispiel sollen die Teilnehmer unterschiedliche politische Parteien hinsichtlich einer Vielzahl von Kriterien beurteilen. Insgesamt sollten 6 Parteien bewertet werden – allerdings soll jeder Teilnehmer nur 2 zufällig ausgewählte Parteien vorgelegt bekommen.
Diese Variante speichert die Antworten zur ersten gezogenen Partei immer in die gleichern Variablen. Wenn Sie pro Partei z.B. 20 Variablen verwenden, hat Ihr Datensatz also 40 Variablen für die Partei-Bewertungen. Das ist übersichtlich, macht die Auswertung aber ein wenig schwieriger, weil die Antworten zu den Grünen mal im Variablenset P1xx
und mal im Set P2xx
stehen. Verwenden Sie diese Variante, wenn Sie (a) viele Gegenstände zu bewerten haben und (b) mit Datensätzen in der Auswertung gut umgehen können.
P1
) mit allen Fragen an, welche zu einer Partei gestellt werden sollen. Anstatt des Parteinamens tragen Sie jeweils den Platzhalter %partei%
ein.P2
bekommt.P1
und P2
an den gewünschten Stellen. Im Beispiel wird angenommen, dass erst alle Fragen aus P1
und dann alle Fragen aus P2
gestellt werden. Wenn die Fragen gemischt werden sollen, müssten unterschiedliche Platzhalter (z.B. %partei1%
und %partei2%
) in den Fragen und Items verwendet werden.1 = CDU/CSU 2 = SPD 3 = Die Grünen 4 = Die Linke 5 = Piraten 6 = AfD
Platzieren Sie den Zufallsgenerator unter Fragebogen zusammenstellen auf der ersten Seite mit einer P1
-Frage (oder vorher). Darunter platzieren Sie folgenden PHP-Code:
$name = value('ZG04x01', 'label'); // Name der Partei (CDU/CSU bis AfD) replace('%partei%', $name);
Von dort an wird in jeder Frage der Platzhalter %partei%
durch den gezogenen Namen ersetzt. Der numerische Code der gezogenen Partei kann ggf. über $code = value('ZG04x01');
ausgelesen werden – etwa um einen Textbaustein mit dem Partei-Logo einzubinden (s. weiter oben).
Auf der ersten Seite mit einer P2
-Frage platzieren Sie entsprechend folgenden PHP-Code:
$name = value('ZG04x02', 'label'); replace('%partei%', $name);
Falls Sie die Fragen zu den beiden Parteien mischen möchten und daher in den Fragen und Items die Platzhalter %partei1%
und %partei2%
verwendet haben, platzieren Sie unter dem Zufallsgenerator einfach folgenden PHP-Code:
$name1 = value('ZG04x01', 'label'); replace('%partei1%', $name1); $name2 = value('ZG04x02', 'label'); replace('%partei2%', $name1);
Ebenfalls möglich ist, dass Sie für jede Partei eigene Fragen anlegen. Wenn Sie pro Partei 20 Variablen abfragen, macht das im Datensatz immerhin 120 Variablen – dafür werden die Bewertungen einer Partei aber immer in denselben Variablen gespeichert. Das Anlegen so vieler Fragen ist natürlich aufwändiger (v.a. wenn im Pretest noch Änderungsbedarf auftaucht) – aber die Auswertung ist deutlich einfacher.
P1
) mit allen Fragen an, welche zu Ihrer ersten Partei gestellt werden sollen.%partei%
eintragen und zu Beginn des jeweiligen Frage-Blocks den Namen mittels replace()
einstellen. Das spart Arbeit.P2
bis P6
bekommen.1 = CDU/CSU 2 = SPD 3 = Die Grünen 4 = Die Linke 5 = Piraten 6 = AfD
Platzieren Sie den Zufallsgenerator unter Fragebogen zusammenstellen auf oder vor der Seite mit der ersten Partei-Frage.
Falls Sie mit dem Platzhalter %partei%
arbeiten, müssen Sie zu Beginn der beiden Blöcke folgenden PHP-Code platzieren:
$name = value('ZG04x01', 'label'); // Beim zweiten Block dann mit ZG04x02 replace('%partei%', $name);
Die Fragen haben nun also die Kennungen P101
für die erste Frage zur ersten Partei (CDU/CSU), P201
für die erste Frage zur zweiten Partei (SPD) u.s.w. Nun gibt es zwei Möglichkeiten, die jeweils gewünschte Frage anzuzeigen: Sie können einen IF-Filter verwenden (s. auch Filterfragen und Filter) oder die Kennung „zusammenbauen“. Das Zusammenbauen ist deutlich kompakter. Falls die Frage-Kennungen nicht perfekt parallel sind (z.B. weil für eine Partei eine zusätzliche Frage gezeigt werden soll), funktioniert an dieser Stelle nur ein Filter.
Den folgenden PHP-Code platzieren jeweils dort, wo die entsprechende Frage gestellt werden soll. Wenn Sie also 9 Fragen pro Partei haben, platzieren Sie den Code 9-mal im Block für die erste Partei und 9-mal im Block für die zweite Partei. Im zweiten Block muss ZU04x01
natürlich gegegen ZU04x02
ausgetauscht werden. Die Frage-Kennungen müssen in jedem PHP-Code angepasst werden.
$code = value('ZG04x01'); $kennung = 'P'.$code.'01'; // Der Punkt (.) verbindet Strings (Texte) question($kennung);
$code = value('ZG04x01'); if ($code == 1) { question('P101'); } elseif ($code == 2) { question('P201'); } elseif ($code == 3) { question('P301'); } elseif ($code == 4) { question('P401'); } elseif ($code == 5) { question('P501'); } elseif ($code == 6) { question('P601'); }
Prinzipiell besteht auch die Möglichkeit, dass Sie alle Fragen zu allen Parteien im Fragebogen platzieren, den Seiten Kennungen vergeben (s. unten, z.B. „P1Begin“, „P1End“, „P2Begin“, „P2End“ u.s.w.) und dann mit setPageOrder()
arbeiten, um die passenden Seiten-Blöcke anzuzeigen.
Diese Variante ist anfälliger gegen Fehler (z.B. dass man irgendwo im Fragebogen eine Frage vergisst) und macht den Fragebogen sehr unübersichtlich. Der Befehl setPageOrder()
ist durchaus sinnvoll, um die Reihenfolge von Frageblöcken zu variieren – nur für die Auswahl von Stimuli zur Anzeige bzw. für das Überspringen von Seiten gibt es i.d.R. bessere Lösungen.
Aufgrund des begrenzten Nutzend von setPageOrder()
für die vorliegende Problematik, wird hier nur knapp PHP-Code gezeigt. Dieser wird auf der letzten Seite eines allgemeinen Teils platziert. Der Code zeigt die beiden Partei-Blöcke getrennt von einem Zwischenteil („middleBegin“ bis „middleEnd“) an und fährt danach auf der Seite mit der Kennung „demografie“ fort. Vor dem PHP-Code ist wieder der oben beschriebene Zufallsgenerator zu platzieren.
$seiten = array(); // Numerischer Code der ersten Partei $code1 = value('ZG01x01'); // Die passenden Seiten in das Array schreiben if ($code1 == 1) { $seiten[] = 'P1Begin-P1End'; } elseif ($code1 == 2) { $seiten[] = 'P2Begin-P2End'; } elseif ($code1 == 3) { $seiten[] = 'P3Begin-P3End'; } elseif ($code1 == 4) { $seiten[] = 'P4Begin-P4End'; } elseif ($code1 == 5) { $seiten[] = 'P5Begin-P5End'; } elseif ($code1 == 6) { $seiten[] = 'P6Begin-P6End'; } // Seiten für den Zwischenteil ergänzen $seiten[] = 'middleBegin-middleEnd'; // Numerischer Code der zweiten Partei $code2 = value('ZG01x02'); // Seiten für die zweite Partei in das Array schreiben if ($code2 == 1) { $seiten[] = 'P1Begin-P1End'; } elseif ($code2 == 2) { $seiten[] = 'P2Begin-P2End'; } elseif ($code2 == 3) { $seiten[] = 'P3Begin-P3End'; } elseif ($code2 == 4) { $seiten[] = 'P4Begin-P4End'; } elseif ($code2 == 5) { $seiten[] = 'P5Begin-P5End'; } elseif ($code2 == 6) { $seiten[] = 'P6Begin-P6End'; } // Festlegen, wo es dann weitergeht $seiten[] = 'demografie'; // Seitenabfolge festlegen setPageOrder($seiten);
Auch dieser PHP-Code lässt sich prinzipiell wieder kompakter schreiben, wenn man die Kennungen der Seiten „zusammenbaut“:
$code1 = value('ZG01x01'); $code2 = value('ZG01x02'); setPageOrder( 'P'.$code1.'Begin-P'.$code1-'End', 'middleBegin-middleEnd', 'P'.$code2.'Begin-P'.$code2-'End', 'demografie' );
Der Fragebogen in diesem Beispiel gehört zu einem Within-Subject Experimentaldesign. Im Fragebogen gibt es einen allgemeinen Teil, dann einige Seiten mit dem ersten Stimulus, dann einige Seiten Puffer und dann Seiten zum zweiten Stimulus. Die Abfolge der beiden Stimulus-Teile im Fragebogen soll zufällig variiert werden.
1 = Experimentalgruppe 1 2 = Experimentalgruppe 2
Unter Fragebogen zusammenstellen ziehen Sie den Zufallsgenerator auf die letzte Seite des allgemeinen Teils. Die darauf folgende Seite sollte entsprechend die Kennung „beginA“ haben.
Unter dem Zufallsgenerator fügen Sie folgenden PHP-Code ein (s. auch Einführung in PHP-Code). Der Befehl setPageOrder()
sorgt dafür, dass die Seiten in der gewünschten
$code = value('ZG02'); if ($code == 1) { // Normale Reihenfolge beibehalten - man könnte den Befehl also auch einfach weglassen... setPageOrder('beginA-endA', 'beginMiddle-endMiddle', 'beginB-endB', 'final'); } else { // Umgekehrte Reihenfolge der Teile A und B setPageOrder('beginB-endB', 'beginMiddle-endMiddle', 'beginA-endA', 'final'); }
Arbeitet man mit vielen Experimentalgruppen, kann es sein, dass die eigentlich erfolgreiche Gleichverteilung nach der Bereinigung verloren geht. Gerade wenn die Fallzahl pro Gruppe sehr klein ist, schlagen die Fälle zu Buche, die bei der Bereinigung (z.B. aufgrund des Manipulation Check) gelöscht werden müssen. Dann kann es sein, den Zufallsgenerator während der Erhebung geringfügig anzupassen.
Warnung: Das Nachjustieren der Zufallsauswahl sollte nur dann erfolgen, wenn die Teilnehmer kontinuierlich und aus derselben Grundgesamtheit rekrutiert werden. Sonst besteht die Gefahr einer Konfundierung: Man stelle sich ein Experiment mit 4 Gruppen vor, bei dem die Teilnehmer alle an einem bestimmten Tag eingeladen werden. Nachdem 2/3 der Teilnehmer den Fragebogen ausgefüllt haben, bemerkt man, dass in Gruppe 1 überdurchschnittlich viele Fälle bereinigt werden müssen. Also werden ab sofort mehr Teilnehmer der Gruppe 1 zugeteilt. Nun liegt eine Konfundierung vor, denn Teilnehmer, die auf eine Einladung später reagieren, können sich systematisch von Teilnehmern unterscheiden, die schnell reagieren. Also würden sich die Teilnehmer in Gruppe 1 nun a-priori von Teilnehmern in anderen Gruppen unterscheiden – und damit wären Unterschiede in den abhängigen Variablen nicht mehr alleine auf den experimentellen Stimulus zurückzuführen.
Tipp: In einer Situation, wo man die Zufallsziehung nicht nachträglich anpassen kann, kann man eine Urne verwenden und in urnDraw()
ein manuelles Ablegen der Zettel konfigurieren. Das manuelle Ablegen mittels urnPutAway()
erfolgt nur dann, wenn mit einem Filter überprüft wurde, dass der Fall auch brauchbar ist. Nachteile: Das ist vergleichsweise aufwändig und gerade zu Beginn der Erhebung kann es zu deutlich ungleichen Gruppengrößen kommen.
Sind die Bedingungen für das Nachjustieren (s. oben) erfüllt, so ist das Vorgehen wie folgt:
Code: Anzahl
umgewandelt (s. unten).Die Liste der Codes und verwertbaren Fälle kann z.B. wie folgt aussehen:
111111: 2 111211: 1 111311: 2 111411: 2 112111: 1 112211: 2 112311: 2 112411: 2 u.s.w.
In Excel oder OpenOffice Calc erstellt man solch eine Liste, indem man die zuvor erstellte Häufigkeitstabelle (mit Codes, nicht Beschriftungen) mit folgendem Befehl zusammenfasst (wenn in Spalte A die Codes stehen und in Spalte B die Häufigkeiten):
=VERKETTEN(A1; ": "; B1)
In GNU R kann man Häufigkeitstabelle und Liste wie folgt ausgeben lassen (wenn die Variable des Zufallsgenerators z.B. RG01 heißt):
tmp = table(data$RG01) cat(paste(paste(names(tmp), tmp, sep=": "), collapse="\n"))