0 votes
in SoSci Survey (dt.) by s066535 (275 points)

Liebes Forum

Ich benutze eine Zuordnungsaufgabe und möchte gerne die Pausenlängen mit jeweils einer zufällig gezogenen Pausenlänge ersetzten.

Auf der Hilfeseite habe ich ein Beispiel gefunden, welches die Prime Dauer ändert:

Html Code
<script type="text/javascript">
window.addEventListener("load", function() {
    SoSciTools.questionnaire.%question%.setPrimeTimes(%randomTimes%);
});
</script>

PHP -Code
$times = [];
for ($i=1; $i<=20; $i++) {
  $randomTime = random(100, 1000);
  put(id('AB03', $i), $randomTime);
  $times[$i] = $randomTime;
}
 
// Textbaustein AB02 einbinden und dabei
// die Platzhalter für Frage-Kennung und die Zeiten einsetzen
show('AB02', [
    '%question%' => 'AB01',
    '%randomTimes%' => json_encode($times)
]);

Weiter oben steht (JavaScriptAnbindung) beschrieben, dass die Pausenlänge über fixation und evt.detail.duration geändert werden kann. Wäre das dann:

<script type="text/javascript">
<!--
 
// Filterfunktion
function selFilter(item, option) {
fixation.detail.duration[10000]
}
 
SoSciTools.attachEvent(window, "load", function() {
    assignmentCT04.setCallbackSelect(selFilter);
});
 
// -->
</script>

Oder kann ich dies auch direkt in die Funktion SoSciTools.questionnaire.%question%.setPrimeTimes einbauen, oder gibt es eine analoge bestehende Funktion SoSciTools.questionnaire.%question%.setFixationTimes?

Besten Dank

1 Answer

0 votes
by SoSci Survey (331k points)

dass die Pausenlänge über fixation und evt.detail.duration geändert werden kann.

Nein, darüber kann sie ausgelesen werden.

In der Anleitung ist beschrieben, dass die Dauer für die Primes über setPrimeTimes() angepasst werden kann. Das hatten wir damals auf Anfrage ergänzt.

Für die Pause bzw. die Fixationsdauer ist das bisher nicht implementiert. Schildern Sie doch bitte einmal Ihren Anwendungsfall, dann prüfe ich, ob sich so eine Ergänzung zeitnah umsetzen ließe.

by s066535 (275 points)
Ich möchte gerne einen "Simple Attention Task" implementieren. Dieser soll so funktionieren, dass die Versuchspersonen so schnell wie möglich auf die Taste drücken sollen, sobald ein Buchstabe erscheint. Der ganze Task soll 2 Minuten dauern. Die Dauer zwischen den Buchstaben soll zwischen 2-5 Sekunden betragen (zufällig gezogen). Daher dachte ich, es wäre das einfachste, eine Zuordnungsaufgabe mit einem Antwortbutton zu benutzen und die Pausenlänge dynamisch zu ändern.
by s066535 (275 points)
moved by s066535

Wir hätten geplant, diesen Reaktionszeittest bei der nächsten Befragung der Swiss Corona Stress Study in 2 Wochen mit über 30'000 Teilnehmer über die Unilizenz laufen zu lassen.
Es wäre natürlich optimal, dies in einer Frage programmieren zu können und dieser Task würde bestimmt auch von anderen Gruppen aufgenommen werden.

Ansonsten würde ich für jeden Buchstaben eine eigene Frage anlegen und es über loopPage lösen, dies wäre jedoch nicht gleicht optimal, da vor jedem neuen Buchstaben erneut auf Start gedrückt werden müsste und es einen sichtbaren Seitenwechsel gäbe.

Denken Sie, unser Anwendungsfall hat Chancen für eine Implementierung und falls ja, wäre es realistisch, diesen in 2 Wochen implementiert zu haben?

by SoSci Survey (331k points)
Danke für die Geduld, wir haben nun auf www.soscisurvey.de und s2survey.net ein Update installiert, welches äquivalent zu setPrimeTimes() die Methode setPauseTimes() unterstützt.

