0 votes
in Methoden-Fragen by s213653 (130 points)

Hallo,

ich habe einen etwas spezielleren Fall bei meinem Projekt: und zwar zeige ich den Teilnehmerinnen der Umfrage eine Auswahl von 10 Kategorien. Da sollen sie im Rahmen einer Mehrfachauswahl ankreuzen, welche sie interessieren. Als Filterfrage habe ich jeweils eingestellt, dass, wenn sie Essen ankreuzen auch ein Video zu Essen abgespielt werden soll usw. Das hätte ich prinzipiell also schon geschafft. Nun habe ich vor diesem ganzen Prozess aber noch einen Zufallsgenerator eingebaut, der die Personen so aufteilt, dass sie ein Video zu dem Thema, das sie angekreuzt haben, bekommen oder aber eben die anderen Videos, deren Themen sie nicht gewählt haben (das sind also meine zwei Experimentalgruppen). Ich möchte jetzt, dass, je nachdem, welcher Gruppe die Probandinnen zugeordnet werden, sie entweder 3 Videos zu ihren angekreuzten Themengebieten oder 3 zu den anderen, die sie nicht angekreuzt haben, bekommen. Wenn jemand genau 3 ankreuzt, wäre das eh schon geregelt, aber wenn jemand 7 ankreuzt und in der "positiven" Gruppe ist, würde er momentan noch alle 7 angezeigt bekommen, was eher unpraktisch wäre. Da bräuchte ich jetzt noch einen Zufallsgenerator oder eine Randomisierung, der / die bestimmt, welche der angekreuzten (oder nicht angekreuzten) Themengebiete es werden. Wie gehe ich das an? Denn ich weiß ja nicht im Vorhinein, was bzw. welche Konstellation die Personen ankreuzen? Und an welcher Stelle muss ich den Code einbauen?

Liebe Grüße und danke im Voraus!

by SoSci Survey (327k points)
Tipp: Viele Systeme, die Texte mit Kürzeln formatieren, haben das Sternchen schon lange vor dem Gender-Stern zur Formatierung genutzt. Der Doppelpunkt hingegen ist technisch relativ unproblematisch, und er sieht im Fließtext auch eleganter aus, vgl. Teilnehmer:innen, Expert:innen, ...

1 Answer

0 votes
by SoSci Survey (327k points)

Ich möchte jetzt, dass, je nachdem, welcher Gruppe die Probandinnen zugeordnet werden, sie entweder 3 Videos zu ihren angekreuzten Themengebieten oder 3 zu den anderen, die sie nicht angekreuzt haben, bekommen.

Die Zahl der Kreuzchen werden Sie dann auf 3-7 beschränken müssen ... sonst gibt es Grenzfälle, wo Sie nur 2 oder weniger Videos zeigen können.

Technisch ist es dann gar nicht so schwer. aber man muss in Arrays = Mengenlehre denken. Dafür erstellen Sie, je nach Experimentalgruppe, ein Array mit den gewählten oder nicht gewählten Videos.

if (value('RG01') ==1) {
  $videos = getItems('AB01', 'is', 2);  // Gewählte Themen
} else {
  $videos = getItems('AB01', 'is', 1);  // Nicht gewählte Themen
}

Ich wollte hier eigentliche rst einen Code mit array_diff() schreiben, aber es ist wesentliche einfach, wenn man sich die nicht ausgewählten Items (Code 1) heraussuchen lässt.

Gut, die Liste $videos können wir nun einfach mischen.

shuffle($videos);

Und anschließend nehmen wir einfach die ersten drei davon:

$shop = array_slice($videos, 0, 3);

Jetzt müssen wir die passenden Videos nur noch anzeigen :)

Und an welcher Stelle muss ich den Code einbauen?

Im Zweifelsfall auf der Seite, auf welcher Sie das erste Video anzeigen möchten. Sie werden dann auch noch ein registerVariable() brauchen und eine Array, welches die numerischen Item-Codes in Kennungen für Texte mit dem HTML-Code für die Videos übersetzt. Aber Sie wollten ja zuerst einmal die Lösung für die Randomisierung. Viola.

