报告不确定性:给定平均值和标准误差,仅显示有效数字

Report uncertainty: given a mean and the standard error, show only significant figures

目的是展示几个观察的结果 不必要的数字,即显示一个值 与给定一致的有效数字的数量 不确定性。

例如,如果计算 mean=123.45err=0.0012345 那么 预期输出可能看起来像 123450 ± 1.2 (× 10-3) 其中 使用以下规则:

  1. 错误总是有一位或两位有效数字。如果第一个是两个 数字是 1(忽略前导零)
  2. 平均值四舍五入以去除不确定的数字,除了 最后一个 ("stop the mean at the same decade as that of the first significant (non-zero) digit in the SEM")。如有必要,添加尾随零以显示与错误对应的精度。

如何在 Python 中使用:

import statistics

mean = statistics.mean(measurements)
err = statistics.stdev(measurements, mean) / len(measurements) ** 0.5
print("{} ± {} (×10<sup>{}</sup>)".format(*round_to_uncertainty(mean, err)))

问题是如何实现表达上述规则 1 和 2 的 round_to_uncertainty(value, uncertainty) 函数。

注意:术语误差、不确定性在 问题。参见 the Guide to the Expression of Uncertainty in Measurement (GUM). Here's a related question for R

decimal模块可以方便的操作数字的十进制表示:

from decimal import Decimal

def round_to_uncertainty(value, uncertainty):
    # round the uncertainty to 1-2 significant digits
    u = Decimal(uncertainty).normalize()
    exponent = u.adjusted()  # find position of the most significant digit
    precision = (u.as_tuple().digits[0] == 1)  # is the first digit 1?
    u = u.scaleb(-exponent).quantize(Decimal(10)**-precision)

    # round the value to remove excess digits
    return round(Decimal(value).scaleb(-exponent).quantize(u)), u, exponent

示例:

for mean, err in [
    (123.45, 0.0012345),    # 123450 ± 1.2 (×10<sup>-3</sup>)
    (8165.666, 338.9741),   # 82 ± 3 (×10<sup>2</sup>)
]: 
    print("{} ± {} (×10<sup>{}</sup>)".format(*round_to_uncertainty(mean, err)))

输入 123.450.0012345 报告为 123450 ± 1.2 (×10-3)。还有 8165.666338.9741 根据当前问题的规则转换为 82 ± 3 (×102)