0 votes
in SoSci Survey (dt.) by s163696 (230 points)

Hallo lieber sosci support

ich habe eine ür mich ziemlich komplexe Sache zu programmieren.
Es geht um ein Spiel. Probanden "spielen" auf einer geloopten Seite (24 x) gegen den Computer.
Den Probanden wird auf jeder der 24 Seiten eines von 6 Angeboten (mit dem Zufallsgenerator ZG01) präsentiert (Es gibt 6 Zettel, 24 Zettel werden pro Interview gezogen, gleichverteilte Ziehung)
Die Anbegote (Zettel) sind fiktive Geldbeträge die eben zufällig ausgewählt werden.
Zettel 1: 1€
Zettel 2: 2€
Zettel 3: 3€
Zettel 4: 7€
Zettel 5: 8€
Zettel 6: 9€

Die Probanden können das Angebot annehmen oder ablehnen (Auswahlfrage OF01 bis OF24)
wenn sie es annehmen "bekommen" sie das fiktive Geld, wenn sie es ablehnen "bekommen" sie es nicht.

Das funktioniert alles!

Nun möchte ich, dass den Probanden der aktuell erspielte fiktiven Betrag angezeigt wird (dieser ändert sich ja mit jedem angenommenden Angebot).
Dieser hängt also davonn ab, welches Angebot (ZG) zufällig gezogen wurde (1 - 6 [1, 2, 3, 7, 8, 9€]) und ob sie das Angebot "annehmen" oder "ablehnen" (OF).
Das soll fortlaufend geschehen. Also der Geldbetrag soll sich immer weiter aufsummieren (die Seite wird ja 24 mal geloopt, also gibt es 24x die Möglichkeit Angebote anzunehmen oder eben ach abzulehnen)

Wie mache ich das?

by SoSci Survey (308k points)
Am besten schreiben Sie eine Funktion, welche auf Basis der Daten den Betrag berechnet. Was wären denn die möglichen Ausprägungen für die erste Runde?
by s163696 (230 points)
okay und wie mache ich das?

