Liebe Community,
ich arbeite an einem experimentellen Studiendesign mit zweistufiger Randomisierung und stehe vor einem Problem, das ich allein nicht eindeutig lösen kann. Vielleicht hat jemand von euch eine Lösung oder einen Hinweis.
Studiendesign
Ich habe ein 2×5-Design mit 9 Bedingungen (Kontrolle plus 8 Treatments). Die Randomisierung läuft zweistufig:
RG01 (Seite 2; Control vs. Treatment): Erste Zufallsziehung mit Urnenmodus, 7 Zettel (1× Control, 6× Treatment) - ergibt eine Gewichtung von 1:6 zugunsten der Treatments.
RG02 (Seite 3; Treatmentcondition): Zweite Zufallsziehung mit Urnenmodus, 8 Zettel (je 1× Decrease 5/10/15/20 % und Increase 5/10/15/20 %) - verteilt die Treatment-Teilnehmenden gleichmäßig auf die 8 Treatment-Bedingungen.
Auf Seite 3 habe ich die Filterbedingung value('RG01') != 1 gesetzt, damit RG02 nur ausgeführt wird, wenn der Teilnehmer in RG01 ein Treatment gezogen hat.
Auf Seite 6 wertet ein PHP-Block die Werte von RG01 und RG02 aus und mappt sie auf die finalen Bedingungsvariablen.
Problem: Bei der Kontrolle der Daten ist mir aufgefallen: Auch bei Kontroll-Teilnehmenden (RG01 = 1) erscheint im Datenexport ein RG02-Wert zwischen 1 und 8. Die Urne von RG02 wird also offenbar trotz der Filterbedingung auf Seitenebene konsumiert, obwohl die Seite selbst übersprungen wird.
Konkret in einem aktuellen Test-Datensatz (N = 13):
11 Treatment-Teilnehmer (RG01 ≠ 1)
2 Kontroll-Teilnehmer (RG01 = 1)
Gesamtsumme der RG02-Ziehungen über alle Teilnehmer: 13 (statt erwarteter 11)
Das heißt also, dass zie zwei Kontroll-Teilnehmer jeweils einen RG02-Zettel "verbraucht" haben, obwohl sie der Kontrollbedingung zugewiesen wurden.
Die Folge für die Hauptstudie
In meiner Hauptstudie sind 560 Teilnehmende geplant (rechnerisch 80 Kontrollen, 480 Treatments). Wenn jede Kontrollperson zusätzlich einen RG02-Zettel konsumiert, wird die Urne unnötig oft neu gefüllt - und damit kann die Zellenbalance der 8 Treatment-Bedingungen verzerrt werden, gerade bei kleineren Stichproben oder unausgeglichener Reihenfolge der Kontroll- vs. Treatment-Teilnehmer.
Frage: Wie bringe ich SoSci dazu, RG02 wirklich nur dann auszuführen, wenn die Filterbedingung value('RG01') != 1 erfüllt ist? Mein Eindruck ist, dass die Seitenfilterbedingung zwar die Anzeige der Seite blockiert, aber den Zufallsgenerator selbst trotzdem auslöst.
Ich habe in den Konfigurationsoptionen des Zufallsgenerators (Tabs Ziehung, Verwaltung, Inhalte anzeigen, Variablen) keine Möglichkeit gefunden, eine Bedingung direkt am Element zu setzen. Auch die Einstellung "Los nur bei abgeschlossenen Fällen ziehen" scheint hier nicht zu greifen - sie verhindert nur den Verbrauch bei abgebrochenen Sessions, nicht bei übersprungenen Seiten.
Gibt es eine Einstellung, die ich übersehen habe? Oder ist die saubere Lösung, RG02 komplett aus den Zufallsgeneratoren zu nehmen und stattdessen die Treatment-Auswahl per mt_rand() direkt im PHP-Block des nachgelagerten Mappings zu erzeugen?
Vielen Dank für eure Hilfe!
Anbei noch der komplette PHP-Codeblock:
$rg01 = value('RG01');
if ($rg01 == 1) {
// Kontrolle - RG02 wurde uebersprungen
$condition = 1;
$direction = 'control';
$magnitude = 0;
$sc_text = 'SC11';
$sc_shop = 'SC01';
} else {
// Treatment - RG02 wurde gezogen
$rg02 = value('RG02');
$treatment_map = array(
1 => array('cond' => 2, 'dir' => 'decrease', 'mag' => -5, 'text' => 'SC12', 'shop' => 'SC02'),
2 => array('cond' => 3, 'dir' => 'decrease', 'mag' => -10, 'text' => 'SC13', 'shop' => 'SC03'),
3 => array('cond' => 4, 'dir' => 'decrease', 'mag' => -15, 'text' => 'SC14', 'shop' => 'SC04'),
4 => array('cond' => 5, 'dir' => 'decrease', 'mag' => -20, 'text' => 'SC15', 'shop' => 'SC05'),
5 => array('cond' => 6, 'dir' => 'increase', 'mag' => 5, 'text' => 'SC16', 'shop' => 'SC06'),
6 => array('cond' => 7, 'dir' => 'increase', 'mag' => 10, 'text' => 'SC17', 'shop' => 'SC07'),
7 => array('cond' => 8, 'dir' => 'increase', 'mag' => 15, 'text' => 'SC18', 'shop' => 'SC08'),
8 => array('cond' => 9, 'dir' => 'increase', 'mag' => 20, 'text' => 'SC19', 'shop' => 'SC09')
);
$t = $treatment_map[$rg02];
$condition = $t['cond'];
$direction = $t['dir'];
$magnitude = $t['mag'];
$sc_text = $t['text'];
$sc_shop = $t['shop'];
}
// Abgeleitete Variablen fuer die Analyse berechnen
$magnitude_abs = abs($magnitude); // 0, 5, 10, 15, 20
$magnitude_c = $magnitude_abs - 10; // -10, -5, 0, 5, 10 (zentriert)
$magnitude_sq = $magnitude_c * $magnitude_c; // 100, 25, 0, 25, 100
// Direction-Dummy als if-else (statt ternaerem Operator)
if ($direction == 'increase') {
$direction_dum = 1;
} else {
$direction_dum = 0;
}
$mag_x_dir = $magnitude_c $direction_dum;
$magsq_x_dir = $magnitude_sq $direction_dum;
// Alle Variablen persistieren
put('VA01_01', $condition);
put('VA02_01', $direction);
put('VA03_01', $magnitude);
put('VA04_01', $magnitude_abs);
put('VA05_01', $magnitude_c);
put('VA06_01', $magnitude_sq);
put('VA07_01', $direction_dum);
put('VA08_01', $mag_x_dir);
put('VA09_01', $magsq_x_dir);
// Textbausteine fuer Vortext und Shop-Bild anzeigen
text($sc_text);
text($sc_shop);