Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
Nächste ÜberarbeitungBeide Seiten der Revision
de:survey:quota [19.07.2017 20:16] – [Quotierung] autschde:survey:quota [09.09.2022 21:09] admin
Zeile 5: Zeile 5:
 **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:** 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, um die Funktion des Quotenstopps zu prüfen und wenn dieser im Test (z.b. mit sehr kleinen Quotennicht sofort funktioniert ([[:de:create:filter-solving]]).
  
-**Tipp:** Verwenden Sie den Debug-Modus und sehen Sie die Debug-Informationen anwenn die Quotenstopp im Test nicht sofort funktioniert ([[:de:create:filter-solving]]).+ 
 +===== Minimal-Quotierung ===== 
 + 
 +Mitunter soll eine Erhebung mit dem Erreichen einer bestimmten Anzahl von Fällen beendet werden. 
 + 
 +Legen Sie im Fragenkatalog einen Text an, welcher nach Erreichen der Fallzahl angezeigt werden soll und fügen Sie auf der ersten Seite des Fragebogens ganz oben folgenden PHP-Code ein. Der Beispiel-Code geht davon aus, dass der Text die Kennung "QS01" hat und die Erhebung nach 250 ausgefüllten Fragebögen enden soll. 
 + 
 +<code php> 
 +// Abgeschlossene Fragebögen zählen 
 +$finished = statistic('count', 'FINISHED'); 
 +// Filter zum Quotenstopp 
 +if ($finished >= 250) { 
 +  // Text anzeigen 
 +  text('QS01'); 
 +  // Weiter-Knopf ausblenden 
 +  buttonHide(); 
 +  // Keine weiteren Inhalte dieser Seite zeigen 
 +  pageStop(); 
 +
 +</code> 
 + 
 +**Hinweis:** Dieser PHP-Code zähle alle Fälle mit MODE "interview" und FINISHED 1.  Dies können auch Fälle sein, bei denen mittels ''redirect()'' ein Screenout erfolgt. Im Debug-Modus werden die Fälle unabhängig von der Variable MODE gezählt. 
 + 
 +==== Filterung ==== 
 + 
 +Falls Sie sicherstellen möchten, dass nur Fälle mit bestimmten Eigenschaften gezählt werden, legen Sie eine [[:de:create:questions:internal|interne Variable]] an (im folgenden Beispiel "QS02_01"und geben Sie dieser Variable nur dann den Wert 2, wenn ei Fall die gewünschten Kriterien erfüllt. Wenn der z.B. der folgende PHP-Code auf der vorletzten Seite des Fragebogens platziert wirddann werden nur Fälle gezählt, welche die vorletzte Seite erreichen und bis dorthin mindestens 10 Minuten (600 Sekunden) benötigt haben. 
 + 
 +<code php> 
 +$time = caseTime('hitherto'); 
 +if ($time >= 600) { 
 +  put('QS02_01', 2); 
 +
 +</code> 
 + 
 +Der eigentliche Quotestopp bezieht sich dann nicht mehr auf die Variable "FINISHED", sondern auf die interne Variable. Auf der ersten Seite des Fragebogens würde dann z.B. der folgende PHP-Code platziert. 
 + 
 +<code php> 
 +// Gültige Fragebögen zählen 
 +$valid = statistic('count', 'QS02_01', 2); 
 +// Filter wie oben 
 +if ($valid >= 250) { 
 +  text('QS01'); 
 +  buttonHide(); 
 +  pageStop(); 
 +
 +</code> 
 + 
 + 
 +===== Funktionsweise Quotierung ===== 
 + 
 +Die Quotierung erfolgt in folgenden Schritten: 
 + 
 +  - Abfrage der Quoten-Merkmale einer Person mittels ''[[:de:create:functions:value]]''
 +  Zählung, wie viele Personen mit dieser Merkmalsausprägung bzw. mit dieser Kombination von Merkmalsausprägungen bereits befragt wurden, mittels ''[[:de:create:functions:statistic]]''
 +  - Vergleich der Zählung mit einer Quotentabelle, wie viele Personen pro demografischer Zelle benötigt werden. 
 +  - Abweisen von Personen, wenn für eine demografische Zelle bereits ausreichend Fälle vorliegen, mittels ''[[:de:create:functions:redirect]]''.
  
 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). 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.+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?"). Hier werden die Randsummen der Verteilung überprüft. Entsprechend wäre es bei der unverbundenen 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 =====+Beim Zusammenspiel von ''statistic()'' und ''redirect()'' zu beachten: Der Befehl ''redirect()'' markiert die Fragebögen von abgewiesenen Teilnehmern als "abgeschlossen" (FINISHED=1), sodass sie von ''statistic()'' gezählt werden. Um falsche Zählungen zu vermeiden, werden nicht direkt die Variablen gezählt, welche im Fragebogen abgefragt wurden: Stattdessen werden beim Complete-Redirect die Quotenmerkmale mittels ''[[:de:create:functions:put]]'' in [[:de:create:questions:internal|interne Variablen]] kopiert, die dann gezählt werden können. Für die Quotierung sind demnach 2 getrennte PHP-Codes erforderlich.
  
-Die technische Umsetzung erfolgt mittels [[:de:create:php]] und umfasst aus drei oder vier Teile:+  - Nach Abfrage der Quotenmerkmale (auf der darauf folgenden Seite) wird die vom Teilnehmer angegeben Ausprägung gegen die Anzahl vorhandener Fälle geprüft. 
 +  - Direkt vor dem Complete-Redirect wird die Ausprägung des Quoten-Merkmals in eine interne Variable kopiert.
  
-  - 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. +Sofern das Quotenmerkmal zunächst umkodiert werden muss, wird dieser PHP-Code in beiden Teilen verwendet.
-  - 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()''.+===== Technische Umsetzung (unverbundene Quoten=====
  
 +Die technische Umsetzung erfolgt mittels [[:de:create:php|PHP-Code]] und umfasst mehrere Schritte. Diese werden hier zunächst für die Überprüfung von unverbundenen Quoten erklärt.
  
-===== UmsetzungEin Merkmal =====+Im folgenden werden exemplarisch zwei Merkmale quotiertAlter (offen abgefragt in Variable "SD01_01") und das Geschlecht (geschlossen abgefragt in Variable "SD02"). Es ist zweckmäßig, Qutotenfragen als [[:de:create:checks#antwortzwang|Pflichtfragen]] zu definieren.
  
-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 +==== Definition der Quoten ====
-  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]]+Zunächst wird eine Liste ([[:de:create:array|Array]]) benötigt, welches für jede Ausprägung des Merkmals die gewünschte Teilnehmerzahl vorgibt. Bei unverbundenen Quoten ist eine Quotentabelle pro Merkmal erforderlich. 
 + 
 +Im folgenden Beispiel wird der Screenout direkt in der Quotenprüfung integriert. Es wäre aber genauso ein vorgelagerter Screenout möglich.
  
 <code php> <code php>
-$ageGrp value('AB01'); +$quotaAge 
-if (($ageGrp < 2or ($ageGrp 4)) { +  2 => 200,  // 200 Personen in Altersgruppe 2 (18-30 Jahre
-  // Hier der individuelle Screenout-Link für die Studie +  3 => 250,  // 250 Personen in Altersgruppe 3 (31-50 Jahre) 
-  redirect('http://www.anbieter.com/p1234567/screenout.php?id=%panelID%');+  4 => 150   // 150 Personen in Altersgruppe 4 (51-68 Jahre) 
 +]; 
 +$quotaGender = [ 
 +  1 =300,  // 300 Frauen (Code 1
 +  2 => 300   // 300 Männer (Code 2) 
 +]; 
 +</code> 
 + 
 +Beachten Sie, dass für die Altersgruppen 1 (Personen unter 18 Jahre) und 5 (Peronen älter als 68 Jahre) keine Einträge in der Tabelle vorliegen. Ebenso für das Geschlecht 3 (Personen, sie sich einem sonstigen Geschlecht zuordnen). Dies wird im Screenout (unten) durch die Funktion ''[[https://www.php.net/manual/de/function.array-key-exists.php|array_key_exists()]]'' abgebildet. 
 + 
 + 
 +==== Merkmale auslesen und umkodieren ==== 
 + 
 +Die Merkmalsausprägung des aktuellen Teilnehmers wird mittels ''value()'' ausgelesen und bei Bedarf mit einer [[:de:create:php-filters#das_schluesselwort_if|IF-Konstruktion]] umkodiert. Im vorliegenden Fall muss das Alter (offene Eingabe) umkodiert werden. 
 + 
 +<code php> 
 +// Geschlecht wird direkt ausgelesen 
 +$gender = value('SD02'); 
 +// Das Alter wird umkodiert 
 +$age = value('SD01_01'); 
 +if ($age < 18) { 
 +  $ageGroup = 1; 
 +} elseif ($age <= 30) { 
 +  $ageGroup = 2; 
 +} elseif ($age <= 50) { 
 +  $ageGroup = 3; 
 +} elseif ($age <= 68) { 
 +  $ageGroup = 4; 
 +} else { 
 +  $ageGroup = 5;
 } }
 </code> </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.+ 
 +==== Zählung der vorliegenden Fälle ==== 
 + 
 +Nun wird mitels ''statistic()'' überprüft, wie viele Datensätze mit der Ausprägung der Quotenmerkmale bereits im Datensatz vorliegen. Dieser Wert wird dann mit den oben definierten Quoten verglichen. 
 + 
 +**Wichtig:** Damit der PHP-Code korrekt funktioniert, müssen alle Teile im selben PHP-Code Block stehen. [[:de:create:variables#php-variablen|PHP-Variablen]] wie ''$quotaAge'' und ''$ageGroup'' sind nur jeweils innerhalb eines Code-Blocks gültig. 
 + 
 +Im folgenden Code werden __nicht__ die Variablen gezählt, mit denen die Quotenmerkmale abgefragt wurden ("SD01_01" und "SD02"), sondern interne Variablen ("SD03_01" und "SD03_02"). 
 + 
 +**Wichtig:** Die [[:de:create:questions:internal|internen Variablen]] müssen im **Fragenkatalog** vorab manuell angelegt werden.
  
 <code php> <code php>
-$limits array+// Abruf der vorliegenden Fälle für diese Merkmalsausprägung 
-  => 100+$casesAge    statistic('count', 'SD03_01', $ageGroup); 
-  3 => 200+$casesGender statistic('count''SD03_02', $gender); 
-  => 200 + 
-);+// Screenout 
 +if (!array_key_exists($ageGroup$quotaAge) || !array_key_exists($gender, $quotaGender)) { 
 +  redirect('https://www.panelanbieter.de/?xyz=screenoutGHIJKI&uid=%reference%'); 
 +
 + 
 +// Auslesen der Quoten für die angegeben Merkmale 
 +$maxPerAge    = $quotaAge[$ageGroup]; 
 +$maxPerGender = $quotaGender[$gender]; 
 + 
 +// Quotenstopp 
 +if (($casesAge >= $maxPerAge) || ($casesGender >= $maxPerGender)) { 
 +  redirect('https://www.panelanbieter.de/?xyz=quotaABCDEF&uid=%reference%'); 
 +}
 </code> </code>
  
-Dieser PHP-Code hat keine direkte Auswirkung auf die Verarbeitung der SeiteDie Obergrenzen werden erst weiter unten verwendet.+Der Bool'sche Operator ''||'' ist eine ODER-Verknüpfung zwischen den zwei BedingungenWenn also entweder genug Fälle für das Alter vorliegen __oder__ genug Fälle für das Geschlecht, dann erfolgt ein QuotaFull-Redirect.
  
-Nun wird ermittelt, wie viele abgeschlossene Fragebögen für die Altergruppe des aktuellen Teilnehmers schon vorliegenWelche 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.+Den Redirect-Link erhalten Sie vom Panel-AnbieterWichtig ist, dass Sie die Teilnehmer-ID übermitteln. Im Beispiel kommt der Platzhalter ''%reference%'' zum Einsatz. Details dazu lesen Sie hier: [[:de:survey:panels]]
 + 
 +**Wichtig:** Die Antwort des Teilnehmers wird erst zum Server übermittelt, wenn sie der Teilnehmer mittels "Weiter" abgeschickt hat. Wenn die Fragen "SD01" und "SD02" auf Seite 2 des Fragebogens steht, kann ''value()'' und damit der obige PHP-Code frühestens auf Seite 3 platziert werden. 
 + 
 + 
 +==== Kopieren der Quotenmerkmale ==== 
 + 
 +Zuletzt müssen die Quoten-Merkmale noch in die internen Variablen kopiert werden. Das heißt, direkt vor dem Complete-Redirect, welches üblicherweise auf der vorletzten Seite des Fragebogen platziert wird. 
 + 
 +Hierzu benötigen Sie __erneut__ den PHP-Code aus dem Abschnitt [[#Merkmale_auslesen_und_umkodieren|Merkmale auslesen und umkodieren]] (oben) und im selben PHP-Code Block direkt darunter die Funktion ''[[:de:create:functions:put]]'' zum Setzen der internen Variablen.
  
 <code php> <code php>
-$ageGrp = value('AB01'); +put('SD03_01', $ageGroup); 
-$n = statistic('count', 'AB01', $ageGrp);  // Abzählen der Fragebögen mit AB01 = $ageGroup+put('SD03_02', $gender);
 </code> </code>
  
-**Wichtig:** Die Antwort des Teilnehmers wird erst zum Server übermittelt, wenn sie der Teilnehmer mittels "Weiter" abgeschickt hatWenn die Frage "AB01" auf Seite 2 des Fragebogens steht, kann ''value()'' frühestens auf Seite platziert werden.+Danach folgt üblicherweise der Complete-Redirect. 
 + 
 +<code php> 
 +redirect('https://www.panelanbieter.de/?xyz=completeDEFGHI&uid=%reference%'); 
 +</code> 
 + 
 + 
 +===== Verbundene Quoten ===== 
 + 
 +==== Quotenprüfung zu Beginn ==== 
 + 
 +Wenn Sie mit verbundenen Quoten arbeiten, müssen Sie eine größere Anzahl an Quoten definieren: Ein Grenzwert pro demografischer Zelle. Bei Ausprägungen für das Alter und 2 Ausprägungen für das Geschlecht sind das insgesamt 6 Quoten.
  
-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ürdass die richtige Obergrenze verwendet wird.+Im folgenden PHP-Code wird eine demografische Zelle durch einen Code aus Altersgruppe (2-4und Geschlecht (1-2definiert. Die 6 Quoten sind der Übersichtlichkeit halber in 3 Zeilen mit jeweils 2 Quoten notiert -- technisch macht es keinen Unterschiedob nach dem Komma ein Zeilenumbruch folgt.
  
 <code php> <code php>
-if ($n >$limits[$ageGroup]) { +$quota = [ 
-  // Hier der individuelle Quotafull-Link für die Studie +  '2-1' => 100, '2-2' => 100,  // 100 Personen pro Geschlecht für die Altersgruppe 1 
-  redirect('http://www.anbieter.com/p1234567/quotafull.php?id=%panelID%');+  '3-1' => 125, '3-2' => 125,  // 125 Personen pro Geschlecht für die Altersgruppe 2 
 +  '4-1' => 75,  '4-2' => 75    //  75 Personen pro Geschlecht für die Altersgruppe 3 
 +]; 
 +</code> 
 + 
 +Das Auslesen der quotenrelevanten Ausprägungen und das Umkodieren erfolgt zunächst genauso wie bei den unverbundenen Quoten. 
 + 
 +<code php
 +// Geschlecht wird direkt ausgelesen 
 +$gender value('SD02')
 +// Das Alter wird umkodiert 
 +$age = value('SD01_01'); 
 +if ($age < 18) { 
 +  $ageGroup = 1; 
 +} elseif ($age <= 30) { 
 +  $ageGroup = 2; 
 +} elseif ($age <= 50) { 
 +  $ageGroup = 3; 
 +} elseif ($age <= 68) { 
 +  $ageGroup = 4; 
 +} else { 
 +  $ageGroup = 5;
 } }
 </code> </code>
  
-Nachfolgended nochmal der komlette PHP-Code:+Allerdings wird zusätzlich noch eine Variable definiert, welche den Code der demografischen Zelle beinhaltet. Der Punkt (''.'') dient in PHP zum Aneinanderfügen von Texten (Verketten von Strings). 
 + 
 +<code php> 
 +// Definition einer Variable mit Altesgruppe und Geschlecht 
 +// Aus 3 und 2 wird hier '3-2' 
 +$demGroup = $ageGroup.'-'.$gender; 
 +</code> 
 + 
 +Die Quotenprüfung erfolgt nun für dieses (kombinierte) Merkmal. Erneut wird eine interne Variable (SD04_01) verwendet, die vorab im **Fragenkatalog** definiert werden muss.
  
 <code php> <code php>
-// Altersgruppe des aktuellen Teilnehmers auslesen +// Abruf der vorliegenden Fälle für diese Merkmalsausprägung 
-$ageGrp value('AB01');+$cases statistic('count', 'SD04_01', $demGroup);
  
 // Screenout // Screenout
-if (($ageGrp < 2) or ($ageGrp > 4)) { +if (!array_key_exists($demGroup, $quota)) { 
-  redirect('http://www.anbieter.com/p1234567/screenout.php?id=%panelID%');+  redirect('https://www.panelanbieter.de/?xyz=screenoutGHIJKI&uid=%reference%');
 } }
  
-// Obergrenzen +// Auslesen der Quote für die demografische Gruppe 
-$limits = array( +$maxPerGroup = $quota[$demGroup];
-  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 // Quotenstopp
-if ($nQnr >= $nMax) { +if ($cases >= $maxPerGroup) { 
-  // Hier der individuelle Quotafull-Link für die Studie +  redirect('https://www.panelanbieter.de/?xyz=quotaABCDEF&uid=%reference%');
-  redirect('http://www.anbieter.com/p1234567/quotafull.php?id=%panelID%');+
 } }
 </code> </code>
  
  
-===== Umkodieren =====+==== Speicherung des Zellen-Codes ====
  
-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.+Vor dem Complete-Redirect muss der Code für die demografische Zelle in die interne Variable gespeichert werden.
  
-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").+<code php> 
 +// Speichern der Gruppenzugehörigkeit in der internen Variable SD04_01 
 +put('SD04_01'$demGroup)
 +</code>
  
-Das folgende Beispiel geht davon ausdass die offene Frage nach dem Alter mit einer Texteingabe (Beschränkung "nur Ziffern") mit der Kennung "AB02_01" abgefragt wird.+Damit dieser Code funktioniertmüssen auch hier die Quotenausprägungen abgerufen und umkodiert werden. Und natürlich müssen sie zum Zellen-Code ''$demGroup'' verkettet werden. Der vollständige Code für die vorletzte Fragebogen-Seite einschließlich Complete-Redirect sieht demnach wie folgt aus.
  
 <code php> <code php>
-$age (int)value('AB02_01'); +// Geschlecht wird direkt ausgelesen 
- +$gender = value('SD02'); 
-// Umkodieren+// Das Alter wird umkodiert 
 +$age = value('SD01_01');
 if ($age < 18) { if ($age < 18) {
-  $ageGrp = 1; +  $ageGroup = 1; 
-} elseif ($age <= 25) { +} elseif ($age <= 30) { 
-  $ageGrp = 2; +  $ageGroup = 2; 
-} elseif ($age <= 35) { +} elseif ($age <= 50) { 
-  $ageGrp = 3; +  $ageGroup = 3; 
-} elseif ($age <= 45) { +} elseif ($age <= 68) { 
-  $ageGrp = 4;+  $ageGroup = 4;
 } else { } else {
-  $ageGrp = 5;+  $ageGroup = 5;
 } }
  
-// Im Datensatz speichern +// Definition einer Variable mit Altesgruppe und Geschlecht 
-put('IV01_01'$ageGrp); +// Aus 3 und 2 wird hier '3-2' 
-</code>+$demGroup = $ageGroup.'-'.$gender;
  
-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 Variableersetzt.+// Speichern der Gruppenzugehörigkeit in der internen Variable SD04_01 
 +put('SD04_01', $demGroup);
  
 +// Complete-Redirect
 +redirect('https://www.panelanbieter.de/?xyz=completeDEFGHI&uid=%reference%');
 +</code>
  
-===== 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.+===== Fehlersuche =====
  
 +Die Implementierung einer Quotierung ist im Moment nicht ganz trivial (Optimierung in Arbeit) -- und es schleichen sich immer mal wieder Fehler im Code ein. Zum Beispiel werden Fälle abgewiesen, obwohl die Quoten noch nicht erfüllt sind.
  
-===== Verbundene Quoten =====+Wir setzen voraus, dass Sie mir der Funktion der Debug-Information (siehe [[:de:create:debugging]]) vertraut sind.
  
-Für verbundene Quoten wird ''statistic('crosscount', ...)'' statt ''statistic('count', ...)'' eingesetzt. Außerdem muss eine ID für die demografische Zelle erstellt werden.+Damit alle für die Fehlersuche notwendigen Informationen angezeigt werden, sind zwei Modifikationen sehr hilfreich.
  
-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).+==== (1) Redirect zweitweise deaktivieren ====
  
-Als Kennung für die demografische Zelle werden die beiden Zahlen einfach durch einen Bindestrich getrennt zusammengefügtDer String '''2-1''' steht dann für weibliche Teilnehmer (2aus der Altersgruppe 18-25 Jahre (1). Anhand dieser Kennungen werden die Obergrenzen definiert.+Deaktivieren Sie die Redirects, sodass die Debug-Informationen überhaupt angezeigt werdenSie können das ''redirect()'' mit zwei Schrägstrichen (''%%//%%''auskommentieren und damit deaktivieren. Ergänzen Sie stattdessen ein ''[[:de:create:functions:pagestop]]'', damit auf der Seite keine weiteren Inhalte ausgeführt werden. Mittels ''html()'' können Sie auch noch eine kurze Information anzeigen. Wenn Ihr IF-Filter also im Produktiv-Betrieb wie folgt aussieht...
  
 <code php> <code php>
-// Merkmale auslesen +// Quotenstopp 
-$ageGrp value('IV01_01')+if (($casesAge >$maxPerAge|| ($casesGender >$maxPerGender)) { 
-$gender value('AB03');+  redirect('https://www.panelanbieter.de/?xyz=quotaABCDEF&uid=%reference%'); 
 +
 +</code>
  
-// Evtl. Screenout +... dann ändern Sie den Code zur Fehlersuche wie folgt. 
-if (($ageGrp < 2or ($ageGrp 4) or ($gender < 1)) { + 
-  redirect('http://www.anbieter.com/p1234567/screenout.php?id=%panelID%');+<code php> 
 +// Quotenstopp 
 +if (($casesAge >= $maxPerAge|| ($casesGender >$maxPerGender)) { 
 +  // redirect('https://www.panelanbieter.de/?xyz=quotaABCDEF&uid=%reference%'); 
 +  html('<p>Redirect ausgelöst</p>'); 
 +  pageStop();
 } }
 +</code>
  
-// Kennung für die demografische Zelle erstellen +==== (2) Quoten-Zählung anzeigen ====
-$demID $ageGrp.'-'.$gender;+
  
-// Obergrenzen definieren +In der Debug-Information sehen Sie berietswelche Werte ''statistic()'' liefert. Aber mit der Funktion ''[[:de:create:functions:debug]]'' können Sie auch anzeigenwelche Werte Ihre Quotierung (das Array mit den Quotenfür den aktuellen Fall liefert.
-$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 +Ergänzen Sie einfach für alle Filter-relevanten Variablen eine Zeile ''debug()''. Für den obigen Filter würde das dann wie folgt aussehen.
-$n = statistic('crosscount', array('IV01_01', 'AB03'), array($ageGrp, $gender));+
  
-// Quoten prüfen +<code php> 
-if ($> $limits[$demID]) { +// Zusätze Informationen anzeigen 
-  redirect('http://www.anbieter.com/p1234567/quotafull.php?id=%panelID%');+debug($casesAge); 
 +debug($maxPerAge); 
 +debug($casesGender); 
 +debug($maxPerGender); 
 + 
 +// Quotenstopp 
 +if (($casesAge >$maxPerAge) || ($casesGender >= $maxPerGender)) { 
 +  // redirect('https://www.panelanbieter.de/?xyz=quotaABCDEF&uid=%reference%'); 
 +  html('<p>Redirect ausgelöst</p>'); 
 +  pageStop();
 } }
 </code> </code>
 +
 +Damit können Sie unmittelbar nachvollziehen, warum ein Redirect ausgelöst wird. Wenn Sie dann noch nicht nachvollziehen können, warum diese (evtl. falschen) Werte wemittelt werden, lassen Sie sich weitere Variablen anzeigen, z.B. dort wo die Quotenlimits ausgelesen werden. Der Code oben im Beispiel lautet wie folgt.
 +
 +<code php>
 +// Auslesen der Quoten für die angegeben Merkmale
 +$maxPerAge    = $quotaAge[$ageGroup];
 +$maxPerGender = $quotaGender[$gender];
 +</code>
 +
 +Wenn z.B. unklar ist, woher der Wert für ''$maxPerAge'' kommt, kann man sich das Array und die Alterskategorie anzeigen lassen.
 +
 +<code php>
 +// Auslesen der Quoten für die angegeben Merkmale
 +$maxPerAge    = $quotaAge[$ageGroup];
 +$maxPerGender = $quotaGender[$gender];
 +
 +// Zusätzliche Informationen anzeigen
 +debug($ageGroup);
 +debug($quotaAge);
 +debug($maxPerAge);
 +</code>
 +
 +Diese Informationen helfen auch im [[https://support.soscisurvey.de/|Online-Support]], wenn Sie Unterstützung bei der Implementierung Ihrer Filter benötigen.
de/survey/quota.txt · Zuletzt geändert: 09.01.2023 22:25 von admin
 
Falls nicht anders bezeichnet, ist der Inhalt dieses Wikis unter der folgenden Lizenz veröffentlicht: CC Attribution-Share Alike 4.0 International
Driven by DokuWiki