0 votes
in SoSci Survey (dt.) by s178438 (220 points)
edited by SoSci Survey

Guten Tag,

ich habe einen Fragebogen, in welchem eine Reihe von Events (bspw. "Ich habe einen neuen Job angefangen." Ja/Nein) abgefragt werden. Diese Events sind in 6 Kategorien aufgeteilt, welche zwischen den Kategorien und innerhalb der Kategorien randomisiert werden.

Im Anschluss an diese Fragen folgt eine weitere Skale, in welcher Fragen zu einem Event gestellt werden, bei welchem der TN "Ja" angekreuzt hat.

Die Umsetzung soll wie folgt aussehen:
Zuerst möchten wir alle Events in 5 neue "Listen" aufteilen, die sich nach Häufigkeit richten (Gruppe 1 - selten bis Gruppe 5 - häufig). Innerhalb der Liste sollen die Items randomisiert werden und nacheinander (mit Gruppe 1 beginnend) abgefragt werden, ob der TN "Ja" angekreuzt hat. Sobald er bei einem Event " Ja" angekreuzt hat, soll dieses Event in den Platzhalter %ereignis% eingefügt werden. Sollte die Person bei allen Events "Nein" angeklickt haben, so soll hier zusätzlich noch ein offenes Feld erscheinen, in welches die Person ein noch nicht genanntes Ereignis in ihrem Leben eintragen kann. In dem Fall soll das im offenen Textfeld genanntes Ereignis in den Platzhalter integriert werden. Den Code, dass das offene Feld nur angezeigt wird, wenn alles andere mit "Nein" beantwortet wurde, habe ich bereits.

Für den anderen Code bin ich erst soweit gekommen:

// Reihenfolge der Events festlegen
// 1. Ich bin krank geworden.
// 2. Ich habe eine ernste medizinische Diagnose erhalten.
// 3. Ich habe eine medizinische Behandlung oder Psychotherapie begonnen.

.
.
.
usw.

