====== Quotierung ======

Bei der [[panels|Zusammenarbeit mit Panel-Anbietern]] werden oft quotierte Stichproben gebucht. Der Fragebogen ist dann für den Quotenstopp verantwortlich: Liegen für eine demografische Gruppe also genug Fragebögen vor, werden weitere Teilnehmer dieser Gruppe an eine Quotafull-Adresse des Panel-Anbieters zurück geschickt.

**Hinweis:** Für andere Formen der Rekrutierung ist ein Quotenstopp i.d.R. __nicht__ sinnvoll. Die Folge wäre, dass man die Mehrheit der interessierten Teilnehmer abweist -- zugleich aber noch rekrutieren muss, damit man die fehlenden demografischen Gruppen vervollständigt.

**Hinweis:** Vorsicht beim Zusammenspiel von ''[[:de:create:functions:statistic]]'' und ''[[:de:create:functions:redirect]]''. Der Befehl ''redirect()'' markiert die Fragebögen von Abbrechern und aufgrund der Quote abgewiesenen Teilnehmern als "abgeschlossen", sodass sie von ''statistic()'' gezählt werden. Um hier falsche Zählungen zu vermeiden, ist es sinnvoll, die zu zählende Variable gegen Ende des Fragebogens mittels ''[[:de:create:functions:put]]'' in eine [[:de:create:questions:internal]] zu kopieren und mittels ''statistic()'' dann die interne Variable abzuzählen. Alternativ kann man in einer internen Variable für vollständige Fälle einen bestimmten Wert ablegen und dann mit ''statistic('filter', ...)'' oder ''statistic('crosscount', ...)'' arbeiten.

**Tipp:** Verwenden Sie den Debug-Modus und sehen Sie die Debug-Informationen an, wenn die Quotenstopp im Test nicht sofort funktioniert ([[:de:create:filter-solving]]).

Mit "demografische Zelle" oder "demografische Gruppe" ist jeweils eine Kombination der zu quotierenden Merkmale gemeint (z.B. "männliche Teilnehmer zwischen 15 und 25 Jahre", wenn Alter und Geschlecht quotiert werden).

Prinzipiell kann man unverbundene und verbundenen Quoten prüfen. Bei der unverbundenen Quotierung werden die Merkmale einzeln nacheinander geprüft ("Liegen schon genug Fragebögen von männlichen Teilnehmern vor?" "Liegen schon genug Fragebögen von jungen Teilnehmern vor?"). Entsprechend wäre es bei der unbverbundenen Quotierung möglich, die Quoten mit jungen Frauen und alten Männer zu füllen -- ganz ohne junge Männer. Bei der verbundenen Quotierung werden die demografischen Zellen überprüft ("Liegen schon genug Fragebögen von jungen männlichen Teilnehmen vor?"). Die verbundene Quotierung ist damit weniger anfällig für systematische Verzerrungen (Konfundierung zwischen den demografischen Merkmalen) -- allerdings werden auch mehr potenzielle Teilnehmer abgewiesen.


===== Technische Umsetzung =====

Die technische Umsetzung erfolgt mittels [[:de:create:php]] und umfasst aus drei oder vier Teile:

  - Eine Definition, welche Gruppen es gibt und wie viele Teilnehmer dort jeweils erlaubt sind. Hierfür kommt ein sog. [[de:create:array|Array]] zum Einsatz.
  - Falls ein Merkmal umkodiert werden muss (z.B. Alter in Alterskategorien), werden [[:de:create:questions:internal|interne Variablen]] in Verbindung mit der Funktion ''[[:de:create:functions:put]]'' verwendet.
  - Die eigentliche Überprüfung, ob der aktuelle Teilnehmer noch teilnehmen darf. Dies erfolgt mittels der PHP-Funktion ''[[:de:create:functions:statistic]]''.
  - Eine Umleitung (Redirect) von Teilnehmern, wenn eine demografische Zelle bereits gefüllt ist. Diese erfolgt mittels ''[[:de:create:functions:redirect]]'' und i.d.R. sind noch [[:de:create:placeholders]] erforderlich, um die Teilnehmer-ID des Panels an den Panel-Anbieter zu übermitteln ([[panels]]).

