0 votes
in SoSci Survey (dt.) by s128411 (130 points)

Ich möchte verschiedene Teilnehmer aus einer gegebenen Liste einander zuweisen (dies muss nicht unbedingt auf Parntner beruhen).

Meine Idee wäre gewesen: Einen Zufallsgenerator und der Teilnehmer-Liste als Input zu erstellen, und gleichverteilung ohne Zurücklegen zu parametrisieren.

Das einzige Problem dabei ist, dass sie nicht ihren eigenen Namen ziehen sollen.

Ich hätte daher gerne eine randomisierte Ziehung. Dann eine Frage, ist das dein eigener Name? Wenn nein, nächste Seite, wenn ja, erneute Ziehung. Allerdings müsste dann die letzte Ziehung zurückgesetzt werden, da sonst die Person von keiner anderen Person gezogen werden kann.

Ich möchte allerdings nirgends wissen, wer welchen Namen gezogen hat, daher will ich keine Partnerzuweisung per E-Mail o.Ä. erstellen.

Danke für die Hilfe

by SoSci Survey (327k points)
Ich muss SIe noch um ein wenig Kontext bitten. Also ... Sie haben einen vordefinierten Pool an Personen und möchten jeder Person zufällig eine andere Person zuspielen? Und die Personen werden anhand ihres Namens identifziert, und Sie brauchen den Namen der "Zielperson" im Datensatz, nicht aber den Namen der Person, die ausfüllt. Habe ich das soweit korrekt verstanden?

Wie laden Sie die Personen zum Fragebogen ein? Per Serienmail oder auf anderem Wege?
by s128411 (130 points)
Genau, ein vordefinierter Pool an Personen, jede Person soll zufällig eine andere Person aus dem Pool ziehen. D.h. die Person, die den Fragebogen gerade bearbeitet, soll dann sehen: Ihre Zielperson ist: XY. Die Zielperson weiß nicht von wem sie gezogen wurde. Identifiziert werden sie anhand des Namens. Ich brauche (und möchte) letztendlich nicht wissen, wer wen gezogen hat, um Anonymität der darauf folgenden Aufgabe zu gewährleisten. Ich will nur sicherstellen, dass jede Person von irgendeiner Person gezogen wurde, dass keine Person sich selber zieht.
D.h. ich brauche auch nicht den Namen der Person, die ausfüllt (damit ich wiederum Anonymität gewährleisten kann). Der Fragebogen wird ja nur von Personen ausgefüllt, die auch in diesem vordefinierten Pool dabei sind.
Der einzige (hoffentlich unwahrscheinliche Fall), bei der es dazukommen kann, dass ich weiß, wer den Fragebogen ausgefüllt hat ist, wenn ich eine Zielperson zuweise und frage "Sind Sie das selber?" und sie dann "ja" beantworten, sodass neu gezogen werden muss.

Personen hab ich in einer csv Liste, die ich so in den Zufallsgenerator eingefügt hätte. Darin steht derzeit:
"001 = Vorname1 Nachname1
002 = Vorname 2 Nachname 2
..."

Einladung würde ich gerne nur als Link schinken in die private Gruppe der Personen, sodass nur diese darauf zugreifen können (aber theoretisch wäre es öffentlich)

1 Answer

0 votes
by SoSci Survey (327k points)

Ich brauche (und möchte) letztendlich nicht wissen, wer wen gezogen hat, um Anonymität der darauf folgenden Aufgabe zu gewährleisten. Ich will nur sicherstellen, dass jede Person von irgendeiner Person gezogen wurde, dass keine Person sich selber zieht.

Das heißt, ist ist für Ihre Auswertung vollkommen egal, welche andere Person gezogen wurde. Ist es denn relevant, wie häufig welche andere Person gezogen wird? Also im Extremfall: Wäre es auch okay, wenn alle dieselbe "andere" Person zugewiesen bekommen außer dieser Person selbst?

Generell muss SoSci Survey irgendwoher wissen, wer da teilnimmt, wenn es die Person aus der Ziehung nehmen soll. Wenn Sie also keine personalisierten Links versenden möchten, dann geht das nur über den vor Ihnen vorgeschlagenen Weg, dass man ggf. erneut zieht.

