0 votes
in SoSci Survey (dt.) by s040122 (170 points)

Hallo!

Ich bin gerade dabei, die Studie für meine Masterarbeit zu erstellen. Der Ablauf soll folgendermaßen sein:

  1. Die Teilnehmer (TN) teilen ihren Tag in Episoden ein, beschreiben diese jeweils kurz und geben zu jeder Episode an, als wie emotional intensiv sie diese erlebt haben (Schieberegler).

  2. Die Teilnehmer werden zu den sechs emotional intensivsten Episoden jeweils einzeln befragt. Dazu wird ihnen auf 6 aufeinanderfolgenden Seiten jeweils die Beschreibung der Episode erneut angezeigt, zusätzlich ein paar Likertskalen.

Meine Frage: Wie bekomme ich es hin, dass die sechs Episoden ausgewählt werden, die als am intensivsten erlebt wurden? Ich habe leider nur wenig Erfahrung mit PHP und Programmieren im allgemeinen, Einen if-ifelse-else-Vergleich bekomme ich gerade noch hin und mit replace kann ich auch arbeiten, aber da hört es dann auch leider auf...

Um Hilfe wäre ich wirklich sehr dankbar!

Viele Grüße

Ronja

by SoSci Survey (327k points)
Könnten Sie vielleicht noch etwas ausführlicher beschrieben, wie die Einteilung der Teilnehmer aussieht? Welche(n) Fragetyp(en) verwenden Sie dafür? Werden die Teilnehmer überhaupt mehr als 6 Episoden eintragen?
by s040122 (170 points)
Hm, es scheint tatsächlich ein schwierigeres Problem zu sein. Wenn es keine Lösung gibt, ist das auch eine hilfreiche Information für mich, dann muss ich die Studie anders aufbauen... Vielen Dank!

3 Answers

0 votes
by s040122 (170 points)

Hallo!

Ich habe der Einfachheit halber einfach einen Screenshot davon aufgenommen, was die Teilnehmer sehen (bei den beiden unteren Tabellen fehlen die Schieberegler noch).

Bis auf die Schieberegler handelt es sich um freie Texteingaben. Die Teilnehmer können bis zu 30 Episoden angeben, müssen dies aber nicht tun, ein Minimum ist nicht vorgegeben (Instruktion dazu gibt es auf der Seite davor).

Anhand der Schieberegler sollen nun die 6 intensivsten automatisch ausgewählt werden.
Auf der nächsten Seite kommt dann etwas wie "Erinnen Sie sich noch einmal an die Episode Titel der Episode zurück, in der foldendes passiert ist: Beschreibung der Episode", dazu dann ein paar Skalen. Pro Episode soll es dafür eine Fragebogenseite geben. Ob dabei die intensivste Episode zuerst eingeblendet wird oder nicht ist egal, es sollen nur die sechs intensivsten sein. Bei "Gleichstand" zwischen Episoden (angenommen jemand hätte 9 Episoden mit höchsten Intensität angegeben), soll einfach zufällig ausgewählt werden.

Sollte es einfacher sein, kann ich auch nur eine, statt drei Tabellen zum Eintragen anbieten, dann haben die Schieberegler zumindest alle den gleichen Anfang im Variablennamen.

Ich hoffe, ich konnte das ganze noch einmal präzisieren - vielen Dank für die Hilfe!

Viele Grüße

Ronja

0 votes
by SoSci Survey (327k points)

Zunächst sollten Sie in Betracht ziehen, dass es bei dieser Form der Abfrage vielleicht nicht die 6 intensivsten Episoden gibt.

  • Es ist möglich, dass insgesamt weniger Episoden angegeben werden
  • Es ist möglich, dass mehrere Episoden dieselbe Intensität zugewiesen bekommen

Das generelle Herangehen wäre folgendes: Sie rufen mit valueList() die kompletten Antworten für den Schieberegler ab, sortieren mittels arsort() absteigend nach Werten und nehmen dann die ersten 6 Werte - so vorhanden - mittels array_slice().

$resp = valueList('SR01');
arsort($resp);
$items = array_slice($resp, 0, 6);

Jetzt noch in Item-Nummern übersetzen:

$itemList = array();
foreach ($items as $id => $value) {
  $itemID = (int)trim(substr($id, 5, 2), '0');
  $itemList[] = $itemID;
}

