Project

General

Profile

feature request #8771

display of average value with precision so that it differs from min and max by one digit

Added by Andreas Kohlbecker 7 months ago. Updated 6 months ago.

Status:
Resolved
Priority:
Highest
Category:
cdm-dataportal
Target version:
Start date:
12/17/2019
Due date:
% Done:

50%

Severity:
normal
Tags:

Description

The display of decimal place for average value should be adjusted so that it differs from the values on min and max (typical upper and lower bound) by one digit. The number of visible decimal places should not be lower than that of the least precise min or max value

e.g (min - mean - max).:

  • 12.23 - 13.2345 - 14.2 => 12.23 - 13.2 - 14.2
  • 5 - 4.234325 - 6 => 5 - 4 - 6
  • 6.3467 - 6.3477 - 6.3482 => 6.3467 - 6.347 - 6.3482
  • 0.00000001 - 0.500000001 - 1 => 0.00000001 - 0.5 - 1
  • 0.123457- 0.1234565 - 0.123456 => 0.123457- 0.1234565 - 0.123456

picture066-1.png View (12.2 KB) Andreas Kohlbecker, 01/08/2020 02:59 PM


Related issues

Related to Edit - feature request #8945: support statistical value type ExactValue (29736701-58c4-48b3-a9d7-41c74140cac7) Resolved 04/08/2020
Copied from Edit - bug #8739: remaining issues for description detail page Closed

Associated revisions

Revision 793df790 (diff)
Added by Andreas Kohlbecker 6 months ago

fix #8771 display of average value with minimum amount of significant figures

Revision 8480271c (diff)
Added by Andreas Kohlbecker 6 months ago

fix #8771 removing comment

Revision df2eb131 (diff)
Added by Andreas Kohlbecker 6 months ago

ref #8771 unit test for significant figures of statistical values

Revision 76c0847f (diff)
Added by Andreas Kohlbecker 6 months ago

ref #8771 downgrading to phpUnit 5 for backwards compatibility with php5

Revision b2ecf616 (diff)
Added by Andreas Kohlbecker 6 months ago

ref #8771 phpunit logging in junit xml format

Revision 2e07d351 (diff)
Added by Andreas Kohlbecker 6 months ago

ref #8771 phpunit logging in junit xml format - renaming logfile

Revision 458948d0 (diff)
Added by Andreas Kohlbecker 6 months ago

ref #8771 phpunit improving test suite setup

Revision 778b241c (diff)
Added by Andreas Kohlbecker 6 months ago

ref #8771 phpunit improving test suite setup

Revision 7c808239 (diff)
Added by Andreas Kohlbecker 6 months ago

ref #8771 phpunit improving test suite setup

Revision 29d3d2ce (diff)
Added by Andreas Kohlbecker 6 months ago

ref #8771 phpunit improving test suite setup

Revision c3fb3bba (diff)
Added by Andreas Kohlbecker 6 months ago

ref #8771 more test cases

Revision dd80884c (diff)
Added by Andreas Kohlbecker 6 months ago

ref #8771 finetuning of statistical values display and more tests

Revision 8726bde3 (diff)
Added by Andreas Kohlbecker 6 months ago

ref #8771 documenting phpUnit test execution

Revision 8867b63b (diff)
Added by Andreas Kohlbecker 6 months ago

ref #8771 fixing bug in statistical value processing

History

#1 Updated by Andreas Kohlbecker 7 months ago

  • Copied from bug #8739: remaining issues for description detail page added

#2 Updated by Andreas Kohlbecker 7 months ago

  • Tracker changed from bug to feature request
  • Status changed from New to Feedback
  • Assignee changed from Andreas Kohlbecker to Norbert Kilian
  • Priority changed from New to Highest

do you agree with my suggestion?

#3 Updated by Andreas Kohlbecker 6 months ago

  • Description updated (diff)

Weitere Beispiele für die Ticket-Beschreibung

#4 Updated by Andreas Kohlbecker 6 months ago

Eigentlich ist das entscheidende ja, wie weit min und max von einander entfernt sind. Bei 98-190 reicht eine Zahl ohne Dezimalstellen, z.B. 154, um die Lage genau genu zu beschreiben. Bei 153,58 – 154,5 ist es nicht genug sondern es wäre eine Zahl mit 2 Nachkommastellen angebracht.
[Andreas Müller:]

Das kommt m.E. daher, wie groß die Differenz ist. Im ersten Fall 92 im zweiten 0,92 also 2 Zehnerpotenzen weniger.

Mein Vorschlag also: Die Differenz von max-min berechnet, schauen in welchem Skalenbereich sie liegt und daraus die Genauigkeit berechnet, indem man z.B. 1 oder 2 Skalen tiefer liegt. Also z.B. bei Differenz >100 => Genauigkeit einstellig. Bei Differenz >1 2 Dezimalstellen, bei >0,01 4 Dezimalstellen etc. Evtl. könnte man den Schnitt auch wo anders machen. Z.B. scheint mir sinnvoll >500 auf 10er runden, >50 auf 1er runden, >5 1 Dezimalstelle, >0,5 2 Dezimalstellen etc.

