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

Hallo liebes Support-Team,

ich habe in meiner Umfrage 7 Zufallsgeneratoren integriert, die jedoch jeweils nur in einem Item unterscheiden. Ich möchte, falls möglich, gerne am Ende meiner Umfrage eine möglichst gleichgroße Gruppierung aller Items haben.

Meine Frage lautet nun, welche Ziehungsart ich hierfür am besten verwenden sollte:
- Gleichverteilung nach abgeschlossenen Fragebögen
- Systematische Ziehung (sequenzielle Verteilung reihum)

Es geht darum, dass es insgesamt 7 Items (Positionen im Fußball) sind, wovon die Teilnehmer ihre jeweilige Position auswählen. Danach werden sie erst zu ihrer eigenen Position befragt und anschließend werden sie zu zwei weiteren Positionen, die durch den Zufallsgenerator ausgespuckt werden, befragt.

Gilt die Gleichverteilung, wenn die Zufallsgeneratoren sich auf die gleichen Rubriken beziehen, immer nur für den jeweiligen einzelnen Zufallsgenerator oder für alle? In meinen Ergebnissen würde ich, wie bereits erwähnt, gerne eine ungefähre Gleichverteilung auf alle 7 Items haben.

Vielen Dank im Voraus!

Beste Grüße,
Pascal

1 Answer

+1 vote
by SoSci Survey (328k points)

Gilt die Gleichverteilung, wenn die Zufallsgeneratoren sich auf die gleichen Rubriken beziehen, immer nur für den jeweiligen einzelnen Zufallsgenerator oder für alle?

Jeder Zufallsgenerator ist für sich isoliert/selbständig.

Es geht darum, dass es insgesamt 7 Items (Positionen im Fußball) sind, wovon die Teilnehmer ihre jeweilige Position auswählen. Danach werden sie erst zu ihrer eigenen Position befragt und anschließend werden sie zu zwei weiteren Positionen

Sie haben 7 Zufallsgeneratoren, in welchen jeweils die eigene Position fehlt - und verwenden nur einen davon? Prinzipiell keine schlechte Idee. Aber eine Gleichverteilung werden Sie damit nicht bekommen.

Das Problem ist nur ein Stück weit technisch bedingt - eigentlich liegt ein statistisches Problem dahinter. Nehmen wir einmal an, dass viele Teilnehmer Position 1 spielen. Dann können diese alle nicht nochmal zur Position 1 befragt werden. Das heißt aber, dass jeder Teilnehmer der nicht Position 1 spielt fast automatisch Position 1 zugelost bekommen muss, damit die Gleichverteiltung bei den zufällig gezognen Positionen am Ende gewährleistet ist. Damit handeln Sie sich schnell eine Konfundierung ein.

Was ist denn Ihr Ziel? Eine Gleichverteilung bei allen Positionen inklusive der selbst gespielten? Oder eine Gleichverteilung bei den zufällig gezogenen Positionen?

Eine recht einfache Lösung, die zumindest annähernd Gleichverteilung gewährleistet wäre folgende: Sie ziehen aus einem Zufallsgenerator (für alle) 2 Positionen - und falls zufällig die eigene dabei ist, wird mit ein wenig PHP-Code zufällig eine andere gezogen. Diese fällt aus der Gleichverteilung heraus - aber nachdem das nur 1 von 7 Interviews betrifft, ist diese Verzerrung nicht besonders dramatisch.

by s120469 (130 points)
Erst einmal vielen Dank für die schnelle und ausführliche Antwort!

Mein Ziel wäre im Idealfall eine Gleichverteilung aller Positionen inklusive der selbst gespielten.

Bevor es zu den Bewertungen der Positionen kommt, habe ich durch eine Filterfrage es aktuell so ausgewählt, dass immer zuerst die eigene Position, die in der Filterfrage als Antwort gegeben wurde, erscheint und anschließend einen Zufallsgenerator der sechs übrigen Positionen integriert.

Wenn ich das demnach richtig verstehe, brauche ich nur einen einzigen Zufallsgenerator und muss diesen dann mit Hilfe eines PHP-Codes so umfunktionieren, dass alle sieben Positionen in der "Urne" sind, zwei Positionen gezogen werden, aber wenn die eigene Position (durch die vorherige Filterfrage) durch den Zufallsgenerator gezogen werden sollte, dass dann eine neue Position gezogen wird, richtig?

