0 votes
in SoSci Survey (dt.) by SoSci Survey (325k points)

Dies ist die Fortsetzung der Frage:
Randomisierung

Mit der Zusammenfassung der Randomisierung wie folgt:

Block 1 (Referenz vorgegeben)
-> 10 der 20 Stimuli (jeweils 2 pro Bereich)

-> Je 1 Stimulus pro Bereich mit gain-frame präsentiert und
-> Je 1 Stimulus pro Bereich mit loss-frame präsentiert

-> Outcome wird zufällig rotiert (5-mal pos, 5-mal neg.)

Block 2 (Referenz selbst gewählt)
-> Wie Block 1, und es sollen die 10 Situationen verwendet werden, die in Block 1 noch nicht dran waren.
-> Hier aber jeweils 2 Seiten statt einer

1 Answer

0 votes
by SoSci Survey (325k points)
edited by SoSci Survey

Ich bin ein größer Freund davon, mit wenigen Seiten zu arbeiten, denn das erlaubt in Rotationen und Randomisierungen mehr Kontrolle über die Inhalte. Ich würde deshalb in beiden Blöcken immer wieder dieselben beiden Seiten mittels loopToPage() wiederholen. IIm Block 1 (wo immer der kommt) wird dann eine der beiden Seiten übersprungen.

Wir brauchen außerdem eine Datenstruktur für die Stimuli - nicht zu verwechseln mit den Daten, die Sie am Ende bekommen. Und zwar würde ich für Ihre Rotation empfehlen, dass Sie diese nach Bereichen gliedern. Es sind 5 Bereiche à 4 Stimuli. Also z.B.

$stimuli = [
    1 => [1,2,3,4],
    2 => [5,6,7,8],
    ...
    5 => [17,18,19,20]
];

Wenn Sie sich das als Tabelle mit 4 Spalten vorstellen und die Zeilen in sich jeweils rotieren, dann haben Sie bereits pro Spalte die Stimuli für Block 1a, Block 1b, Block 2a und Block 2b.

Block1a (loss frame) und Block (1b) werden dann nochmal unterneinander gemischt, keine Sorge. Also, beginnen wir mit dem Mischen jeder Zeile.

foreach (array_keys($stimuli) as $bereich) {
    shuffle($stimuli[$bereich]);
}
debug($stimuli);

Jetzt können wir unsere Teilblöcke bauen. Block 1 bekommt die erste und zweite Spalte, einmal mit gain-frame (1) und einmal mit loss-Frame (2).

$block1 = [];
// Erstmal Block 1a
foreach (array_keys($stimuli) as $bereich) {
  // Die Liste $block wird jedesmal um ein Element ergänzt
  $block1[] = [
    $stimuli[$bereich][0],  // Die erste Spalte aus dem gemischten Array von oben
    1  // Code für das gain-Frame
  ];
}
// Und dann Block 1b
foreach (array_keys($stimuli) as $bereich) {
  // Die Liste $block wird jedesmal um ein Element ergänzt
  $block1[] = [
    $stimuli[$bereich][1],  // Die zweite Spalte aus dem gemischten Array von oben
    2  // Code für das loss-Frame
  ];
}
// Das Ergebnis können wir uns schonmal ansehen
debug($block1);

Hier die Ausgabe des Ergebnis soweit:

Fügen wir noch eine dritte Spalte mit dem pos/neg Outcome hinzu:

$outcomes = [1,1,1,1,1,2,2,2,2,2];
shuffle($outcomes);
foreach (array_keys($block1) as $i) {
    $block1[$i][2] = $outcomes[$i];
}

Und zur Sicherheit notieren wir auch die Block-Nummer noch als vierte Spalte:

foreach (array_keys($block1) as $i) {
    $block1[$i][3] = 1;
}

Die Reihenfolge der Zeilen mischen wir noch:

shuffle($block1);
debug($block1);

Das Ergebnis ist m.E. schon ganz brauchbar:

Wenn man diese Zeilen nun von oben nach unten abarbeitet, dann startet man mit: Stimulus 19 im loss-Frame, das negative Outcome kommt zuerst und das Ganze gehört zu Block 1.

