0 votes
in SoSci Survey (dt.) by s068921 (150 points)

Liebes Support-Team,

ich habe ein Problem bei der Verwendung von urnDraw.

In meiner aktuellen Umfrage verwende ich zwei Stimuluslisten mit jeweils 36 items (4 items in 6 Bedingungen). Jeder Proband soll eine komplette Stimulusliste sehen, und jedes item nur einmal (also 4 pro Bedingung).

Die Stimuli sind gespeichert in der Datenbank für Inhalte. Die "keys" geben die Kombination aus Stimulusliste und fortlaufender Itemnummer an (liste1_01, liste1_02, (...) liste1_36)

Um zu entscheiden, welche Stimulusliste ein Proband sieht, verwende ich einen Zufallsgenerator. Dieser wählt zwischen zwei Urnen aus. Jede dieser Urnen enthält 36 Zettel, sie entsprechen den "keys" in der Datenbank für Inhalte (eine Urne für jede Liste).

Für jeden Probanden werden 36x Zettel aus der Urne genommen (sie also einmal komplett geleert) und die items mit den entsprechenden keys angezeigt. Das bedeutet, dass jeder Proband alle items aus einer Liste sieht und jedes item nur einmal, und gleich viele items von jeder Bedingung.
Bei bisherigen Experimenten hat dies problemlos funktioniert. Bei meinem aktuellen Experiment kommt es jedoch zu Problemen - für einzelne Probanden werden manche Zettel mehrmals gezogen und manche garnicht.

Woran könnte das liegen?

Im aktuellen Code (s.u.) habe ich versucht, nur abgeschlossene Fragebögen bei der Anzahl der entnommenen Zettel zu berücksichtigen. Das hat leider nicht funktioniert.

Vielen Dank im Voraus für alle Tips, und freundliche Grüße!

/ Seite n-Mal wiederholen (aktuelle seitennummer in $i speichern)
$i = loopPage(36);

// Führende Nullen an einstellige Zahlen anhängen
$frage_nr = str_pad($i+1, 2, '0', STR_PAD_LEFT);

// Zufallsgenerator wählt eine von zwei Urnen aus  
$code =value('ZG01');

// Für jede Stimulusliste gibt es eine eigene Liste mit itemnummern. 
// In der Datenbank für Inhalte enthält die erste Spalte den key 
 
// fuer bis 99 stimuli pro liste 
if($code == '1') {urnDraw('itemnummern_liste1', 'BX'.$frage_nr, 'end');} 
elseif($code == '2') {urnDraw('itemnummern_liste2', 'BX'.$frage_nr,'end');}

// Variable für Text registrieren 
// für bis 99 items 
$inhalt = dbGet(value('BX'.$frage_nr.'_01'));  
  

1 Answer

0 votes
by SoSci Survey (328k points)

Jeder Proband soll eine komplette Stimulusliste sehen, und jedes item nur einmal (also 4 pro Bedingung).

Die Urne ist dafür ausgelegt, Stimuli über mehrere Interview zu verteilen. Sie ist nicht geeignet, um Stimuli innerhalb eines Interviews zu rotieren.

Erstellen Sie stattdessen eine Liste (1 bis 36), mischen Sie diese via shuffle() und zeigen Sie die Stimuli dann entsprechend der Liste an.

In der Anleitung zur Rotation (nicht Randomisierung!) finden Sie einige Code-Beispiele, die dafür dann z.B. loopPage() verwenden.

by s068921 (150 points)
Vielen Dank für die Erklärung!

Ich habe noch einige Verständnisfragen:

- Die Liste müsste wahrscheinlich nicht die Zahlen 1-36 enthalten, sondern die keys in der Datenbank für Inhalte. Sollte ich diese Liste mit "array" erstellen? Sollte ich das auf der gleichen Seite tun, die die Präsentation der Stimuli erledigt (also mit "loop page" beginng)? Oder auf einer vorhergehenden Seite?

