如何在R中制作Youden图

时间:2014-12-16 10:04:06

标签: r plot

我想知道如何创建一个Youden图来分析实验室间测试的结果。您可以在此处下载数据:data。测试包括确定参与者的表现以测量一个等级的3个等级。数据包含每个级别中每个参与者的个人平均值和标准差。

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

所以,既然你没有准确地了解Youden情节是什么,对你来说,以及我之前从未听说过这样的情节,我将直接使用W. J. Youden (1959)定义来绘制它。

  

通过在纸张底部绘制惯常的x轴并在此轴上放置一个覆盖材料A的结果范围的刻度来制备图表。在左边,y轴具有刻度在相同的单位中,包括材料B报告的结果范围。然后,实验室报告的结果对用于绘制点。与报告实验室一样多的要点。在绘制点之后,绘制平行于x轴的水平中线,使得线上方的点数与其下方的点数相同。第二条中间线平行于y轴绘制,因此放置左边的点与此线右侧的点数相同。

让我们从那开始吧。

dat <- read.table("dat_youd.csv",sep=",",head=TRUE)
datL <- split(dat,dat$levels) 
#I don't really get what your levels are and why there are three of them though, but i'll assume there are equivalent to Youden's "materials".
plot(datL[[1]]$MeanValues,datL[[2]]$MeanValues,asp=1, pch=19, xlab="Sample A", ylab="Sample B") 
#asp=1 because of the circle.
mB <- median(datL[[2]]$MeanValues)
mA <- median(datL[[1]]$MeanValues)
abline(h=mB, v=mA)

该图的第三个元素是45°线:

  

假设两种材料的类型相似且性质的幅度几乎相等,则报告的A结果中的分散应与B结果的分散大致相同。在那种情况下,通过中位数交叉的45度线可以估计数据的精确度。

这是:

curve(x-(mA-mB),from=par('usr')[1],to=par('usr')[3],add=TRUE) 
#I use here par('usr') so that it expands on the whole plot area

然后是“标准偏差”计算:

  

从每个点到45度线的垂直距离可用于形成精度的估计。 [...]这些垂线不需要在方格纸上测量。而是为每个实验室写下差异A-B跟踪标志。将这些差异称为d1,d2,...,dn。计算代数平均差。从每个差值中减去d并获得一组校正差值d'1,d'2,...,d'n。这些差异的绝对值的平均值乘以sqrt(pi)/ 2或0.886得出标准偏差的估计值。

让我们计算:

d <- mean(datL[[1]]$MeanValues-datL[[2]]$MeanValues)
d_prime <- datL[[1]]$MeanValues-datL[[2]]$MeanValues-d
r <- mean(abs(d_prime))*sqrt(pi)/2

最后是圈子:

  

将上面得到的标准偏差乘以2.45,得出圆圈的半径,如果可以消除个别常数误差,则应包括95%的实验室。

我们可以采用以下方式:

r <- 2.45 * r
t <- seq(0,2*pi,by=0.01)
x <- r*cos(t) + mA
y <- r*sin(t) + mB
lines(x,y)

结果:

Youden Plot

作为一个功能:

youden <- function(serieA, serieB){
    plot(serieA,serieB,asp=1, pch=19, xlab="Sample A", ylab="Sample B") 
    mB <- median(serieB)
    mA <- median(serieA)
    abline(h=mB, v=mA)
    curve(x-(mA-mB),from=par('usr')[1],to=par('usr')[3],add=TRUE)
    d <- mean(serieA-serieB)
    d_prime <- serieA-serieB-d
    r <- 2.45*mean(abs(d_prime))*sqrt(pi)/2
    t<-seq(0,2*pi,by=0.01)
    x<-r*cos(t)+mA
    y<-r*sin(t)+mB
    lines(x,y)
    }

以第三个系列为例:

youden(datL[[1]]$MeanValues, datL[[3]]$MeanValues)

enter image description here