Dieses Verfahren kommt an die Anforderung, den Mittelwert genau genug, aber nicht übergenau zu definieren, um seine Lage im Vergleich zu den Extremwerten und somit die Verteilung näherungsweise abschätzen zu können m.E. am ehesten ran.

#5 Updated by Andreas Kohlbecker 6 months ago

Hallo,

der Vorschlag die Differenz Max - Min für die Berechnung der signifikanten Stellen des Mittelwertes zu verwenden ist, wie ich finde der richtige Weg und deckt sich auch mit meinem Vorschlag, den ich im Ticket #8771 gemacht habe.

Die Anzahl der signifikanten Dezimalstellen kann algorithmisch leicht mit dem Zehnerlogarithmus bestimmt werden: floor(log10(x)) + 1 für 0 braucht man natürlich eine Ausnahmebehandlung.

Warum der "Schnitt" bei den 5ern zu machen von Vorteil sein soll, leuchtet mir noch nicht ein, ließe sich aber auch umsetzen:

x > 0: floor(log10(x) - log(5)) + 1 
x = 0:  1
x < 0: floor(log10(x) - log(0.5)) - 1 

Viele Grüße

Andreas

#6 Updated by Andreas Kohlbecker 6 months ago

Eine Funktion zum runden oder trunkieren nach signifikanten Stellen gibt es in php nicht aber in diesem Stackoverflow thread: https://stackoverflow.com/questions/37618679/format-number-to-n-significant-digits-in-php#answer-48283297

#7 Updated by Andreas Kohlbecker 6 months ago

  • Status changed from Feedback to Resolved
  • % Done changed from 0 to 50

#8 Updated by Andreas Kohlbecker 6 months ago

  • Assignee changed from Norbert Kilian to Andreas Müller

please review

#9 Updated by Andreas Kohlbecker 6 months ago

Hallo,

der Fall x=0 ist der Fall min=max. => avg=min(=max). Also trivial, die Dezimalstellen sollten die gleichen sein wie bei den Werten selber.

Den Schnitt bei 5 zu machen geht darauf zurück, dass bei +1 Dezimalstelle die Differenz 0,1 lediglich zu einer 2-stelligen Zahl führt, dass ist relativ unscharf. Also min=0.1 und max=0.2 würde lediglich zu avg 0.14 oder 0.15 führen, nichts dazwischen, das finde ich zu wenig, man bräuchte +2 Dezimalstellen. Diff 0,9 würde bei 0.1 und 1.0 aber zu auch zu +2 (also insgesamt 3) Dezimalstellen führen. Nach meinem Geschmack zu viel in diesem Fall.