- Das Problem, das mit den Urnen auftrag, hat mich verwundert, weil wir bisher unsere Experimente immer problemlos so wie hier angegeben programmiert hatten und auch durch fehlende Antworten keine Probleme mit der gleichmäßigen Verteilung innerhalb eines Probanden bekommen haben - für jeden Probanden wurde die Urne sozusagen komplett zurückgesetzt. Deswegen dachte ich, dass ich im neuen Experiment möglicherweise eine Einstellung verändert habe. Deswegen habe ich nun bei urnDraw 'end' als Variable angegeben. Ich hatte gehofft, dass so nur Ziehungen gespeichert werden, die zu beendeten Experimenten gehören, und dass so eine Gleichverteilung auch gewährleistet bleibt. - Könnten Sie mir sagen, ob ich 'end' hier richtig verwendet habe, und ob sich das aktuelle Experiment mit 'end' in das gewünschte Verhalten ändern ließe?

Vielen Dank, und viele Grüße
by SoSci Survey (328k points)
> - Die Liste müsste wahrscheinlich nicht die Zahlen 1-36 enthalten, sondern die keys in der Datenbank für Inhalte. Sollte ich diese Liste mit "array" erstellen?

Wie genau Sie es umsetzen, hängt vom spezifischen Fall ab. Aber ja, die Datenbank-Schlüssel wären vermutlich sinnvoll.

> Sollte ich das auf der gleichen Seite tun, die die Präsentation der Stimuli erledigt (also mit "loop page" beginng)? Oder auf einer vorhergehenden Seite?

Sie können das auf der gleichen Seite machen. Stellen Sie dann aber mit registerVariable() und isset() sicher, dass Sie nicht bei jeder Wiederholung erneut mischen.


> Das Problem, das mit den Urnen auftrag, hat mich verwundert, weil wir bisher unsere Experimente immer problemlos so wie hier angegeben programmiert hatten

Der Zufallsgenerator könnte das. Bei einer Urne gibt es dann Probleme, wenn nicht alle Zettel der Urne exakt gleich häufig gezogen wurden. Wenn man von Anfang an immer alle Zettel zieht, kann es schon sein, dass es funktioniert. Aber nachdem es nicht vorgesehen ist, in einem Interview mehrere Zettel aus einer Urne gezogen werden, können bei gleichzeitig laufenden Interviews schon mal Konstellationen auftreten, die man so nicht vorgesehen hat.

> und dass so eine Gleichverteilung auch gewährleistet bleibt

Die Gleichverteilung bleibt gewährleistet. Aber eben über alle Interviews hinweg. Es ist nur nicht sichergestellt, dass in einem Interview nicht zweimal die erste Hälfte der Urne gezogen wird und im anderen Interview zweimal die andere Hälfte.

> Könnten Sie mir sagen, ob ich 'end' hier richtig verwendet habe, und ob sich das aktuelle Experiment mit 'end' in das gewünschte Verhalten ändern ließe?

Das "end" hat nur Einfluss darauf, wann die Zettel als "gezogen" markiert werden. Wenn Sie "end" verwenden, könnte in einem Interview derselbe Zettel auch 10-mal gezogen werden, denn er gilt ja dann erstmal noch nicht als gezogen.

Aber nochmal, um keine Missverständnisse aufkommen zu lassen: Mit dem Zufallsgenerator könnten Sie das gewünschte Ergebnis erzielen. Die Urne ist für die mehrfache Ziehung pro Interview nicht ausgelegt.
by s068921 (150 points)
Vielen Dank für die ausführliche und hilfreiche Antwort. Inzwischen habe ich versucht, das Experiment entsprechend den Vorschlägen zu ändern. Einiges funktioniert schon. Allerdings gelingt es mir noch nicht, die geshufflete Liste abzuspeichern.  Die einzelnen Fragen werden immer in der gleichen Reihenfolge angezeigt.
Im Handbuch finde ich für das shufflen von Listen nur Beispiele, in denen Fragekennungen geshufflet werden. Meine Liste enthält allerdings die Datenbank-Schlüssel. Es wäre sehr hilfreich, zu hören, wie ich die geshufflete Liste für Datenbank-Keys speichern sollte, so dass jeder Teilnehmer die Stimuli in anderer Reihenfolge sieht. Ich schreibe unten inline in die vorherigen Kommentare hinein. Hier schon einmal vielen Dank für alle Tips!