// Nacheinander prüfen, ob Event mit "Ja" beantwortet
if(value('LE01_01') == 1) {
replace('%ereignis%', 'Krankheit');

} elseif (value('LE01_02') == 1) {
replace('%ereignis%', 'medizinische Diagnose');

.
.
.

usw.

Hier hat man jedoch eine vorab festgelegte Reihenfolge. Bei mir scheitert es nun am Anlegen der Listen (1- selten bis 5-häufig), diese jeweils innerhalb durchzumischen und nacheinander abzufragen und beim ersten "Ja" dieses Ereignis in den Platzhalter des nächsten FB-Anschnitts zu integrieren (zuerst 1. Item der Gruppe 1, dann 2. Item der Gruppe 1 usw. bis letztes Item der Gruppe 5 -> falls hier alles nein, dann genanntes Ereignis des offenen Textfeldes in den Platzhalter integrieren.)

Hier mal der Pretest-Link:
https://www.soscisurvey.de/12schnappschuesse/?act=wHvVsrr333zN0fmywPIW59WQ

Ich danke Ihnen vielmals für Ihre Hilfe!

1 Answer

0 votes
by SoSci Survey (282k points)

Machn Sie sich um die Reihenfolge und Rotation erstmal nicht zu viele Gedanken. Das können Sie am Schluss optimieren.

Im ersten Schritt sollten Sie sich der Auswahl der Items annehmen - in aller Regel via getItems(). Da wäre zu klären, ob Sie Ihre Events in unterschiedlichen Fragen abfragen oder ob alle Events als Items derselben Frage angelegt wurden?

Die Folgefrage - also die Skalen - haben Sie schon realisiert, oder? Wenn nicht, dann sollte das mit der Anleitung Items in eine andere Frage übernehmen mehr oder weniger einfach umsetzbar sein.

Und wie ist das dann mit den per Skala bewerteten Ereignisse - möchten Sie daraus ein einzelnes Ereignis herausgreifen und dann dazu weitere Folgefragen stellen oder möchten Sie mehrere Ereignisse abfragen? Wie viele ggf.?

by s178438 (220 points)
Die Fragen mit den Events sind in jeweils 6 Fragen angelegt worden, welche jeweils 4-5 Items enthalten, also eine Mischung aus beidem. Da Die "Gruppen" jedoch neu sortiert werden, d.h. nicht nach "Art" des Events sondern danach, wie häufig dieses Events auftritt, bräuchte ich glaube ich eine array-Funktion, mit  welcher ich die neuen Gruppen einteilen könnte.  oder?

Das wäre bmein 1. Ansatz:

// Gruppe 1 (am seltensten) - Gruppe 5 (am häufigsten)
// 5 Listen anlegen und Items innerhalb randomisieren
// nacheinander Listen abfragen ob "Ja"
// Wenn ja -> Abspeichern in %event% und Weiter auf Seite 'PH'
// Wenn nirgends "ja" -> Seite "ER"

// UMSETZUNG
// Gruppe 1: am seltensten
if (!isset($Gruppe1)) {

    // Alle Items der Gruppe 1 auflisten
    $Gruppe1 = array('LE01_02', 'LE01_04', 'LE04_02', 'LE04_04', 'LE06_04');
   
    // Liste mischen
    shuffle($Gruppe1);

    // Präsentierte Itemreihenfolge zu String konvertieren
    $Gruppe1_string = implode("+", $Gruppe1);
    
    // Präsentierte Itemreihenfolge in Datensatz ablegen
    put("item_order_Gruppe1", $Gruppe1_string);

    // Variable für andere Seiten verfügbar machen
    registerVariable('Gruppe1');
}

if($Gruppe1[0] == 1 ){
$ereignis = value($Gruppe1[0]);
$ereignis = trim($ereignis);
replace('%ereignis%', $ereignis);
}




$Gruppe2 = array('LE02_02', 'LE02_04', 'LE03_03', 'LE04_01', 'LE06_03');
    $Gruppe3 = array('LE01_03', 'LE02_03', 'LE03_02', 'LE06_02', 'LE06_05');
    $Gruppe4 = array('LE03_01', 'LE03_04', 'LE04_03', 'LE05_01', 'LE05_03');
    $Gruppe5 = array('LE01_01', 'LE02_01', 'LE05_02', 'LE06_01');

Leider erscheint mir hier folgende Fehlermeldung:
Für den Platzhalter %ereignis% wurde weder ein Eingabefeld mit prepare_input() vorbereitet, noch ein Inhalt mit replace() festgelegt

Hätten Sie hierzu eine Tipp?
by SoSci Survey (282k points)
Für das Sortieren müssen Sie alle Bewertungen aus allen Fragen erstman in ein gemeinsames Schema bringen. Da würde ich mit valueList() anfangen. Geben Sie die Funktion mal alle Item-Kennungen, und lassen Sie sich das Ergebnis anzeigen.

$ratings = valueList([
    'LE02_01', 'LE02_02', 'LE02_03',
    ...
    'LE06_03', 'LE06_04', 'LE06_05'
]);
debug($ratings);

Im nächsten Schritt können wir dieses Array dann in separate Arrays zerlegen, je nach ausgewähltem Wert. Das wollten Sie, korrekt?

> Für den Platzhalter %ereignis% wurde weder ein Eingabefeld mit prepare_input() vorbereitet, noch ein Inhalt mit replace() festgelegt

Nochmal meine Frage: Wollen Sie die Folgefragen nur zu einem einzigen Ereignis stellen oder zu mehreren?
by s178438 (220 points)
Im nächsten Schritt können wir dieses Array dann in separate Arrays zerlegen, je nach ausgewähltem Wert. Das wollten Sie, korrekt?
-> genau. In 5 verschiedene Gruppen, welche ich vorab festlege.

IEs sollen nur nach einem einzigen Event (das möglichst weit oben in der Prio mit "Ja" beantwortet wurde) Folgefragen gestellt werden.
by SoSci Survey (282k points)
Danke für die Erklärung. Ich hatte es bisher so verstanden, dass sich die Gruppen aus der Bewertung ergeben würden (also z.B. "alle mit einem Rating von 5").

Jetzt verstehe ich es so, dass die Gruppen die Priorität widerspiegeln. Und dass Sie die Gruppen eigentlich nur zum randomisieren benötigen, wenn jemand mehrere Optionen innerhalb einer Gruppe mehrere mit "Ja" beantwortet hat?
by s178438 (220 points)
Die Fragen zu den Events sind dichotome Fragen, welche nur mit Ja oder Nein beantwortet werden können. Das heißt ich habe beispielsweise 3 Aussagen wie z.B.
-> Ich habe mit dem Rauchen aufgehört
-> Ich oder meine Partnerin ist schwanger geworden.
-> Ich habe meinen Job verloren.
usw... (insgesamt ca 25 Items)
Diese Aussagen sollen mit Ja oder Nein beantwortet werden. Nach diesen Fragen hätte ich gerne einen PHP-Code, welcher die Fragen in 5 "Gruppen" einteilt, die sich nach der Wahrscheinlichkeit/Häufigkeit ergeben. Diese Gruppen sind literaturbasiert vorab festgelegt. Innerhalb dieser Gruppen sollen die Fragen dann randomisiert werden und anschließend nacheinander geprüft werden, ob Frage 1 (Frage 2, usw) mit "JA" beantwortet wurde. Sobald eine Frage mit "Ja" beantwortet wurde (also diese Person dieses Events tatsächlich erlebt hat), soll dieses Event in den nächsten Platzhalter (Bitte bewerten Sie, inwiefern die folgenden Aussagen auf das Ereignis "%ereignis%", das Sie in den letzten vier Wochen erlebt haben, zutreffen.) eingefügt werden. Dieser Platzhalter befindet sich im nächsten FB-Abschnitt, wo weitere Fragen zu genau diesem erlebten Events gestellt werden. Es sollen dann auch nur Fragern zu diesem einen einzigen Events gestellt werden.
by SoSci Survey (282k points)
Danke für die Erklärung. So langsam ergibt es Sinn :)

