不同尺度的 Bland-Altman(Tukey 均值差)图

机器算法验证 数据可视化 协议统计 索引 平淡的奥特曼情节
2022-03-29 12:04:02

我发现用于比较两种方法的Bland-Altman 图在评估一致性方面非常有用。但是,我很好奇当两种方法的尺度不相同但它们仍然测量相同的潜在现象时,是否可以使用类似的方法或转换。

例如,我试图比较两种测量蛋白质含量的方法之间的一致性:定量蛋白质印迹和色氨酸荧光。每个都给出了一种非常不同的测量方法,但质疑它们在测量蛋白质含量方面的一致性仍然是合理的。

我的问题:是否有类似于可以处理不同尺度的 Bland-Altman 图(也称为 Tukey 均值差图)的方法? 我唯一的想法是使用 Spearman 相关性来比较样本的相对顺序,但相关性充满了危险非常感谢您的任何回复。

3个回答

使用相关性作为一致性度量的问题在于,他们真正评估的是值的顺序,以及它们的相对间距,而不是数字本身是否一致(参见我的答案:Do Spearman's表示一致?)。另一方面,如果数字不相称,试图确定他们是否同意是没有意义的——不管他们同意还是不同意,都没有任何意义。因此,Bland-Altman 图在这里没有任何价值。但是,相关性可能会提供一些(尽管很少)价值。 XiYir=0.38

从探索的角度来看,我将从一个常规的旧散点图开始。我还可以做一个简单的线性回归并测试关系中的曲率。通常情况下,不同的测量在不同的范围内具有不同的敏感性。例如,他们可能在测量您想要的范围内的中间值方面同样出色,但一个在测量较低值方面做得更好(而另一个刚刚开始输出相同的低数字,可能是检测极限),对于更高的值,反之亦然。我想到的是,这些关系不是线性的。考虑这个能量与水温之间关系的程式化图形:

在此处输入图像描述

然后想象有温度和其他东西,也许是体积(冰在较低温度下开始膨胀),两者都是能量的度量。

一旦/如果您对这种关系是线性的感到满意,那么您衡量一致性程度的能力将仅限于 Pearson 的乘积矩相关性;Bland-Altman 情节在这里行不通。

假设您不能将两个度量转换为一组公共单位,并且两个度量都是连续的并且大致呈正态分布,则将两者都转换为标准化分数(例如,)。z=xμσ


为响应@Nick 添加:Bland-Altman 图绘制了两个度量之间的差异与两个度量的平均值之间的差异,因此为了有意义,两个度量需要在相同的尺度上进行测量。将不同尺度的两个度量转换为无量纲标准化分数可以让您进行必要的计算。


为响应@Nick (2) 添加:

不确定你在说什么。这是一个可行的例子:

# Load packages
library(dplyr)
library(BlandAltmanLeh)

# Using the same conditions @Ashe used

## Set seed
set.seed(2063)

## Generate data
x <- seq(1, 40)
y <- 2 * x + rnorm(n = length(x), mean = 0, sd = 10)

## Put x and y into a dataframe
df <- data_frame(x = x,
                 y = y) %>%
    ## Add two new columns containing standarized values of x and y
    mutate(x_std = (x - mean(x)) / sd(x),
           y_std = (y - mean(y)) / sd(y))

## Bland-Altman plots of:
### i) raw x and y values
raw <- bland.altman.plot(group1 = df$x,
                  group2 = df$y,
                  main = 'Raw values',
                  xlab = 'Average of x and y',
                  ylab = 'Difference between x and y')

在此处输入图像描述

### ii) standardized x and y values
std <- bland.altman.plot(group1 = df$x_std,
                  group2 = df$y_std,
                  main = 'Standardized values',
                  xlab = 'Average of x and y',
                  ylab = 'Difference between x and y')

在此处输入图像描述

lm它实现了与@Ashe 使用的方法相同(至少在形状上)的结果,这是您所期望的,因为这两种方法都在“重新调整”值。

我想出了一个可能的解决方案,所以我将尝试回答我自己的问题。不过,我希望社区提供一些重要的反馈。

我知道这两种现象是相关的,所以我假设我可以将一个刻度校准到另一个刻度。然后,我将比较一种方法的预测值与另一种方法的实验值之间的一致性。 这种方法仍然无法找到均值偏差(正如@Jeremy 指出的那样,这在这种情况下没有意义),但它仍然可能允许比较 95% 的限制。

一些代码(在 R 中)进行比较:

library(ggplot2)
set.seed(2063)  #Dr. Cochrane

bland <- function(x, y, titl=''){
  gg.data <- data.frame(x=x, y=y, avg=(x+y)/2, diff=(x-y))
  g <- ggplot(gg.data, aes(x=avg, y=diff)) + geom_point(size=4) + theme_bw()
  g <- g + theme(text=element_text(size=24), axis.text=element_text(colour='black'))
  g <- g + labs(x='Average', y='Difference') + ggtitle(titl)
  g <- g + geom_hline(yintercept=mean(gg.data$diff), colour='chocolate', size=1)
  g <- g + geom_hline(yintercept=mean(gg.data$diff) + 1.96*sd(gg.data$diff), colour='dodgerblue3', size=1,
                      linetype='dashed')
  g <- g + geom_hline(yintercept=mean(gg.data$diff) - 1.96*sd(gg.data$diff), colour='dodgerblue3', size=1,
                      linetype='dashed')
  plot(g)

}

#Make some data
x <- seq(1,40)
y <- 2*x + rnorm(n=length(x), mean=0, sd=10)

qplot(x,y)
lm.data <- data.frame(x=x, y=y)

lm(data=lm.data, y~x)

#Bland-Altman of raw data
bland(x,y,'Raw Data')

#Bland-Altman of calibrated data
orig.df <- data.frame(x=x)
y.p <- predict(lm(data=lm.data, y~x), newdata=orig.df)

bland(y.p,y, 'Calib Data')
qplot(y.p,y)

如果我尝试直接比较,正如预期的那样,我会得到非常差的协议: xy在此处输入图像描述

“校准”刻度,则一致性似乎要好得多: xy在此处输入图像描述

一些关键的想法:

  1. 我不必使用线性模型。任何将一个比例校准到另一个比例的模型都会做得很好。
  2. 这在功能上等同于根据的平均值和值绘制模型残差。yy^ 这是我最大的担忧。我想比较方法之间的一致性,但我可以简单地评估模型的质量。 我目前的想法是这两者是等价的。
  3. 给定#2,通过比较模型的残差作为一致性度量,我的比较值强烈依赖于用于校准的模型是正确的假设。

综上所述,如果我选择了一个合理的模型(#1)来校准一个尺度到另一个尺度(#3),那么我可以合理地比较该模型的残差(#2)作为一致性的衡量标准。在上面的第二个示例图中,我将其解释为 95% 的偏差在尺度上的 ~20 点内。然后,我可以评估这些限制对于我正在尝试研究的两种方法是否合理。y

正如我上面所说,欢迎批评。