Welcome to the LimeSurvey Community Forum

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

Zufällige Gruppenzuteilung mit dynamischer Anpassung

  • Leonie883
  • Leonie883's Avatar Topic Author
  • Offline
  • New Member
  • New Member
More
1 day 22 hours ago #270233 by Leonie883
Meine LimeSurvey-Version: LimeSurvey Community Edition  Version 6.11.0+250303
==================

Hallo zusammen,

ich benötige Unterstützung bei der technischen Umsetzung einer Umfrage für meine Bachelorarbeit in LimeSurvey.

Konkret möchte ich die Teilnehmer per Zufallsprinzip zu vier Gruppen (1–4) zuteilen.
Dafür verwende ich aktuell folgende Gleichung als erste versteckte Frage: if(is_empty(Gleichung), rand(1, 4), Gleichung)
Alle weiteren Fragen habe ich mit der Bedingung Gleichung==x (x = die Zahl der jeweiligen Gruppe: 1/2/3/4) zugewiesen.

Die Teilnehmer erhalten einen einheitlichen Link und sollen beim Aufruf zufällig einer der vier Gruppen zugewiesen werden.

Nun möchte ich folgende Anforderungen umsetzen und benötige dafür entweder den entsprechenden Code oder Hinweise zur technischen Realisierung:
1. Begrenzung auf 40 Teilnehmer pro Gruppe:
Jede der vier Gruppen soll exakt 40 vollständig ausgefüllte Fragebögen erhalten. Nur vollständig abgeschlossene Umfragen dürfen für die Zählung berücksichtigt werden.
2. Dynamische Zuteilung bei Erreichen des Limits:
Sobald eine Gruppe 40 vollständige Teilnahmen erreicht hat, sollen neue Teilnehmer nur noch zufällig auf die verbleibenden Gruppen mit freien Plätzen verteilt werden.
3. Verteilung bei vollem Kontingent:
Falls alle Gruppen das Ziel von 40 vollständigen Datensätzen erreicht haben, sollen neue Teilnahmen gleichmäßig auf alle Gruppen verteilt werden.