Block 2 kann man analog in eine zweite Variable schreiben. Und das Zusammenbauen der beiden Variablen mittels array_merge() in der Reihenfolge 1/2 oder 2/1 (das kann man mittels Zufallsgenerator entscheiden) sollte auch kein Problem sein. Wenn soweit alles passt (?), machen wir weiter :)

by s265976 (130 points)
>Wenn Sie sich das als Tabelle mit 4 Spalten vorstellen und die Zeilen in sich jeweils rotieren, dann haben Sie bereits pro Spalte die Stimuli für Block 1a, Block 1b, Block 2a und Block 2b.

Müssen dann vier Arrays erstellt werden?
Z.B $stimuli_GF_V ,    $stimuli_LF_V,    $stimuli_GF_S,    $stimuli_LF_S mit jeweils 4 Situationen?
Oder ein Array wie von Ihnen beschrieben, das bis 20 reicht?

Hab ich das richtig verstanden, dass Sie unter Block 1a) und Block 1b), die Situationen mit vorgegebenen Refpunkt meinen (a als lossframe und b als gainframe) ?

Bei einer Codezeile bin ich ein wenig verunsichert:
 "2  // Code für das gain-Frame " meinten Sie hier loss-frame?
by SoSci Survey (325k points)
> Oder ein Array wie von Ihnen beschrieben, das bis 20 reicht?

So, wie es oben steht. In dem Ausgangs-Array ist jede Zeile ein Bereich und jeder Eintrag eine Situation.

Für Block 2 verwenden Sie natürlich die Spalten 3 und 4  (Indizes 2 und 3), damit jede Situation nur einmal vorkommt.

> Hab ich das richtig verstanden, dass Sie unter Block 1a) und Block 1b), die Situationen mit vorgegebenen Refpunkt meinen (a als lossframe und b als gainframe) ?

Ja, korrekt. Block 2 wäre dann mit selbstgewähltem Referenzpunkt.

> Bei einer Codezeile bin ich ein wenig verunsichert:
> "2  // Code für das gain-Frame " meinten Sie hier loss-frame?

Gut beobachtet. Ich korrigiere den Kommentar oben.
by s265976 (130 points)
Also eher ein mehrdimensionales Array so:
$stimuli = [
    1 => [
        1 => ['FI01_01', 'FI03_01', 'FI05_01', 'FI07_01'],
        2 => ['FI02_01', 'FI04_01', 'FI06_01', 'FI08_01']
    ],
    2 => [
        1 => ['GE01_01', 'GE07_01', 'GE13_01', 'GE19_01'],
        2 => ['GE02_01', 'GE08_01', 'GE14_01', 'GE20_01']
    ],
    3 => [
        1 => ['KO01_01', 'KO07_01', 'KO13_01', 'KO19_01'],
        2 => ['KO02_01', 'KO08_01', 'KO14_01', 'KO20_01' ]
    ],
    4 => [
        1 => ['SB01_01', 'SB07_01', 'SB13_01', 'SB19_01'],
        2 => ['SB02_01', 'SB08_01', 'SB14_01', 'SB20_01']
    ],
    5 => [
        1 => ['WO01_01', 'WO07_01', 'WO13_01', 'WO20_01'],
        2 => ['WO02_01', 'WO08_01', 'WO14_01', 'WO19_01']
    ]
];

Oder muss noch zusätzlich eine Dimension angehängt werden wegen den vorgegebenen und selbstgewählten Refpunkten?

Wenn ich den Code so in den Fragebogen packe, dann wird nichts ausgegeben.
by SoSci Survey (325k points)
> Also eher ein mehrdimensionales Array so

Nein, Sie sollten wirklich 1:1 bei dem Array bleiben, wie ich es oben beschrieben habe. Erstmal geht es nur um die Rotation der Informationen, noch nicht um die SoSci-Kennungen, die dazu gehören.

Die Zuordnung, was alles zu Situation 1 gehört, erfolgt dann bei der Ausgabe. Dafür können Sie dann z.B. eine Liste anlegen, welche die Nummern konkreten Kennungen zuordnet:

$texts =  [
  1 => 'FI01_01',
  2 => 'FI03_01',
  3 => 'FI05_01',
  4 => 'FI07_01',
  5 => 'FI02_01',
  ...
];

