【问题标题】:Plotting errorbars in the logarithmic domain with negative values (Matlab)在对数域中用负值绘制误差线(Matlab)
【发布时间】:2026-01-21 23:55:02
【问题描述】:

我有一个向量,称为 x,它包含我从平均值计算得出的非常小的数字。我想绘制 x 的对数变换,例如 y=10*log10(x),以及等于 +- 2 个标准差的误差线,在找到平均值时计算。

为此,我使用以下代码:

figure
errorbar(lengths, 10*log10(x), ...
    10*log10(x-2*std_x), 10*log10(x+2*std_x), 'o')

我的问题是,由于x包含这么小的值,x-2*std_x通常是负数,不能取负数的对数。

所以我想我的问题是,当减去线性域中的标准偏差得到负数时,如何在对数域中绘制误差线?我做不到 +-

【问题讨论】:

  • 这也意味着误差条的含义并不完全正确——误差条假设为高斯分布,非负表示它不是高斯分布。但我还是明白你为什么要这么做,而且还是有道理的:)

标签: matlab plot logarithm


【解决方案1】:

其实你打错了errorbar。你应该打电话

figure
errorbar(lengths, 10*log10(x),10*log10(2*std_x), 'o')

如果std_x 太小而无法使用,您可以通过绘制从10*log10(x-2*std_x)10*log10(x+2*std_x) 的垂直线来编写自己的errorbar 版本

【讨论】:

    【解决方案2】:

    在两个错误配置中使用errorbar,然后将y轴改为对数:

    eps = 1E-4;  %whatever you consider to be a very small fraction
    ebl = min(2*std_x, x*(1-eps));
    ebu = 2*std_x;
    errorbar(lengths, x, ebl, ebu, 'o');
    set(gca, 'YScale', 'log');
    

    您可能希望使用 ylim 手动调整 yaxis 范围

    【讨论】:

      【解决方案3】:

      您可以将这些值替换为较小但可记录的值(例如,低 40 dB):

      minb = x-2*std_x;
      mask = (minb <= 0);
      minb(mask) = x/1e4;
      ... use 10*log10(minb) instead
      

      或者只是最低限度的阈值:

      K = min(x) / 1e4; % so that K is 40 db below the smallest x
      ... use 10*log10(max(K, x-2*std_x)) instead.
      

      或类似的东西。

      编辑总结 cmets 和进一步的想法:

      大家应该想想为什么会有误差线。通常,误差线往往表示某种置信度/概率的度量(例如,x% 的时间,该值在指示的范围之间)。在这种情况下,如果对某个数量取一些对数,则该数量很可能来自非负分布。在这种情况下,使用非均值 +/- K * std_deviation 的边界来表示边界可能更正确。

      假设具有 cdf F(x) 的单峰分布,“适当的”界限(即对于给定概率而言最小)可能是这样的

      F'(x1) = F'(x2),F(x2) - F(x1) = desired_probability,并且 x1

      这是对称分布的均值 +/- K std_deviation,但如前所述,严格的正分布可能需要不同的处理。

      【讨论】:

      • 从统计学上讲,这是一个准确的解决方案吗?理想情况下,我希望误差线为 +- 2 个标准偏差,但在不可能的情况下,通过使较低的误差线与平均值相距 -40 dB,这似乎会产生误导。
      • 好吧,无论如何它都会产生误导(因为 x-2std_x 是负数)。 x 一开始就可以否定吗?如果不是,那么做 - 2 std_x 可能在概念上是错误的。
      • 通常我可以考虑将 +/- 用于单峰分布的平均值,例如 P(low &lt; X &lt; high) = some_value。对于对称分布(特别是正态分布),采用low = mean-K stdhigh = mean+K std 是有意义的,因为范围是最小的。如果x 是一个偏态分布,那么找到 2 个单独的边界来封装所需信息可能更有意义。