2010-12-09 8 views
3

Ich habe einen Vektor, rufe ihn x, der sehr kleine Zahlen enthält, die ich aus einem Mittelwert berechnet habe. Ich möchte die logarithmische Transformation von x, z. B. y = 10 * log10 (x), zusammen mit Fehlerbalken von + - 2 Standardabweichungen berechnen, die berechnet werden, wenn der Mittelwert gefunden wird.Plotten von Fehlerbalken in der logarithmischen Domäne mit negativen Werten (Matlab)

Um dies zu tun, ich bin mit dem folgenden Code:

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

Mein Problem ist, dass da x so kleine Werte enthält, x-2 * std_x ist in der Regel eine negative Zahl, und Sie können nicht Nimm den Log der negativen Zahlen.

Also meine Frage ist, wie kann ich Fehlerbalken in der logarithmischen Domäne plotten, wenn Subtraktion der Standardabweichung in der linearen Domäne gibt mir negative Zahlen? Ich kann es nicht tun, um das + -

+0

Dies bedeutet auch, dass die Bedeutung des Fehlerbalkens nicht ganz richtig ist - die Fehlerbalken nehmen eine Gauss-Verteilung an, und Nonnegativität bedeutet, dass es nicht Gauß ist.aber ich verstehe immer noch, warum Sie das tun würden, und es ist immer noch vernünftig :) – Peter

Antwort

1

Sie können diese Werte mit einem kleinen Wert ersetzen, sondern einloggen kann (etwa 40 dB niedriger):

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

Oder nur Schwelle zu einem gewissen Minimum:

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

Oder ähnliches Zeug.

EDIT auf Kommentare und weitere Gedanken zusammenfassen:

Man sollte wohl darüber nachdenken, warum Bars Fehler haben. Normalerweise neigen Fehlerbalken dazu, ein gewisses Maß an Konfidenz/Wahrscheinlichkeit anzuzeigen (z. B. x% der Zeit, der Wert liegt zwischen den angegebenen Grenzen). In diesem Fall, wo ein Logarithmus einer Menge genommen wird, ist es wahrscheinlich, dass die Menge aus einer nicht negativen Verteilung gezogen wird. In diesem Fall ist es wahrscheinlich korrekter, Grenzen zu verwenden, die keine Mittelwerte +/- K * std_deviation sind, um Grenzen anzuzeigen.

eine unimodale Verteilung mit cdf F (x) Unter der Annahme, die "richtigen" Grenzen (dh kleinster, für eine gegebene Wahrscheinlichkeit) würde wahrscheinlich so sein, dass

F '(x1) = F' (x2), F (x2) - F (x1) = gewünschte_Wahrscheinlichkeit und x1 < = Modus < = x2.

Dies ist der Mittelwert +/- K std_deviation für eine symmetrische Verteilung, aber wie erwähnt, erfordert eine streng positive Verteilung wahrscheinlich eine andere Behandlung.

+0

Statistisch gesehen ist das eine genaue Lösung? Idealerweise möchte ich, dass die Fehlerbalken + - 2 Standardabweichung sind, aber indem ich die unteren Fehlerbalken -40 dB vom Mittelwert für Fälle mache, in denen das nicht möglich ist, erscheint es irreführend. – Josiah

+0

Nun, es wird sowieso irreführend sein (weil x-2std_x negativ ist). Kann "x" überhaupt negativ sein? Wenn nicht, dann ist das Ausführen von - 2 std_x wahrscheinlich konzeptionell fehlerhaft. – lijie

+0

Normalerweise kann ich mir vorstellen, +/- um den Mittelwert für eine unimodale Verteilung zu nehmen, um etwas wie 'P (niedrig lijie

2

Eigentlich rufen Sie errorbar falsch. Sie sollten

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

nennen Wenn std_x zu klein ist für diese zu arbeiten, können Sie Ihre eigene Version von errorbar durch Auftragen vertikalen Linien 10*log10(x-2*std_x)-10*log10(x+2*std_x)

2

Verwendung errorbar in den zwei Fehlerkonfiguration schreiben, dann ändern die y-Achse sein logarithmisch:

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'); 

Sie manuell ylim können Ihren yaxis anpassen Bereich mit