Leider habe ich trotz vielem Recherchieren dies noch nicht geschafft umzusetzen :(

Ich hoffe auf Eure Unterstützung.

Vielen Dank im Voraus und liebe Grüße
Leonie

Please Log in to join the conversation.

  • Joffm
  • Joffm's Avatar
  • Offline
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
1 day 8 hours ago #270236 by Joffm
Hallo, Leonie,
zunächst: Du musst Deine Frage nicht doppelt schreiben.
Denn wie hier "Bitte erst lesen, dann im Forum schreiben!" steht
Wenn ihr das erste Mal eine Nachricht schreibt, muss diese erst von uns freigegeben werden, bevor sie öffentlich erscheint. Das kann ein paar Stunden dauern, wir bitte um Geduld.

Dies ist einfach ein gewisser Spam-Schutz.
Aber klar, wer liest schon Gebrauchsanweisungen?

Also habe ich den zweiten Thread gelöscht.

Gut, nach der kleinen Rüge zu Deiner Frage.

Ich verstehe nicht, was Du im Endeffekt erreichen willst. Warum zunächst die Aufteilung der ersten 160 Teilnehmer, danach aber im Grunde analog weiter (Zufällige Zuordnung des nächsten Teilnehmers)?
Meinetwegen verteilen wir die ersten 160 Teilnehmer gleichmäßig auf die vier Gruppen.
Aber dann? Der 161. Teilnehmer wird ja wieder zufällig einer der vier Gruppen zugeordnet.

Nichtsdestotrotz:
In meinem "Tutorial 4: Gleichungen, Zufall,..." findest Du mehrere alternative Verfahren.
Zyklische Zuweisung: Der Erste fällt in Gruppe 1, der Zweite in Gruppe 2,..., der Fünfte wieder in Gruppe 1
Least filled
Das Tutorial findest Du hier im deutschen Teil (im Moment auf Seite 20)

Deine Idee, die Zufallsgleichung dynamisch zu ändern, findest Du ebenfalls dort (2.1.3., unten)
Im Tutorial ist dies nur für Zufallszahlen von 1-3 gezeigt.
Es ist aber eine leichte Fingerübung, solche Gleichungen auch für Zufallszahlen von 1-4 zu bilden.
Gefüllt ist Gruppe 1: {rand(2,4)} trivial
Gefüllt ist Gruppe 2: {round(1.4*rand(1,3))} Es tauchen nur die Zahlen 1,3 und 4 auf
Gefüllt ist Gruppe 3: {floor(1.4*rand(1,3))} Es tauchen nur die Zahlen 1,2 und 4 auf
Gefüllt ist Gruppe 4: {rand(1,3)} trivial

Gefüllt sind Gruppen 1 und 2: {rand(3,4)} trivial
Gefüllt sind Gruppen 1 und 3: {2*rand(1,2)} Nur 2 und 4
Gefüllt sind Gruppen 1 und 4: {rand(2,3)} trivial
Gefüllt sind Gruppen 2 und 3: {1+ 3*rand(0,1)} Nur 1 und 4
Gefüllt sind Gruppen 2 und 4: {1+ 2*rand(0,1)} Nur 1 und 3
Gefüllt sind Gruppen 3 und 4: {rand(1,2)} trivial

Und bei drei bereits gefüllten Gruppen ist es ja keine Zufallszahl mehr sondern eine Konstante (eben die noch fehlende Gruppe)
Das ist also kein Hexenwerk. Du musst nur die Mächtigkeit der vier Gruppen bestimmen (am besten mit der Funktion "statCountif")
und dann z.B. mit einem verschachtelten IF die notwendige Funktion benutzen.

Und dann gibt es noch die grundsätzliche Funktion (wenn keine Gruppe gefüllt ist bzw. alle Gruppen gefüllt sind).
{rand(1,4)}
Immer natürlich umschlossen vom Konstrukt {if(is_empty(...)}

Dies würde funktionieren, aber ich weiß ja nicht, welchen Sinn das Ganze hat.
Am einfachsten ist es doch, die Umfrage zunächst laufen zu lassen, bis alle Gruppen gefüllt sind.
Dann sind natürlich einige übererfüllt; aber das ist ja auch gut so.
Denn Du musst schließlich zunächst eine Datenbereinigung durchführen. Soll heißen, Du musst einige Hanseln rausschmeißen, die die Sache nicht ganz ernstgenommen haben. Die entweder als Speeder, Justifier, Happy Clicker bei Skalen oder durch besonders kreative Orig-Antworten und esoterisches Geschwafel (oder was auch immer) bei offenen Fragen auffallen.

Leider hast Du die am Anfang auftauchenden Fragen nicht vollständig beantwortet.
Daher habe ich keine Ahnung, ob Du javascript benutzen kannst. Am Anfang des Tutorials gibt es aber einen kleinen Test.
Mit javascript könnte man dies ebenso lösen.

Abschließend: Im Tutorial steht ja auch, dass diese alternativen Verfahren nicht unbedingt besser sind als die simple Zufallszahl.
Dies liegt einfach daran, dass erst nachdem ein Teilnehmer die Umfrage abgesendet hat, diese als "complete" gewertet werden kann.
Das bedeutet aber auch, dass wenn eine Gruppe mit 39 Teilnehmern gefüllt ist, und 5 Teilnehmer in der Befragung unterwegs sind, durchaus mehrere in diese Gruppe fallen können. Erst wenn 40 "completes" vorhanden sind, würde ein weiterer Teilnehmer beim "Durchschreiten der Zufallstür" nicht mehr in diese Gruppe fallen können.

Vielleicht kannst Du mich noch erwas aufklären, und dann den lss Export eines kleinen Prototypen Deiner Umfrage schicken.
Dann kann man direkt am lebenden Patienten arbeiten.

Bis dann

Joffm








 

Volunteers are not paid.
Not because they are worthless, but because they are priceless
The following user(s) said Thank You: Leonie883

Please Log in to join the conversation.

  • Leonie883
  • Leonie883's Avatar Topic Author
  • Offline
  • New Member
  • New Member
More
1 day 8 hours ago #270238 by Leonie883
Hallo nochmal und vielen Dank für die ausführliche Rückmeldung.

Ich versuche, mein Anliegen noch etwas klarer zu erklären:

– Ich arbeite ohne JavaScript, sondern werte meine Umfrage nach Abschluss in R aus.
– Mir ist es wichtig, dass am Ende etwa gleich viele (mind. 40) vollständige Teilnahmen pro Gruppe vorhanden sind.
– Ursprünglich dachte ich, dass ich einfach zuerst die Gruppen gezielt „auffülle“ (je 40 vollständige Antworten) und danach bei weiteren Teilnahmen wieder zur einfachen Zufallsverteilung zurückkehre. Aber wenn es direkt von Anfang an eine ausgeglichene Verteilung gibt (z. B. „least filled“), wäre das sogar noch besser!
– Ich habe das Tutorial gelesen, finde es auch hilfreich, aber bin in dem Bereich ehrlich gesagt noch ziemlich neu und überfordert – die vorgestellten Varianten (zyklisch, least filled etc.) wirken auf mich deutlich komplexer als meine bisherige `if(is_empty(...), rand(1,4), ...)`-Lösung.
– Ich würde mir wünschen, einfach während der laufenden Studie sehen zu können, wie viele vollständig abgeschlossene Fragebögen es bereits pro Gruppe gibt (geht das irgendwo in LimeSurvey direkt?)
– Dann würde ich ggf. im Verlauf der Studie manuell die Gleichung anpassen, um Gruppen auszuschließen, die bereits voll sind.

Dazu hätte ich konkret folgende Rückfragen:

1. Kann ich während der laufenden Studie irgendwo sehen, wie viele vollständig ausgefüllte Fragebögen pro Gruppe vorliegen?

2. Kann ich dann im Fragebogeneditor einfach die Gleichung in der versteckten Gleichungsfrage anpassen, um z. B. Gruppe 1 auszuschließen?
Beispiel (wenn Gruppe 1 voll ist):
{if(is_empty(Gleichung), rand(2,4), Gleichung)}
Und analog:
Gruppe 2 voll: {if(is_empty(Gleichung), round(1.4*rand(1,3)), Gleichung)}
Gruppe 3 voll: {if(is_empty(Gleichung), floor(1.4*rand(1,3)), Gleichung)}
Gruppe 4 voll: {if(is_empty(Gleichung), rand(1,3), Gleichung)}

3. Ist dieses manuelle Vorgehen (Zähler beobachten + Gleichung anpassen) aus deiner Sicht praktikabel, oder gibt es einen leichteren, idiotensicheren Weg für Leute, die technisch leider nicht so fit sind? 😅

Ich habe meine Gleichungsfrage & eine der Fragengruppen angehängt.

Nochmals vielen Dank für deine Unterstützung – ich bin wirklich sehr dankbar für jeden Hinweis! 🙏

Viele Grüße
Leonie

Please Log in to join the conversation.

  • Joffm
  • Joffm's Avatar
  • Offline
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
1 day 5 hours ago #270241 by Joffm
Hallo,

den lss Export eines kleinen Prototypen

Weder lsq noch lsg Exporte, nur lss.
Gründe: 
  • lsq und lsg Exporte sind sprachsensitiv. Man kann sie nur in eine Umfrage mit derselben Basissprache importieren (selbst "deutsch" und "deutsch-Du" geht in die Hose).
  • Es macht uns bei unserer freiwilligen Hilfe mehr Arbeit, Wir müssen die Sprache erraten, eine Umfrage anlegen, evtl. eine Gruppe, um dann einen lsq Export importieren zu können.
  • Es fehlen die umfrageweiten Einstellungen, welche von Wichtigkeit sein können.
Daher: Umfrage kopieren, alles die Frage nicht Betreffende löschen, den  lss Export des Restes schicken. Dieser wird einfach importiert, und man hat alles.

Noch schnell zu den Fragen:
1. Ja, in der Antworttabelle
2. Ja, alles, was nicht die Datenbank berührt - wie z.B. simple Textänderungen - können in einer aktibvierten Umfrage geändert werden
3. Ja, ich hatte dies ja bereits beschrieben (zählen, verschachteltes IF)

Und javascript hat ja nun nichts mit Deiner Auswertung zu tun. Man kann aber in javascript Berechnungen anstellen, die zwar auch mittels ExpressionScript zu bewerkstelligen sind, manchmal aber deutlich langwieriger.

Und ob "Zyklisch" komplizierter ist, sei dahingestellt.
Normal: {if(is_empty(eqZufall),rand(1,4),eqZufall)}
Formel des Tutorials: {1+statCount(“id“) -4*floor(statCount(“id“)/4)}, wobei hier die scheinbare Länge darauf zurückzuführen ist, dass es keine "modulo"-Funktion in LimeSurvey gibt - diese also nachgebaut werden muss.
Ergibt dann dies:

Die Frage ist, ob es "besser" ist, berücksichtigt man die Schwäche durch Gleichzeitigkeit.
Du kannst ja auch einmal ein Tabellenwerk zu Rate ziehen, um z.B. das 5% Konfidenzintervall zu bestimmen von 40 bei einer Basis von 160.
Dann bekommst Du ein Gefühl, wie gut oder schief die Verteilung sein kann. Es ist übrigens (29.6-52)
Du kannst es natürlich auch einfach in Excel durchspielen (160 mal Zufallsbereich (1,4) und dann zählen)

Joffm

Volunteers are not paid.
Not because they are worthless, but because they are priceless

Please Log in to join the conversation.

Moderators: holchJoffmtpartner

Lime-years ahead

Online-surveys for every purse and purpose