0 votes
in SoSci Survey (dt.) by s063148 (175 points)

Die within randomisierung funktioniert gut (auch mit externen Videolinks etc.), danke.

Nun möchte ich aber auch eine andere Möglichkeit implementieren um die Analyse zu erleichtern, und eventuell um die nötige Stichprobe zu senken.
1) Es gibt 20 Experimentalgruppen (Zuweisung der Probanden randomisiert, between). 2) Jede Gruppe sieht eine Kombination von mehreren Stimuli (5) in randomisierter Reihenfolge (within).

1) Zuweisung Experimentalgruppe (Urne). 2) Jetzt kommt der Proband auf eine der 20 "geloopten" Seiten (Experimentalgruppen) für das within design mit mehreren Stimuli (jede Experimentalgruppe besitzt eine eigene Seite mit eigenem Zufallsgenerator für die 5 Stimuli).

Verknüpfungsidee: Die Urne (interne Variable) weist eine Setpageorder zu, sprich die entsprechende loopseite (ST1 = Gruppe 1, ST2 = Gruppe 2) und dann eben die restlichen Seiten des Fragebogens, die aber gleich sind. Z . B.

 setPageOrder('ST1','end');} elseif ($zahl == 2) { setPageOrder('ST2','end');

Ich habe es mit weniger Stimuli getestet und es funktioniert nicht richtig. Nach dem loopen wird die nächste Seite im Fragebogen angezeigt, anstatt die in der setpageorder spezifizierte.

Gibt es hier eine Lösung oder vielleicht eine andere effizientere Verknüpfung für diese Problemstellung?

by SoSci Survey (304k points)
> jede Experimentalgruppe besitzt eine eigene Seite mit eigenem Zufallsgenerator für die 5 Stimuli

Das mit der eigenen Seite finde ich nicht gut, verstehe ich aber. Was ich aber nicht verstehe sind die 20 Zufallsgeneratoren. Was machen diese denn genau? Geht es hier um eine Rotation oder um eine weitere Randomisierung für die 5 Stimuli?

> Ich habe es mit weniger Stimuli getestet und es funktioniert nicht richtig. Nach dem loopen wird die nächste Seite im Fragebogen angezeigt, anstatt die in der setpageorder spezifizierte.

loopPage() und setPageOrder() können nicht kombiniert werden, die eine Funktion beendet/überschreibt die jeweils andere.
by s063148 (175 points)
Im engeren Sinn ist dies eine Rotation, stimmt, da nur die Reihenfolge der Stimuli zufällig variieren soll. Die Zufallsgeneratoren sollen die Reihenfolge der jeweiligen 5 Stimuli innerhalb der Experimentalgruppen rotieren. Eine Experimentalgruppe sieht daher eine zufällige Reihenfolge der Stimulikombination.
Jedem Zufallsgenerator sind 5 unterschiedliche Stimuli zugewiesen.

Bsp:
Zuteilung zu Experimentalgruppe randomisiert.
Experimentalgruppe 1 sieht Stimuli: 1 - 2 - 3 - 4 - 5 (Reihenfolge der Stimuli soll zufällig sein)
Experimentalgruppe 2 sieht Stimuli: 6 - 7 - 8 - 9 - 10 (Reihenfolge der Stimuli soll zufällig sein)
...

Danke für den Hinweis, also loop und setpage Kombi fällt schon mal aus.

Es gibt sicher eine einfachere, elegantere und funktionierende Lösung.
Hätten Sie eine Idee?

1 Answer

0 votes
by SoSci Survey (304k points)

Die Zufallsgeneratoren sollen die Reihenfolge der jeweiligen 5 Stimuli innerhalb der Experimentalgruppen rotieren.

Der Zufallsgenerator wird auch für eine Rotation funktionieren, ist aber eigentlich nicht dafür ausgelegt, sondern für die Ziehung einzelner Stimuli oder Subsets von Stimuli.

Mein Vorschlag wäre, dass Sie einen Zufallsgenerator mit 20 Zetteln anlegen, wobei die Zettel gleich die Stimuli auflisten, die Sie später darbieten möchten. Wenn Sie diese als Komma-Liste ablegen, können sie diese Liste später im Code "zerlegen" und mittels shuffle() mischen.

Alternativ könnte die Urnen-Funktion anstatt des Zufallsgenerators sinnvoll sein, weil diese gleich Kombinationen aus mehreren Inhalten erlaubt. Das Vorgehen ist ansonst das gleiche.

In beiden Fällen würden Sie die Stimuli ziehen, mischen und dann mittels loopPage() nacheinander präsentieren. Das setPageOrder() o.ä. würde wegfallen, weil es überflüssig ist.

Reihenfolge der Stimuli soll zufällig sein

Da müssten Sie nochmal durchrechnen, ob die Reihenfolge wirklich zufällig sien soll - dann ist shuffle() geeignet, oder ob sie nur eine begrenzte Anzahl Teilnehmer haben und deshalb lieber systematisch einige Abfolgen verwenden. Immerhin kann eine zufällige Rotation mit einer gewissen (und bei kleinen Fallzahlen relevanten) Wahrscheinlichkeit zu systematischen Verzerrungen führen.

by s063148 (175 points)
Danke, ich würde gerne die Lösung mit 20 Zetteln und Stimuluskombinationen implementieren (Urne). Nun geht es aber um das korrekte loopen und einbetten.

Meine Schritte wären wie folgt:
1) Eine Urne anlegen mit Zetteln für Kombinationen (Werte werden unter IV01_01 - IV01_05 gespeichert):
1, 2, 3, 4, 5
5, 4, 3, 2, 1
6, 7, 8, 9, 10
...

