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 (306k 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 (306k 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)
Also da die Seite ja 24 mal wiederholt wird habe ich eben OF01 bis OF24

und ich sehe auch nirgends ein "array"
by s163696 (230 points)
vielleicht war das etwas kompliziert erklärt:

ich habe 24 loop Seiten

Ein Zufallsgenerator mit 6 Zetteln (von denen jeder dann logischerweise 4 mal gezogen wird)

und eine Fragerubrik OF von Frage OF01 bis OF24 die man jeweils über die Auswahl mit "annehmen" (1) oder "ablehnen" (2) beantworten kann.

Jeder Zettel stellt einen Geldbetrag dar der Angeboten wird. (1, 2, 3, 7, 8, 9).

Je nachdem welcher Zettel im Zufallsgenerator gezogen wird soll der dem jeweiligen Zettel zugewiesene Geldbetrag zu 0 bzw. zu der Summe der Seiten davor aufsummiert werden. aber nur wenn in der Frage OF die auf jeder der 24 Seiten auch präsentiert wird "annehmen" (1) angeklickt wird. Wenn "ablehnen" (2) gewählt wird soll 0 aufsummiert werden.

so dass ich auf jeder Seite einen "Zwischenstand" über das aktuell erspielte Geld habe und abschließend bei / nach Seite 24 einen "Endbetrag".
by SoSci Survey (306k points)
> und ich sehe auch nirgends ein "array"

Die eckigen Klammern sind eine Kurzschreibweise für array().

Im Prinzip sollte der o.g. Code das machen, was Sie sich wünschen. Was passiert denn, wenn Sie den Code verwenden und mit html() die Summe einmal anzeigen lassen?

html('<p>Summe: '.$summe.'</p>');
by s163696 (230 points)
aber scheitert es nicht schon daran, dass ich nur ZG01 bis ZG06 habe aber OF01 bis OF24?

Theoretisch müsste ich das mit $werte[value('ZG...
ja 24 mal unter einanderschreiben, damit jedes der OF dran kommt. Aber ich hab ja nur ZG01 bis 06...
by SoSci Survey (306k points)
> aber scheitert es nicht schon daran, dass ich nur ZG01 bis ZG06 habe aber OF01 bis OF24?

Naja, wenn Sie 24 Wiederholunge haben möchten (möchten Sie?) dann müssen Sie im Zufallsgenerator halt eintragen, dass Sie pro Interview 24 Zettel ziehen wollen. Die werden dann einfach mehrfach gezogen, das passt schon :)

Und Sie sollten dann ZG01x1 bis ZG01x24 haben, eine ZG02 sollten Sie nicht haben.
by s163696 (230 points)
schon beim Eingeben erhalte ich das auf der Seite als Warnung ganz oft untereinander).

Warnung: Unerwartetes Element: 1 - fehlt hier vielleicht ein Semikolon (;) oder Anführungszeichen?

$summe =
    $werte[value('ZG01x1')] * ((value('OF01') == 2) ? 1

und wenn ich es dann laufen lasse habe ich kilometerlange Fehlermeldungen.

das Einfügen von "
html('<p>Summe: '.$summe.'</p>') " hat nichts gebracht
by s163696 (230 points)
was ich mir vorstellen könnte das auch ein Störfaktor ist:

Die Frage OF wird ja auch erst auf der Seite beantwortet.
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 (306k 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 (306k 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

...