Welcome to the LimeSurvey Community Forum

Ask the community, share ideas, and connect with other LimeSurvey users!

Frage bzgl. automatischer Selektion und anschließender Randomisierung

  • dohuettemann
  • dohuettemann's Avatar Topic Author
  • Offline
  • New Member
  • New Member
More
3 years 9 months ago #202094 by dohuettemann
Hallo zusammen,


wir erstellen aktuell im Rahmen eines Forschungsprojektes einen Fragebogen und haben noch ein Problem mit der technischen Umsetzung in LimeSurvey, das wir leider noch nicht selbst lösen konnten. Konkret geht es um folgende Fragestellung:

In der Umfrage werden in Matrixform ca. 90 Strategien als Teilfragen abgefragt, die in einer Range von 1 (überhaupt nicht) bis 6 (voll und ganz) bzw. mit „kenne ich nicht“ bewertet werden können. In der anschließenden Frage sollen die Teilnehmer angeben, woher ihnen die Strategien bekannt sind. Dabei möchten wir gerne eine Auswahl von fünf sehr ausgeprägten Strategien (mit "5" oder "6" bewertet) sowie fünf wenig ausgeprägten Strategien (mit "1" oder "2" bewertet) automatisiert abfragen. Die Abfrage dieser Strategien sollte zudem randomisiert erfolgen, sodass die insgesamt 10 selektierten Strategien rein zufällig aus dem Pool gewählt werden.

Das Forschungsdesign nochmal prägnant zusammengefasst:

Es sollen
... aus ca. 90 Teilfragen/Strategien
... alle Teilfragen mit dem Wert 1 (oder wenn nicht mindestens 10 Mal der Wert 1 gewählt wurde, dann auch alle mit dem Wert 2) in einen Pool A und
... alle Teilfragen mit dem Wert 6 (oder wenn nicht mindestens 10 Mal der Wert 6 gewählt wurde, dann auch alle mit dem Wert 5) in einen Pool B
gespeichert werden und dann
... aus Pool A zufällig 5 Strategien für eine Folgefrage (per Dropdown-Auswahl) und
... aus Pool B zufällig 5 Strategien für eine Folgefrage (per Dropdown-Auswahl) gezogen werden.


Wir nutzen die LimeSurvey Version 3.22.16+200519, Windows 10 sowie den Browser Chrome.



Wir sind für jegliche Unterstützung und Tipps sehr dankbar, da die Veröffentlichung möglichst bald erfolgen soll.


Vielen Dank bereits im Voraus!
The topic has been locked.
  • Joffm
  • Joffm's Avatar
  • Offline
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
3 years 9 months ago - 3 years 9 months ago #202136 by Joffm
Hallo,
vor einiger Zeit gabe es hier im deutschen Forum bereits eine ähnliche Frage.
Dabei ging es zwar nur um den einen Teil, aus den Bewertungen die zehn besten zu ermitteln; falss mehr als 10 mit gleichem Score, dann eben at random.
Der zweite Teil ist ja analog.

Ich werde einmal suchen, ob ich meine damalige Lösung finde; in der Zwischenzeit kannst Du ja auch einmal schauen.

Bis später
Joffm

P.S.
Habt Ihr Zugriff auf die Datenbank?
Und wie sieht es mit einem ganz kleinen bisschen Ahnung von php, MySQL aus?
Dann ließe sich das Ganze nämlich schnell und elegant erschlagen.

