0 votes
in SoSci Survey (dt.) by s178438 (230 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!

by s178438 (230 points)
Guten Tag,

ich benötige Hilfe bei der Umsetzung einer Idee zu dem oben genannten Thema/Fragebogen. Und zwar geht es um eine Umfrage, in welcher zunächst mehrere Ereignisse abgefragt werden, ob diese in den letzten 4 Wochen stattgefunden haben. Hier kann die Person entweder Ja oder Nein ankreuzen. In einer darauffolgenden Seite werden zunächst die Gruppen (s.o.) festgelegt, in welchen die Ereignisse nach Häufigkeit gruppiert werden. Daraufhin soll ein Ereignis ausgewählt werden, bei welchem die Person "Ja" angekreuzt hat, um hier mit einer weiteren Skala detailliertere Fragen zu diesem Ergebnis zu stellen. Das Ereignis wird wie folgt ausgewählt: Es wird von der seltensten Kategorie bis hin zu häufigsten Kategorie in einem PHP Code geschaut, ob die Person bei einer Frage "Ja" angekreuzt hat. Das Ereignis, welches am "seltensten" auftritt und mit Ja angekreuzt wurde, wird dementsprechend in einen Platzhalter eingefügt, um hier detailliertere Fragen zu stellen. Der PHP-Code sieht folgendermaßen aus:

// 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
// Gruppe 4: am häufigsten

    // Alle Items der Gruppen auflisten
    $gruppe1 = array('LE02_02', 'LE03_04', 'LE04_01', 'LE02_04');
    shuffle($gruppe1);

    $gruppe2 = array('LE05_02', 'LE06_04', 'LE10_01', 'LE05_01',
                        'LE02_01','LE03_02' ,'LE03_01','LE08_01');
    shuffle($gruppe2);

    $gruppe3 = array('LE09_01', 'LE04_03', 'LE03_03', 'LE04_02', 'LE05_03',
                        'LE02_03','LE06_03' ,'LE01_01','LE06_05','LE06_02');
    shuffle($gruppe3);

    $gruppe4 = array('LE04_04', 'LE06_01');
    shuffle($gruppe4);

  


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

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

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

$item = -1;
foreach ($liste as $varID) {
    $antwort = value($varID);
    if ($antwort == 1) {
      $item = $varID;
      break;
    }
}
if ($item < 0) {
  // Fehlermeldung zeigen, nichts ausgewählt
}

$frage = substr($item, 0, 4);
$itemID = substr($item, 5);
debug($frage);
debug($itemID);

$beschreibung = getItemtext($frage, $itemID);
replace('%ereignis%', $beschreibung);

// Events in Kurztitel ändern

if($beschreibung == 'Ich bin krank geworden.'){
   replace('%ereignis%','Krankheit');
} elseif($beschreibung == 'Ich habe eine ernste medizinische Diagnose erhalten.'){
   replace('%ereignis%','medizinische Diagnose');
} elseif($beschreibung == 'Ich habe eine medizinische Behandlung oder Psychotherapie begonnen.'){
   replace('%ereignis%','medizinische Behandlung oder Psychotherapie');
} elseif($beschreibung == 'Ich habe aufgehört zu rauchen.'){
   replace('%ereignis%','mit dem Rauchen aufgehört');
} elseif($beschreibung == 'Ich habe ein Studium oder eine Ausbildung angefangen.'){
   replace('%ereignis%','Studiums- oder Ausbildungsbeginn');
} elseif($beschreibung == 'Ich habe das Studienfach, die Universität oder die Ausbildung gewechselt.'){
   replace('%ereignis%','Studiums- oder Ausbildungswechsel');
} elseif($beschreibung == 'Ich habe eine wichtige Prüfung bestanden.'){
   replace('%ereignis%','Prüfung bestanden');
} elseif($beschreibung == 'Ich bin durch eine wichtige Prüfung gefallen.'){
   replace('%ereignis%','Prüfung nicht bestanden');
} elseif($beschreibung == 'Ich habe einen neuen Job angefangen.'){
   replace('%ereignis%','neuer Job');
} elseif($beschreibung == 'Ich bin befördert worden.'){
   replace('%ereignis%','Beförderung');
} elseif($beschreibung == 'Mein Arbeitsplatz und meine Aufgaben haben sich maßgeblich verändert.'){
   replace('%ereignis%','Veränderung am Arbeitsplatz');
} elseif($beschreibung == 'Ich habe meinen Job verloren.'){
   replace('%ereignis%','Jobverlust');
} elseif($beschreibung == 'Ich oder meine Partnerin sind schwanger geworden.'){
   replace('%ereignis%','Schwangerschaft');
} elseif($beschreibung == 'Ich habe erfahren, dass eine Person aus meinem engen Freundeskreis oder ein Familienmitglied schwer krank ist.'){
   replace('%ereignis%','Erkrankung von Freund:in oder Familienmitglied');
} elseif($beschreibung == 'Eine Person aus meinem engen Freundeskreis oder ein Familienmitglied ist gestorben.'){
   replace('%ereignis%','Tod von Freund:in oder Familienmitglied');
} elseif($beschreibung == 'Ich habe Freund:innen oder Familie besucht, die ich selten sehe.'){
   replace('%ereignis%','Besuch bei Freund:innen oder Familie');
} elseif($beschreibung == 'Ich bin in einer neuen (romantischen) Beziehung.'){
   replace('%ereignis%','neue Beziehung');
} elseif($beschreibung == 'Mein:e Partner:in und ich haben uns getrennt.'){
   replace('%ereignis%','Trennung');
} elseif($beschreibung == 'Mein:e Partner:in und ich hatten einen ernsten Streit.'){
   replace('%ereignis%','Streit in der Beziehung');
} elseif($beschreibung == 'Ich habe Urlaub gemacht.'){
   replace('%ereignis%','Urlaub');
} elseif($beschreibung == 'Ich habe ein wichtiges Fest gefeiert (z.B. runder Geburtstag, religiöser Festtag, Jubiläum etc.).'){
   replace('%ereignis%','Fest');
} elseif($beschreibung == 'Meine finanzielle Situation hat sich bedeutend verschlechtert.'){
   replace('%ereignis%','Verschlechterung der Finanzen');
} elseif($beschreibung == 'Ich hatte einen Unfall (z.B. einen Verkehrsunfall, Haushaltsunfall oder schweren Sturz).'){
   replace('%ereignis%','Unfall');
} elseif($beschreibung == 'Ich habe etwas sehr Besonderes geleistet.'){
   replace('%ereignis%','besondere Leistung');
}

debug($beschreibung);
debug('%ereignis%');


// Event speichern
put('VC01_19', $beschreibung);

Nun ist das ganze ja ziemlich deterministisch. Wenn eine Person LE03_01 sowie LE03_03 mit "ja" beantwortet hat, wird jedes mal LE03_01 ausgewählt und niemals LE03_03, da letzteres in einer häufigeren Gruppe ist. Nun hängen die beiden Items ziemlich stark miteinander zusammen (LE03_01: Ich habe einen neuen Job angefangen. LE03_03: Mein Arbeitsplatz und meine Aufgaben haben sich maßgeblich verändert.) sodass häufig beides mit "Ja" beantwortet wird.

Mein Anliegen ist nun folgendes: Ich würde gerne den php code so umschreiben, dass nicht JEDES Mal, das seltenere Ereignis für den Platzhalter ausgewählt wird, sondern es nur zu einer gewissen Wahrscheinlichkeit eher ausgewählt wird. D.h. ist seltenen Fällen soll auch das andere Ereignis LE03_03 ausgewählt werden. Ist solch eine Umsetzung irgendwie möglich?

Vielen Dank schonmal für Ihre Hilfe!

1 Answer

0 votes
by SoSci Survey (328k 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 (230 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 (328k 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 (230 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 (328k 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 (230 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 (328k 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 (230 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 (328k 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 (230 points)
Es klappt! Ich danke Ihnen vielmals!

Alleine hätte ich das nicht geschafft.
by s178438 (230 points)
Hallo, ich hätte doch noch eine Frage zu dem obigen Code. Wofür genau stehen die folgenden Zahlen 0, 4 und 5?:

$frage = substr($item, 0, 4);
$itemID = substr($item, 5);

Wenn ich das ganze auf 4 (statt 5) Gruppen reduziere, müssen sich dann auch diese zahlen ändern? Denn wenn ich diese auf 0, 3, 4 ändere, funktioniert der Code nicht mehr.
by SoSci Survey (328k points)
Die Dokumentation der substr()-Funktion finden Sie hier:
https://www.php.net/manual/de/function.substr.php

0 = Ab dem ersten Zeichen (PHP zählt ab 0)
4 = 4 Zeichen lang
5 = ab dem sechsten Zeichen

> Wenn ich das ganze auf 4 (statt 5) Gruppen reduziere, müssen sich dann auch diese zahlen ändern?

Nein. Dafür müssten Sie dafür sorgen, dass $liste nur 4 Einträge enthält. Also hier einen Eintrag entfernen:

$liste = array_merge($gruppe1, $gruppe2, $gruppe3, $gruppe4, $gruppe5);

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

...