Fügen Sie eine Funktion zum Runden auf gerade Zahlen hinzu / Präferenz zum Ändern der von JMP verwendeten Standardrundungen (nach meinem Verständnis folgen sowohl Python als auch R IEEE 754 und runden standardmäßig auf gerade Zahlen). Fügen Sie auch ein Lehrskript hinzu, um die Wirkung des Rundens auf gerade Zahlen im Vergleich zum Runden auf den nächsten Wert zu demonstrieren. Nach meinem Verständnis ist das Runden auf gerade Zahlen das Standardverhalten, beispielsweise in IEEE 754 – Rundungsregeln (wikipedia.org). Das Runden auf den nächsten Wert sollte die Verzerrung beim Berechnen aggregierter Statistiken wie Summe und Mittelwert aus gerundeten Werten verringern.
Unten sehen Sie ein Beispielskript (möglicherweise nicht die beste Demonstration ...):
Names Default To Here(1);
// https://en.wikipedia.org/wiki/IEEE_754#Rounding_rules
// https://blogs.sas.com/content/iml/2019/11/11/round-to-even.html
// https://stackoverflow.com/questions/311696/why-does-net-use-bankers-rounding-as-default
row_count = 400;
dt = New Table("Bankers_demo", Add Rows(row_count), New Column("TrueValue", Numeric, Continuous, Formula(0.25 * (Row() - 100))));
dt << New Column("RoundToNearest", Numeric, Continuous, Formula(Round(:TrueValue, 0)));
dt << New Column("RoundToEven",
Numeric,
Continuous,
Formula(
l = Words(Char(:TrueValue), ".");
If(N Items(l) == 1,
:TrueValue,
If(l[2] == "5",
If(Modulo(Num(l[1]), 2),
Ceiling(:TrueValue),
Floor(:TrueValue)
),
Round(:TrueValue, 0)
)
);
)
);
dt << New Column("TrueSum", Numeric, Continuous, Formula(Col Cumulative Sum(:TrueValue)));
dt << New Column("NearestSum", Numeric, Continuous, Formula(Col Cumulative Sum(:RoundToNearest)));
dt << New Column("EvenSum", Numeric, Continuous, Formula(Col Cumulative Sum(:RoundToEven)));
dt << New Column("ErrorNearest", Numeric, Continuous, Formula(Abs(:TrueSum - :NearestSum)));
dt << New Column("ErrorEven", Numeric, Continuous, Formula(Abs(:TrueSum - :EvenSum)));
dt << New Column("TrueAvg", Numeric, Continuous, Formula(:TrueSum / Row()));
dt << New Column("NearestAvg", Numeric, Continuous, Formula(:NearestSum / Row()));
dt << New Column("EvenAvg", Numeric, Continuous, Formula(:EvenSum / Row()));
nw = New Window("Rounding",
H List Box(
Panel Box("Actions",
Button Box("Add Row", dt << Add Rows(1, At End)),
Button Box("Add 10 Rows", dt << Add Rows(10, At End)),
Button Box("Add 100 Rows", dt << Add Rows(100, At End)),
Button Box("Add 1000 Rows", dt << Add Rows(1000, At End))
),
gb = dt << Graph Builder(
Size(528, 456),
Show Control Panel(0),
Variables(X(:TrueValue), Y(:ErrorNearest, Position(1)), Y(:ErrorEven, Position(1))),
Elements(Points(X, Y(1), Y(2), Y(3), Legend(3)), Line(X, Y(1), Y(2), Y(3), Legend(5))),
Local Data Filter(Add Filter(columns(:TrueValue))),
SendToReport(
Dispatch(
{},
"400",
ScaleBox,
{Legend Model(
3,
Base(0, 0, 0, Item ID("TrueSum", 1)),
Base(1, 0, 0, Item ID("NearestSum", 1)),
Base(2, 0, 0, Item ID("EvenSum", 1))
)}
)
)
),
Tabulate(
Show Control Panel(0),
Add Table(Column Table(Statistics(Sum, Mean)), Row Table(Analysis Columns(:TrueValue, :RoundToNearest, :RoundToEven)))
)
),
<< On Close(Try(Close(dt, No Save)))
);