by s213653 (130 points)
Danke für die schnelle Antwort! Das Problem ist nur, dass die 10 Kategorien schon stehen und auch alle Videos schon vorbereitet wurden. Wenn man statt 3 jedem 2 Videos zeigen würde, wäre es dann eher machbar und auch ohne, dass man die Anzahl der Auswahl verkleinern müsste?
by SoSci Survey (327k points)
Ich habe mich da evtl. missverständlich ausgedrückt. Die 10 Optionen/Kategorien sind kein Problem. Aber Sie müssen von den Befragten mindestens 3 Kreuzchen einfordern und dürfen maximal 7 erlauben, damit die Voraussetzung gegeben ist, dass immer 3 Videos zur Verfügung stehen (also min. 3 passend zur Auswahl und  min. 3 passend zur nicht-Auswahl).

Anders formuliert: Wenn Sie das nicht beschränken, dann kann es vorkommen, dass jemand nur eine Option auswählt. Und dann müssen Sie entscheiden, ob Sie 1 Video zeigen möchten oder ob Sie die Person aus dem Experiment werfen. Das sind natürlich auch Lösungen, wenn Sie keine 3 Kreuzchen einfordern möchten. Nur könnte es sein, dass dann die Vergleichbarkeit leidet. Das müssen Sie halt vorab klären und entscheiden.
by s213653 (130 points)
Achsooo, jetzt verstehe ich es richtig. Ich muss allerdings die Möglichkeit behalten, dass theoretisch jedes angekreuzt werden könnte, da es bei mir inhaltlich sonst nicht anders geht. Wenn ich nun die Personen rausfallen lassen möchte, die weniger als 3 oder mehr als 7 ankreuzen, wie stelle ich das ein? Weil mit normalen Filterfragen geht das nicht, oder? Da muss man soweit ich das gesehen habe konkrete Antwortoptionen auswählen und dann Screenout? Aber damit man keinen verliert, wäre es eigentlich schlauer bzw. könnte man es auch so lösen, dass die Leute, die weniger als 3 ankreuzen automatisch in die falsche Gruppe kommen und die, die mehr als 7 ankreuzen in die positive / richtige Gruppe kommen. Aber wie stelle ich das genau ein mit der Anzahl von Kreuzchen? Sorry für die Nachfragen. Ich bin echt dankbar für Ihre Hilfe!
by SoSci Survey (327k points)
> Wenn ich nun die Personen rausfallen lassen möchte, die weniger als 3 oder mehr als 7 ankreuzen, wie stelle ich das ein?

Sie müssen halt genau überlegen, was Sie in diesem Fall machen möchten. Vielleicht akzeptieren Sie ja auch, wenn jemand nur eine Sache ankreuzt - und in der Experimentalgruppe ist, wo nur Videos zu nicht-gewählten Themen kommen?

Es ist auch technisch nicht weiter aufwändig, dass Personen, die nur ein Thema ausgewähl haben und in der Video-passend-zum-Thema-Gruppe sind dann nur ein Video sehen. Oder gar keins, wenn sie gar nichts angekreuzt haben.

Wie gesagt, das müssen Sie einfach überlegen, entscheiden und (nicht vergessen) schriftlich dokumentieren. Und dann kann man es auch in PHP-Filter umsetzen.

> Wenn ich nun die Personen rausfallen lassen möchte, die weniger als 3 oder mehr als 7 ankreuzen, wie stelle ich das ein?

Dafür würden Sie z.B. einfach die Elemente im Array abzählen:

$selected = getItems('AB01', 'is', 2);
$unselected = getItems('AB01', 'is', 1);
if ((count($selected) < 3) || (count($unselected) < 3)) {
  // Screenout-Code, s. Anleitung zu pageStop()
}

Das hier wäre beispielsweise eine sehr rigide Umsetzung.

>  wäre es eigentlich schlauer bzw. könnte man es auch so lösen, dass die Leute, die weniger als 3 ankreuzen automatisch in die falsche Gruppe kommen