Gibt es den PHP-Code dafür bereits zufällig auf den SoSci-Help-Seiten?
by SoSci Survey (328k points)
Richtig - das wäre die Idee. Der PHP-Code ist nicht besonders anspruchsvoll. Wenn die eigene Position AB01 ist und der Zufallsgenerator (der zwei Zettel zieht) die Kennung RG01 hat, dann würde es so aussehen. Sie bräuchten für diesen Code noch eine interne Variable IN01 mit 3 Variablen, um das Ergebnis zu speichern - also die abzufragenden Positionen.

$own = value('AB01');
$rnd = array_keys(valueList('RG01'));

// Doppelung prüfen
$match = -1;
if ($own == $rnd[0]) {
  $match = 0;
}
if ($own == $rnd[1]) {
  $match = 1;
}

// Doppelung ersetzen
if ($match > -1) {
  // Was bleibt für die Ziehung?
  $available = array_diff(
    array(1,2,3,4,5,6,7),
    array_merge(array($own), $rnd)
  );
  // Eines davon verwenden
  shuffle($available);
  $rnd[$match] = $available[0];
}

// Und alles abspeichern
put('IV01_01', $own);
put('IV01_02', $rnd[0]);
put('IV01_03', $rnd[1]);
by s120469 (130 points)
Super, vielen Dank für den Code! Ich habe diesen angepasst eingefügt und erhalte nun jedoch folgende Fehlermeldung:

Questionnaire Error: Undefined offset: 1
line: 11

PHP code

008 if ($own == $rnd[0]) {
009   $match = 0;
010 }
011 if ($own == $rnd[1]) {
012   $match = 1;
013 }
014
Questionnaire Error: Undefined offset: 1
line: 29

PHP code

026
027 put('IV01_01', $own);
028 put('IV01_02', $rnd[0]);
029 put('IV01_03', $rnd[1]);
030 return 'ok';


Um die ausgewählten bzw. gezogenen Positionen abzufragen, würde ich dann wie vorher bereits auch folgenden Code verwenden (alternativ zu für die zweite Positionen mit "P002x02"), oder?

$code = value('P002x01');
$kennung = 'P'.$code.'01';  // Der Punkt (.) verbindet Strings (Texte)
question($kennung);
$code = value('P002x01');
$kennung = 'P'.$code.'02';  // Der Punkt (.) verbindet Strings (Texte)
question($kennung);
$code = value('P002x01');
$kennung = 'P'.$code.'03';  // Der Punkt (.) verbindet Strings (Texte)
question($kennung);
$code = value('P002x01');
$kennung = 'P'.$code.'04';  // Der Punkt (.) verbindet Strings (Texte)
question($kennung);
$code = value('P002x01');
$kennung = 'P'.$code.'05';  // Der Punkt (.) verbindet Strings (Texte)
question($kennung);
$code = value('P002x01');
$kennung = 'P'.$code.'06';  // Der Punkt (.) verbindet Strings (Texte)
question($kennung);



Die eigene Position frage ich dann ebenfalls weiterhin mit der Filterfunktion ab?
by SoSci Survey (328k points)
> Questionnaire Error: Undefined offset: 1

Das spricht dafür, dass im Zufallsgenerator nur eine Zahl gezogen wurde und nicht zwei. Was sagt denn folgender Code direkt in der zweiten Zeile:

$own = value('AB01');
debug($own);

> würde ich dann wie vorher bereits auch folgenden Code verwenden

Naja ... wenn ohnehin alles auf einer Seite stehen soll, dann geht es auch einfacher:

$code = value('P002x01');
foreach (array(1,2,3,4,5,6) as $nummer) {
  question(id('P'.$code, nummer));
}
by s120469 (130 points)
edited by s120469
Es lag tatsächlich daran, dass nur eine Zahl gezogen wurde.

Zwei hoffentlich abschließende Fragen hätte ich jedoch noch:
1. Ich habe jetzt auf den Seiten 3 und 4 den oben genannten Code eingegeben und der funktioniert soweit auch. Allerdings wird die ausgewählte Position immer noch ab und zu gezogen. Ich weiß nicht, woran das liegen könnte. Mein anfängliches Ziel war es ja insgesamt 3 Positionen auf 3 verschiedenen Seiten abzufragen und davon soll eine die selbst ausgewählte Position sein (das hatte ich anfänglich über eine Filterfrage geleitet). Gibt es die Möglichkeit den Zufallsgenerator so zu "beeinflussen" bzw. einzustellen, dass man drei mal ziehen lässt und einer der Zettel die eigene Position sein MUSS?
2. Als optimale Ziehungsart lasse ich die "Gleichverteilte Ziehung (ziehen ohne Zurücklegen)" bestehen oder würden Sie eine andere Art empfehlen?

