0 votes
in SoSci Survey (dt.) by s122462 (165 points)
edited by SoSci Survey

Hallo miteinander,

mein Fragebogen soll grob Folgendermassen aufgebaut sein:

Block 1: Seiten 1 - 5 (B1 - B5)
Block 2: Seiten 1 - 5 (BH1 - BH5)
Block 3: Seiten 1 - 5 (BS1- BS5)
Block 4: Seiten 1 - 5 (BD1 - BD5)
Block mit sozio-demografischen Fragen (demo)

Prinzipiell wird dergleiche Block viermal wiederholt. Hierbei möchte ich jedoch folgende Randomisierungen einbauen. Was noch zu beachten ist, ist, dass ich pro Block am Anfang eine Seite mit einer Instruktion habe, die nicht randomisiert werden soll (sozusagen B0 bzw. BH0 bzw. BS0 bzw. BD0).

Randomisierung der Seiten pro Block
Alle Personen sehen zuerst Block 1 (Basismessung). Die Reihenfolge der Seiten 1 - 5 soll randomisiert und für die spätere Verwendung in einer internen Variablen (BB17) gespeichert werden.

Randomisierung der Blöcke 2-4
Als nächstes werden die Blöcke 2 bis 4 durchlaufen, wobei die Reihenfolge der Blöcke counterbalanciert werden soll. Innerhalb jeden Blockes wird die Reihenfolge der Seiten aus dem ersten Block übernommen. Dann erscheint der Block mit den sozio-demografischen Fragen.

Bisher habe ich das Randomisieren der Blöcke und der Seiten getrennt in PHP mit setPageOrder() umgesetzt, scheint aber so nicht zu funktionieren...

D.h. für die Randomisierung der Blöcke habe ich einen Zufallsgenerator (BB07) angelegt, der alle möglichen Abfolgen der drei Blöcke enthält:

1 = BH0-BH5, BS0-BS5, BD0-BD5
2 = BS0-BS5, BH0-BH5, BD0-BD5
3 = BD0-BD5, BS0-BS5, BH0-BH5
4 = BD0-BD5, BH0-BH5, BS0-BS5
5 = BS0-BS5, BD0-BD5, BH0-BH5
6 = BH0-BH5, BD0-BD5, BS0-BS5

Bevor der zweite Block beginnt, habe ich diesen PHP-Code eingebaut:

$code2 = value('BB07');
$order1 = value('BB07', 'label');
setPageOrder($order1, 'demo');

Um die Seiten einmalig im 1. Block zu randomisieren und dann die Reihenfolge in den weiteren Blöcken zu übernehmen, habe ich diesen Code verwendet:

Bevor Block 1 beginnt:

$pages = array('B1', 'B2', 'B3', 'B4', 'B5');
$indices = array_keys($pages);
shuffle($indices);

$random = array();
for ($i=0; $i<count($indices); $i++) {
  $id = id('BB17', $indices[$i] + 1);
  put($id, $i + 1);
  $random[$i] = $pages[$indices[$i]];
}
setPageOrder($random, 'intro');

Bevor Block 2 (bzw. 3 oder 4) beginnt:

$pages = array('BH1', 'BH2', 'BH3', 'BH4', 'BH5');
$order2 = [];
foreach (getItems('BB17') as $item) {
  $rank = value(id('BB17', $item));
  $order2[(int)$rank - 1] = $pages[$item -1];
}
ksort($order2);
debug($order2);
setPageOrder($order2);

Es funktioniert so aber nicht, d.h. teilweise werden nicht mehr alle Blöcke (2-4) angezeigt, teilweise werden pro Block mehr als 5 Seiten angezeigt... Ich denke, ich kann wahrscheinlich nicht mehrmals setPageOrder verwenden.

Mir wurde gestern schon diese Antwort gegeben:
Im Prinzip sortieren Sie einfach 4 Seiten-Arrays in der gewünschten Reihenfolge, packen diese in ein verschachteltes Array (4 Arrays in einem Array) und mischen dieses mit shuffle() einmal. bevor Sie es an setPageOrder() übergeben. Könnt Ihr mir das Vorgehen noch genauer erläutern?

Vielen Dank!
Linda

by SoSci Survey (328k points)
Tipp: Mit dem Knopf {} kann man Code als solchen formatieren. Ich habe das der Lesbarkeit zuliebe in Ihrer Frage geändert.

