Welcome to the LimeSurvey Community Forum

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

Randomisierung

  • elenameister
  • elenameister's Avatar Topic Author
  • Offline
  • New Member
  • New Member
More
3 years 8 months ago #204330 by elenameister
Replied by elenameister on topic Randomisierung
:-D
The topic has been locked.
  • Joffm
  • Joffm's Avatar
  • Online
  • LimeSurvey Community Team
  • LimeSurvey Community Team
More
3 years 8 months ago - 3 years 8 months ago #204519 by Joffm
Replied by Joffm on topic Randomisierung
Hallo, Elena, etwas spät, aber es kommt.

die im Handbuch hier gezeigten Funktionen kann man für verschiedene Zwecke nutzen.
manual.limesurvey.org/ExpressionScript_-...mplemented_functions

1. Erzeugen einer neuen Variablen
Zur Erzeugung einer neuen, berechneten Variablen, die auch im Datensatz gespeichert wird, dient der Fragetyp "Gleichung". Im Datensatz wird diese Variable dann unter dem Namen des Codes der Frage gespeichert.
In den folgenden Beispielen soll die Frage als Code "GL" haben.
Im Fragetext wird dazu die Formel in geschweiften Klammern eingegeben.

a. Die allereinfachste und trivialste ist dann der Eintrag {2}.
Dadurch würde für jeden Teilnehmer im Datensatz die Variable "GL" den Wert 2 haben.

b. Sehr häufig wird natürlich hiermit eine Zufallszahl erzeugt.
In den "implementierten Funktionen" gibt es dazu die Funktion "rand(x,y)". Dies ist die Rohform, die man aber nicht verwenden sollte.
Begründung: Wie man auch gut in EXCEL nachvollziehen kann, ändert sich eine Zufallszahl bei jedem Aufruf einer Seite. Dadurch können ungewollte Effekte auftreten, wenn z.B. mehrere Fragen auf einer Seite zusammen mit der Zufallszahlserzeugung sind.
Daher benutzt man dieses Konstrukt
{IF(is_empty(GL),rand(x,y),GL)}
Übersetzt: WENN die Variable GL noch leer ist, DANN wird eine Zufallszahl zwischen x und y erzeugt, SONST bleibt sie, wie sie ist.

c. Berechnung einer neuen Variablen aus einer oder mehreren vorherigen Antworten.
Hier wären zum Beispiel Scores genannt, indem man im einfachsten Fall die Antwortcodes verschiedener Fragen summiert.
Alles Einfachnennungsfragen: {sum(E1.NAOK,E2.NAOK,E3.NAOK,...)}
Erklärung zu NAOK: Falls die Frage E2 aufgrund eines Filters bei einigen Teilnehmern nicht gefragt wird, ist sie nicht definiert, und die Summe würde nicht berechnet werden. Das NAOK löst dieses Problem, so dass in diesem Falle die Summe der restlichen Fragen berechnet wird.
Bei Matrizen muss man nun alle Teilfragen aufsummieren: {sum(Q1_SQ001.NAOK,Q1_SQ002.NAOK,Q1_SQ003.NAOK,Q2_SQ001.NAOK,Q2_SQ002.NAOK,Q3_SQ001.NAOK,Q3_SQ002.NAOK,Q3_SQ003.NAOK,Q3_SQ004.NAOK,...)}
Zur Vereinfachung dieses endlosen Terms gibt es die Variablen ".self" und ".that"
Damit vereinfacht sich dies zu: {sum(that.Q1.NAOK,that.Q2.NAOK,that.Q3.NAOK)}
that.Q1 expandiert also zu Q1_SQ001, Q1_SQ002,...
Bitte im Handbuch unter diesem Kapitel weiteres.
manual.limesurvey.org/ExpressionScript_-....22that.22_variables
Verwandt mit "sum" ist natürlich "count", "countif", "countifop" mit dem gezählt wird, wieviele Ereignisse einer bestimmten Art es gibt.
Eine Mehrfachnennung: {count(M1)} - Wieviele Teilfragen wurden ausgewählt
Eine Matrix: {countif("4",that.M1)} - Wieviele Teilfragen wurden mit Code 4 beantwortet (auch hier wieder "that", um zu vermeiden, jede einzelne Teilfrage schreiben zu müssen)
Eine Matrix: {countifop(">","3",that.M1)} - Wieviele Teilfragen wurden mit Code größer 3 beantwortet

Außerdem gibt es eine große Anzahl Funktionen, um Texte zu bearbeiten, usw.

