Project

General

Profile

Actions

feature request #8771

open

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

Added by Andreas Kohlbecker over 3 years ago. Updated about 3 years ago.

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

50%

Estimated time:
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

Files

picture066-1.png (12.2 KB) picture066-1.png 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)ResolvedAndreas Müller

Actions
Related to EDIT - bug #9802: Label for min=max does not unify values in Matrix QuantitativeData label providerNewKatja Luther

Actions
Related to EDIT - task #8786: Display of mean value with min max ResolvedNorbert Kilian

Actions
Related to EDIT - feature request #8787: Improve layout for ExactValue on Description PagesResolvedNorbert Kilian

Actions
Copied from EDIT - bug #8739: remaining issues for description detail pageClosedAndreas Kohlbecker

Actions
Actions #1

Updated by Andreas Kohlbecker over 3 years ago

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

Updated by Andreas Kohlbecker over 3 years 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?

Actions #3

Updated by Andreas Kohlbecker about 3 years ago

  • Description updated (diff)

Weitere Beispiele für die Ticket-Beschreibung

Actions #4

Updated by Andreas Kohlbecker about 3 years 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.

Actions #5

Updated by Andreas Kohlbecker about 3 years 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

Actions #6

Updated by Andreas Kohlbecker about 3 years 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

Actions #7

Updated by Andreas Kohlbecker about 3 years ago

  • Status changed from Feedback to Resolved
  • % Done changed from 0 to 50
Actions #8

Updated by Andreas Kohlbecker about 3 years ago

  • Assignee changed from Norbert Kilian to Andreas Müller

please review

Actions #9

Updated by Andreas Kohlbecker about 3 years 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.

Actions #10

Updated by Andreas Müller about 3 years 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.

Actions #11

Updated by Andreas Müller about 3 years ago

Is there an example page available?

Actions #12

Updated by Andreas Kohlbecker about 3 years ago

  • Status changed from Feedback to Resolved
Actions #14

Updated by Andreas Müller about 3 years 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?

Actions #15

Updated by Andreas Kohlbecker about 3 years 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.

Actions #16

Updated by Andreas Kohlbecker about 3 years 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!

Actions #17

Updated by Andreas Kohlbecker about 3 years 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.

Actions #18

Updated by Andreas Kohlbecker about 3 years 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.

Actions #19

Updated by Andreas Kohlbecker almost 3 years ago

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

Updated by Andreas Müller over 1 year ago

  • Related to bug #9802: Label for min=max does not unify values in Matrix QuantitativeData label provider added
Actions #21

Updated by Andreas Müller over 1 year ago

  • Related to task #8786: Display of mean value with min max added
Actions #22

Updated by Andreas Müller over 1 year ago

Actions

Also available in: Atom PDF