2) Urnenziehung im Fragebogen
urnDraw('5x', 'IV01')

3) Auf Stimulusseite Auslesen des Urnenzettels (Stimulus ist Video, auf externen Server verlinkt). Wie kann ich sicherstellen, das dass richtige Video angezeigt wird kein Überschreiben etc. (loopen kommt erst weiter unten):
switch (value('IV01_01')) {
  case 1 : $video = 'externer_link1.mp4'; break;
  case 2 : $video = 'externer_link2.mp4'; break;
  case 3 : $video = 'externer_link3.mp4'; break;
  case 4 : $video = 'externer_link4.mp4'; break;
....
}
switch (value('IV01_02')) {
  case 1 : $video = 'externer_link1.mp4'; break;
  case 2 : $video = 'externer_link2.mp4'; break;
  case 3 : $video = 'externer_link3.mp4'; break;
  case 4 : $video = 'externer_link4.mp4'; break;
....
}
// usw. bis IV01_05

html('
    <video width="640" height="360" controls controlsList="nodownload" autoplay id="stimulus">
 <source src="'.$video.'"type="video/mp4"/></video>
  </div>
');

// Spezielle Einstellungen für das Video:
<script type="text/javascript">
<!--
 
var video = document.getElementById("stimulus");
 
// Bedienelemente ausblenden, sobald es abspielt
SoSciTools.attachEvent(video, "play", function(evt) {
  stimulus.removeAttribute("controls");
});
// Weiter-Knopf ausblenden
SoSciTools.attachEvent(window, "load", function(evt) {
  SoSciTools.submitButtonsHide();
});
// Weiter-Knopf am Ende des Videos wieder anzeigen
SoSciTools.attachEvent(stimulus, "ended", function(evt) {
  SoSciTools.submitButtonsDisplay();
});
 
// -->
</script>

4) Loopen der Seite
$i = loopPage(5);  // 5 Videos sollen gezeigt werden
$varID = 'IV01_'.sprintf('%02d', $i + 1) // Die Variablennamen lauten  IV01_01 bis IV01_05.
$video = value($varID, 'label');

5) Fragebatterie (AC) wird auf der Seite eingebettet  - man kann ja nicht über GUI korrekt einbetten. Jedem Video muss die korrekte Frage Kennung zugeordnet werden.
// Die passende Frage-Kennung erstellen und die Frage mittels question() anzeigen
question(id('AC', $i + 1)); // Frage-Kennungen AC01 bis AC05

Das ist vielleicht jetzt etwas viel gefragt, aber das geschulte Auge kann hier sicher effizient helfen wo der Fehler liegt, danke!
by SoSci Survey (304k points)
Verwenden Sie statt value() die Funktion valueList() - dann bekommen Sie die 5 gezogenen Werte aus der Kombination direkt als Array. Das verinfacht das Handling im PHP-Code.

$stimuli = valueList('IV01');
$i = loopPage(count($stimuli));
$code = $stimuli[$i];

> Wie kann ich sicherstellen, das dass richtige Video angezeigt wird

Ich würde dafür ein Array empfehlen, welches einfach für jeden Code die Video-Datei listet:

$videos = array(
  1 => 'externer_link1.mp4',
  2 => 'externer_link2.mp4',
  // u.s.w.
);
$videodatei = $videos[$code];

> kein Überschreiben etc.

Dafür legen Sie Ihre Fragen 5-mal an oder sehen pro Frage 5 Items vor ... was das geschickter ist, kommt auf die Fragen an. Eventuell kopieren Sie auch einfach einer Rubrik 4-mal und, genau Sie können es sich denken, listen die Rubrik-Namen wieder in einem Array. Diesmal aber Index 0.

$rubriken = array(
  0 => 'R1',
  1 => 'R2',
  2 => 'R3',
  3 => 'R4',
  4 => 'R5'
);
$rubrik = $rubriken[$i];

question(id($rubrik, 1));  // Würde jetzt R101, R201, ... oder R501 anzeigen