1 Answer

0 votes
by SoSci Survey (328k points)

Bevor Block 2 (bzw. 3 oder 4) beginnt:

Der Trick besteht darin, dass Sie alle 4 Blöcke gleich zu Beginn des Fragebogens mischen und eine lange Liste erstellen, welche die Abfolge aller Seiten enthält.

Wenn ich es mir genau überlege, kann man sich dann auch die Rekonstruktion der Seitenabfolge aus den internen Variablen ersparen.

$pages = array(
  array('B1', 'B2', 'B3', 'B4', 'B5'),
  array('BH1', 'BH2', 'BG3', 'BH4', 'BH5'),
  array('BS1', 'BS2', 'BS3', 'BS4', 'BS5'),
  array('BD1', 'BD2', 'BD3', 'BD4', 'BD5')
);

$random = array();
for ($b=0; $b<count($pages); $b++) {
  $random[$b] = array();
}

$indices = array_keys($pages[0]);
shuffle($indices);

for ($i=0; $i<count($indices); $i++) {
  $id = id('BB17', $indices[$i] + 1);
  put($id, $i + 1);
  // Die Zufallsfolge für jeden Block anwenden
  for ($b=0; $b<count($pages); $b++) {
    $random[$b][$i] = $pages[$b][$indices[$i]];
  }
}

// Jetzt noch die Blöcke mischen - nur den ersten nicht
$first = array_shift($random);
shuffle($random);
array_unshift($random, $first);

setPageOrder($random, 'intro');

Ich habe die 4 Blöcke hier gleich als verschachteltes Array definiert. Man könnte auch 4 separate Variablen machen, aber so ist es ein wenig eleganter.

Den Zufallsgenerator für die Seitenabfolge verwende ich hier nicht (!). Sollte es Ihnen wichtig sein, dass jede Block-Folge gleich häufig verwendet wird, können wir das gerne in einer weiteren Frage klären.

by s122462 (165 points)
Vielen Dank schon mal!

Ich habe noch zwei weiterführende Fragen...

Kann ich im zweiten Schritt (Blöcke mischen) zusätzliche Seiten einfügen, die an einer festen Stelle im Fragebogen erscheinen sollen? Die Seiten müssten wahrscheinlich eingefügt werden, nachdem die Blöcke gemischt wurden. Ich habe mal folgendes ausprobiert, aber scheint nicht ganz zu stimmen. Ich habe so natürlich auch nicht berücksichtigt, dass der erste Block ja eigentlich immer an erster Stelle erscheinen soll, also nicht geshuffelt wird...

shuffle($random);
$random = array(
  $random[0],
'intro',
'label1',
  $random[1],
  $random[2],
  $random[3]
);
setPageOrder($random, 'Grafiken');

Und ein Detail, was ich bisher übersehen habe:
Wenn ich zu Beginn jeden Blocks eine feste Seite (sozusagen eine Intro-Seite) habe, die spezifisch für jeden Block ist, aber nicht mit randomisiert werden soll, wenn die Seiten des Blocks randomisiert werden, wie mache ich das?

Vielen Dank für Eure Geduld! Ich bin PHP-Neuling und stelle daher so viele Fragen...
by SoSci Survey (328k points)
> aber scheint nicht ganz zu stimmen.

Inwiefern?

> Ich habe so natürlich auch nicht berücksichtigt, dass der erste Block ja eigentlich immer an erster Stelle erscheinen soll, also nicht geshuffelt wird...

Das hatte ich im PHP-Code eigentlich vorgesehen mit dem array_shift() etc.

> Wenn ich zu Beginn jeden Blocks eine feste Seite (sozusagen eine Intro-Seite) habe, die spezifisch für jeden Block ist, aber nicht mit randomisiert werden soll ...

Sie soll also mit den Blöcken rotiert werden, aber nicht innerhalb der Blöcke?

Im Prinzip können Sie damit dem dem array_shift() auch beim Mischen der Seiten machen:

$indices = array_keys($pages[0]);
$first = array_unshift($indices);
shuffle($indices);
$indices = array_merge([$first], $indices);

... aber Sie sehen ... hier in den Kommentaren wird das schnell unübersichtlich ;)

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

...