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

Hallo zusammen,

ich möchte die Funktion Statistic gerne in folgendem Kontext benutzen:

Auf Seite 1 meines Fragebogens erfolgt eine Zufallsziehung von 20 Marken aus einem Set von 120. Diese 20 Marken bewerten dann die Teilnehmer des Fragebogens hinsichtlich Bekanntheit und Vertrautheit.

Bei Erreichen einer definierten Mindestbewertung pro Marke werden dann auf der Folgeseite fünf dieser 20 Marken ausgewählt und für weiterführende Fragen genutzt, so dass Teilnehmer nur dann weiterführend Marken bewerten, die sie gut kennen.

Da die Teilnehmer über ein Panel rekrutiert werden und alle Marken ca. gleich oft bewertet werden sollen, ist eine Quotierung notwendig. Diese habe ich versucht, wie folgt zu implementieren:

Seite 1: Zufallsgenerator mit den 20 Ziehungen aus den 120 Marken. Die Marken werden wie hier beispielhaft dargestellt abgefragt und dann in ein array gespeichert.

$marke0 = value('M004x01', 'label');
registerVariable($marke0);
replace('%marke1%', $marke0);

$marken = array(1 => $marke0, 2 => $marke1, usw.)

Seite 2:

//Selektion der Marken mit MIndestbewertung. 

$Itemliste1 = getItems('M002', '>' , 3);
$Itemliste2 = getItems('M003', '>' , 3);

$Itemliste3 = array_intersect ($Itemliste1, $Itemliste2);
shuffle($Itemliste3);

// Dann folgt die Definition der Limits in einem Array, jede Marke soll max. 60-mal abgefragt werden.

$limits = array(

'Markenname 1' => 60,
'Markenname 2' => 60,
usw.);

// Dann möchte ich für die fünf selektierten Marken prüfen, wie oft die bereits abgefragt wurden. $itemliste4 beinhaltet die fünf Marken und mit dem letzten Part wird der Markenname abgerufen. 

$n1 = statistic('count', $itemliste3, $marken[$itemliste3[0]]);
$n2 = statistic('count', $itemliste3, $marken[$itemliste3[1]]);
$n3 = statistic('count', $itemliste3, $marken[$itemliste3[2]]);
$n4 = statistic('count', $itemliste3, $marken[$itemliste3[3]]);
$n5 = statistic('count', $itemliste3, $marken[$itemliste3[4]]);

Leider kommt es nun zur Fehlermeldung, dass $itemliste3 noch nicht bekannt ist.
Müssen Arrays anders verarbeitet werden? Ist der Angang an das Problem korrekt? In der Doku gibt es viele Infos zu statistic() mit Fragen, aber kaum zur Verwendung mit Array.

Recht herzlichen Dank vorab für die Hilfe!

in SoSci Survey (dt.) by s117257 (175 points)
edited by SoSci Survey

1 Answer

0 votes

Leider kommt es nun zur Fehlermeldung, dass $itemliste3 noch nicht bekannt ist.

Wenn Sie die genaue Fehlermeldung posten, ist eine akkurate Antwort wesentlich einfacher. Danke.

Aber ich kann Ihnen schonmal ein paar Anhaltspunkte geben:

  1. Ziehen Sie die Möglichkeit in betracht, dass die Itemsliste (aufgrund der Kriterien) weniger als 5 Elemente ennthält - damit muss der COde umgehen können.
  2. Der zweite Parameter in statistic() muss ein Variablenname sein. Sie werden also erst einmal eine Variable (z.B. "interne Variablen") anlegen müssen, in welche Sie schreiben, welche Marken im Interview abgefragt wurden. Sonst kann statistic() ja nicht wissen, wo es nachsehen muss.
  3. Vermutlich werden Sie in 5 Variablen zählen (und summieren) müssen, damit Sie herausbekommen, wie häufig eine Marke in anderen Interviews bereits abgefragt wurde.

Der PHP-Code für die Zählung könnte etwa wie folgt aussehen:

$counts = array();
$countVars = array('IV01_01', 'IV01_02', 'IV01_03', 'IV01_04', 'IV01_05');
foreach ($itemliste3 as $itemNum) {
  $counts[$itemNum] = 0;
  foreach ($countVars as $varID) {
      $counts[$itemNum]+= statistic('count', $varID, $itemNum);
  }
}

In $countVars stehen die Variablen, in welchen Sie anschließend die (max. 5) zur weiteren Bewertung gezogenen Marken(-Nummern) abspeichern.

Da Sie mehr als 99 Marken im Set haben und ich vermute, dass ein Teil der Marken in M002 und der andere in M003 liegt, denke ich, array_intersect() ist in Ihrem Code falsch. Und die Item-IDs in den beiden Fragen sind sicher auch nicht überschneidungsfrei. Deshalb werden Sie da noch eine kleine Schleife brauchen. Wie sind die Marken denn auf die beiden Fragen verteilt?

by SoSci Survey (238k points)
Hallo,

vielen Dank für die schnelle Antwort und den Code, das hilft mir schon mal weiter. Die Fehlermeldung ist die folgende:

Fehler im Fragebogen: Die PHP-Variable $itemliste3 wurde verwendet, in diesem PHP-Code aber noch nicht definiert (sie enthält noch keinen Wert).

Zu den anderen Anmerkungen: In M002 und M003 werden die gleichen Marken abgefragt. In M002 geht es um Bekanntheit, dann folgen 20 Marken, die entsprechend bewertet werden.
In M003 funktioniert genauso, nur mit Vertrautheit. Und nur Marken, bei denen ein bestimmtes Level bei beiden Abfragen gegeben ist, sollen später wieder auftauchen. Die Marken und die Reihenfolge der Marken sind aber bei beiden Fragen identisch.
> Fehler im Fragebogen: Die PHP-Variable $itemliste3 wurde verwendet, in diesem PHP-Code aber noch nicht definiert

Kann es sein, dass Sie den PHP-Code auf mehrere Code-Boxen verteilt haben? Eine PHP-Variable gilt jeweils nur für eine Box. Also bitte nicht verteilen.

>  In M002 und M003 werden die gleichen Marken abgefragt. In M002 geht es um Bekanntheit, dann folgen 20 Marken, die entsprechend bewertet werden.

Gut, dann macht das Ganze natürlich Sinn. Aber vorsicht: Denken Sie frühzeitig an die Auswertung (nur 20 aus 120 bedeutet u.U., dass die Variablen jeweils für ander Marken stehen) - und prüfen sie, ob Sie die Daten mit überschaubarem Aufwand umstrukturieren können so wie Sie sie benötigen. Sonst sehen Sie sich bitte die Multi-Level-Funktion an: https://www.soscisurvey.de/help/doku.php/de:create:multilevel
Das Thema mit der Itemliste hat sich erledigt. Der Code scheint soweit auch zu funktionieren - aber gibt es die Chance, das Ganze auch vorab zu testen? Sowiet ich es bislang verstanden habe, werden die Daten in der Testversion des Fragebogens werden die Daten ja nicht gespeichert. Ich würde gerne wissen, ob die Zählung dann auch funktioniert wie vorgesehen.
Wenn Sie den Fragebogen unter "Fragebogen zusammenstellen" im Debug-Modus starten, wird ein Fall im Datensatz angelegt. Solange Sie im Debug-Modus sind, wird diese auch mittels statistic() gezählt.
Hi,

an dieser Stelle ergibt sich für mich noch ein weiteres Problem.

Ich habe nun folgende Situation:

Auf einer früheren Seite des Fragebogens werden die für die Quotierung notwendigen Limits pro abgefragter Marke in dem Array $limits gesetzt, wie beschrieben.

$limits = arrray(

'Marke A' => 60,
'Marke B' => 60,
usw.);

registerVariable($limits);

Dann erfolgt die Befragung über mehrere Seiten und am Ende des Fragebogens möchte ich alle Teilnehmer rausleiten, die bedingt durch die Quotierung nicht gezählt werden sollen. Dazu ist dann folgender Code vorgesehen:

//Zählung der Aufrufe der internen Variablen/Marken

$counts = array();
$countVars = array('BP07_02', 'BP07_03', 'BP07_04', 'BP07_05', 'BP07_06');
foreach ($Itemliste3 as $itemNum)
{  $counts[$itemNum] = 0;
  foreach ($countVars as $varID) {
      $counts[$itemNum]+= statistic('count', $varID, $itemNum);}};

put('ZA12_01',$counts);

//Schleife zur Prüfung der Quotierung

$larger = false;
foreach ($counts as $key => $value) {
  if (!array_key_exists($key, $limits)) {
    continue; // Eintrag ignorieren
  }
  if ($value > $limits[$key]) {
    $larger = true;
  }
}
if ($larger) {
  // Fragebogen nicht beenden
} else {redirect('https://samplicio.us/s/ClientCallBack.aspx?RIS=30&RID=%panelID%');
  // Fragebogen beenden
};

Mit der ersten Schleife zähle ich die Aufrufe der 5 Marken. Landet denn in  $counts der jeweilige Markenname mit der Zählung, so dass das Array dann untenstehende Form hat? Oder fehlt da noch etwas?

$counts(
'Marke A' => 2
'Marke B' => 1
usw.)

Denn aktuell werde ich beim testen an dieser Stelle rausgeworfen, unabhängig davon welche Marke gerade vorher in der Befragung abgefragt wurde. Wie lässt sich das überprüfen?

Danke vorab für die Antworten, beim Thema Schleifen arbeite ich leider gerade noch an meinem PHP-Verständnis. ;)
> Denn aktuell werde ich beim testen an dieser Stelle rausgeworfen, unabhängig davon welche Marke gerade vorher in der Befragung abgefragt wurde. Wie lässt sich das überprüfen?

Entfernen Sie das redirect() bzw. ersetzen Sie es durch ein html('redirect'), damit Sie etwas sehen. Anschließend können Sie die Debug-Informationen lesen und sich z.B: auch die $counts ausgeben lassen:

debug($counts);
...