3

我有一个向量,称为 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 通常是一个负数,你不能取负数的对数。

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

4

3 回答 3

2

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

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

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

于 2010-12-10T05:41:11.733 回答
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');

您可能需要手动调整 yaxis 范围ylim

于 2010-12-10T17:23:36.973 回答
1

您可以将这些值替换为较小但可记录的值(例如,降低 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.

或类似的东西。

编辑以总结评论和进一步的想法:

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

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

F'(x1) = F'(x2),F(x2) - F(x1) = desired_probability,并且 x1 <= 众数 <= x2。

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

于 2010-12-09T01:02:53.860 回答