0 votes
in SoSci Survey (dt.) by s047711 (250 points)

Meine Versuchsanordnung ist ein bisschen kompliziert. Deshalb frage ich erstmal vorneweg, ob es da einen Trick gibt, bevor ich mich mit PHP versuche.

Je nach Antwort bei Frage SK02 sollen unterschiedliche Pfade durchlaufen werden, also gefiltert werden. Die beiden Unterskalen mit der höchsten Ausprägung (das sind jeweils 4 Items pro Skala) sollen ergeben, welche Fragen in der Folge bearbeitet werden sollen (das sind dann jeweils mehrere, ca. 10-12).

Danach soll dann in Kontroll - und Experimentalgruppe aufgeteilt werden, und zwar 50/50. Allerdings soll die direkt darauf folgende Frage auch wiederum spezifisch nach den vorher gefilterten Pfaden angezeigt werden. Geht das soweit überhaupt?

Dann soll in der Folge eine von 2 Fragen, Reihenfolge randomisiert (unabhängig von Exp.- und Kontr.Gruppe), gezeigt werden.

Dann wieder eine Seite entsprechend der Filterfrage SK 02 (und hier nicht mehr unterschiedlich für Kontroll- und Experimentalgruppe).

Dann nochmal die zweite der beiden reihenfolge-randomisierten Fragen.

Dann noch abschließend einige weitere Fragen, für alle Gruppen gleich.

Entschuldigung, dass ich die Frage ohne schon von mir erstellten Code bringe, aber ich befürchte, mich sonst erstmal hoffungslos zu verheddern.

3 Answers

0 votes
by SoSci Survey (320k points)

Die beiden Unterskalen mit der höchsten Ausprägung (das sind jeweils 4 Items pro Skala) sollen ergeben, welche Fragen in der Folge bearbeitet werden sollen

Für die Pfade sehen Sie sich bitte setPageOrder() an - unbedingt in Verbindung mit der Einführung zu Arrays.

Was die Subskalen angeht, sehen Sie sich bitte valueMean() an. Um die größten zu finden, bieten sich Arrays und die PHP-Funktion asort() und array_keys(). Zugegeben, daran werden Sie ein klein wenig zu beißen haben. Aber mit debug() und dem Debug-Modus können Sie immer nachsehen, was gerade in Ihren Variablen (Arrays) gespeichert ist. Und wenn Sie konkreten PHP-Code haben, können wir im Support auch konkrete Fragen beantworten.

Danach soll dann in Kontroll - und Experimentalgruppe aufgeteilt werden, und zwar 50/50.

Das ist relativ einfach - die Anleitung zur Randomisierung erklärt das recht detailliert. Von der vorherigen Programmierung ist das weitgehend unabhängig.

Allerdings soll die direkt darauf folgende Frage auch wiederum spezifisch nach den vorher gefilterten Pfaden angezeigt werden. Geht das soweit überhaupt?

Da müssen Sie nur überlegen, ob Sie das 50/50-Verhältnis in jeder der Subgruppen einhalten müssen (das wären bei z.B. Subskalen 5x4=20 mögliche Subgruppen) oder ob es reicht, wenn Sie den Teilnehmer quasi schon zu Beginn in eine der Gruppen einteilen. Dass der Inhalt in der EG oder KG dann noch abhängig von der Subgruppe variiert wird, ist nicht weiter kompliziert. Nur ein Filter im Filter.

Dann nochmal die zweite der beiden reihenfolge-randomisierten Fragen.

Just more of the same...

0 votes
by s047711 (250 points)
reshown by s047711

Habe jetzt mal versucht für jede Subskala ein Array zu definieren. Dann die asort-Funktion, um zu filtern, welchen entsprechenden Pfad die Probanden bekommen. Leider kam dann die am Ende stehende Warnung.

  $sum = valueSum(
             $Sozial = array(
               'SK02_01',
               'SK02_02',
               'SK02_03',
               'SK02_04',
             )
           );
    
    $sum = valueSum(
             $Verbal = array(
               'SK02_05',
               'SK02_06',
               'SK02_07',
               'SK02_08',
             )
           );
    $sum = valueSum(
             $Logisch = array(
               'SK02_09',
               'SK02_10',
               'SK02_11',
               'SK02_12',
             )
           );
    
    $sum = valueSum(
             $Kreativ = array(
               'SK02_13',
               'SK02_14',
               'SK02_15',
               'SK02_16',
             )
           );
    
    <?php
    $Skalen = array("a" => "Sozial", "b" => "Verbal", "c" => "Logisch", "d" => "Kreativ");
    asort($Skalen);
    foreach ($Skalen as $key => $val) {
        echo "$key = $val\n";
    }
    ?>
Warnung: Das PHP Schlüsselwort echo darf im PHP-Code nicht verwendet
werden.