Bitte testen Sie einmal, ob Sie die Implementierung damit wie gewünscht umsetzen können.
by s066535 (275 points)
Herzlichen Dank für die super Implementierung und Ihre Hilfe, die Funktion setPauseTimes() ändert wie gewünscht die Pausenlängen.

Das einzige, was noch ist: der ganze "simple attention Task" sollt 2 Minuten dauern, nachdem Start gedrückt wurde. Wenn ich die Funktion zur automatischen Weiterleitung davor einfüge, beginnt die Zeit natürlich zu laufen, sobald die Seite geöffnet wird - nicht erst wenn "Start" gedrückt wird.

if (!isset($time0)) {
  $time0 = time();
  registerVariable($time0);  // Die Variable $time0 auch nach Ende des PHP-Codes aufbewahren
}
// Prüfung, ob die Zeit schon abgelaufen ist
// (z.B. weil der Teilnehmer die Seite neu geladen hat)
$timer = 10;  // Der Teilnehmer hat 1 Minute (60 Sekunden) Zeit zur Bearbeitung
if (time() >= $time0 + $timer) {
  goToPage('next');
}
// Die verbleibende Zeit muss auch dem JavaScript-Code bekannt gemacht werden
$remain = $time0 + $timer - time();
replace('%remain%', $remain);

Funktion Weiterleitung

$times = [];
for ($i=1; $i<=60; $i++) {
  $randomTime = random(2000, 5000);
  put(id('IV01', $i), $randomTime);
  $times[$i] = $randomTime;
}

// Textbaustein CT05 einbinden und dabei
// die Platzhalter für Frage-Kennung und die Zeiten einsetzen
show('CT05', [
    '%question%' => 'CT04', // simpleAttention
    '%randomTimes%' => json_encode($times)
]);

question('CT04');  // simpleAttention

Da es die Variablen (zB die erste Reaktionszeit) erst in die Datenbank speichert, sobald der Fragebogen auf der nächsten Seite ist, kann ich auch keine zusätzliche if Bedingung einbauen, um den timer erst zu starten, wenn eine Reaktionszeit vorhanden ist. Wie könnte ich dies trotzdem umsetzten, zB in dem ich loopToPage verwende, dh die erste Seite abschicke, sobald $i > 1 ist? Wäre dies ein Problem für die Reaktionszeitmessung?
by SoSci Survey (331k points)
Sie verwenden hier ja einen PHP-Code, damit man das Zeit-Limit nicht durch Nue-Laden der Seite umgehen kann - mit isset() gleich zu Beginn. Ich denke, das ist in Ihrem Fall nicht unbedingt erforderlich.

Stattdessen könnten Sie den PHP-Code weglassen und einfach einen Timer starten, wenn der erste Stimulus in Ihrer Zuordnungsaufgabe angezeigt wird. Das könnte ungefähr so aussehen:

function selFilter(item, option) {
  // Nicht direkt ein Filter...
  if ((item == 1) && (option == 1)) {
    window.setTimeout(SoSciTools.submitPage, 120000);
  }
}
 
SoSciTools.attachEvent(window, "load", function() {
    assignmentCT04.setCallbackSelect(selFilter);
});
by s066535 (275 points)
Vielen Dank, dies funktioniert wunderbar. Wäre es hier auch zusätzlich möglich, den Countdown anzeigen zu lassen?
by SoSci Survey (331k points)
Dafür müssten Sie auch den Timer für den Countdown in dem entsprechen Aufruf starten. Im Beispiel-Code in der Anleitung wäre das diese Zeile:

timerInterval = window.setInterval(updateCountdown, 250);

Die Variable timerInterval muss allerdings außerhalb der Funktion mit dem "var" definiert werden.
by s066535 (275 points)
Super, vielen Dank. Auf www.soscisurvey.de funktioniert nun alles bestens. Ich werde es noch mittels UniLizenz testen und unsere IT bitten das neue Update auf
s2survey.net zu installieren.
In der Funktion selFilter, gäbe es da auch die Möglichkeit, anstelle von item==1, anzugeben, sobald "Start" gedrückt wurde?
by SoSci Survey (331k points)
> In der Funktion selFilter, gäbe es da auch die Möglichkeit, anstelle von item==1, anzugeben, sobald "Start" gedrückt wurde?