Die zentrale Funktion hierbei ist ''[[:de:create:functions:statistic]]'', sie zählt, wie viele Fragebögen mit bestimmten Kriterien bereits vorliegen. Standardmäßig zählt ''statistic()'' nur abgeschlossene Fragebögen (Variable [[:de:results:variables#interview-fortschritt|FINISHED]]), d.h. jene, bei denen die letzte Seite erreicht oder en ''redirect()'' aufgerufen wurde.

**Wichtig:** Wenn Sie ''redirect()'' verwenden, um Teilnehmer an den Anbieter zurückzuleiten, die zu schnell geantwortet haben ("Speedster") oder deren Antworten Qualitätsmängel aufweisen ("Quality"), dann setzen Sie in der ''[[:de:create:functions:redirect]]''-Funktion den zweiten Parameter (''true''), damit diese Teilnehmer nicht für die Quote gezählt werden. Damit die Teilnehmer den Fragebogen dann nicht weiter ausfüllen können, setzen Sie ein ''setNextPage('repeat');'' vor das ''redirect()''.


===== Umsetzung: Ein Merkmal =====

Im einfachsten Fall ist nur ein Merkmal zu quotieren. Das folgende Beispiel geht davon aus, dass Sie das Alter auf Seite 2 des Fragebogens mit einer geschlossenen Auswahl-Frage "AB01" in 6 Stufen abgefragt haben:

  1 = jünger als 18 Jahre
  2 = 18-25 Jahre
  3 = 26-35 Jahre
  4 = 36-45 Jahre
  5 = 46-55 Jahre
  6 = älter als 55 Jahre

Sie möchten nur Personen von 18 bis 45 Jahre befragen, daher werden Teilnehmer, die nicht die Antwort 2, 3 oder 4 gewählt haben, gleich via Screenout zum Panel-Anbieter zurück geschickt. Der folgende Code geht davon aus, dass Sie eine Teilnehmer-ID im Platzhalter ''%panelID%'' gespeichert haben, wie in der Anleitung empfohlen: [[:de:survey:panels]]

<code php>
$ageGrp = value('AB01');
if (($ageGrp < 2) or ($ageGrp > 4)) {
  // Hier der individuelle Screenout-Link für die Studie
  redirect('http://www.anbieter.com/p1234567/screenout.php?id=%panelID%');
}
</code>

Nun definieren Sie in einem [[de:create:array|Array]], wie viele Teilnehmer pro Ausprägung erlaubt sind. Im folgenden Beispiel wären das 100 Personen in Gruppe 2 (18-25) und jeweils 200 Personen in den beiden anderen Gruppen 3 und 4.

<code php>
$limits = array(
  2 => 100,
  3 => 200,
  4 => 200
);
</code>

Dieser PHP-Code hat keine direkte Auswirkung auf die Verarbeitung der Seite. Die Obergrenzen werden erst weiter unten verwendet.

Nun wird ermittelt, wie viele abgeschlossene Fragebögen für die Altergruppe des aktuellen Teilnehmers schon vorliegen. Welche Altergruppe das ist, wurde oben bereist via ''[[:de:create:functions:value]]'' ermittelt -- hat man den Screenout im selben PHP-Code wie ''statistic()'', kann die erste Zeile weggelassen werden.

<code php>
$ageGrp = value('AB01');
$n = statistic('count', 'AB01', $ageGrp);  // Abzählen der Fragebögen mit AB01 = $ageGroup
</code>

**Wichtig:** Die Antwort des Teilnehmers wird erst zum Server übermittelt, wenn sie der Teilnehmer mittels "Weiter" abgeschickt hat. Wenn die Frage "AB01" auf Seite 2 des Fragebogens steht, kann ''value()'' frühestens auf Seite 3 platziert werden.

In Variable ''$n'' ist nun die Anzahl der ausgefüllten Fragebögen aus der Altersgruppe des Teilnehmers (''$ageGroup'') abgelegt. Diesen Wert kann man nun mit den oben definierten Obergrenzen (''$limits'') vergleichen. Die eckigen Klammern sorgen dafür, dass die richtige Obergrenze verwendet wird.

<code php>
if ($n >= $limits[$ageGroup]) {
  // Hier der individuelle Quotafull-Link für die Studie
  redirect('http://www.anbieter.com/p1234567/quotafull.php?id=%panelID%');
}
</code>

Nachfolgended nochmal der komlette PHP-Code:

<code php>
// Altersgruppe des aktuellen Teilnehmers auslesen
$ageGrp = value('AB01');

// Screenout
if (($ageGrp < 2) or ($ageGrp > 4)) {
  redirect('http://www.anbieter.com/p1234567/screenout.php?id=%panelID%');
}

// Obergrenzen
$limits = array(
  2 => 100,
  3 => 200,
  4 => 200
);

// Ermittlung der Anzahl abgeschlossener Fragebögen in dieser Altersgruppe
$nQnr = statistic('count', 'AB01', $ageGrp);
// Auslesen des Limit für diese Altergrsuppe
$nMax = $limits[$ageGrp];

// Quotenstopp
if ($nQnr >= $nMax) {
  // Hier der individuelle Quotafull-Link für die Studie
  redirect('http://www.anbieter.com/p1234567/quotafull.php?id=%panelID%');
}
</code>


===== Umkodieren =====

Falls das Alter nicht geschlossen, sondern offen abgefragt wurde, muss es zunächst umkodiert werden. Die Altersgruppe muss dann im Datensatz abgelegt werden, damit ''statistic()'' korrekt zählen kann.

Legen Sie zunächst eine Frage vom Typ [[:de:create:questions:internal|interne Variablen]] an (z.B. Kennung "IV01") und darin eine Variable (Item), welche Sie z.B. mit "Altersgruppe" beschriften (Kennung z.B. "IV01_01").

Das folgende Beispiel geht davon aus, dass die offene Frage nach dem Alter mit einer Texteingabe (Beschränkung "nur Ziffern") mit der Kennung "AB02_01" abgefragt wird.

<code php>
$age = (int)value('AB02_01');

// Umkodieren
if ($age < 18) {
  $ageGrp = 1;
} elseif ($age <= 25) {
  $ageGrp = 2;
} elseif ($age <= 35) {
  $ageGrp = 3;
} elseif ($age <= 45) {
  $ageGrp = 4;
} else {
  $ageGrp = 5;
}

// Im Datensatz speichern
put('IV01_01', $ageGrp);
</code>

Dieser PHP-Code wird einfach vor die Qutierung (s. oben) gesetzt. Im PHP-Code für die Quotierung würde dann ''AB01'' durch ''IV01_01'' (die kennung der internen Variable) ersetzt.


===== Unverbundene Quoten =====

Die Prüfung unverbundener Quoten erfolgt nun einfach dadurch, dass man den PHP-Code für die Quotierung (s. oben) für jedes Merkmal wiederholt. Dabei müssen lediglich die Kennung für die Variable (''AB01'') und die Obergrenzen (''$limits'') angepasst werden.


===== Verbundene Quoten =====

Für verbundene Quoten wird ''statistic('crosscount', ...)'' statt ''statistic('count', ...)'' eingesetzt. Außerdem muss eine ID für die demografische Zelle erstellt werden.

Das folgende Beispiel geht davon aus, dass die Altergruppe in Variable "IV01_01" vorliegt (Codes 2 bis 4, s. oben) und das Geschlecht in Variable "AB03" (1=weiblich, 2=männlich).

Als Kennung für die demografische Zelle werden die beiden Zahlen einfach durch einen Bindestrich getrennt zusammengefügt. Der String '''2-1''' steht dann für weibliche Teilnehmer (2) aus der Altersgruppe 18-25 Jahre (1). Anhand dieser Kennungen werden die Obergrenzen definiert.

<code php>
// Merkmale auslesen
$ageGrp = value('IV01_01');
$gender = value('AB03');

// Evtl. Screenout
if (($ageGrp < 2) or ($ageGrp > 4) or ($gender < 1)) {
  redirect('http://www.anbieter.com/p1234567/screenout.php?id=%panelID%');
}

// Kennung für die demografische Zelle erstellen
$demID = $ageGrp.'-'.$gender;

// Obergrenzen definieren
$limits = array(
  '1-1' => 50,
  '1-2' => 50,
  '2-1' => 100,
  '2-2' => 100,
  '3-1' => 100,
  '3-2' => 100
);

// Abgeschlossene Fragebögen zählen
$n = statistic('crosscount', array('IV01_01', 'AB03'), array($ageGrp, $gender));

// Quoten prüfen
if ($n > $limits[$demID]) {
  redirect('http://www.anbieter.com/p1234567/quotafull.php?id=%panelID%');
}
</code>