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 (316k 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)
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 (316k 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 (316k 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

...