2013-05-06 15 views
7

Có thể tạo một Bland-Altman plot bằng Python không? Tôi dường như không thể tìm thấy bất cứ điều gì về nó.Âm mưu Bland-Altman trong Python

Tên khác cho loại lô này là ô Tuỷ có ý nghĩa khác biệt về Tukey.

Ví dụ:

enter image description here

+2

Tại sao bạn không chỉ cần vẽ các dấu chấm sử dụng 'plt.plot' và thêm đường ngang sử dụng' plt.axhline'? Âm mưu đó có vẻ dễ dàng, đủ để làm. –

+0

Có âm mưu dễ dàng. Nhưng tôi nghĩ có lẽ có một mô-đun trong một lib đã thực hiện các phép tính. Ví dụ tôi vượt qua 2 tín hiệu của tôi và nó âm mưu cốt truyện của tôi. Nó luôn luôn trung bình trên trục x và sự khác biệt trong 2 tín hiệu trên trục y. Các đường ngang là độ lệch chuẩn trung bình (neg và pos) – Ojtwist

Trả lời

18

Nếu tôi đã hiểu lý thuyết đằng sau cốt truyện chính xác, mã này sẽ cung cấp âm mưu cơ bản, trong khi bạn có thể cấu hình nó theo nhu cầu cụ thể của riêng bạn.

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

Các yếu tố tương ứng trong data1data2 được sử dụng để tính toán các tọa độ cho các điểm vẽ trên biểu đồ.

Sau đó, bạn có thể tạo một âm mưu bằng cách chạy ví dụ:

from numpy.random import random 

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

Bland-Altman Plot

+1

Không nên là 'md + 1,96 * sd' và' md - 1,96 * sd' thay thế? –

0

có lẽ tôi đang thiếu cái gì, nhưng điều này có vẻ khá dễ dàng:

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() 

Ở đây tôi chỉ cần tạo một số dữ liệu ngẫu nhiên giữa 0 và 1 và tôi ngẫu nhiên đặt một đường ngang tại y = 0.5 - nhưng bạn có thể đặt bao nhiêu tùy thích bất cứ nơi nào bạn muốn.