>> - Die Liste müsste wahrscheinlich nicht die Zahlen 1-36 enthalten, sondern die keys in der Datenbank für Inhalte. Sollte ich diese Liste mit "array" erstellen?
>Wie genau Sie es umsetzen, hängt vom spezifischen Fall ab. Aber ja, die Datenbank-Schlüssel wären vermutlich sinnvoll.
Das habe ich nun getan. Der Code sieht so aus:

%%%%
$liste1 = array('liste1_01', 'liste1_02', 'liste1_03', 'liste1_04', 'liste1_05', 'liste1_06', 'liste1_07', 'liste1_08', 'liste1_09', 'liste1_10', 'liste1_11', 'liste1_12', 'liste1_13', 'liste1_14', 'liste1_15', 'liste1_16', 'liste1_17', 'liste1_18', 'liste1_19', 'liste1_20', 'liste1_21', 'liste1_22', 'liste1_23', 'liste1_24', 'liste1_25', 'liste1_16', 'liste1_27', 'liste1_28', 'liste1_29', 'liste1_30', 'liste1_31', 'liste1_32', 'liste1_33', 'liste1_34', 'liste1_35', 'liste1_36');

$liste2 = array('liste2_01', 'liste2_02', 'liste2_03', 'liste2_04', 'liste2_05', 'liste2_06', 'liste2_07', 'liste2_08', 'liste2_09', 'liste2_10', 'liste2_11', 'liste2_12', 'liste2_13', 'liste2_14', 'liste2_15', 'liste2_16', 'liste2_17', 'liste2_18', 'liste2_19', 'liste2_20', 'liste2_21', 'liste2_22', 'liste2_23', 'liste2_24', 'liste2_25', 'liste2_16', 'liste2_27', 'liste2_28', 'liste2_29', 'liste2_30', 'liste2_31', 'liste2_32', 'liste2_33', 'liste2_34', 'liste2_35', 'liste2_36');

// Zufallsgenerator wählt eine Stimulusliste aus

$code =value('ZG01');
if($code == '1') {$liste = $liste1;}
elseif($code = '2') {$liste = $liste2;};  

// Die ausgewählte Liste zufällig mischen

if(!isset($liste)){shuffle($liste);

// Die Rotation für eine eventuelle Wiederholung der Seite zwischenspeichern

registerVariable($liste);
};

%%%%

Nach dem shufflen werden die einzelnen Fragen gezeigt. Hierbei steht in jeder Frage nur ein Platzhalter, der Fragetext soll mithilfe des keys aus einer Datenbank geholt werden. Der Code sieht jetzt so aus:

%%%%

// Seite n-Mal wiederholen (aktuelle seitennummer in $i speichern)

$i = loopPage(36);

// Führende Nullen an einstellige Zahlen anhängen

$frage_nr = str_pad($i+1, 2, '0', STR_PAD_LEFT);

// aktuellen key aus der geshuffleten liste holen

$schlussel = $liste[$i];

// Variable für Text registrieren

$inhalt = dbGet($schlussel);

replace('%pred%', $inhalt[6], 'html');

// Frage FR$i anzeigen (%pred% wird ersetzt)
question('AX'.$frage_nr.'_01');   

%%%%
by SoSci Survey (328k points)
Wollen wir das vielleicht in eine neue Frage verlagern (s. oben "related question")? Hier wird es langsam ein wenig unübersichtlich.

Was nicht funktionieren kann, ist folgender Abschnitt im ersten Code:

if(!isset($liste)){shuffle($liste);
  // Die Rotation für eine eventuelle Wiederholung der Seite zwischenspeichern
  registerVariable($liste);
};

Da wird die Variable $liste nämlich ein Stückchen darüber definiert. isset() liefert deshalb immer false - und damit wird dieser Teil nicht ausgeführt.

Packen Sie den IF-Filter mit isset() bitte einfach an den Anfang des PHP-Codes.
by s068921 (150 points)
Mit der vorgeschlagenen Änderung hat es funktioniert. Vielen Dank für die Unterstützung!

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

...