Allerdings wird das nicht mit dem Zufallsgenerator zusammen funktionieren. Denn dieser zieht nur einen Wert pro Interview. Und wenn Sie einen zweiten Zufallsgenerator verwenden würden, wüssten Sie ja schon wer teilnimmt, wenn der zweite zum Einsatz kommt.

Insofern würde ich hier ausnahmsweise ein shuffle() empfehlen. Das könnte so aussehen:

if (!isset($personen)) {
  // Erstmal brauchen wir eine Liste - da nehmen wir Ihren Zufallsgenerator als Quelle
  $personen = getItems('RG01', 'all');
  // Die mischen wir
  shuffle($personen);
  // Und merken uns die Abfolge
  registerVariable($personen);
}
// Daraus nehmen wir den ersten Namen
$person = $personen[0];
// Und speichern den Namen zum Code in einen Platzhalter
$name = getValueText('RG01', $person);
replace('%name%', $name);
// Und dann zeigen Sie die Frage, ob man das selbst ist
question('AB01');

Der Trick ist nun: Wenn jemand "ja" anwortet, dann schneiden Sie den ersten Wert von der Liste ab. Also auf der folgenden Seite folgender Code:

if (value('AB01') == 1) {
  array_shift($personen);
  repeatPage();
}

Okay, vielleicht es nicht erforderlich, dann nochmal zu fragen... Wenn Sie also davon ausgehen, dass die zweite Person auf der Liste dann passt, dann...

if (value('AB01') == 1) {
  array_shift($personen);
  // Daraus nehmen wir (wieder) den ersten Namen
  $person = $personen[0];
  // Und speichern den Namen zum Code in einen Platzhalter
  $name = getValueText('RG01', $person);
  replace('%name%', $name);
}
by s128411 (130 points)
edited by s128411
Vielen Dank für die Antwort.

Ich bin mir noch nicht ganz sicher, ob ich den Code verstehe...

Welchen Typ müsste denn die Frage RG01 haben, um dort meine Teilnehmer-Namen einzutragen? Im Zufallsgenerator würden die Inhalte ja dann im Format "1=Name" stehen.

Ist RG01 dann ein Text oder eine Frage? Darin sollte ja beinhaltet sein:
"Ihre Partner/in ist: XY"
in AB01 steht dann "Sind Sie das selbst?"
und dann muss das XY durch ein YZ ausgetauscht werden (2. Element).
Muss ich also dann in das Frage / Text Element irgendwo %name% schreiben? Und wenn ja, wo?

Entschuldigen Sie, dass ich damit noch nicht so vertraut bin.

Es ist tatsächlich wichtig, dass keine Person mehrfach gezogen wird. Also jede Person soll einmal ziehen, einmal gezogen werden, aber nicht sich selber. (Ähnlich wie beim Wichteln)

Ich könnte auch Links verschicken, wenn das die Situation einfacher macht. Allerdings habe ich einen Topf mit Themen, die dann zu dieser Person gezogen wird. Und dieses Thema soll auch nicht doppelt vergeben sein. D.h. wenn ich persönliche Links verschicke, kann das ebenso gewährt werden, und wie sähe das dann aus?
by SoSci Survey (327k points)
> Welchen Typ müsste denn die Frage RG01 haben, um dort meine Teilnehmer-Namen einzutragen

Statt RG01 tragen Sie bitte die Kennung Ihres Zufallsgenerators ein.

> Ist RG01 dann ein Text oder eine Frage?

Der Text ist hier im Code noch nicht enthalten. Legen sie einen Text an, verwenden Sie darin den Platzhater %name% und ziehen Sie ihn unter dem Code auf die Seite (oder auf eine spätere Seite).

> Also jede Person soll einmal ziehen, einmal gezogen werden, aber nicht sich selber.

Wenn das wichtig ist, dann müssen Sie es deutlich aufwändiger machen. Und zwar müssen Sie dann in der Datenbank für Inhalte hinterlegen, welche Person schon gezogen wurde und diese Personen direkt aus der Zufallsziehung entfernen.