Sie können einfach beim ersten Mal reagierenm unabhängig von der Nummer.

var done = false;

function selFilter(item, option) {
  if (!done) {
    done = true;
    window.setTimeout(SoSciTools.submitPage, 120000);
  }
}

Abgesehen davon liefert die Zuordnungaufgabe noch eine ganze Menge JavaScript-Events, mit denen man so ziemlich auf jeden einzelnen Schritt reagieren kann: https://www.soscisurvey.de/help/doku.php/de:create:questions:assignment#javascript-anbindung
by s066535 (275 points)
Vielen Dank. Ich hab den Task zur Sicherheit geprüft, ob er auch wirklich so lange dauert, wie er soll. Dabei habe ich zum einen in den Daten die Response Times und Pausenlänge addiert, und zum anderen simple mit einer Stoppuhr geschaut, ob die Dauer stimmt. Dabei habe ich festgestellt, dass der Task immer länger dauert, als er sollte (zB 5 Sekunden länger):
<script type="text/javascript">
<!--
var done=false;
function selFilter(item, option) {
  // Nicht direkt ein Filter...
  if (!done) {//(item == 1) && (option == 1)
    done = true;
    window.setTimeout(SoSciTools.submitPage, 12000);
  }
}

SoSciTools.attachEvent(window, "load", function() {
    assignmentCT04.setCallbackSelect(selFilter);
});
// -->
</script>

Wenn der Timer zusätzlich eingefügt wird, startet der Timer auch erst nach Beantwortung des ersten Stimuli, dafür geschieht bei Countdown 0 der Seitenwechsel:
<script type="text/javascript">
<!--

var timeLeft = 12;
var done = false;

function selFilter(item, option) {//start sel Filter
 // Nicht direkt ein Filter...
    if (!done) {// (item == 1) && (option == 1) // start if item
    done = true;
    window.setTimeout(SoSciTools.submitPage, timeLeft*1000);
    var timeStart = new Date();
    
    // Funkton zur Aktualisierung der Anzeige und Prüfung der Zeit
    function updateCountdown() {//start update countdown
    // Zeit berechnen
        var now = new Date();
        var timePage = Math.floor((now.getTime() - timeStart.getTime()) / 1000);  // Vergangene Zeit [Sek.]
        var remain = timeLeft - timePage;
        // Zeit abgelaufen?
        if (remain <= 0) {
        remain = 0;
        // Timer stoppen
        window.clearInterval(timerInterval);
        }
     // Zeit anzeigen
        var display = document.getElementById("timeDisplay");
        if (!display) {
            return;
          }
        while (display.lastChild) {
            display.removeChild(display.lastChild);
          }
        var minutes = Math.floor(remain / 60);
        var seconds = String(remain - 60 * minutes);
        if (seconds.length < 2) {
            seconds = "0" + seconds;
          }
        var displayText = String(minutes) + ":" + seconds;
        var displayNode = document.createTextNode(displayText);
          display.appendChild(displayNode);
    }
 
    // Initialisierung
    var timerInterval = window.setInterval(updateCountdown, 250);
    updateCountdown();
    } // end if item
} //end sel Filter
 

SoSciTools.attachEvent(window, "load", function() {
    assignmentCT04.setCallbackSelect(selFilter);
});


// -->
</script>

Ist es daher nur möglich, vom ersten Stimulus aus zu zählen oder habe ich etwas falsch codiert?
by SoSci Survey (331k points)
> Ist es daher nur möglich, vom ersten Stimulus aus zu zählen oder habe ich etwas falsch codiert?

Ab wann sollte die Zeit denn optimal laufen? Ich ging bisher davon aus, dass die Präsentation des ersten Stimulus der gewünschte Start-Zeitpunkt der Zeitmessung wäre?

Zum Testen können Sie die Zeit ja mal auf 5 Sekunden reduzieren. Dann geht es mit dem Testen schneller.

