Заговор Bland-Altman в Python

Можно ли сделать Bland-Altman plot в Python? Кажется, я ничего не могу найти.

Другим именем для этого типа сюжета является разностный сюжет Туки.

Пример:

enter image description here

Ответ 1

Если я правильно понял теорию заговора, этот код должен обеспечить базовое построение графика, тогда как вы можете настроить его на собственные нужды.

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

Соответствующие элементы в data1 и data2 используются для вычисления координат для нанесенных точек.

Затем вы можете создать график, выполнив, например,

from numpy.random import random

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

Bland-Altman Plot

Ответ 2

Возможно, я что-то пропустил, но это кажется довольно простым:

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

Здесь я просто создаю случайные данные между 0 и 1, и я беспорядочно помещаю горизонтальную линию в y = 0,5, но вы можете поместить столько, сколько хотите, где бы вы ни хотели.

Ответ 3

Теперь это реализовано в statsmodels: https://www.statsmodels.org/devel/generated/statsmodels.graphics.agreement.mean_diff_plot.html.

Вот их пример:

import statsmodels.api as sm
import numpy as np
import matplotlib.pyplot as plt

# Seed the random number generator.
# This ensures that the results below are reproducible.
np.random.seed(9999)
m1 = np.random.random(20)
m2 = np.random.random(20)

f, ax = plt.subplots(1, figsize = (8,5))
sm.graphics.mean_diff_plot(m1, m2, ax = ax)

plt.show()

который производит это:

enter image description here