Warnung: Der PHP-Code enthält Funktionen oder PHP-Elemente, die nicht
für die Verwendung im Fragebogen freigegeben wurden. Falls Sie der
Meinung sind, dass die monierten Konstrukte ungefährlich sind, setzen
Sie sich bitte mit dem Administrator in Kontakt!
0 votes
by s047711 (250 points)

Ich habe mein Problem im Wesentlichen gelöst, komme jetzt aber an einer Stelle nicht weiter. Mit arsort und Array_keys bekomme ich die richtigen Pfade (siehe setPageOrder-Teil unten im Code). Allerdings besteht das Problem, dass arsort mir bei identischen Elementen (also gleichen Punktwerten in den Skalen) nicht random irgendeins auswählt, sondern immer ein bestimmtes (ich nehme an, weil es als erstes im Code genannt wird). Das zerschießt mir ein Stück weit die Studie. Ich hoffe ich habe das Problem klar erklärt... Wie bekomme ich ihn dazu, bei identischen Elementen eins zufällig auszuwählen (oder sogar zwei, dann aber diesen beiden auch in zufälliger Reihenfolge)?

Anbei der Code:

$SumSoz = valueSum(
         $Sozial = array(
           'SK02_01',
           'SK02_02',
           'SK02_03',
           'SK02_04',
         )
       );

$SumVer = valueSum(
         $Verbal = array(
           'SK02_05',
           'SK02_06',
           'SK02_07',
           'SK02_08',
         )
       );
$SumLog = valueSum(
         $Logisch = array(
           'SK02_09',
           'SK02_10',
           'SK02_11',
           'SK02_12',
         )
       );

$SumKre = valueSum(
         $Kreativ = array(
           'SK02_13',
           'SK02_14',
           'SK02_15',
           'SK02_16',
         )
       );



// Sortiere mir alle Summen und geben sie mir aus
$SumArray = array("Soz" => $SumSoz, "Ver" => $SumVer,"Log" => $SumLog,"Kre" => $SumKre);
arsort($SumArray);
$Dim1 = array_keys($SumArray)[0];
$Dim2 = array_keys($SumArray)[1];


if (
  ($Dim1 == "Ver") and
  ($Dim2 == "Soz")
) { 
  setPageOrder('SE01-SE11, SE20, SE12-SE19, WF07, VE01-VE05, WF03');
 
}


if (
  ($Dim1 == "Soz") and
  ($Dim2 == "Ver")
) {
  setPageOrder('VE01-VE05, WF07, SE01-SE11, SE20, SE12-SE19, WF03');
  
}

if (
  ($Dim1 == "Kre") and
  ($Dim2 == "Soz")
) {
  setPageOrder('SE01-SE11, SE20, SE12-SE19, WF07, KR01-KR14, WF03');
   
}

if (
  ($Dim1 == "Soz") and
  ($Dim2 == "Kre")
) {
  setPageOrder('KR01-KR14, WF07, SE01-SE11, SE20, SE12-SE19, WF03');

}

if (
  ($Dim1 == "Ver") and
  ($Dim2 == "Kre")
) {
  setPageOrder ('KR01-KR14, WF07, VE01-VE05, WF03');

}

if (
  ($Dim1 == "Kre") and
  ($Dim2 == "Ver")
) {
  setPageOrder ('VE01-VE05, WF07, KR01-KR14, WF03');
}

if (
  ($Dim1 == "Log") and
  ($Dim2 == "Ver")
) {
  setPageOrder ('VE01-05, WF07, LM01-LM07, WF03'); 
  
}

if (
  ($Dim1 == "Ver") and
  ($Dim2 == "Log")
) {
  setPageOrder ('LM01-LM07, WF07, VE01-05, WF03'); 
  
}

if (
  ($Dim1 == "Soz") and
  ($Dim2 == "Log")
) {
  setPageOrder ('LM01-LM07, WF07, SE01-SE11, SE20, SE12-SE19, WF03'); 
  
}

if (
  ($Dim1 == "Log") and
  ($Dim2 == "Soz")
) {
  setPageOrder ('SE01-SE11, SE20, SE12-SE19, WF07, LM01-LM07, WF03'); 
   
  
}

if (
  ($Dim1 == "Log") and
  ($Dim2 == "Kre")
) {
  setPageOrder ('KR01-14, WF07, LM01-LM07, WF03'); 
  
}

if (
  ($Dim1 == "Kre") and
  ($Dim2 == "Log")
) {
  setPageOrder ('LM01-LM07, WF07, KR01-KR14, WF03'); 
  

}

by SoSci Survey (320k points)
Ich empfehle, Nachfragen nicht als "Antworten" zu posten. Sonst werden sie schnell übersehen.

> Wie bekomme ich ihn dazu, bei identischen Elementen eins zufällig auszuwählen (oder sogar zwei, dann aber diesen beiden auch in zufälliger Reihenfolge)?

Wenn Sie das perfekt machen müssen, dann müssen Sie erstmal Gruppen (=Arrays) aus den Codes bauen, die gleich sind, dann jede Gruppe in sich mittels shuffle() mischen und dann alle Gruppen wieder zu einem Array verbinden.

