2013-05-06 9 views
7

Ist es möglich, einen Bland-Altman plot in Python zu machen? Ich kann nichts darüber finden.Bland-Altman-Plot in Python

Ein anderer Name für diese Art von Plot ist die Tukey Mittelwert-Differenz-Plot.

Beispiel:

enter image description here

+2

Warum zeichnen Sie nicht nur die Punkte 'plt.plot' verwenden und die horizontalen Linien mit' plt.axhline' hinzufügen? Diese Handlung scheint einfach genug zu sein. –

+0

Ja, das Plotten ist einfach. Aber ich dachte, vielleicht gab es ein Modul in einer Bibliothek, das auch die Berechnungen durchführte. Zum Beispiel gebe ich meine 2 Signale und es zeichnet meine Handlung auf. Es ist immer Durchschnitt auf der X-Achse und Unterschied in den 2 Signalen auf der Y-Achse. Die horizontalen Linien sind die mittleren Standardabweichungen (neg und pos) – Ojtwist

Antwort

18

Wenn ich die Theorie hinter dem Plot richtig verstanden habe, sollte dieser Code das Grundplotten bieten, während Sie ihn nach Ihren eigenen Bedürfnissen konfigurieren können.

import matplotlib.pyplot as plt 
import numpy as np 

def bland_altman_plot(data1, data2, *args, **kwargs): 
    data1  = np.asarray(data1) 
    data2  = np.asarray(data2) 
    mean  = np.mean([data1, data2], axis=0) 
    diff  = data1 - data2     # Difference between data1 and data2 
    md  = np.mean(diff)     # Mean of the difference 
    sd  = np.std(diff, axis=0)   # Standard deviation of the difference 

    plt.scatter(mean, diff, *args, **kwargs) 
    plt.axhline(md,   color='gray', linestyle='--') 
    plt.axhline(md + 1.96*sd, color='gray', linestyle='--') 
    plt.axhline(md - 1.96*sd, color='gray', linestyle='--') 

die entsprechenden Elemente in data1data2 und werden verwendet, um die Koordinaten für die geplotteten Punkte zu berechnen.

Dann können Sie ein Diagramm erstellen, indem Sie z.

from numpy.random import random 

bland_altman_plot(random(10), random(10)) 
plt.title('Bland-Altman Plot') 
plt.show() 

Bland-Altman Plot

+1

Sollen nicht 'md + 1.96 * sd' und' md - 1.96 * sd' sein? –

0

vielleicht bin ich etwas fehlt, aber das scheint ziemlich einfach:

from numpy.random import random 
import matplotlib.pyplot as plt 

x = random(25) 
y = random(25) 

plt.title("FooBar") 
plt.scatter(x,y) 
plt.axhline(y=0.5,linestyle='--') 
plt.show() 

Hier schaffe ich nur einige zufällige Daten zwischen 0 und 1 und I Setze zufällig eine horizontale Linie bei y = 0.5 - aber du kannst beliebig viele setzen, wo du willst.