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

0 votes

Sehr geehrte Damen und Herren,

ich habe mich jetzt an ihrer Anleitung orientiert und bei unserer Befragung einen Quotenstopp eingebaut und zwar möchte ich insgesamt Daten von n = 1000 erheben, davon

1) Schülerinnen und Schüler im Alter von 14-19 Jahren (ca 50% weiblich, 50% männlich)
2) Studierende im Alter von 18-35 Jahren (ca 50% weiblich, 50% männlich)

Mein Code sieht wie folgt aus:

$quota_sus = [
  1 => 275,  // 250 Personen (weiblich)
  2 => 275,  // 250 Personen (männlich)
];
$quota_stud = [
  1 => 275,  // 250 Personen (weiblich)
  2 => 275,  // 250 Personen (männlich)
];

//Geschlecht wird direkt übergeben
$gender = value('SB01');

//Studium oder Schule wird direkt übergeben
$edu = value('FF01');



// Schule und Alter 14-19 Jahre (array (1,2,3,4,5,6)) nach Geschlecht

if (($edu == 1) && (in_array(value('FF02'), array(1,2,3,4,5,6))) && ($gender == 1)){

$group_sus = 1;

}else if (($edu == 1) && (in_array(value('FF02'), array(1,2,3,4,5,6))) && ($gender == 2)){

$group_sus = 2;

}


// Studium und Alter 18-35 Jahre (array(5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22)) nach Geschlecht

else if (($edu == 2) && (in_array(value('FF02'), array(5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22))) && ($gender == 1)){

$group_stud = 1;

}else if (($edu == 2) && (in_array(value('FF02'), array(5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22))) && ($gender == 2)){

$group_stud = 2;

}

// Abruf der vorliegenden Fälle für diese Merkmalsausprägung, neue internen Variablen FF04, FF05 angelegt
$casesGroupSus    = statistic('count', 'FF04', $group_sus);
$casesGroupStud    = statistic('count', 'FF05', $group_stud);

// Screenout
if (!array_key_exists($group_sus, $quota_sus) || !array_key_exists($group_stud, $quota_stud)) {
  redirect('Screenout-Link');
}
 
// Auslesen der Quoten für die angegeben Merkmale
$maxPerGroup_sus    = $quota_sus[$group_sus];
$maxPerGroup_stud  = $quota_stud[$group_stud];


 
// Quotenstopp
if (($casesGroupSus >= $maxPerGroup_sus) || ($casesGroupStud  >= $maxPerGroup_stud)) {
  redirect('Quotasful-Link');
}


//vor complete auf der vorletzten Seite eingefügt

put('FF04', $group_sus);
put('FF05', $group_stud);

Wo genau soll ich den oberen Code einfügen - bisher habe ich ihn nach der Abfrage des Geschlechts auf der Seite 13 mittels PHP Element integriert. Woran liegt es das der Screenout kommt und ist es ausreichend, dass ich als einzige interne Variablen, die Variablen im Counter (FF04, FF05) angelegt haben?
Ich würde mich sehr freuen, wenn Sie hier einmal rauf schauen könnten

in SoSci Survey (dt.) by s099565 (110 points)
edited by s099565
Ergänzung: Filterfrage 1 auf Seite 1 fragt das Alter ab.
Filterfrage 2 auf Seite 3 fragt ab, ob die Personen ein Studium machen oder zur Schule gehen --> erst dann startet der Fragebogen. Die Abfrage nach Geschlecht erfolgt erst auf Seite 12, daher habe ich den oberen Code auf Seite 13 platziert.
Fehlermeldung laut debug_mode:
Undefined variable $group_stud (muss die auch als interne variable angelegt werden?)
060 Trying to access array offset on value of type null
Wenn ich Ihren Code korrrekt verstehe, möchten Sie eine verbundene Quote mit insgesamt 4 Gruppen à 250 Personen. Daher wäre es sinnvoll, wenn Sie ein Array mit 4 Einträgen (jeweils 250) erstellen und eine interne Variable erzeugen, die den Wert 1-4 bekommt, entsprechend der Gruppe.