Ich würde empfehlen, das Ganze von hinten anzugehen. Und zwar können Sie statt der Antworten auch einfach die Variablen innerhalb der 5 Gruppen mischen. Also...

$gruppe1 = array('LE01_02', 'LE01_04', 'LE04_02', 'LE04_04', 'LE06_04');
shuffle($gruppe1);
$gruppe2 = array('LE02_02', 'LE02_04', 'LE03_03', 'LE04_01', 'LE06_03');
shuffle($gruppe2);
// u.s.w.

Anschließend fügen Sie diese Arrays mittels array_merge() zu einem Array zusammen. Und dann müssen Sie nur noch von oben nach unten (also in einer FOR-Schleife) testen, wo die erste 2 (angekreuzt) kommt. Schon haben Sie das gewünschte Event.
by s178438 (220 points)
Vielen Dank für Ihre Antwort :)

Ich habe es nun wie folgt versucht:
// Gruppe 1 (am seltensten) - Gruppe 5 (am häufigsten)
// 5 Listen anlegen und Items innerhalb randomisieren
// nacheinander Listen abfragen ob "Ja"
// Wenn ja -> Abspeichern in %event% und Weiter auf Seite 'PH'
// Wenn nirgends "ja" -> Seite "ER"

// UMSETZUNG
// Gruppe 1: am seltensten

    // Alle Items der Gruppen auflisten
    $gruppe1 = array('LE08_01', 'LE10_01', 'LE04_02', 'LE04_04', 'LE06_04');
    shuffle($gruppe1);

    $gruppe2 = array('LE02_02', 'LE02_04', 'LE03_03', 'LE04_01', 'LE06_03');
    shuffle($gruppe2);

    $gruppe3 = array('LE09_01', 'LE02_03', 'LE03_02', 'LE06_02', 'LE06_05');
    shuffle($gruppe3);

    $gruppe4 = array('LE03_01', 'LE03_04', 'LE04_03', 'LE05_01', 'LE05_03');
    shuffle($gruppe4);

    $gruppe5 = array('LE01_01', 'LE02_01', 'LE05_02', 'LE06_01');
    shuffle($gruppe5);


// einzelne Listen zusammenführen
$liste = array_merge($gruppe1, $gruppe2, $gruppe3, $gruppe4, $gruppe5);

    // Präsentierte Itemreihenfolge zu String konvertieren
    $liste_string = implode("+", $liste);
    
    // Präsentierte Itemreihenfolge in Datensatz ablegen
    put("item_order_liste", $liste_string);

// Variable für andere Seiten verfügbar machen
    registerVariable($liste);    


// FOR-Schleife (nacheinander prüfen, ob "Ja" angekreuzt wurde

for ($i = 0; $i <= 23; $i++){
    if($liste[0] == 1 ){
$ereignis = value($liste[0]);
$ereignis = trim($ereignis);
replace('%ereignis%', $ereignis);
}
}

Leider scheitert es vermute ich noch an der FOR-Schleife. Hier kenne ich mich leider zu wenig aus. Das Ereignis später wird jedenfalls nicht ersetzt. Hier konnte kein Platzhalter gefunden werden. Könnten Sie mir noch bei der Umsetzung der FOR-Schleife behilflich sein? Da wäre ich sehr dankbar!

Außerdem wollte ich fragen, ob die Funktion array_merge() quasi die Reihenfolge der aufgeführen Listen berücksichtigt. Also dass quasi vorher drch shuffle() innerhalb der jeweiligen Listen durchgemischt wurde, die Listen an sich jedoch in der Reihenfolge in $liste aufgenommen werden, wie ich sie angegeben habe ($liste = array_merge($gruppe1, $gruppe2, $gruppe3, $gruppe4, $gruppe5);
by SoSci Survey (282k points)
Das registerVariable($liste) brauchen Sie m.E. nicht ... es sollte aber auch nicht stören. Schauen wir uns die FOR-Schleife mal an...

Da ist das IF m.E. an der falschen Stelle. Probieren Sie es hiermit:

$item = -1;
foreach ($liste as $varID) {
    $antwort = value($varID);
    if ($antwort == 2) {
      $item = $varID;
      break;
    }
}
if ($item < 0) {
  // Fehlermeldung zeigen, nichts ausgewählt
}
debug($ereignis);
$frage = substr($item, 0, 4);
$itemID = substr($item, 5);
debug($frage);
debug($itemID);

$beschreibung = getItemtext($frage, $itemID);
replace('%ereignis%', $beschreibung);
by s178438 (220 points)
Es klappt! Ich danke Ihnen vielmals!

Alleine hätte ich das nicht geschafft.

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

...