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

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

Итак, я полагаю, мой вопрос заключается в том, как я могу построить планки погрешностей в логарифмической области, когда вычитание стандартного отклонения в линейной области дает мне отрицательные числа? Я не могу сделать +-


person Josiah    schedule 09.12.2010    source источник
comment
это также означает, что значение полосы погрешности не совсем правильное - полосы погрешностей предполагают гауссово распределение, а неотрицательность означает, что оно не является гауссовым. но я все еще понимаю, почему вы это делаете, и это все еще разумно :)   -  person Peter    schedule 09.12.2010


Ответы (3)


Вы можете заменить эти значения небольшим, но логарифмическим значением (скажем, на 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.

Или подобные вещи.

EDIT, чтобы обобщить комментарии и дальнейшие мысли:

Вероятно, следует подумать о том, почему есть полосы ошибок. Обычно планки погрешностей, как правило, указывают некоторую меру достоверности/вероятности (например, x% времени, значение находится между указанными границами). В этом случае, когда количество логарифмируется, вполне вероятно, что количество взято из неотрицательного распределения. В этом случае, вероятно, более правильно использовать границы, которые не являются средним +/- K * std_deviation для указания границ.

Предполагая унимодальное распределение с cdf F (x), «правильные» границы (т. Е. Наименьшие для данной вероятности), вероятно, будут такими, что

F'(x1) = F'(x2), F(x2) - F(x1) = желаемая_вероятность и x1 ‹= режим ‹= x2.

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

person lijie    schedule 09.12.2010
comment
Статистически говоря, является ли это точным решением? В идеале я хотел бы, чтобы погрешности составляли +- 2 стандартных отклонения, но если сделать более низкие погрешности -40 дБ от среднего значения для случаев, когда это невозможно, это может ввести в заблуждение. - person Josiah; 10.12.2010
comment
Что ж, это все равно будет вводить в заблуждение (потому что x-2std_x отрицательно). Может ли x вообще быть отрицательным? Если нет, то выполнение - 2 std_x, вероятно, концептуально ошибочно. - person lijie; 10.12.2010
comment
Обычно я могу думать, что +/- относительно среднего для одномодального распределения говорит что-то вроде P(low < X < high) = some_value. Для симметричного распределения (в частности, нормального распределения) использование low = mean-K std и high = mean+K std имеет смысл, поскольку диапазон является минимально возможным. Если x является асимметричным распределением, то, возможно, имеет смысл найти 2 отдельные границы для инкапсуляции необходимой информации. - person lijie; 10.12.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).

person Jonas    schedule 10.12.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');

вы можете настроить диапазон оси Y вручную, используя ylim

person Marc    schedule 10.12.2010