Построение панелей ошибок в логарифмической области с отрицательными значениями (Matlab) - PullRequest
3 голосов
/ 09 декабря 2010

У меня есть вектор, назовите его х, который содержит очень маленькие числа, которые я вычислил из среднего значения. Я хотел бы построить логарифмическое преобразование 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 ]

2 голосов
/ 10 декабря 2010

На самом деле вы звоните 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)

2 голосов
/ 10 декабря 2010

используйте панель ошибок в конфигурации с двумя ошибками, затем измените ось 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

1 голос
/ 09 декабря 2010

Вы можете заменить эти значения небольшим значением, но с возможностью регистрации (скажем, на 40 дБ ниже):

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) = требуемая вероятность и x1 <= mode <= x2. </p>

Это среднее +/- K std_deviation для симметричного распределения, но, как уже упоминалось, строго положительное распределение, вероятно, требует другого подхода.

...