> Undefined variable $group_stud

Wenn ein:e Schüler:in teilnimmt, dann wird diese Variable im PHP-Code nicht definiert. Daher die Fehlermeldung. Wenn Sie das Schema auf die o.g. 4 Gruppe  umstellen, dann passiert so etwas nicht mehr, weil die Gruppe (1-4) dann immer definiert ist.
Vielen herzlichen Dank für die Rückmeldung. Ich habe mal probiert das umzusetzen und bekomme auch keine Fehlermeldung mehr - sieht das aus ihrer Sicht korrekt aus?




$quota_group = [
  1 => 275,  // 275 Personen (weiblich) Schüler*innen
  2 => 275,  // 275 Personen (männlich) Schüler*innen
  3 => 275,  // 275 Personen (weiblich) Studierende
  4 => 275,  // 275 Personen (männlich) Studierende
];

//Geschlecht wird direkt übergeben
$gender = value('SB01');

//Studium oder Schule wird direkt übergeben
$edu = value('FF01');



//1 Schule und Alter 14-19 Jahre nach Geschlecht

if (($edu == 1) && (in_array(value('FF02'), array(1,2,3,4,5,6))) && ($gender == 1)){

$group = 1;

}else if (($edu == 1) && (in_array(value('FF02'), array(1,2,3,4,5,6))) && ($gender == 2)){

$group = 2;

}


//2 Studium und Alter 18-35 Jahre nach Geschlecht

else if (($edu == 2) && (in_array(value('FF02'), array(5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22))) && ($gender == 1)){

$group = 3;

}else if (($edu == 2) && (in_array(value('FF02'), array(5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22))) && ($gender == 2)){

$group = 4;

}

// Abruf der vorliegenden Fälle für diese Merkmalsausprägung, neue interne Variable FF04_01
$casesGroup    = statistic('count', 'FF04_01', $group);

// Screenout
if (!array_key_exists($group, $quota_group)) {
 
  html('Redirect Screenout');
}
 
// Auslesen der Quoten für die angegeben Merkmale
$maxPerGroup = $quota_group[$group];

 
// Quotenstopp
if ($casesGroup >= $maxPerGroup)  {
  
  html('Redirect Quotasful');
}

1 Answer

0 votes

Ihr Code sieht auf den ersten Blick gut aus. Zur Prüfung, ob korrekt egezählt wird, fügen Sie noch ein paar debug() ein:

$casesGroup    = statistic('count', 'FF04_01', $group);
debug($group);
debug($casesGroup);
by SoSci Survey (238k points)
Super, vielen Dank!
Sagen Sie, wir stellen gerade fest, dass Quotafull nicht zurückgemeldet wird an das Panel. Können Sie anahand des Codes oben sagen wieso das nicht zu funktionieren scheint?
Ich gehe davon aus, dass Sie in diesem Abschnitt...

if ($casesGroup >= $maxPerGroup)  {
  html('Redirect Quotasful');
}

Das html() wieder durch ein geeignetes redirect() mit dem Quotestop-Link ausgetauscht haben?

Das gilt natürlich auch für die anderen html(), die nur der Fehlersuche galten.
Ja, genau - hier steht natürlich der redirect link drin. group 1 ist schon voll, wurde aber nicht gestoppt.
Mittels

debug($casesGroup);
debug($maxPerGroup);

können Sie prüfen, welche Werte dem Screenut-Filter zugrunde gelegt werden. Wenn Sie den Fragebogen im Debug-Modus starten, zählen Test-Fälle mit (MODE=debug bzw. MODE=admin), im "normalen" Fragebogen-Ablauf hingegen nicht.

Eine Alternative, um das zu prüfen wäre, dass Sie noch eine interne Variable anlegen und dort die Werte zur Konteolle ablegen:

put('XX01_01', $casesGroup);
put('XX01_02', $maxPerGroup);
...