Volunteers are not paid.
Not because they are worthless, but because they are priceless
Last edit: 3 years 9 months ago by Joffm.
The topic has been locked.
  • Joffm
  • Joffm's Avatar
  • Offline
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
3 years 9 months ago #202166 by Joffm
So, meine Lösung wäre:
in einer Frage vom Typ "kurzer Text" (sie mag QAjax" heißen) wird per "ajax call" ein php-script aufgerufen, welches die Datenbank abfragt.

Bei mir würde dann Folgendes zurückgegeben (ich habe es in meinem Test auf 5 + 5 beschränkt.

#H07H25H18H26H08L03L30L12L28L15
wobei H für die hohen Werte, L für die niedrigen Werte steht, und das andere sind eben die Teilfragen-Codes.

Nun kann man in der Folgefrage einfach per Teilfragen-Relevanz die anzuzeigenden Items auswählen:
Nämlich indem man fragt, ob eine bestimmte Nummer im Text enthalten ist.
strpos(QAjax,"H01")>0 für die erste Teilfrage, usw.

Übrigens dient das vorgestellte "#" dazu, dass der von "strpos" zurückgegebene Wert nicht falsch-negativ ist.
Ohne dieses Zeichen würde strpos(QAjax,"H01") nämlich das Ergebnis "0" haben (das erste Zeichen hat den Index "0")
"0" ist aber gleichzeitg der Wert für "nicht gefunden".
Das haben wir damit also abgefangen.

Und der ajax call sieht dann so aus.
Code:
<script type="text/javascript" charset="utf-8">
$(document).on('ready pjax:scriptcomplete',function(){
   $.post('https://www.myServer.de/getMyValue.php' , { sid: "{SID}", gid: "{GID}", qid: "{QID}", savedid: "{SAVEDID}" } ,function(data) {
 
                   $('#question{QID} input[type="text"]').val(data);
 
  });
// Uncomment to hide the question
                $('#question{QID}').hide();
});
</script>
Es werden also die SurveyID, die GruppenID und die FragenID der matrixfrage übergeben, außerdem natürlich die SpeicherID der aktuellen Person.

Volunteers are not paid.
Not because they are worthless, but because they are priceless
The topic has been locked.
  • Joffm
  • Joffm's Avatar
  • Offline
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
3 years 9 months ago - 3 years 9 months ago #202323 by Joffm
Hallo,
nachdem ich gesehen habe, dass Du eine Uni-Email hast, gehe ich davon aus, dass LimeSurvey auch auf dem Uni-Server installiert ist.
Damit erübrigt sich natürlich ein ajax call.

Aber es gibt natürlich auch eine built-in Lösung.
In meinem angehängten Beispiel habe ich mich auf 50 Items beschränkt und zeige es auch nur für die Werte 1/2.
Die Erweiterung überlasse ich Euch.
Außerdem ist die Matrix keine Pflichtfrage; dann uss man beim Testen nicht immer alles anklicken.
Ich zeige "Gruppe für Gruppe" an, da alle Gleichungen noch nicht versteckt sind (ist zum Testen besser) und man daher nicht alle durchklicken muss.

In der Gruppe "GRechne" sind sämtliche Gleichungen, die nach dem Test natürlich versteckt werden müssen.
1. "eqZahl1" und "eqZahl6". Hier wird gezählt, wieviele Items mit 1 bzw. 6 bewertet wurden.
2.a. "eqJoinLow1". Es wird ein string erzeugt, der die Codes der Teilfragen enthält, die mit "1" bewertet wurden.
2.b. "eqJoinLow2". Falls nötig (wir haben noch keine 10): Es wird ein string erzeugt, der die Codes der Teilfragen enthält, die mit "2" bewertet wurden.
2.c. "eqJoinLowA". Die beiden strings werden zum Endstring zusammengefügt.
Die hinzugefügten - und auch wieder entfernten - Buchstaben dienen dazu, dass dies nicht als Zahl interpretiert wird. Dann gäbe es nämlich evtl. einen Überlauf.

Nun folgt fünfmal dasselbe Procedere, um die fünf zufälligen Codes zu erzeugen.
3.a. "eqRandLowA". Es wird eine Zufallszahl zwichen "0" und der Anzahl der im String enthaltenen Codes (-1) erzeugt.
3.b. "wertLow1". Der Code wird aus dem String extrahiert.
3.c. "eqJoinLowB". Der Code wird aus dem String entfernt.

4.a. "eqRandLowB". Es wird eine Zufallszahl zwichen "0" und der Anzahl der im String enthaltenen Codes (-1) erzeugt.
4.b. "wertLow2". Der Code wird aus dem String extrahiert.
4.c. "eqJoinLowC". Der Code wird aus dem String entfernt.
...

Am Ende werden die fünf so erhaltenen Codes wieder zusammengefügt
8. "listLow". Am Ende werden die fünf so erhaltenen Codes wieder zusammengefügt
Und man erhält eine Zeichenkette wie diese:
#04, 34, 21, 11, 39,
Nun kann man in die Teilfragenrelevanz der folgenden Frage - die ja nur diese 5 Items anzeigen soll - schreiben:

QX_SQ001: strpos(listLow,"01,")>0
...
QX_SQ002: strpos(listLow,"02,")>0
QX_SQ044: strpos(listLow,"44,")>0
...

Wichtig ist das führende Zeichen (hier "#"). Diese verhindert, dass der Code "04," an der Stelle "0" gefunden wird (die Programmiersprache beginnt die Zählung bei "0".
"strpos == 0" bedeutet aber auch: "Nicht gefunden".
Daher ist mit diesem Zeichen der erste gefundene Index mindestens "1".

Und auch die Kommata haben ihren Sinn.
Ohne diese sähe die Zeichenkette z.B. so aus:
Codes "01", "23", "54", "78"
"01235478"
Dann würden aber auch mit "strpos" die Werte "12" oder "47" gefunden.

Jetzt müsst Ihr also nur "eqJoinLow1" und "eqJoinLow2" auf Eure Itemzahl zu erweitern.
Und dann das Ganze noch einmal für die 5/6 Bewertung zu kopieren und anpassen.

Zum Schluss hat man dann eine "listHigh".
Oder wenn diese zehn Items in eine Frage kommen, fügt man eben alle zehn wertLow1,... wertHigh5 zusammen.

Joffm

File Attachment:

File Name: limesurvey...9667.lss
File Size:84 KB


P.S.
Falls Du an derselben Studie wie Nathalie arbeitest (dieselbe E-Mail), dann solltet Ihr auch einen gemeinsamen Thread aufmachen.

Volunteers are not paid.
Not because they are worthless, but because they are priceless
Last edit: 3 years 9 months ago by Joffm.
The topic has been locked.
Moderators: Joffm

Lime-years ahead

Online-surveys for every purse and purpose