Vielen lieben Dank für Ihre enorme Mühe!
by SoSci Survey (328k points)
> Allerdings wird die ausgewählte Position immer noch ab und zu gezogen.

Das liegt daran, weil Sie nicht P002x01 auslesen dürfen, sondern sttattdessen IV01_02. Sie speichern die korrigierte Ziehung ja in einer anderen Variable.

> Als optimale Ziehungsart lasse ich die "Gleichverteilte Ziehung (ziehen ohne Zurücklegen)" bestehen

Ich würde nicht mit systematischen Abbrechern rechnen. Aber Sie könnten auch "Gleichverteilung in abgeschlossenen Interviews" versuchen. Bei 7 Gruppen könnte das nochmal einen Tick besser sein. Mit dem "Korrekturproblem" hat das allerdings nichts zu tun.
by s120469 (130 points)
P002 wäre in diesem Fall mein Zufallsgenerator mit den 7 Positionen. Wenn ich IV01_01 auslese, bekomme ich korrekterweise immer die ausgewählte Position. Ich habe einige Varianten ausprobiert, bekomme aber für IV01_02 und IV01_03  jetzt immer verschiedene Fehlermeldungen wie z.B.:

"There is no question with the ID PP009x0101 in this project."

Dementsprechend sucht der Code ja an einer falschen Stelle. Ist es denn korrekt, dass ich den von Ihnen oben zuerst genannten Code auf jeder Seite, auf der die entsprechenden Fragen erscheinen sollen, angebe?

Gerne gebe ich Ihnen auch Admin-Zugang zu meinem Projekt ("MA_positionsprofile_im_fussball"), damit Sie Ihre Arbeitszeit nicht die ganze Zeit nur meinem Problem widmen müssen.
by SoSci Survey (328k points)
edited by SoSci Survey
> Wenn ich IV01_01 auslese, bekomme ich korrekterweise immer die ausgewählte Position.

Richtig, deshalb schrieb ich IV01_02 :)

> "There is no question with the ID PP009x0101 in this project."

Ich meine wirklich nur:

$code = value('IV01_02');
foreach (array(1,2,3,4,5,6) as $nummer) {
  question(id('P'.$code, $nummer));
}
by s120469 (130 points)
Ich habe jetzt verschiedenste Varianten ausprobiert, aber leider führt keine zum gewünschten Ziel.

> Ich meine wirklich nur:
$code = value('IV01_02');
foreach (array(1,2,3,4,5,6) as $nummer) {
  question(id('P'.$code, nummer));
}

Wenn ich diesen Code einfach nur eingebe, bekomme ich folgende Fehlermeldung:

There is an error in the PHP code:
Questionnaire Error: Use of undefined constant number - assumed 'number' (this will throw an Error in a future version of PHP)
line: 5
PHP code
002
003 $code = value('IV01_02');
004 foreach (array(1,2,3,4,5,6) as $nummer) {
005   question(id('P'.$code, nummer));
006 }
007 return 'ok';


Auch hier habe ich schon unterschiedliche Varianten (number; $number; oder verschiedene Positionen des Codes) ausprobiert. Leider allesamt erfolglos. Vier Kommentare zuvor dachte ich eigentlich fast am Ziel zu sein, da ich zumindest auf drei Seiten jeweils die gewünschten Fragen angezeigt bekommen hatte :D

Ich habe mir auch noch einmal Fragen zum Zufallsgenerator anderer User durchgelesen - würde bei mir tatsächlich die Gefahr einer Konfundierung bestehen? Die eigene Position soll ja schließlich immer bewertet werden und dann folgt die Bewertung zweier zufälliger Positionen.

Wäre es ansonsten noch möglich den Zufallsgenerator dreimal ziehen zu lassen, ihn aber so mit einem Code einzustellen, dass auf jeden Fall die ausgewählte Position abgefragt wird? (Wäre das eine andere Vorgehensweise oder habe ich gerade einen Denkfehler?)
by SoSci Survey (328k points)
> Questionnaire Error: Use of undefined constant number

