0 votes
in SoSci Survey (dt.) by s273366 (160 points)
edited by s273366

Hallo,

für einen Fragebogen möchte ich gerne 20 Items aus 2 Fragen anzeigen (jeweils 10 pro Frage), die abhängig von den Antworten auf andere vorherige Fragen/ Items aber in sich zufällig ausgewählt werden sollen.

Es geht dabei um die Fragen MB01/ MB02 und die darauffolgenden, zugehörigen Fragen MA01/ MA02. Die Fragen haben jeweils dieselbe Anzahl an Items und beziehen sich aufeinander (Heißt MA01_01 ist die Folgefrage für MB01_01).

Der Fragebogenaufbau sieht dabei wiefolgt aus:
Zunächst beantworten die Teilnehmenden alle Items von MB01/ MB02, die mit dem folgenden Code durchmischt, randomisiert und über zwei Seiten verteilt dargeboten werden:

if (!isset($itemBlocks)) {
  $questions = ['MB01', 'MB02'];
  // Liste mit allen Items erstellen
  $items = [];
  foreach ($questions as $qstID) {
    $qstItems = getItems($qstID, 'all');
    foreach ($qstItems as $itemID) {
      $items[] = [$qstID, $itemID];
    }
  }
  // Liste mischen
  shuffle($items);

//Liste abrufen
  $itemBlocks = array_chunk($items, 21);
  registerVariable($itemBlocks);
}
 
// Auf mehreren Seiten präsentieren
$i = loopPage(count($itemBlocks));
 
// Fragetext anzeigen
question('MB01', 'spacing=0', 'show-items=no');
 
// Items anzeigen
$items = $itemBlocks[$i];
foreach ($items as $n => $item) {
  if ($n == 0) {
    question($item[0], [$item[1]], 'spacing=0', 'show-title=no', 'show-explanation=no', 'shading=all-shaded');
  } elseif ($n % 2 == 0) {
    question($item[0], [$item[1]], 'spacing=0', 'show-title=no', 'anchor=none', 'show-explanation=no', 'shading=all-shaded');
  } else {
    question($item[0], [$item[1]], 'spacing=0', 'show-title=no', 'anchor=none', 'show-explanation=no', 'shading=all-unshaded');
  }
}

Als Nächstes sollen nun aus MA01 und MA02 jeweils 10 Items gezeigt werden. Diese sollen zufällig aus dem Pool der Items gezogen werden, die bei den entsprechenden MB01/MB02-Items mit >1 beantwortet wurden.
(Heißt wenn MB01_03 mit >1 beantwortet wurde kommt MA01_03 als eins von den 10 MA01 Items in Frage)
Mit dem folgenden Code habe ich dies versucht:

//random list of immoral behavior (answered >1)
    $immoral = random_items(getItems('MB01', 'min', 2), 10);
    registerVariable($immoral);
    
//random list of moral behavior (answered >1)
    $moral = random_items(getItems('MB02', 'min', 2), 10);
    registerVariable($moral);

Die Inhalte dieser Variablen sehen wiefolgt aus:

Gibt es nun eine Möglichkeit, wie ich mit diesen Item-IDs aus MB01/MB02, die entsprechenden Items aus MA01/MA02 abrufen kann?

Ich hoffe meine Erklärungen waren verständlich, falls etwas unklar ist, versuche ich dies gerne nochmal genauer zu erläutern!
Vielen Dank für Ihre Hilfe!

1 Answer

0 votes
by SoSci Survey (309k points)

Vorab: Sie würden Ihr Leben wesentlich (!) vereinfachen, wenn Sie die 20 Items jeweils in einer Frage unterbringen statt in zwei Fragen. Dann hätten Sie nur 3 Zeilen PHP-Code statt 30.

Gibt es nun eine Möglichkeit, wie ich mit diesen Item-IDs aus MB01/MB02, die
entsprechenden Items aus MA01/MA02 abrufen kann?

Die Items sollten Sie in den Variablen $immoral und $moral ja bereits haben. Lassen Sie sich die Inhalte doch mal anzeigen:

debug($immoral);
debug($moral);

Wenn Sie da Dopplungen haben, lassen Sie den Parameter "10" weg.

Jetzt geht es noch um die rotierte Anzeige der Items. Da würden Sie den Code, den Sie schon haben, nochmal wiederholen und das getItems($qstID, 'all') durch Ihre neuen Listen ersetzen. Wobei das ziemlich kompliziert wäre ...

... einfacher wäre es, wenn Sie die bereits rotierte Reihenfolge verwenden und "nur" den letzten Teil ein wenig umgestalten. Und zwar so, dass Sie die Items überspringen, die einen Antwortcode 1 haben.

$items = $itemBlocks[$i];
$first = true;
$shade = true;
foreach ($items as $n => $item) {
  $frageID = $item[0];
  $itemID = $item[1];
  $neueFrage = 'MA'.substr($frageID, 2,2);  // macht aus MB02 -> MA02.
  if (value(id($frageID, $itemID)) < 2) {
    continue;
  }

  if ($first) {
    $first = false;
    question($neueFrage, [$item[1]], 'spacing=0', 'show-title=no', 'show-explanation=no', 'shading=all-shaded');
  } elseif ($shade) {
    question($neueFrage, [$item[1]], 'spacing=0', 'show-title=no', 'anchor=none', 'show-explanation=no', 'shading=all-shaded');
  } else {
    question($neueFrage, [$item[1]], 'spacing=0', 'show-title=no', 'anchor=none', 'show-explanation=no', 'shading=all-unshaded');
  }
  $shade = !$shade;
}
by s273366 (160 points)
Hallo und Danke schon einmal für die bisherige Antwort.

Leider konnte ich den Code  noch nicht wirklich nachvollziehen und deshalb auch nicht begründen, warum dieser immer noch nicht funktioniert.

Die Inhalte der Variablen $moral ud $immoral habe ich in der ursprünglichen Frage als Screenshot ergänzt. Diese beinhalten noch keine "vollständigen" Items, sondern bisher nur die randomisierten Item-IDs ohne die dazugehörigen Frage-IDs.
Deshalb habe ich auch noch nicht verstanden, wie diese nun mit dem vorgeschlagenen Code randomisiert werden sollen, vor allem da die Variablen $moral/$immoral (die die Itemcodes beinhalten) gar nicht nochmal aufgegriffen werden.
Könnten Sie mir dies bitte nochmal erklären?

Mein Ziel wäre es am Ende einen Array mit allen 20 Items von MA01/MA02 zu haben, damit ich mit diesem die einzelnen Items verteilt über 20 Seiten loopen kann.
by SoSci Survey (309k points)
> Die Inhalte der Variablen $moral ud $immoral habe ich in der ursprünglichen Frage als Screenshot ergänzt.

Das sind jeweils 10 Items. Sollten in Ihrem Test alle 10 Items ausgewählt werden - also entsprechend Ihrer Antwort bei MB01/MB02 ?

> Leider konnte ich den Code  noch nicht wirklich nachvollziehen und deshalb auch nicht begründen, warum dieser immer noch nicht funktioniert.

Wie ich schon schrieb ... packen Sie alle Items in eine Frage, dann nehmen Sie SEHR viel Komplexität aus Ihrem Anwendungsfall :)

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

...