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

Guten Tag,

ich benötige Hilfe bei der Umsetzung einer Idee. 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 (327k points)

Ehrlich gesagt empfehle ich, dass Sie vorab nochmal komplett durchdenken, welche Auswertungen Sie machen werden - und was Sie dabei vergleichen werden. Denn gerade die Vergleiche können zum Problem werden, wenn Sie wie oben dargestellt seltene Ereignisse systematisch häufiger abfragen.

Ich kann den Wunsch nach gleich großen Gruppen nachvollziehen, aber der statistische Preis ist hoch. Die meisten Verfahren, die eine Zufallsauswahl voraussetzen, lassen sich dann nicht mehr anwenden. Also z.B. ein t-Test.

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.

Gilt das nur für diese Konstellation oder möchten Sie es immer so haben, dass mit gewichteter Zufallsauswahl zwischen dem seltensten und dem zweit-seltensten Ereignis ausgewählt wird? Technisch ist es im Prinzip nicht schwer: Sortieren sie die in der Gruppe ausgewählten Ereignisse nach der Seltenheit, zählen Sie ab, ob es 1 oder 2+ Ereignisse sind, und wenn es 2+ sind, dann ziehen Sie z.B. per Zufallsgenerator oder mittels random_p(), ob Sie das erste oder zweite verwenden möchten.

by s178438 (230 points)
edited by s178438
"Gilt das nur für diese Konstellation oder möchten Sie es immer so haben, dass mit gewichteter Zufallsauswahl zwischen dem seltensten und dem zweit-seltensten Ereignis ausgewählt wird?"

Genau genommen möchten wir jedes Ereignis mit einer Auftretenswahrscheinlichkeit (durch vergangene Studienergebnisse) gewichten. Wenn Beispielsweise Ereignis A (p= 0.8) und Ereignis E (p=0.1) mit "Ja" angekreuzt werden, soll Ereignis A mit einer 8x so hohen Wahrscheinlichkeit für den Platzhalter ausgewählt werden.

das theoretische Vorgehen wäre wie folgt:
// Auftrittswahrscheinlichkeiten jedem einzelnen Ereignis zuordnen

// Prüfen, welche Ereignisse mit "ja" angekreuzt wurden
// $Liste erstellen mit allen Items/Ereignissen, die mit "Ja" angekreuzt wurden

// aus $Liste mittels random_(p) eine Zahl/Ereignis würfeln mit Gewichtung

// ausgewähltes Ereignis in Platzhalter einfügen

Nun scheitert es bei mir an der praktischen Umsetzung. Könnten Sie mir helfen?
by SoSci Survey (327k points)
Die Funktion random_p() liefert Ihnen auch eine gewichtete Ziehung. Sie müssen dann nur vorab ein Array mit den Wahrscheinlichkeiten definieren...

$prop = [
  1 => 80,
  2 => 100,
  3 => 25,
  ...
  8 => 10
];

... dann die markierten Optionen daraus in ein neues Array kopieren:

$selected = getItems('AB01', 'is', 2);
$basis = [];
foreach ($selected as $num) {
  $basis[$num] = $prop[$num];
}

.... und dann daraus ziehen:

$use = random_p($basis);

Sorgen sie nur mittels isset() und registerVariable() dafür, dass die Ziehung sich beim Neu-Laden der Seite nicht ändern. Und denken Sie bitte daran, dass wir hier eine uneingeschränkte Zufallsziehung haben: Eine Wahrscheinlichkeit von 0,1 heißt nicht, dass der Wert am Ende auch wirklich in 10% aller Fälle gezogen wird. Erst im Bereich großer Zahlen nähert sich der Wert der Wahrscheinlichkeit an.
by s178438 (230 points)
Vielen Dank für Ihre Nachricht! Könnten Sie mir noch dabei helfen, wie genau ich den einzelnen Fragen die Nummern fest zuordnen kann? Die Ja/Nein-Fragen vorab werden nämlich randomisiert dargeboten und wenn ich nun beim ersten präsentierten Item "ja" ankreuze, bekomme ich den Platzhalter von $use = 1 angezeigt. Wäre es irgendwie möglich, dass ich nicht "Zahlen" ziehe, sondern wirklich direkt die Fragen mit deren Kennung?

