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 suche eine Möglichkeit, eine Variable auszuwählen (und dann als Filter zu nutzen), die auf einer Fragebogenseite im Vergleich zu anderen Variablen den höchsten Wert erreicht hat. Im Forum habe ich folgenden Code gefunden, der mir aus einer Skala das Item mit dem grössten Wert ausgibt. Ich möchte aber die Variable mit dem grössten Wert.

$values = valueList('IA01');    

$max = max($values);

if ($max >= 5) {
      $items = getItems('IA01', 'is', $max);
    } else {
      goToPage('MNPI');
    }

Quelle: "Aus gleichwertigen Items per Zufall auswählen"

Konkretes Vorhaben:
Auf Fragebogenseite X werden verschiedene Objekte präsentiert und zu jedem Objekt wird eine Einstellung abgefragt. Pro Objekt eine Variable (bspw. 'S302_01', 'S303_01', 'S304_01'). Das Objekt, zu dem die positivste Einstellung abgegeben wurde, soll auf einer späteren Fragebogenseite angezeigt werden. Für jedes Objekt gibt es eine Fragebogenseite, d.h. in Abhängigkeit von den Angaben auf Seite X soll mit goToPage auf die entsprechende Seite gefiltert werden.

B: Wenn S302_01 den grössten Wert hat, soll auf die Fragebogenseite Page302 gefiltert werden.

Ich vermute, ich könnte das auch mit if-Bedingungen angehen (verkürzt etwa: Wenn S302_01 grösser als S303_01 und S304_01 dann goToPage XY). Da es aber viele Variablen sind (nicht nur drei wie im Bsp.), wäre eine Funktion, die mir den Maximalwert ausgibt (präzisiere: die Variable mit dem grössten Wert), sicher effizienter. Zumal es dann noch noch zusätzliche Regeln/Bedingungen geben muss, für den Fall, dass zwei Variablen den gleichen Wert haben etc.

Ich danke sehr für jede Hilfe!
Liebe Grüsse, Anne

in SoSci Survey (dt.) by s090684 (235 points)
edited by s090684

4 Answers

+1 vote
 
Best answer

Für jedes Objekt gibt es eine Fragebogenseite, d.h. in Abhängigkeit von den Angaben auf Seite X soll mit goToPage auf die entsprechende Seite gefiltert werden.

Bei goToPage() rate ich immer ein wenig zur Vorsicht: Diese Funktino ist gut, wenn man einen Teil im Fargebogen überspringen will. Aber um eine einzelne Seite anzuzeigen ist sie etwas "hakelig", denn man muss ja alle anderen Seiten überspringen. Ein normaler Filter, der (auf einer Seite) einfach das anzeigt, was angezeigt werden soll, ist in aller Regel handlicher.

Aber um Ihre eigentliche Frage zu beantworten: valueList() liefert die Variablen-Namen gleich mit. Also können Sie den Code wie folgt modifizieren:

$values = valueList('IA01');    
$max = max($values);

$labels = array();
foreach ($values as $label => $value) {
  if ($value == $max) {
    $labels[] = $label;
  }
}

Die Variable $labels enthält dann die Variablen-Labels, bei denen der Maximalwert angegeben/ausgewählt wurde.

Alternative

Für Ihre Aufgabenstellung mit den einzelnen Seiten können Sie auch anders vorgehen: Ermitteln Sie den Maximalwert wie im Code oben und speichern Sie diesen dann für die weitere Verarbeitung mit registerVariable()

$values = valueList('IA01');    
$max = max($values);
registerVariable($max);

Nun können Sie auf den folgenden Seiten zu Beginn einfach einen Filter setzen, der die Seite überpringt, wenn der Teilnehmer für dieses Item nicht (!) den Maximalwert ausgewählt hat:

if (value('IA01_01') < $max) {
  goToPage('next');
}
by SoSci Survey (79k points)
selected by s090684
Hallo, ich habe eine Folgefrage formuliert, allerdings als Antwort auf meine erste Frage, weil ich auf Ihre Antwort hier nur kommentieren konnte. Dann fehlte aber die Möglichkeit, den Code schön in die Frage einzubetten. Ich setze hier jetzt diesen Kommentar, um Sie ggf. auf meine Nachfrage aufmerksam zu machen. Danke!
0 votes

Vielen Dank für die schnelle Antwort. Ich bin damit leider noch nicht am Ziel. Ich beginne mal mit der valueList:

$values = valueList('S302_01', 'S303_01', 'S304_01'); 

Fehlermeldung: "Die Kennung S302_01, die in der Funktion valueList() angegeben wurde, ist keine Frage- sondern eine Item-Kennung."

wenn ich alternativ die Fragen-Kennung eingebe, also:

$values = valueList('S302', 'S303', 'S304'); 