Ich glaube, damit sind die anderen Fragen auch schon beantwortet, oder?
by s063148 (175 points)
Ich bekomme es noch nicht hin...
Mir sind einige Sachen nicht ganz klar ...  
Auch gibt es einen "Undefined offset: 0" beim array. Anscheinend versucht er eine Array Ziffer (0) zu ziehen, die vorher nicht definiert wurde. Wenn ich aber bei der Defnition der Nummern im Array (externe Links) 0 einfüge, löst es das Problem nicht.

// Ziehe Zettel aus Urne
urnDraw('5x', 'IV01');

// stimuli werden definiert als Wert aus Urne und looping festgelegt anhand Anzahl der stimuli auf dem Zettel
$stimuli = valueList('IV01');
$i = loopPage(count($stimuli));
$code = $stimuli[$i];

// Auflistung der Videos als array, hier genügt der Link, ich definiere später wie es gezeigt werden soll
$videos = array(
  1 => 'https://..../1.mp4?dl=1',
  2 => 'externer_link2.mp4',
  3 => 'externer_link2.mp4',
  4 => 'externer_link2.mp4',
  5 => 'externer_link2.mp4',
  // u.s.w.
);
// das gezeigt Video auf der Seite wird definiert als videodatei
$videodatei = $videos[$code];

// diese videodatei soll wie folgt gezeigt werden, id wird mit stimulus definiert
html('
  <video width="640" height="360" controls controlsList="nodownload" autoplay id="stimulus">
    <source src="'.$videodatei.'" type="video/mp4" /></video>');

// Ausblenden der weiter Knöpfe etc., nehme Bezug auf variable videodatei
<script type="text/javascript">
<!--
 
var video = document.getElementById("videodatei");
 
// Bedienelemente ausblenden, sobald es abspielt
SoSciTools.attachEvent(video, "play", function(evt) {
  stimulus.removeAttribute("controls");
});
// Weiter-Knopf ausblenden
SoSciTools.attachEvent(window, "load", function(evt) {
  SoSciTools.submitButtonsHide();
});
// Weiter-Knopf am Ende des Videos wieder anzeigen
SoSciTools.attachEvent(stimulus, "ended", function(evt) {
  SoSciTools.submitButtonsDisplay();
});
 
// -->
</script>

// Anzeigen der Fragenbatterie
$rubriken = array(
  0 => 'AC01',
  1 => 'AC02',
  2 => 'AC03',
  3 => 'AC04',
  4 => 'AC05'
);
$rubrik = $rubriken[$i];

question(id($rubrik, 1));  // Würde jetzt AC01, AC02, ... oder AC05 anzeigen
by SoSci Survey (304k points)
Für die Fehlersuche fügen Sie um die Zeile

$code = $stimuli[$i];

Bitte noch zwei Zeilen mit debug() ein:

debug($stimuli);
$code = $stimuli[$i];
debug($code);

Im Debug-Modus sollte dann eine zusätzliche Anzeige erscheinen, was in den Variablen gespeichert ist.
by s063148 (175 points)
Also, das sind die Debug-Informationen.

Debug Zusatzinfo:

Debug-Information für $stimuli:
IV01_01->1, IV01_02->2, IV01_03->3, IV01_04->4, IV01_05->5

//wenn man hier mit 0 in der Urne startet ist das Problem gelöst?

Debug-Information für $code:
Keine Daten (null)

//sollte code nicht dem stimuli (index) entsprechen?

Im PHP-Code trat ein Fehler auf. (Fehlerzeilen sind eingerückt.)
Fehler im Fragebogen: Undefined offset: 0
Zeile: 5

PHP-Code

002
003 $stimuli = valueList('IV01');
004 $i = loopPage(count($stimuli));
          005 $code = $stimuli[$i];
006 debug($stimuli);
007 $code = $stimuli[$i];
008 debug($code);
Fehler im Fragebogen: Undefined offset: 0
Zeile: 7

PHP-Code

004 $i = loopPage(count($stimuli));
005 $code = $stimuli[$i];
006 debug($stimuli);
              007 $code = $stimuli[$i];
008 debug($code);
009
010
Fehler im Fragebogen: Undefined index:
Zeile: 19

PHP-Code

016   5 => 'externer_link2.mp4',
017   
018 );
             019 $videodatei = $videos[$code];
020
021 html('
022   <video width="640" height="360" controls controlsList="nodownload" autoplay id="stimulus">
by SoSci Survey (304k points)
Okay, fangen wir doch mal oben an:

> Debug-Information für $stimuli:
> IV01_01->1, IV01_02->2, IV01_03->3, IV01_04->4, IV01_05->5

Die Schlüssel (keys) für das Array $stimuli ist nicht numerisch, sondern es sind die Variablennamen. Stimmt ja... Die Lösung ist denkbar einfach. Ersetzen Sie die Zeile...

$stimuli = valueList('IV01');

... bitte wie folgt ...

$stimuli = array_values(valueList('IV01'));
by s063148 (175 points)
Super, danke, scheint zu funktionieren.

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

...