Technisch möglich, aber damit zerstören Sie die komplette zufällige Variation und sorgen ziemlich einfach für eine Konfundierung. Aus methodischer Sicht würde ich mir solch eine Selbstselektion wirklich sehr gut überlegen (und mich wahrscheinlich dagegen entscheiden). Aber es kommt auf die Forschungsfrage an ... es gibt sicher Designs, wo das absolut sinnvoll ist. Nur wahrscheinlich keine experimentellen ;)
by s213653 (130 points)
Ich habe versucht den Code zu verstehen und meine Fragen gegen RG01 etc. auszutauschen, aber ich tue mir noch etwas schwer, zu verstehen, was $videos = getItems('AB01', 'is', 2); genau bedeutet. Was meint diese 2? und statt RG01 würde ich meine Frage für den Zufallsgenerator einsetzen? D.h. wenn der Zufallsgenerator 1 (korrekte Videos) ist... was genau passiert dann, also was sage ich dem System mit diesem AB01 is 2?

if (value('ZU01') ==1) {
  $videos = getItems('IN01', 'is', 2);  // IN01 wäre hier meine Frage für die korrekten Videos
} else {
  $videos = getItems('IN12', 'is', 1);  // IN12 wären die nicht angekreuzten Videos
}

so funktioniert es nämlich nicht - wird wahrscheinlich daran liegen, dass ich zum ersten Mal mit solchen Codes arbeite und da noch nicht ganz durchblicke. Könnte man es eigentlich auch zu dem folgenden Code, den ich davor schon hatte, so dazuschreiben? ich hab ein paar Varianten probiert, bekomme aber immer nur Fehlermeldungen. Ich glaube ich mache irgendwas sehr falsch :D

if (value('ZU01') == 1) {
  question('IN01');
}
shuffle($videos);
$shop = array_slice($videos, 0, 3);

in den Fehlermeldungen steht auch immer, dass die Variable $videos nicht definiert wurde, was soll mir das genau sagen? Könnten Sie sich meinen Fragebogen vielleicht noch einmal ansehen? ich würde mich sehr darüber freuen!

https://www.soscisurvey.de/experiment2022tiktok/?act=rnUpQkmardC8WuB0sXigt8YT
by SoSci Survey (327k points)
> $videos = getItems('AB01', 'is', 2); genau bedeutet. Was meint diese 2?

Die Funktion getItems() sucht aus einer Frage die Items oder Optionen heraus, die eine bestimmte Bedingung erfüllen. In dem Fall, dass sie den Wert 2 haben. Das ist bei einer Mehrfachauswahl sinnvoll, weil dort 1=nicht / 2=ausgewählt kodiert wird. Das "is", 2 liefert also eine Liste ausgewählter Items.

> so funktioniert es nämlich nicht

Dann sehen Sie sich an, warum es nicht funktioniert:

debug(value('ZU01'));
debug($videos);

>  ich hab ein paar Varianten probiert, bekomme aber immer nur Fehlermeldungen.

Wenn Sie die Fehlermeldungen im Wortlaut posten, kann ich diese erklären.

> in den Fehlermeldungen steht auch immer, dass die Variable $videos nicht definiert wurde

Stellen Sie sicher, dass der obere Teil (wo $videos definiert wird) im selben PHP-Code-Block steht wie der untere Teil, wo die PHP-Variable verwendet wird.
by s213653 (130 points)
Ich habe es jetzt noch so probiert, aber es passiert nichts

if (value('ZU01') == 1) {
  question('IN01');
} else {
 question('IN12');
}
if (value('ZU01') ==1) {
  $videos = getItems('IN01', 'is', 2);  
} else {
  $videos = getItems('IN12', 'is', 1);
}
shuffle($videos);
$shop = array_slice($videos, 0, 3);

ich habe von der Anordnung her jetzt meinen Zufallsgenerator und dann diesen Code. Kann es ansonsten auch sein, dass meine Filter direkt bei den Fragen den PHP Code aufheben oder so? dort hab ich es am Anfang ja so gelöst, dass bestimmte Seiten angezeigt werden sollen (z.B. wenn Musik ausgewählt wird, soll ein Video zum Thema gezeigt werden und dann noch zwei Reflexionsfragen dazu, aber wenn nicht, dann eben keine der drei). Kann es sein, dass ich diese ganzen Einstellungen dann nicht mehr brauche, weil es nun ja der PHP Code für mich regelt? Bzw. dass ich die Einstellung zu den Fragen, die nach dem Video kommen sollen, erst nach dem PHP Code einbauen darf?

und das kam jetzt als ich debug eingegeben habe:

Im PHP-Code trat ein Fehler auf.
Fehler im Fragebogen: Die PHP-Variable $videos wurde verwendet, in diesem PHP-Code aber noch nicht definiert (sie enthält noch keinen Wert).

PHP-Code

001 namespace s2survey\questionnaire\environment;
002
003 debug(value('ZU01'));
004 debug($videos);
005 return 'ok';
by SoSci Survey (327k points)
Schreiben Sie das debug() unter den Teil, wo Sie die Variabeln definieren, also

...
  $videos = getItems('IN12', 'is', 1);
}
debug(value('ZU01'));
debug($videos);
shuffle($videos);
debug($videos);
$shop = array_slice($videos, 0, 3);
debug($shop);
by s213653 (130 points)
in der Vorschau steht dann das als Hinweis: Debug-Information für value('ZU01'):
value('ZU01') = 2 (string) und Debug-Information für $videos:
Array (ohne Elemente)
by SoSci Survey (327k points)
> Debug-Information für $videos:
> Array (ohne Elemente)

Dann funktioniert beim zweiten getItems() irgendwas nicht, welches hier aktiv wurde.

Und ich sehe auch was: Sie verwenden das getItems() auf derselben Seite, auf welcher auch die Frage steht. Das kann nicht funktionieren, vgl. Anleitung zu value().

Aber was ich auf Basis der bisherigen Informationen nicht verstehe: Warum zeigen Sie je nach Experimentalgruppe eine unterschiedliche Frage (IN01 v. IN12)?
by s213653 (130 points)
Ach stimmt, an das hab ich nicht mehr gedacht. Da ich anfangs probiert habe, alles mit Filterfragen zu lösen, hab ich die Frage mit der Mehrfachauswahl zweimal erstellt und dort dann die Filter wenn z.B. Essen angekreuzt wird, werden folgende Seiten angezeigt usw. eingestellt und wenn der Zufallsgenerator 1 ist wird quasi die eine Art der Frage und wenn 2 die zweite gestellt. Bei der zweiten habe ich dann wieder für jede Antwortmöglichkeit eingestellt, dass, wenn etwas nicht angekreuzt wird, dennoch das Video und die Folgefragen angezeigt werden. Aber jetzt mit dem PHP Code brauche ich die ganzen Filterfragen wahrscheinlich eh nicht mehr denk ich mir? Also müsste ich zuerst den Zufallsgenerator rechnen lassen, dann eben die Mehrfachauswahl-Frage, die dann bei beiden Gruppen gleich wäre und danach dann den Code mit getItems - verstehe ich das so richtig?
by s213653 (130 points)
edited by s213653
Jetzt habe ich es gerade so ausprobiert wie vorher beschrieben und es werden einige Hinweise angezeigt, aber die Videos werden nun alle abgespielt, egal in welcher Gruppe man ist.

Beispielsweise wird das ausgespuckt: Debug-Information für value(ZU01): ZU01 = 1 (string)

für $videos: 6,10,1,5,2 (0,1,2,3,4)

und noch einmal fast das gleiche für $videos:
6,2,1,5,10

und dann noch die Information für $shop:
6,2,1 (0,1,2)

also anscheinend nimmt das System schon die ersten drei Zahlen her, aber von den Videos werden trotzdem noch alle abgespielt.
by SoSci Survey (327k points)
>  aber von den Videos werden trotzdem noch alle abgespielt.

Welchen PHP-Code haben Sie denn verwendet, um die Videos abzuspielen? Das hier ist ja erstmal nur der Code, um das passende Array zu erzeugen. Für die Ausgabe der Videos muss man das dann noch z.B. mit Dateinamen verknüpfen und z.B. via loopPage() oder über PHP-Filter so auswerten, dass die richtigen Videos abgespiel (oder die falschen übersprungen) werden.