Versuchen Sie erstmal, diesen Code zum Laufen zu bekommen -  und dann kümmern wir uns (am besten in einer neuen Frage hier im Support) um Ihre zusätzliche Bedingung.

> Ich könnte auch Links verschicken, wenn das die Situation einfacher macht.

Sie könnten direkt im Link kodieren, welche Person angesprochen werden soll, z.B.

https://www.soscisurvey.de/PROJEKT/?r=1

Und dann im Code:

$person = reference();
if ($person) {
  $name = getValueText('RG01', $person);
  replace('%name%', $name);
} else {
  replace('%name%', 'FEHLER');
}

> Allerdings habe ich einen Topf mit Themen, die dann zu dieser Person gezogen wird.

Langsam wird's kompliziert :) Kümmern wir uns erstmal um das erste Problem und dann um weitere.
by s128411 (130 points)
Ich habe versucht den Code umzusetzen, jetzt bekomme ich folgende Fehlermeldung:

"There are not enough parameters for the function getValueText. 2 parameters are essential for proper processing. Please refer to the user manual for further details."

Code:
There is an error in the PHP code:

Questionnaire Error: Undefined array key 0
line: 8

PHP code: (FR ist mein Zufallsgenerator mit Zettel (Inhalte): 01= Name1 02= Name 2 usw)

005   shuffle($personen);
006   registerVariable('personen');
007 }
008 $person = $personen[0];
009 $name = getValueText('FR02', $person);
010 replace('%name%', $name);
011 return 'ok';
by SoSci Survey (327k points)
Was die Fehlermeldung Ihnen sagen will ... in dieser Zeile

$name = getValueText('FR02', $person);

hat $person keinen Wert. Ds wiederum liegt daran, dass diese Zeile

$person = $personen[0];

nicht funktioniert, denn "Undefined array key 0".

Also gibt es offenbar ein Problem mit der Variable $personen. Und ja, ich hatte bei getItems() etwas vergessen. Bitte ersetzen Sie diese Zeile...

$personen = getItems('RG01', 'all');

mal wie folgt:

$personen = array_values(getItems('RG01', 'all'));
by s128411 (130 points)
Leider kommt auch nach Ersetzen der Zeile mit array_values(...) noch die gleiche Fehlermeldung. Haben Sie eine Idee woran es liegen kann?

Und ginge das ganze mit individuellen Links einfacher? Falls ja bräuchten wir ja nicht erst das hier fixen, wenn es am Ende nochmal geändert wird, oder?
by SoSci Survey (327k points)
> Haben Sie eine Idee woran es liegen kann?

Ja, ich hatte Ihnen für das Erstellen der Personenliste einen falschen Tipp gegeben. Und zwar liefert getitems() für einen Zufallsgenerator nicht die enthaltenen Zettel. Es sind ja kein Items.

Nachdem Sie den Zufallsgenerator ohnehin nicht einsetzen, werden wir nicht umhin kommen, die Liste direkt im Code zu definieren, z.B.

$namen = [
  1 => 'Max Mürrisch',
  2 => 'Moritz Marx',
  // ...
];
if (!isset($personen)) {
  $personen = array_values($names);
  // ...
}

Und unten dann entsprechend:

$person = $personen[0];
$name = $names[$person];

Entschuldigen Sie bitte die Irritation.

> Und ginge das ganze mit individuellen Links einfacher?

Ja, definitiv. In dem Fall können Sie einen Zufallsgenerator verwenden, die aktuelle Person bei der Ziehung direkt ausschließen und dafür sorgen, dass alle Personen etwa gleich häufig gezogen werden.

$person = reference();
// Liste aller "anderen"
$personen = array_diff(
  [1,2,3,4,5,6,7,8,10,11,...,20],
  [$person]
);
// Aus dem Zufallsgenerator jm. anders ziehen
show('RG01', ['filter' => $personen]);
// Und den Platzhalter vorbereiten
replace('%name%', 'RG01', 'response');
by s128411 (130 points)
Super, damit habe ich es jetzt hinbekommen, vielen Dank für Ihre Hilfe

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

...