Man kann nun diese neuen Variablen weiter benutzen, um wieder anderes zu berechnen, indem man mehere dieser Gleichungen hintereinandersetzt.
Beispiel: Wähle zufällig zwei der am niedrigsten bewerteten Items (aber nur 1 und 2) aus einer Matrix (Q1) (1-6) von insgesamt 10 Items aus.
a. "Anzahl1" {countif("1",that.Mat1)} - Stelle fest, wieviele Items mit 1 bewertet wurden.
b. "ListL1" {join("L",if(Q1_SQ001==1,"01",""),if(Q1_SQ002==1,"02",""),if(Q1_SQ003==1,"03",""),if(Q1_SQ004==1,"04",""),if(Q1_SQ005==1,"05",""),if(Q1_SQ006==1,"06",""),if(Q1_SQ007==1,"07",""),if(Q1_SQ008==1,"08",""),if(Q1_SQ009==1,"09",""),if(Q1_SQ010==1,"10","")}
Der Buchstabe dient dazu, dass das Ganze als Text angesehen wird; sonst könnte es einen numerischen Überlauf geben.
WENN Anzahl1<2 ist, machen wir dasselbe für den Wert 2
c1. "Anzahl2" {countif("2",that.Mat1)} - Stelle fest, wieviele Items mit 1 bewertet wurden.
c2. "ListL2" {join("x",if(Q1_SQ001==2,"01",""),if(Q1_SQ002==2,"02",""),if(Q1_SQ003==2,"03",""),if(Q1_SQ004==2,"04",""),if(Q1_SQ005==2,"05",""),if(Q1_SQ006==2,"06",""),if(Q1_SQ007==2,"07",""),if(Q1_SQ008==2,"08",""),if(Q1_SQ009==2,"09",""),if(Q1_SQ010==2,"10","")}

d. "ListL" {str_replace("X","",join(ListL1.NAOK,ListL2.NAOK))} - Füge die beiden Texte zusammen und entferne das "X"
e. "eqRandLowA" {if(is_empty(eqRandLowA),rand(0,(strlen(ListL)-1)/2-1),eqRandLowA)} Erzeuge eine Zufallszahl von 0 bis zur Länge des Textes-1
f. "W1" {substr(ListL,1+2*eqRandLowA,2)} Speichere den an dieser Stelle stehenden Wert
g. "List2L" {str_replace(W1,"",ListL)} Entferne den Wert aus der Liste
Und danach machen wir dasselbe noch für einen zweiten Wert.

Beispielstudie

File Attachment:

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



2. Zuweisung von Werten zu einer Frage
Die andere Art, Fragen vom Typ Gleichung zu nutzen, ist die Zuweisung von Werten.
a. Zunächst das triviale Beispiel.
Einfachnennung (E1)
{E1=2}
Damit wird bei Frage E1 der Code 2 ausgewählt.
Mehrfachnennung (M1)
{M1_SQ002="Y"}
{M1_SQ005="Y"}
{M1_SQ006="Y"}

Damit werden bei Frage M1 die Teilfrage 2, 5 und 6 ausgewählt.

Wie man sieht, können hier mehrere Befehle in einer Frage stehen; im Gegensatz zu Teil 1 wird hier ja nichts unter der Variablen "GL" gespeichert.

b. Nehmen wir ein klassisches Beispiel:
Zunächst wird in einer Mehrfachnennung (M1) gefragt "Welche Fleischsorten essen Sie denn so?"
Darauf folgt die Einfachnennung (E1): "Welche diesenr Fleischsorten präferieren Sie?
Natürlich muss ich diese Frage nicht stellen, wenn in der Mehrfachnennung nur eine Sorte genannt wurde.
Also überspringt man die Frage. Damit die Daten aber konsistent sind, wird der Code dieser einen Fleischsorte mittels Gleichung in die Frage E1 hineingeschrieben.
Wissend, dass in Mehrfachnennungen gewählte Teilfragen die Antwort "Y", nicht gewählte dagegen "", kann man also schreiben:
{E1=IF(M1_SQ001=="Y",1,IF(M1_SQ002=="Y",2,IF(M1_SQ003=="Y",3,4)))}
Dies ist ein verschachteltes IF, weil der FALSCH-Teil des ersten IFs wieder ein neues IF beinhaltet.
WENN M1_SQ001=="Y" ist, wird E1 auf 1 gesetzt, SONST WENN M1_SQ002=="Y" ist, wird E1 auf 2 gesetzt, SONST WENN M1_SQ003=="Y" ist, wird E1 auf 3 gesetzt, SONST wird E1 auf 4 gesetzt.

3. Nutzung in Relevanzgleichungen
Bei der Nutzung der Funktionen in Relevanzgleichungen werden KEINE geschweiften Klammern gesetzt
Alle Funktionen können nun auch benutzt werden, um zu definieren, ob eine Frage angezeigt wird oder nicht.
a. Wieder die einfachste zuerst:
E1==2 Wenn in E1 der Code 2 gewählt wurde, wird diese Frage angezeigt, sonst nicht
count(M1)>0 Wurde in dieser Mehrfachnennung zumindest ein Item audsgewählt
strpos(O1,"blau")>0 Wurde in der Textfrage O1 das Wort "blau" benutzt.
Natürlich lassen sich diese logischen Terme mit AND und/oder OR verknüpfen (wie wir es in der Schule gelernt haben)
strpos(O1,"blau")>0 OR strpos(O1,"rot")>0 Wurde in der Textfrage O1 das Wort "blau" oder "rot" benutzt.
E1>2 AND E2!=6 Wurde in E1 ein Wert größer 2 und in E2 ein Wert ungleich 6 gewählt.

Joffm

P.S.
Diese Funktionen sollten nicht aus einem Textprogramm o.ä. in LimeSurvey hineinkopiert werden.
Dabei kann es passieren, dass der Editor Zeichen wie ">" in die HTML-Entity "&gt;" ändert. Dies führt dann zu einer falschen Syntax.
Auch Zeilenumbrüche sind zu vermeiden. Der Editor liebt das Einfügen von <p> und </p>
Empfehlung: In der Quellcode-Ansicht überprüfen, dass wirklich nur der gewünschte Code dort steht.

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

Lime-years ahead

Online-surveys for every purse and purpose