使用负值绘制对数域中的误差线(Matlab)

时间:2010-12-09 00:49:32

标签: matlab plot logarithm

我有一个向量,称之为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通常是负数,而你不能记录负数。

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

3 个答案:

答案 0 :(得分:2)

实际上你错误地称errorbar。你应该打电话给

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

如果std_x太小而无法使用,您可以通过绘制从errorbar10*log10(x-2*std_x)

的垂直线来编写自己的10*log10(x+2*std_x)版本

答案 1 :(得分:2)

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

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

手动调整y轴范围

答案 2 :(得分: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 <= mode&lt; = x2。

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