$prop = array(1 => 80, 2 => 100, 3 => 25, 4 => 10, 5 => 80, 6 => 100,
              7 => 25, 8 => 10, 9 => 80, 10 => 100, 11 => 25, 12 => 10,
              13 => 80, 14 => 100, 15 => 25, 16 => 10, 17 => 80, 18 => 100,
              19 => 25, 20 => 10, 21 => 80, 22 => 100, 23 => 25, 24 => 10);

// Ereignisse, die mit "ja" angekreuzt wurden in array kopieren

$selected1 = getItems('LE01', '==', 1);
$selected2 = getItems('LE08', '==', 1);
$selected3 = getItems('LE09', '==', 1);
$selected4 = getItems('LE10', '==', 1);
$selected5 = getItems('LE02', '==', 1);
$selected6 = getItems('LE03', '==', 1);
$selected7 = getItems('LE04', '==', 1);
$selected8 = getItems('LE05', '==', 1);
$selected9 = getItems('LE06', '==', 1);

$selected = array_merge($selected1, $selected2, $selected3,
            $selected4, $selected5, $selected6, $selected7,
            $selected8, $selected9);


$basis = [];
foreach ($selected as $num) {
  $basis[$num] = $prop[$num];
}

// und dann daraus ziehen:

$use = random_p($basis);


// Events in Kurztitel ändern
if($use == 1){
   replace('%ereignis%','Krankheit');
} elseif($use == 2){
   replace('%ereignis%','medizinische Diagnose');
} elseif($use == 3){
   replace('%ereignis%','medizinische Behandlung oder Psychotherapie');
} elseif($use == 4){
   replace('%ereignis%','mit dem Rauchen aufgehört');
} elseif($use == 5){
   replace('%ereignis%','Studiums- oder Ausbildungsbeginn');
} elseif($use == 6){
   replace('%ereignis%','Studiums- oder Ausbildungswechsel');
} elseif($use == 7){
   replace('%ereignis%','Prüfung bestanden');
} elseif($use == 8){
   replace('%ereignis%','Prüfung nicht bestanden');
} elseif($use == 9){
   replace('%ereignis%','neuer Job');
} elseif($use == 10){
   replace('%ereignis%','Beförderung');
} elseif($use == 11){
   replace('%ereignis%','Veränderung am Arbeitsplatz');
} elseif($use == 12){
   replace('%ereignis%','Jobverlust');
} elseif($use == 13){
   replace('%ereignis%','Schwangerschaft');
} elseif($use == 14){
   replace('%ereignis%','Erkrankung von Freund:in oder Familienmitglied');
} elseif($use == 15){
   replace('%ereignis%','Tod von Freund:in oder Familienmitglied');
} elseif($use == 16){
   replace('%ereignis%','Besuch bei Freund:innen oder Familie');
} elseif($use == 17){
   replace('%ereignis%','neue Beziehung');
} elseif($use == 18){
   replace('%ereignis%','Trennung');
} elseif($use == 19){
   replace('%ereignis%','Streit in der Beziehung');
} elseif($use == 20){
   replace('%ereignis%','Urlaub');
} elseif($use == 21){
   replace('%ereignis%','Fest');
} elseif($use == 22){
   replace('%ereignis%','Verschlechterung der Finanzen');
} elseif($use == 23){
   replace('%ereignis%','Unfall');
} elseif($use == 24){
   replace('%ereignis%','besondere Leistung');
}
by SoSci Survey (327k points)
Ihre Ermittlung der ausgewählten Optionen ist noch ein wenig fehleranfällig und ... nicht ganz korrekt. Das getItems() ist für eine Mehrfachauswahl oder Skala klasse, nicht aber für eine einzelne Auswahlfrage. Was halten Sie hiervon?

$optionen = [
  1 => 'LE01',
  2 => 'LE08',
  ...
  9 => 'LE06'
];

$basis = [];
foreach ($optionen as $num => $qstID) {
  if (value(qstID) == 1) {
    $basis[$num] = $prop[$num];
  }
}

Das Ergebnis der Ziehung sollten Sie natürlich noch in eine interne Variable speichern:

$use = random_p($basis);
put('IV01_01', $use);
by s178438 (230 points)
edited by s178438
Vielen Dank, das probiere ich direkt mal aus!

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

...