0 votes
in SoSci Survey (dt.) by s222544 (610 points)

Hallo SoSci Survey Online Support,

In meinem Experiment müssen die Probanden 100 Prozent in vier Kategorien verteilen, was in $Zahl1 bis $Zahl4 gespeichert wird. Im nächsten Schritt werden Veränderungen in den 4 Kategorien angezeigt in $Zahl5 bis $Zahl8. Danach werden Fragen beantwortet.

Vortests haben gezeigt, dass es häufig keine Veränderungen gibt. Deshalb möchte ich in meinem PHP Code zwei Beschränkungen einfügen. Die erste: Wenn zwei bestimmte Variablen auf ganze Zahl aufgerundet, gleich sind (z.B. $Zahl1 ist 9.5 und $Zahl5 ist 10.01, werden beide auf 10 gerundet und angezeigt), so soll $Zahl5 als ganze Zahl angepasst werden (entweder auf- oder abgerundet werden), sodass $Zahl5 bis $Zahl8 in der Summe 100 ergeben (die zweite Beschränkung).
Ich bitte höflich um Hilfe in der Umsetzung!
Vielen Dank im Voraus.

1 Answer

0 votes
by SoSci Survey (308k points)

Wenn Sie 4 Zahlen haben, kann der Rundungsfehler maximal 0,5 * 4 = 2,0 betragen. Mit konstanter Summe maximal 1,0. Irgendwo muss dieser Rundungsfehler untergebracht werden, wenn Sie eine fixe Summe haben möchten. Und Sie müssen nach einer Regel entscheiden, wo er hin soll. Denn die Rundung kann ja nicht nur eine Zahl betreffen, sondern im Prinzip alle 4.

Eine mögliche Strategie wäre, dass Sie die Zahlen in der Reihenfolge des kleinen Abstands von der ganzen Zahl durchgehen, jeweils den Rundungsfehler in der Summe prüfen, und abhängig davon auf- oder abrunden. Auch die umgekehrte Reihenfolge kann sinnvoll sein.

Sie müssten also, bevor es an den Code geht, zunächst einmal genau erklären, anhand welcher Regeln (genau) die 4 Zahlen gerundet werden sollen.

by s222544 (610 points)
Vielen Dank für Ihren Kommentar. Verstehe ich Sie richtig, dass Sie vorschlagen sich den absoluten Abstand zwischen ursprünglicher und veränderter Zahl anzusehen und bspw. bei einer Differenz von weniger als 0,5 die veränderte Zahl abzurunden und bei einer Differenz von mehr als 0,5 die veränderte Zahl aufzurunden?

Wie Sie richtig sagen, können auch mehrere Zahlen gleich bleiben; deshalb würde die oben vorgeschlagene Regel für alle 4 Zahlen gelten, wenn beide Zahlen gleich sind.
Wie könnte ich dann trotzdem überprüfen, dass die Summe der veränderten Zahlen (5 bis 8) 100 ergeben muss.

Vielen Dank im Voraus!
by SoSci Survey (308k points)
Nicht ganz ... ich schlage vor, dass Sie sich überlegen, wie Sie mit dem Rundungsfehler umgehen möchten.

> deshalb würde die oben vorgeschlagene Regel für alle 4 Zahlen gelten, wenn beide Zahlen gleich sind.

Das wird nicht funktionieren, denn Ihre Regel ist nur anwendbar, wenn Sie 3 von
4 Zahlen schon kennen.
Wenn es nur um eine Rundung geht, ist das kein Problem - aber im Zweifelsfall müssen Sie die Entscheidung zum auf-/abrunden ja für mehrere Zahlen treffen.

Eine mögliche Lösung wäre, dass Sie erstmal alle klassisch mathematisch runden - und dann prüfen, ob Sie über oder unter 100 herauskommen. Wenn Sie bei 99 herauskommen (also +1 brauchen), könnten Sie die Zahl suchen, die am weitesten abgerundet wurde (z.B. von 10,4 auf 10,0), und diese aufrunden. Und umgekehrt.
by s222544 (610 points)
Vielen Dank für Ihre Erklärung. Ich runde bereits klassisch mit int, sodass ganze Zahlen angezeigt werden. Mein Problem betrifft genau die ganzen Zahlen, die gerundet gleich sind.
Die Rundungen der Zahlen, die sich verändern, bspw. von 10 auf 13 sollen nicht geändert werden.

Sollte der PHP Code in ungefähr so aussehen:
if (int)$Zahl1 == (int)$Zahl5 & if summe5bis8 != 100;
 if summe5bis8 >100;
  (int)$Zahl5 -((int)summe5bis8 -100);
 else
  (int)$Zahl5 +(100- (int)summe5bis8);
usw. für alle 4 Zahlenreihen?
by SoSci Survey (308k points)
Verwenden Sie zum mathematisch korrekten Runden besser round() statt (int)

Und sonst lässt sich Ihre Code ja direkt nach PHP übersetzen:

$zahl1 = value('AB01_01');
$zahl5 = value('AB01_05');
$summe5bis8 =
  value('AB01_05') + value('AB01_06') +
  value('AB01_07') + value('AB01_08');
if ((round($zahl1) == round($zahl5)) & ($summe5bis8 != 100)) {
    $zahl5 = 100 - round($summe5bis8 - value('AB01_05'));
}

Wahrscheinlich möchten Sie die Summe auch noch runden.

Das IF/ELSE innen kann man weglassen, wenn $zahl5 wird ja ohnehin immer den Restwert auf 100 bekommen...

> usw. für alle 4 Zahlenreihen?

Tja, dadurch verändert sich eben Ihre Summe...
by s222544 (610 points)
Vielen Dank; ich verstehe das Problem.
Ihrem Vorschlag folgend, möchte ich die Zahlen in der Reihenfolge des kleinsten Abstands von der ganzen Zahl durchgehen, jeweils den Rundungsfehler in der Summe prüfen und dann aufrunden.

Nach folgendem PHP Code, wie implementiere ich die Suche des kleinsten Abstands? Durch abs?

$zahl1 = value('AB01_01');
$zahl5 = value('AB01_05');
$summe5bis8 =
  value('AB01_05') + value('AB01_06') +
  value('AB01_07') + value('AB01_08');
if ((round($zahl1) == round($zahl5)) & ($summe5bis8 != 100)) {

Vielen Dank im Voraus!
by SoSci Survey (308k points)
Sie würden im ersten Schritt wohl ein Array mit allen Zahlen bauen.

$zahl = []
for ($i=1; $i<=8; $i++) {
  $zahl[$i] = value(id('AB01', $i));
}

Und dann die Abstände zum grundeten Wert bestimmen.

$zahl = []
$diff = []
for ($i=1; $i<=8; $i++) {
  $zahl[$i] = value(id('AB01', $i));
  $diff = abs($zahl[i] - round($zahl[$i]));
}
debug($zahl);
debug($diff);

Anschließend können Sie nach der Differenz sortieren:

asort($diff);

Und dann können Sie in dieser Reihenfolge arbeiten.

foreach ($diff as $i => $x) {
  ....
}

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

...