Sehen wir uns das Ergebnis einmal an.

debug($items);
debug($itemList);

Damit kann man schonmal arbeiten. Allerdings ist das Problem noch nicht gelöst, wenn mehrere Items dieselbe Intensität bekommen.

by s040122 (170 points)
Dankeschön! Das funktioniert schon richtig gut!
Dass mehrere Episoden die gleiche Intensität zugewiesen bekommen, ist inhaltlich überhaupt nicht schlimm. Vielleicht trifft es die Formulierung "sechs der intensivsten Episoden" besser als "die sechs intensivsten Episoden". Ich werde die Probanden wohl instruieren mindestens sechs Episoden anzugeben.
Ich habe gerade ein bisschen mit verschiedenen "Antworten" herumgespielt und die Listen sind so, wie ich sie mir vorstelle.

Gibt es jetzt damit die Möglichkeit die "_01"-Zahl (Entschuldigung, ich weiß leider nicht, wie man das nennt.. ) der Listen-Items, an anderen Stellen im Fragebogen in den "replace('%antwort%', 'TX01_01', 'response')"-einzufügen? Also hier anstatt "TX01_01" --> "TX01*setze hier die Nummer der ersten Items aus der Liste ein*" Dann sollte ich darüber doch die Antworten eines anderen Items, das zum entsprechenden Schieberegler gehört hat, anzeigen lassen, oder bin ich da auf dem Holzweg?

Vielen Dank nochmal für die Hilfe, das ist wirklich Gold wert!
by SoSci Survey (327k points)
Das mit den Platzhaltern lässt sich in folgenden PHP-Code recht einfach integrieren:

$itemList = array();
foreach ($items as $id => $value) {
  $itemID = (int)trim(substr($id, 5, 2), '0');
  $itemList[] = $itemID;
}

Und da ergänzen wir noch ein value() und replace():

$itemList = array();
foreach ($items as $id => $value) {
  $itemID = (int)trim(substr($id, 5, 2), '0');
  $itemList[] = $itemID;
  // Platzhalter vorbereiten
  replace('%text'.sprintf('%02d', $itemID).'%', value(id('XX00', $itemID)));
}

Das sprintf() ist nur dafür da, dass aus 1 wieder ein 01 wird, also %text01% - ansonsten ist der Code nicht besonders anspruchsvoll.

Und für das XX00 müssen Sie die Frage-Kennung der offenen Texteingabe einsetzen, deren Text Sie verwenden möchten. Nummer und Text können Sie natürlich auch kombinieren, wenn Sie value() mehrfach verwenden.

Und noch ein Tipp: Versuchen Sie als erste Frage in der kombinierten Frage doch mal den Fragetyp "offene Nennungen". Dann können Sie sich evtl. die Spalte "Nr." sparen.
by s040122 (170 points)
Hallo,

leider funktioniert das nicht so richtig.
Ich habe den Code einfach kopiert und dann als Textbaustein %text'.sprintf('%02d', $itemID).'% auf der gleichen Seite wie den PHP-Code eingefügt, aber dann wir mir tatsächlich nur "%text'.sprintf('%02d', $itemID).'%" angezeigt und nicht das, was ich vorher eingegeben hatte...

Ich verstehe auch noch nicht, an welcher Stelle ich eintrage, auf welches Item aus der Liste sich das replace beziehen soll, also ob auf der erste, das zweite, das dritte... Und muss ich bei replace am Ende nicht noch 'response' anfügen, damit die Antwort der Teilnehmer hier angezeigt wird? Ich hatte es bisher immer so verstanden und verstehe nicht, warum es hier nicht nötig ist.

Ich stelle gleich auch noch ein Foto hier herein, wie es bei mir gerade aussieht...

Viele Dank!
0 votes
by s040122 (170 points)

Hier noch das Bild, wie ich es gerade aufgebaut habe

by SoSci Survey (327k points)
Nein, den unteren Teil (Text (Einschub)) benötigen Sie nicht. Da hatte ich mich missverständlich ausgedrückt. Es geht um eine Änderung im PHP-Code un der replace()-Zeile.
by s040122 (170 points)
Hm, ok, ich versuche mal zu verstehen, was der Code macht, wie er jetzt da steht: Ich verstehe es gerade so, dass

$itemList = array();
foreach ($items as $id => $value) {
  $itemID = (int)trim(substr($id, 5, 2), '0');
  $itemList[] = $itemID;
}