Beachten Sie bitte auch, dass Chrome die Zeiten u.U. ignoriert, wenn das Tab nicht dauerhaft im Vordergrund ist.
by s066535 (275 points)
Besten Dank. Unsere IT hat nun soscisurvey auf unserem Server auf die Version 3.2.35 geupdated. Der Fragebogen mit dem Attention Task, welcher auf soscisurvey.de nun super läuft, funktioniert jedoch nicht auf dem Uniserver, und die Zuordnungsaufgabe mit Reaktionszeit wechselt nun nicht mehr automatisch nach Ende auf die nächste Seite, sondern wiederholt sich ständig (mitdenselben Einstellungen). Die IT schrieb:  "I did not get any error during the update. The process was like other times I’ve done it, no error nor warnings.

I’m not sure about a fix… The server shows no errors and the developer tools on Firefox don’t show any error either.

I did a quick check for the function setPauseTimes on all the code in our server and the update package but didn’t found any hit in the php or javascript code.

It looks like the version 3.2.35 they have published might not contain the changes they made on their site?" Haben wir etwas falsches geupdatet, respektive können sie eventuell der IT weiterhelfen?
by SoSci Survey (331k points)
Prüfen Sie bitte als erstes mal, ob der Cache Ihres Browser schuld ist: Öffnen Sie den Fragebogen dafür einfach mal in einem anderen Browser.

Falls es keine so einfache Lösung ist, posten Sie gerne mal einen Pretest-Link direkt (!) zur betroffenen Seite im Fragebogen. Dann werfe ich einen Blick darauf.
by s066535 (275 points)
Vielen Dank. Das erste Problem ist behoben, jedoch greift die Funktion setPauseTimes nicht. Gerne hier einen Pretest-Link:
https://sosci.scicore.unibas.ch/coronastress_d/?act=I1PhLMF9SFjQqVnxlKwIYg1N
by SoSci Survey (331k points)
Arg ... mein Fehler. Die Funktion setPauseTimes() war im Update 3.2.35 (10. August) noch nicht enthalten, denn ich hatte das ja erst am 11. August implementiert.

Ich lassen dem technischen Ansprechpartner für Ihren Server gleich ein Interims-Update mit der Funktion zukommen.
by s066535 (275 points)
Vielen Dank. In der Zwischenzeit konnten wir die Umfrage mit ca. 14'000 Teilnehmenden durchführen und auswerten. Dabei konnten in der Schweiz wohnhafte Personen teilnehmen. Wir haben die Reaktionszeit gemessen mit dem obigen Task. Nun haben wir in den Daten einen seltsamen Haupteffekt Distanz auf Reaktionszeit gefunden (Wohnort zu Ort von unserem Server). Nach meinem Verständnis sollte dies mit dem Java Script Code nicht möglich sein. Haben Sie vielleicht eine Idee, an was das liegen könnte?
Besten Dank
by SoSci Survey (331k points)
Nein, die per JavaScript gemessene Reaktionszeit ist unabhängig von der Übertragungszeit, die Messung beginnt erst, wenn die Seite komplett an den Browser übetragen wurde. Unterschiede bei der Übertragungszeit wären innerhalb desselben Landes zudem vermutlich im Bereich des Messrauschens und damit nicht als Effekt erkennbar.

Von welchem Regressionkoeffizienten (unstandardisiert) sprechen wir denn? Ich hatte mal eine Studie mit >30.000 vollständigen Fragebögen zur Auswertung. Dort fanden wir bei einer Kreuzkorrelation zwischen allen Variablen (nur aus methodischem Interesse, versteht sich) nur einen einzigen Zusammenhang, der nicht nicht statistisch signifikant war.

Ist auch ein Effekt erkennbar, wenn Sie nur Personen, die in größeren Städten wohnen, in der Auswertung betrachten? Oder verschwindet der Effekt dann?
by s066535 (275 points)
Vielen Dank für die schnelle Rückmeldung.

Es handelt sich um einen sehr kleinen Effekt. Der unstandartisierte Regressionskoeffizient beträgt 0.052, somit erhöht sich die mediale Reaktionszeit um 5.2ms, wenn die Distanz zu unserem Server um 100km zunimmt.

In der Umfrage kennen wir lediglich den Kanton, in dem die Probanden wohnen, nicht jedoch den genauen Ort. Daher handelt es sich um eine grobe Schätzung der Distanz und ich kann somit nicht nach Städten filtern.