Und wenn Sie dann aus dem Loop ...

$blockGesamt = array_merge(
    $block1,
    $block2
);

$i = loopToPage('second', count($blockGesamt));
$line = $blockGesamt[$i];

... die Informationen für eine spezifische Zeile haben, dann können Sie damit den passenden Text anzeigen.

$situation = $link[0];
$textID = $texts[$situation];
text($textID);


Aber wie gesagt: Die Ausgabe ist erst der zweite Schritt zunächst einmal muss die Logik der Rotation gebaut werden. Man könnte das schon versuchen zu mischen, aber damit macht man es nur unnötig komplex, und Sie tun sich am Ende bei der Auswertung schwerer.
by s265976 (130 points)
Vielen Dank für die Erklärung. Soweit habe ich alles verstanden.
Wir können gerne zu Schritt 2 übergehen.
by SoSci Survey (325k points)
Okay, den ersten Schritt für die Anzeige habe ich ja schon angedeutet:

$i = loopToPage('second', count($blockGesamt));
$line = $blockGesamt[$i];

$situation = $link[0];
$textID = $texts[$situation];
text($textID);

Die Variable $line liefert Ihnen alle Informationen, was Sie anzeigen und abfragen möchten und was nicht. Zum Beispiel würden Sie zu Beginn der ersten Seite folgenden PHP-Code verwenden, um die Seite in Block-1-Fällen zu überspringen:

if ($line[3] == 1) {
  goToPage('next');
}

Wie weit funktioniert die Ausgabe bei Ihnen denn schon und wo hakt es noch?
by s265976 (130 points)
Es funktioniert noch überhaupt nichts.

Wenn ich mir nach array_merge die debug ausgabe dazu geben, muss ich feststellen, dass eine Situationen in beiden Blöcken abgefragt wird, was ja nicht der Fall sein sollte.

Ausserdem muss auch die Texte der Outcomes zuweisen und bei diesen Zuweisungsbefehlen weiss ich nicht 1. Wo sie im Code stehen müssen und 2. wie sie exakt definiert werden müssen.

Momentan wird noch gar nichts angezeigt und ausserdem erscheinen nur einige Fehlermeldungen:
-Für die Funktion text() wurde anstatt einer Kennung ein Parameter vom Typ NULL angegeben.
-Die PHP-Variable $link wurde verwendet, in diesem PHP-Code aber noch nicht definiert (sie enthält noch keinen Wert).
by SoSci Survey (325k points)
> Wenn ich mir nach array_merge die debug ausgabe dazu geben, muss ich feststellen, dass eine Situationen in beiden Blöcken abgefragt wird, was ja nicht der Fall sein sollte.

Okay, dann posten Sie doch bitte mal den kompletten PHP-Code, wie Sie ihn bisher zusammengestellt haben. Am besten in einer neuen Frage, damit es ein wenig übersichtlicher ist. Danke.

> Ausserdem muss auch die Texte der Outcomes zuweisen

Die Reihenfolge der Outcomes wird in der Spalte 3 (Index 2) rotiert. Die Kennung der Frage selbst ermitteln Sie wie bei den Texten ($texts) über ein Array oder zwei.

> Für die Funktion text() wurde anstatt einer Kennung ein Parameter vom Typ NULL angegeben.

Dann funktioneirt hier der Zugriff auf das Array noch nicht so, wie er sollte. Lassen Sie sich mittels debug() den Wert des Schlüssels ausgeben, den Sie beim Array-Zugriff verwenden, also z.B.

$situation = $link[0];
$textID = $texts[$situation];
debug($situation);
debug($textID);

> Die PHP-Variable $link wurde verwendet, in diesem PHP-Code aber noch nicht definiert (sie enthält noch keinen Wert).

Ja, es solte $line heißen, nicht $link, das was ein Typo.

Willkommen im Online-Support von SoSci Survey.

Hier bekommen Sie schnelle und fundierte Antworten von anderen Projektleitern und direkt von SoSci Survey.

→ Eine Frage stellen


Welcome to the SoSci Survey online support.

Simply ask a question to quickly get answers from other professionals, and directly from SoSci Survey.

→ Ask a Question

...