In der Tat, da fehlt noch ein Dollar-Zeichen vor dem $nummer. Was kommt dann?
by s120469 (130 points)
Das hatte ich leider auch schon versucht. Allerdings erhalte ich dann folgende Fehlermeldungen:

Questionnaire Error (page 4)
The funktion id() expects either the ID of a section (2 characters) or of a question (4 characters) as first parameter. The given value P009x01 is neither of both.
Questionnaire Error (page 4)
There is no question ID in question().
by SoSci Survey (328k points)
Offensichtlich ist in IV01_02 nicht einfach nur die Nummer einer Position gespeichert, sondern deutlich mehr Text. Dadurch erzeigt 'P'.$code nicht eine RUbrik-Kennung wie P1, P2, P3, ... sondern einen längeren Text. Was sagt denn die Debug-Information auf der Seite?

Bitte posten Sie auch nochmal den kompletten (!) PHP-Code - das Problem entsteht an einer früherne Stelle im Code.
by s120469 (130 points)
Die Debug-Information ist folgende:
[Processing]    Reading answers from page 2
[Information]    Answer to FI01 = 1
[Information]    Answer to FI02 = 2
[Information]    Answer to FI03_01 = 7.00
[Information]    Answer to FI04 = 2
[Information]    Answer to P001 = 1
[Information]    100% of the questions have been answered so far
[Processing]    Create page 3 in questionnaire SoSciCode
[Information]    value("P001") = 1
[Information]    The internal variable IV01_01 gets a value of 1.
[Information]    The internal variable IV01_02 gets a value of P009x01.
[Information]    The internal variable IV01_03 gets a value of P009x02.
[Information]    value("IV01_02") = "P009x01


Der komplette PHP-Code ist wie folgt (P001 ist die Frage nach der eigenen Position und P009 ist der Zufallsgenerator mit allen 7 Positionen):
$own = value('P001');
$rnd = array_keys(valueList('P009'));

// Doppelung prüfen
$match = -1;
if ($own == $rnd[0]) {
  $match = 0;
}
if ($own == $rnd[1]) {
  $match = 1;
}

// Doppelung ersetzen
if ($match > -1) {
  // Was bleibt für die Ziehung?
  $available = array_diff(
    array(1,2,3,4,5,6,7),
    array_merge(array($own), $rnd)
  );
  // Eines davon verwenden
$rnd[$match] = $available[0];
}

// Und alles abspeichern
put('IV01_01', $own);
put('IV01_02', $rnd[0]);
put('IV01_03', $rnd[1]);

$code = value('IV01_02');
foreach (array(1,2,3,4,5,6) as $number) {
  question(id('P'.$code, $number));
}


Den unteren Teil ab "$code" würde ich dann entsprechend mit IV01_01 und IV01_03 auf anderen Seiten abfragen. Bei IV01_01 gibt es damit keinerlei Probleme. Anfangs hatte ich diesen Teil in einem separaten PHP-Code-Feld. Mittlerweile jedoch in einem gemeinsamen. Ein Unterschied war nicht zu erkennen.
by SoSci Survey (328k points)
Also ... fangen wir mal mit der wichtigsten Sache an:

$rnd = array_keys(valueList('P009'));

... musst heißen

$rnd = array_values(valueList('P009'));
by s120469 (130 points)
Damit funktioniert es weitestgehend! Juhu, vielen vielen Dank!

Ich bin den Bogen jetzt knapp 10mal durchgegangen und soweit hat alles geklappt, außer jetzt bei dem letzten Versuch. Da habe ich folgende Fehlermeldung erhalten:

There is an error in the PHP code:
Questionnaire Error: Undefined offset: 0
line: 23

PHP code

020     array_merge(array($own), $rnd)
021   );
022   
023 $rnd[$match] = $available[0];
024 }
025
026
by SoSci Survey (328k points)
In Ordnung. Dann ergänzen Sie bitte unter

  $available = array_diff(
    array(1,2,3,4,5,6,7),
    array_merge(array($own), $rnd)
  );


noch folgende Zeile:

shuffle($available);

Das fehlte noch Zufall - und dieser erledigt auch gleich die "Lücken" im Array. Das hatten sie mal im Code, aber offenbar ging es irgendwo verloren.
by s120469 (130 points)
Perfekt! So funktioniert es einwandfrei. Ich dachte erst, dass ich nur einen von beiden Befehlen nutzen soll.

Vielen lieben Dank für die ausführliche Hilfe und die große Mühe! :)

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

...