bekomme ich diese Fehlermeldung: " Für die Frage S302 wurde kein Item mit der Kennung 0 gefunden"

Ferner heisst es: "Die Variable S302 gibt es in diesem Projekt nicht (siehe Variablen-Übersicht). Daher kann kein Antwort-Wert dafür ermittelt werden."

Es handelt sich hier um einen Schieberegler. Evtl. spielt das eine Rolle?

Vielen Dank für den Hinweis bzgl. goToPage. Ich werde alternativ nun eine Fragebogenseite erstellen, auf der alle Objekte eingebettet sind, diese aber ein- bzw. ausblenden, je nach vorherigem Antwortverhalten. Das erscheint mir auch einfacher.

Besten Dank nochmal.

by s090684 (235 points)
+1 vote

Bitte legen Sie Nachfragen als neue Fragen an ("aks related question"), nicht als Antwort - sonst ist das Risiko recht hoch, dass wir die Nachfrage übersehen.

Fehlermeldung: "Die Kennung S302_01, die in der Funktion valueList() angegeben wurde, ist keine Frage- sondern eine Item-Kennung."

Wenn Sie mehrere Variablen-Kennungen angeben, dann bitte als Array:

$values = valueList(array('S302_01', 'S303_01', 'S304_01')); 
by SoSci Survey (79k points)
0 votes

Ich dokumentiere hier den vollständigen Code, den ich für die Programmierung des oben beschriebenen Vorhabens geschrieben habe. Am Ende wurden zunächst erfragte Elemente gar nicht benötigt. Vielen Dank nochmal für die Hilfe an SoSci Survey.

 //Mean aus den drei Subskalen von Populistischen Einstellungen
    $meananti = valueMean('PA01');
    $meansov = valueMean('PA02');
    $meanhom = valueMean('PA03');
    $meanpop = ($meananti + $meansov + $meanhom)/3;
    put('IV01_01', $meanpop);
    
    if ((value('IV01_01') > 4))  {
      put('IV01_02', 1);  // Code 1 für Populisten
    } else {
      put('IV01_02', 2);  // Code 2 für Nicht-Populisten
    }
    
    $valuesanti = valueList(array('S302_01', 'S303_01')); //Werte der Anti-Elite Überschriften in Liste
    $maxanti = max($valuesanti); //höchster Wert, der für Anti-Elite Überschriften abgegeben wurde
    
    $valuespro = valueList(array('S305_01', 'S306_01')); //Werte der Pro-Elite Überschriften in Liste
    $maxpro = max($valuespro); //höchster Wert, der für Pro-Elite Überschriften abgegeben wurde
    
    //Liste aus Anti-Artikeln.PNG
    if (!isset($antiart)) {
      $antiart= array('AntiElite01_Artikel.PNG', 'AntiElite02_Artikel.PNG'); 
       // Die Liste mischen
      shuffle($antiart);
    // Die Listen auf allen Seiten verfügbar machen
    registerVariable('antiart');
    }
    
    //Liste aus Pro-Artikeln.PNG
    if (!isset($proart)) {
      $proart= array('ProElite01_Artikel.PNG', 'ProElite02_Artikel.PNG'); 
       // Die Liste mischen
      shuffle($proart);
    // Die Listen auf allen Seiten verfügbar machen
    registerVariable('proart');
    }
    
    //Zuweisung Anti-Elite Artikel
    //Anti-Elite Artikel wird Nicht-Populisten zugewiesen
    //Es wird der Anti-Elite Artikel zugewiesen, für dessen Überschrift die höchste Lesewahrscheinlichkeit angegeben wurde
    //Wenn beide Anti-Elite Artikel eine gleich hohe Lesewahrscheinlichkeit haben, wird zufällig einer ausgewählt. 
    if ((value('S302_01') == value('S303_01')) and (value('IV01_02') == 2)) {
      html('<p><img src="'.$antiart[0].'"></p>');
    } elseif ((value('S302_01') == $maxanti) and (value('IV01_02') == 2)) {
      html('<img src="AntiElite01_Artikel.PNG" >');
    } elseif ((value('S303_01') == $maxanti) and (value('IV01_02') == 2)){
      html('<img src="AntiElite02_Artikel.PNG" >');
    } 
    
    //Zuweisung Pro-Elite Artikel entsprechend Anti-Elite Artikel
    if ((value('S305_01') == value('S306_01')) and (value('IV01_02') == 1)) {
      html('<p><img src="'.$proart[0].'"></p>');
    } elseif ((value('S305_01') == $maxpro) and (value('IV01_02') == 1)){
      html('<img src="ProElite01_Artikel.PNG" >');
    } elseif ((value('S306_01') == $maxpro) and (value('IV01_02') == 1)){
      html('<img src="ProElite02_Artikel.PNG" >');
    }
by s090684 (235 points)
...