Naja in der ersten Runde wäre ja jeder Outcome denkbar.
(0 [bei ablehnung], [bei zustimmuung] 1, 2, 3, 7, 8, 9 [je nachdem welches Angebot präsentiert wird]


Diesen Tipp habe ich von meiner Professorin bekommen. Allerdings komme ich damit nicht weiter, weil ich leider so gar keine Ahnung davon habe:

Für so etwas musst du zuerst eine Varibale definieren, die das Geld
darstellt (und am Anfang bei 0 liegt); dann musst du auf der seite des
SPiels eine Variable definieren, di e di e möglichen Gewinne berechnet
aber nur gilt, wenn die Vp das Angebot annimmt (also eine if then loop)
und dann müsste man diese beiden Variablen zusammenführen und Variable 1
quasi updaten.
by s163696 (230 points)
es sollte quasi so sein, dass man hat:

Wenn ZG01 Zettel 1 zieht, dann 1€, außer OF ist 2 (ablehnung), dann 0
wenn ZG01 Zettel 2 zieht, dann 2€, außer OF ist 2 (ablehnung), dann 0
wenn ZG01 Zettel 3 zieht, dann 3€, außer OF ist 2 (ablehnung), dann 0
wenn ZG01 Zettel 4 zieht, dann 7€, außer OF ist 2 (ablehnung), dann 0
wenn ZG01 Zettel 5 zieht, dann 8€, außer OF ist 2 (ablehnung), dann 0
wenn ZG01 Zettel 6 zieht, dann 9€, außer OF ist 2 (ablehnung), dann 0


und das im Loop und von jeder Seite den Betrag der auf dieser Seite erspielt wurde (€) jeweils mit dem was auf den Seiten davor erspielt wurde summieren.

Wie müsste der Code lauten?
by s163696 (230 points)
das ist meine aktuelle Programmierung:



$zahl = value(id('ZG01', $i + 1));

// Anzeige der Angebote
if ($zahl == 1) {
  html('<p>Sie erhalten <b>1 €</b>, Ihr Spielpartner erhält <b>9€</b>.</p><br>');
} elseif ($zahl == 2) {
  html('<p>Sie erhalten <b>2 €</b>, Ihr Spielpartner erhält <b>8€</b>.</p><br>');
} elseif ($zahl == 3) {
  html('<p>Sie erhalten <b>3 €</b>, Ihr Spielpartner erhält <b>7€</b>.</p><br>');
} elseif ($zahl == 4) {
  html('<p>Sie erhalten <b>7 €</b>, Ihr Spielpartner erhält <b>3€</b>.</p><br>');
} elseif ($zahl == 5) {
  html('<p>Sie erhalten <b>8 €</b>, Ihr Spielpartner erhält <b>2€</b>.</p><br>');
} elseif ($zahl == 6) {
  html('<p>Sie erhalten <b>9 €</b>, Ihr Spielpartner erhält <b>1€</b>.</p><br>');
}


// Frage danach Angebot annehmen oder Ablehnen

question(id('OF', $i + 1));

//potentieller Gewinn, den man im jeweiligen Angebot erhält

if ($zahl == 1) {
  $pot_gewinn = 1;
} elseif ($zahl == 2) {
  $pot_gewinn = 2 ;
} elseif ($zahl == 3) {
  $pot_gewinn = 3;
} elseif ($zahl == 4) {
  $pot_gewinn = 7;
} elseif ($zahl == 5) {
  $pot_gewinn = 8;
} elseif ($zahl == 6) {
  $pot_gewinn = 9
;
}

registerVariable('pot_gewinn');



//Auszahlung des potentiellen Gewinns oder 0, je nachdem wie Frage OF (siehe oben) beantwortet wird

$Ant_Of = value('OF'.sprintf('%02d, $i + 1'));

if ($Ant_Of == 1) {
  $Auszahlung = $pot_gewinn;
}
if ($Ant_Of == 2) {
  $Auszahlung = 0 ;
}

registerVariable('Auszahlung');


//Anzeige des Gewinns
html('
<h2>Der Gewinn in dieser Runde beträgt <b>'.$Auszahlung.' Euro</b>.');

1 Answer

0 votes
by SoSci Survey (308k points)
edited by SoSci Survey

Für so etwas musst du zuerst eine Varibale definieren, die das Geld darstellt (und am Anfang bei 0 liegt);

Nein, davon würde ich abraten. Denn wenn eine Seite erneut geladen wird (keine Antwort trotz Antwortpflicht oder einfach F5 gedrückt), dann würde da weitergezählt - das ist unnötig kompliziert und fehleranfällig.

Einfacher ist es, wenn Sie einfach jedesmal alle Entscheidungen zusammenzählen. Und die, die bisher nicht präsentiert wurden, fließen solange eben mit einer 0 in die Rechnung ein.

Wenn ZG01 Zettel 1 zieht, dann 1€, außer OF ist 2 (ablehnung), dann 0

Ich hoffe, Sie haben in OF auch für jede Runde eine eigene Variable angelegt. Also entweder OF01 bis OF 06 oder Sie haben eine Skala angelegt und präsentieren daraus in jeder Runde ein Item (OF01_01 bis OF01_06). Ich nehme im folgenden Beispiel mal ersteres an.

In Programmcode formuliert man das wie folgt:

$werte = [
  1 => 1,
  2 => 2,
  3 => 3,
  4 => 7,
  5 => 8,
  6 => 9
];

$summe = 
    $werte[value('ZG01x1')] * ((value('OF01') == 2) ? 1 : 0) +
    $werte[value('ZG01x2')] * ((value('OF02') == 2) ? 1 : 0) +
    // u.s.w.

Das Array oben ist nur dafür verantwortlich, dass wir die Wertigkeit jedes Angebots kennen. Das wird dann unten verwendet, wo value('ZG01x1') abgerufen wird.

Und dann gibt es da diese Konstruktion aus (... ? 1 : 0)

Das ist eine Kurzschreibweise für einen IF-Filter. Wenn die Bedingung (...) erfüllt ist, wird der erste Wert (1) verwendet, sonst der zweite Wert (0).

Ergänzung

Wenn Sie nicht nur 6 Wiederholungen haben, sondern 24, dann lässt sich der zweite Teil besser mit einer Schleife formulieren. Die Definition des Arrays $werte = [... bleibt unverändert. Und darunter dann:

$summe = 0;
for ($i=0; $i<24; $i++) {
  if (value(id('OF', $i + 1)) == 2) {
    $summe+= $werte[value(id('ZG01', $i+1)];
  }
}

Damit beschwert sich die Vorab-Prüfung in PHP-Code-Elementen auch nicht mehr über die Konstruktion mit (... ? ... : ...).

by s163696 (230 points)
okay. Ich hab das jetzt 24 mal wiederholt.

muss ich bei dem "1 : 0" noch etwas bei den Widerholungen verändern?
anonsten habe ich die Variablen von ZG und OF für jede Zeile angepasst und in der letzten Zeile das "+" gelöscht und ein ";" hingemacht.

Wenn ich es laufen lasse kommt die Fehlermeldung:

Warnung (Seite 5)
Die Variable OF01 wurde im Laufe dieses Interviews auf keiner vorhergehenden Seite abgefragt. Daher kann die Funktion value() keinen Antwort-Wert ermitteln.

und das für OF01 bis OF24.

zudem steht unten immer Summe: 0 (auch wenn ich mich durchklicke und Angebote annehme)
by SoSci Survey (308k points)
> Warnung: Unerwartetes Element: 1 - fehlt hier vielleicht ein Semikolon (;) oder Anführungszeichen?

Bitte ignorieren Sie diese Warnung - SoSci Survey kennt den PHP-Operator mit den Klammern nicht. Aber ich schreibe oben gleich nochmal eine andere Lösung - es ist ja schon ein Unterschied, ob Sie 6 oder 24 Wiederholungen des Codes benötigen.
by s163696 (230 points)
ich habe statt der 2 bei OF im Code jetzt 1 eingefügt (da ich gemerkt habe, dass es die Summer zusammenzählt hat, wenn ich auf ablehnen geklickt habe)
Jetzt geht es. Wenn ich auf annehmen klicke zählt es die Summe jetzt :)

Allerdings bekomme ich beim "durchrennen" lassen immernoch diese Fehlermeldung. Im Ersten loop 24 mal (für OF01 bis 24), im 2. Loop noch 23 mal (für OF02 bis 24...).

Warnung (Seite 5)
Die Variable OF01 wurde im Laufe dieses Interviews auf keiner vorhergehenden Seite abgefragt. Daher kann die Funktion value() keinen Antwort-Wert ermitteln

Das stimt ja auch. Die Variablen habe ich auch noch nicht beantwortet.
Die Summe zeigt es (trotz Fehlermeldung) nun richtig an, aber kann ich noch etwas tun um die Fehlermeldung zu umgehen?
by SoSci Survey (308k points)
>  aber kann ich noch etwas tun um die Fehlermeldung zu umgehen?

Wegschauen ... es ist keine Fehlermeldung, sondern nur ein Hinweis. Den sehen nur Sie als Projektleitung, die Befragten sehen nichts davon.
by s163696 (230 points)
okay. Fuktionieren tut es ja und wenn nur ich das sehe ist das ja okay.

Vielen Dank für den tollen Support.

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

...