Haben Sie die Videos bisher auf separate Seiten gelegt (z.B. zusammen mit Fragen)?
by s213653 (130 points)
Ich hatte es davor ganz anders und nicht mit PHP Code eingestellt. Nämlich mit zwei Mehrfachauswahl Fragen (der Zufallsgenerator hat entschieden, welche gezeigt wird) und bei der einen waren im Hintergrund alles Filter eingesetzt, dass die richtigen Videos angezeigt werden sollten und bei der anderen die falschen. Dadurch wurden aber eben alle angezeigt, die angekreuzt oder nicht angekreuzt wurden und nicht nur drei. Jetzt hab ich die Mehrfachauswahl Frage nur einmal eingebaut und alle Filter entfernt, weil es so mit einem PHP Code vielleicht doch einfacher geht (der mir aber jetzt noch fehlt). Also muss ich im selben Code bzw. auf derselben Seite, auf der das Array mit obigem Code erzeugt wird, quasi noch einen Code positionieren.

Genau, ich habe bisher für jedes Video eine "Frage" angelegt. Ich bin gerade am Überlegen, ob ich die zwei darauffolgenden Fragen einfach auch noch auf die gleiche Seite mit dem Video packe, damit es beim Ausfüllen keine Verwirrung gibt, auf welches Video sich die Fragen jetzt beziehen. Und ich habe die Videos ja per HTML Code eingepflegt, also müsste man dann die ganzen Links anstatt der Dateinamen in einen Code packen, oder?

Aber mit einem einfachen if value('ZU01') == 1 & html () kann ich das ja nicht machen, weil ich ja irgendwie auf den Code mit dem Array referenzieren muss (also dass genau die Videos, der drei zufällig ausgewählten Items angezeigt werden) und es ja mehrere Videos und Ankreuz-Kombinationsmöglichkeiten gibt. Das verwirrt mich momentan noch ziemlich, wenn ich ehrlich bin.

Kann es sein, dass man in den Code dann für jedes Video schreibt, dass wenn dessen Kategorie unter diesen drei zufälligen Items ist, es im nächsten Schritt auch angezeigt werden soll? Also quasi wenn in diesem $shop = array_slice($videos, 0, 3); Item 1 vorkommt, Spiel Video 1 ganz vereinfacht ausgedrückt :D
by SoSci Survey (327k points)
> Also muss ich im selben Code bzw. auf derselben Seite, auf der das Array mit obigem Code erzeugt wird, quasi noch einen Code positionieren.

Genau. Erst klären Sie mittels PHP-Code, welche Videos Sie zeigen möchten - als Liste von Nummern. Und dann kümmern Sie sich darum, dass die Videos auch angezeigt werden.

> also müsste man dann die ganzen Links anstatt der Dateinamen in einen Code packen, oder?

Wenn Sie ohnehin Fragen "mitnehmen" möchten, dann ist es einfacher, wenn Sie pro Video eine Seite anlegen und dann mittels setPageOrder() festlegen, welche Seiten angezeigt werden sollen. Wenn die Seitenkennung "video1", "video2" u.s.w. heißen, könnten Sie das so machen:

$seiten = [
  1 => 'video1',
  2 => 'video2',
  3 => 'video3',
  // u.s.w.
];

$anzeigen = [];
foreach ($videos as $video) {
  $anzeigen[] = $seiten[$video];
}

setPageOrder($anzeigen, 'weiter');
by s213653 (130 points)
Vielen lieben Dank, das Anzeigen funktioniert jetzt über diesen Code!! Nur die Beschränkung auf drei Videos klappt noch nicht. Es werden zwar die angekreuzten Themen / Videos in der Reihenfolge wie sie der Debug ausgibt abgespielt, aber nicht nur die drei, sondern alle. Muss ich diesbezüglich nicht noch einen zweiten Code wie dieses $shop = array_slice($videos, 0, 3) einbauen? oder einen, der die anderen Seiten mit den nicht gewählten Themen / Videos ausblendet?
by SoSci Survey (327k points)
> Nur die Beschränkung auf drei Videos klappt noch nicht.

Was zeigt denn debug($videos) an? Dort sollten max. drei Werte auftauchen.

> Muss ich diesbezüglich nicht noch einen zweiten Code wie dieses $shop = array_slice($videos, 0, 3) einbauen?

Ähm, ja, ich dachte, der wäre schon drin. Wenn es diese Zeile ist, dann bitte


foreach ($videos as $video) {

tauschen gegen


foreach ($shop as $video) {
by s213653 (130 points)
Ein großes Dankeschön von meiner Seite! Nun funktioniert mit der Randomisierung alles! :)

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

...