Wenn Sie nur den/die Codes mit dem Maximalwert benötigen, ermitteln Sie bitte als erstes den Maximalwert, suchen dann alle Elemente mit diesem Wert und mischen diese am Schluss mit shuffle().

Wenn Sie nur die Reihenfolge - aber mit allen Elementen brauchen - sollte auch folgendes funktionieren: Erst die Liste mit shuffle() mischen und dann arsort() anwenden.
by s047711 (250 points)
Ich brauche die beiden erstplatzierten Elemente. Wenn zwei (oder 3) punktgleich erstplatziert sind, sollen diese zufällig auf Platz 1 und 2 zugewiesen werden. Wenn Platz 1 eindeutig ist, aber Platz 2 mit mehreren besetzt, dann analog dort. Und wenn z.B. alle 4 gleich wären, dann sollte es komplett random ausgewählt werden. D.h. ich muss die erste, komplizierte Variante bauen?
by SoSci Survey (320k points)
Nein, die einfache mit Maximum - dazu die passenden Optionen suchen und dann mischen.
by s047711 (250 points)
Ich habe jetzt dem Code einfach zwei Shuffle-Befehle hinzugefügt, aber die Auswahl ist immer noch nicht zufällig (es wird weiterhin immer derselbe Wert ausgewählt, nur jetzt ein anderer als vorher...).

Also so wie oben, nur ergänzt:

// Sortiere mir alle Summen und geben sie mir aus
$SumArray = array("Soz" => $SumSoz, "Ver" => $SumVer,"Log" => $SumLog,"Kre" => $SumKre);
arsort($SumArray);

$Dim1 = array_keys($SumArray)[0];
shuffle ($SumArray)[0];
$Dim2 = array_keys($SumArray)[1];
shuffle ($SumArray)[1];

(und dann die SetPageOrder-Befehle).
by SoSci Survey (320k points)
Sie sortieren im Moment ja auch noch nicht - und suchen auch nicht die Elemente mit dem Maximum heraus. Probieren Sie es einmal hiermit:

$sumArray = array("Soz" => $SumSoz, "Ver" => $SumVer,"Log" => $SumLog,"Kre" => $SumKre);
$max = max($sumArray);
$maxis = array();
foreach ($sumArray as $code => $value) {
  if ($value == $max) {
    $maxis[] = $code;
  }
}
shuffle($maxis);
$use = $maxis[0];
by s047711 (250 points)
Ich dachte arsort und $Dim1 = array_keys ($SumArray)[0] machen das.

Was muss ich denn bei ihrer Variante für die Set Page Order-Befehle einsetzen? Ich brauche ja weiterhin die 12 Pfade für die 12 Kombinationen der ersten beiden Plätze.

Wenn ich
if (
  ($maxis[0] == "Ver") and
  ($maxis[1] == "Soz")
) {
  setPageOrder('SE01-SE11, SE20, SE12-SE19, WF07, VE01-VE05, WF03');
 }
(und analog für die anderen 11 Kombinationen) einsetze, kommt wieder immer das gleiche (nur wiederum ein anderes als bei den beiden vorherigen Versuchen).
by SoSci Survey (320k points)
Ohne die Debug-Information schwer zu beantworten... Inhaltlich sieht der PHP-Code korrekt aus. Vermutlich liegt das Problem an anderer Stelle.

Ergänzen Sie ein debug($maxis) nach dem shuffle(), um den Verlauf im Debug-Modus genau zu verfolgen.
by s047711 (250 points)
Bisher klappte alles gut (bei mir im Programm), aber sobald jemand von aussen zugriff, kam immer folgende Fehlermeldung

Im PHP-Code trat ein Fehler auf.

Fehler im Fragebogen: Undefined offset: 1
Zeile: 48

PHP-Code

045 }
046 shuffle($maxis); debug($maxis);
047 $use = $maxis[0];
048 $use = $maxis[1];
049
050
051

Teilweise wird auch nicht korrekt gefiltert, d.h. anstatt der ersten beiden aus der Rangreihe, werden einfach alle nacheinander angezeigt (wenn auch offenbar in zufälliger Reihenfolge).

Liegt es daran, dass $maxis[1] nicht definiert ist?
by SoSci Survey (320k points)
Ja, die Fehlermeldung liegt daran, dass $maxis nicht (immer) definiert ist. Nur, wenn min. 2 Optionen denselben Wert erreichen. Das "von innen/außen" dürfte hier keinen Unterschied machen.
by s047711 (250 points)
Was mache ich, damit immer die ersten beiden gefiltert werden können?
by SoSci Survey (320k points)
Bitte legen Sie doch mal eine neue Frage an, posten sie dort den kompletten PHP-Code, wie sie ihn bisher verwenden und erklären Sie knapp, was genau Ihr Ziel ist. Danke.

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

...