Wofür wäre dies denn ein Hinweis, wenn nur Personen in grossen Städten eingeschlossen werden würden und der Effekt sich ändern würde?
by SoSci Survey (331k points)
> Wofür wäre dies denn ein Hinweis, wenn nur Personen in grossen Städten eingeschlossen werden würden und der Effekt sich ändern würde?

Ich spekuliere hier nur mal ins blaue, dass Menschen in Städten i.d.R. höhere Mieten zahlen, mehr verdienen und deshalb evtl. auch neuere Computer ihr Eigen nennen. Womöglich arbeiten "Städter" auch mehr am PC und reagieren deshalb schneller.

Meine Vermutung wäre, dass Ihrem Effekt eine Konfundierung zwischen PC-Ausstattung, IT-Literacy und Entfernung zugrunde liegt, sodass die Ursache gar nicht wirklich die Entfernung wäre.

Aber 5,2 ms sind selbst bei der genauen Messung mittels JavaScript im Bereich des Messfehlers: Sie haben auf den meisten Bildschirmen eine Refresh-Frequenz von 60 Hz - oftmals nur 60 Hz interlaced und 30 Hz Vollbild. Das bedeutet im Idealfall, dass das Bild auf dem Bildschirm min. 16,7 ms benötigt, um sich zu ändern. Hinzu kommen nochmal bis zu 20 ms Rendering durch den Browser (da kann die Leistungsfähigkeit der Hardware eine Rolle spielen).

Die Reaktionszeit von Menschen unterliegt weiteren Einflüssen - aber auch da sind die Unterschiede eher im Bereich 50+ ms als im Bereich von 5 ms.

Summa summarum: Ih behaupte, dass der von Ihnen beobachtete Effekt nicht mit der Länge von Datenleitungen zusammenhängt. Die Verbindung aus München zum Server von google.com in Irland (gemessen mittels ping) beträgt 1,3 ms. Die Verzögerungen durch den Übertragungsweg wären demnach deutlich kleiner als 5 ms pro 100 km.
by s066535 (275 points)
Vielen Dank für Ihre ausführliche Rückmeldung. Wir gehen inzwischen auch davon aus, dass der gefundene Effekt mit 5.2 ms konfundiert war.
Rein aus Interesse haben wir daher eine spezielle VPN App verwendet, bei der die Daten durch ein Land XY geroutet werden können, um das Ausfüllen des Tasks von verschiedenen Ländern aus zu simulieren, um quasi eine grössere Distanz zu erhalten. Eine Person hat dies für 10 verschiedene Länder mit demselben Device gemacht. Interessanterweise gab es auch hier einen Zusammenhang (r=0.56), unstandartisiert B= 0.0018  (0.18 ms pro 100 km) respektive die Hälfte davon (0.09 ms pro 100 km), wenn davon ausgegangen wird, dass die Daten nicht nur hin sondern auch wieder zurück in die Schweiz gesendet werden. Dies wäre ähnlich zur Verbindung von München zum google Server in Irland nach Ihren Messungen (1.3ms, Entfernung ca 1480, dementsprechend 0.087ms pro 100 km).

Natürlich fällt auch dies in den Messfehlerbereich der Bildschirm Refresh-Frequenz von 60 Hz. Rein aus Interesse, damit ich besser verstehe, welche Einflussfaktoren bei der Messung der Reaktionszeit wie gross sind:
-  Wäre es möglich, dass lokal beim Smartphone/Computer des Probanden eine andere Anwendung, zB Virenschutzprogramm, den Browser und somit den Task beeinflussen?
- Ich hab gesehen, dass es in JavaScript einen Befehl gibt, dass JavaScript den Button drückt. Wenn ich dies einbauen würde, zB dass nach 100ms der Button gedrückt werden soll, wäre ich so im Stande den gesamten "technischen" Messfehlerbereich zu erfassen? Falls ja, würde ich dies bei der nächsten Studie quasi als kurze Kalibrierung einbauen, um bei jedem Probanden einen "technischen" Messfehlerwert zu haben.

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

...