mir eine geordnete Liste mit den 6 höchten Items erzeugt. Wenn ich die Zeile

replace('%text'.sprintf('%02d', $itemID).'%', value(id('TX02', $itemID)));

einfüge, werden dann die Elemente der Liste umgeschrieben? Also eine Liste, in der Anstelle von TX21_01 dann TX02_01 steht? Und das hat gar nichts mit dem replace-Befehl zu tun, den ich benötige, um dann tatsächlich die Antworten wieder einzublenden?

Heißt das, ich muss dann für den replace-Befehl, den ich brauche um die vorhergehende Antwort einzublenden auf einer anderen Seite so eitwas schreiben wie "replace(%text1%, $itemList[0], 'response')"?


Oder verknote ich mir gerade vollkommen den Kopf?
by SoSci Survey (327k points)
> mir eine geordnete Liste mit den 6 höchten Items erzeugt. Wenn ich die Zeile

Nicht ganz: Hier werden die Items aus $items einzeln durchgegangen und aus der Kennung. z.B. TX21_01 wird die Item-Kennung ("01") herausgeschnitten und in $itemList[] geschrieben.

Und Sie benötigen für jedes dieser Items ja noch einen Platzhalter. Das macht die replace()-Zeile. Sie macht aus der Item-Nummer 1 den Platzhalter %text01% (das ist der erste Teil bis zum '%') und setzt als Inhalt die Antwort von TX02_01 (das ist der zweite Teil nach dem Komma). Das value() ersetzt hier das "response" - wäre aber prinzipiell auch möglich, wenn Sie ausschließlich die Eingabe in das eine Feld verwenden möchten (also nicht z.B. die Kombination der ersten beiden Textfelder pro Zeile).
by s040122 (170 points)
Dankschön! Das hat geholfen, jetzt weiß ich, was da passiert.

Leider setzt es nicht immer alles richtig ein, mir scheint, dass es den Übertrag nicht richtig macht, manchmal sagt es einfach, der Platzhalter sei sind generiert worden. Es kommt mir vor, als würde es nur die ersten sechs Zeilen in Platzhalter abwandeln, wenn diese zu den höchen Werten zählen. Vielleicht irre ich mich da aber auch.

Hier einfach mal der Link zu dem Teil des Fragebogens, da sieht man es schneller, als wenn ich es erkläre.      https://www.soscisurvey.de/MA_EmoDiff/?q=tester
by SoSci Survey (327k points)
> Vielen Dank für Ihr Interesse!
> Diese Befragung wurde noch nicht veröffentlicht.

Ein Pretest-Link wäre vermutlich hilfreicher. Und immer sehr hilfreich: Die Debug-Information der entsprechenden Seite: https://www.soscisurvey.de/help/doku.php/de:create:debugging
by s040122 (170 points)
Richtig, meine letzte Studie mit Sosci ist schon etwas her, ich hatte ganz vergessen, dass ich das gibt...
https://www.soscisurvey.de/MA_EmoDiff/?act=S56dJQEA1efIw8RCkozcU236 hier der richtige Link - die unteren Tabellen sind bisher noch nicht eingestellt, vermutlich werde ich sie eh löschen, aber weil es so viel arbeit war, sie zu bauen, lasse ich sie vorerst noch drin, ignoriere sie aber
by s040122 (170 points)
So, mit ein bisschen Getüftel habe ich das Problem lösen können, der Code sieht jetzt so aus:

$resp = valueList('TX21');
arsort($resp);
$items = array_slice($resp, 0, 6);

$itemList = array();
$i=1;
foreach ($items as $id => $value) {
  $itemID = (int)trim(substr($id, 5, 2), '0' );
  $itemList[] = $itemID;
  // Platzhalter vorbereiten
  replace('%text'.sprintf('%02d', $i++).'%', value(id('TX02', $itemID)));
}


und er tut, was er tun soll :)

Vielen Dank für den ganzen Support!
by SoSci Survey (327k points)
Sehr schön :)

Wie gesagt: Legen Sie testweise mal noch eine Frage "offene Nennungen" an, sorgen Sie dort für ein 1., 2., ... vor dem Eingabefeld und ersten Sie die ersten beiden Spalten (alles nur testweise) durch diese Frage. Könnte einen Versuch wert sein.

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

...