Daher die Lösung dazwischen, die Differenz erst noch mit 2 (oder einer etwas größeren Zahl) multiplizieren und dann floor(log10(x)-1 ausführen (das entspricht dem Übergang bei 5 oder einer ähnlichen Zahl). Dann sollte man immer in einer sinnigen Größenordnung liegen. Aber das ist Finetuning, kann man auch später noch anpassen.

Viele Grüße,

Andreas M.

#10 Updated by Andreas Müller 6 months ago

  • Description updated (diff)
  • Status changed from Resolved to Feedback
  • Assignee changed from Andreas Müller to Andreas Kohlbecker

3 Verbesserungsvorschläge:

  • Avg, StdAbw und Var nur ausblenden bei min=max, wenn Avg=min(=max) bzw. StdAbw und Var=0 sind, wenn nicht weist das auf einen Fehler hin, und den sollte man dann auch besser sehen, um ihn korrigieren zu können.

  • Die Differenz sollte nicht zwischen min und max gebildet werden sondern als diff=Min(avg-min, max-avg). Das verhindert bei Werten, die sehr nah bei min oder bei max liegen, dass die Rundung zu ungenau bzw. unverständlich wird. Beispiel: Chromosomenzahl: 20x 22, 1x 23 => avg=22,047619 => Rundung ergibt 22,0 und das lässt Fragen offen.

  • ich weiß nicht ob bereits so umgesetzt, aber es sollte immer gerundet, nicht einfach abgeschnitten werden. Z.B. das Beispiel aus der Beschreibung: 6.3467 - 6.347 - 6.3482 => dass ist nicht so schön 6.348 wäre der genauere Wert für 6.3477 bei gleicher Stellenzahl

Persönlich würde ich ja das runden auch erst bei den Nachkommastellen anfangen. Es geht ja nur darum die Zahlen kurz zu halten, was bei Vorkommastellen keine Auswirkung hat. Aber das mag Geschmacksache sein.

#11 Updated by Andreas Müller 6 months ago

Is there an example page available?

#12 Updated by Andreas Kohlbecker 6 months ago

  • Status changed from Feedback to Resolved

#14 Updated by Andreas Müller 6 months ago

Die Zeile verstehe ich nicht:

$precision += $precision < 0 ? - 1 : 1;

Warum muss die Richtung der Präzisionserhöhung sich bei Zahlen 0<x<1 umdrehen? Hast du ein Beispiel?

#15 Updated by Andreas Kohlbecker 6 months ago

Andreas Müller wrote:

Die Zeile verstehe ich nicht:

$precision += $precision < 0 ? - 1 : 1;

Warum muss die Richtung der Präzisionserhöhung sich bei Zahlen 0<x<1 umdrehen? Hast du ein Beispiel?

bei Zahlen < 0 ist die errechnete Präzision an dieser Stelle negativ bei Zahlen > 0 positiv. Um eine um 1 höhere Präzision in der Anzeige zu erhalten muss je nachdem addiert oder subtrahiert werden.

#16 Updated by Andreas Kohlbecker 6 months ago

Andreas Müller wrote:

3 Verbesserungsvorschläge:

  • Avg, StdAbw und Var nur ausblenden bei min=max, wenn Avg=min(=max) bzw. StdAbw und Var=0 sind, wenn nicht weist das auf einen Fehler hin, und den sollte man dann auch besser sehen, um ihn korrigieren zu können.

Derzeit ist u.A. vor allem folgender Ausnahmefall berücksichtigt: Wenn min==max==NULL und Avg!==NULL wird anstatt min–max Average dargestellt, StdAbw und Var werden dann unterdrückt. Ich ändere das jetzt so, dass StdAbw und Var dennoch angezeigt werden.

  • Die Differenz sollte nicht zwischen min und max gebildet werden sondern als diff=Min(avg-min, max-avg). Das verhindert bei Werten, die sehr nah bei min oder bei max liegen, dass die Rundung zu ungenau bzw. unverständlich wird. Beispiel: Chromosomenzahl: 20x 22, 1x 23 => avg=22,047619 => Rundung ergibt 22,0 und das lässt Fragen offen.

Derzeit wird in diesem Fall 22 ausgegeben. Das ist auf jeden Fall verbesserungswürdig, diff=Min(avg-min, max-avg) ist ein guter Vorschlag dies zu verbessern.
Bei Charactern wie Chromosomen-Anzahl führt eine Mittelwertsbildung Werten die in der Realität niemals auftreten können. Eine Chromosomenanzahl ist immer ganzzahlig.

  • ich weiß nicht ob bereits so umgesetzt, aber es sollte immer gerundet, nicht einfach abgeschnitten werden. Z.B. das Beispiel aus der Beschreibung: 6.3467 - 6.347 - 6.3482 => dass ist nicht so schön 6.348 wäre der genauere Wert für 6.3477 bei gleicher Stellenzahl

Es wird immer gerundet!

#17 Updated by Andreas Kohlbecker 6 months ago

Andreas Kohlbecker wrote:

Andreas Müller wrote:

3 Verbesserungsvorschläge:

Derzeit ist u.A. vor allem folgender Ausnahmefall berücksichtigt: Wenn min==max==NULL und Avg!==NULL wird anstatt min–max Average dargestellt, StdAbw und Var werden dann unterdrückt. Ich ändere das jetzt so, dass StdAbw und Var dennoch angezeigt werden.

  • Die Differenz sollte nicht zwischen min und max gebildet werden sondern als diff=Min(avg-min, max-avg). Das verhindert bei Werten, die sehr nah bei min oder bei max liegen, dass die Rundung zu ungenau bzw. unverständlich wird. Beispiel: Chromosomenzahl: 20x 22, 1x 23 => avg=22,047619 => Rundung ergibt 22,0 und das lässt Fragen offen.

diff=Min(avg-min, max-avg) führt beim Beispiel min=0.123457, max=0.123456, average=0.1234565555555 zur Ausgabe: '0.123457–0.123456[5;x̄=0.12345656]', also mit einer Stelle mehr als nötig, ausgereift ist das auch noch nicht. vielleicht ist 22–33[24;x̄=22.0] doch die bessere Variante bis wir etwas ausgefeiltereres haben.

#18 Updated by Andreas Kohlbecker 6 months ago

  • Assignee changed from Andreas Kohlbecker to Andreas Müller

By now we are having quite good solution, and I suggest to close this issue. Please move further requirements and wishes to new tickets.

#19 Updated by Andreas Kohlbecker 3 months ago

  • Related to feature request #8945: support statistical value type ExactValue (29736701-58c4-48b3-a9d7-41c74140cac7) added

Also available in: Atom PDF

Add picture from clipboard (Maximum size: 40 MB)