78

115

（1）绝对正常：33/3
（2）可能正常：6/2
（3）可疑：6/2
（4）可能异常：11/11
（5）绝对异常：2/33

# ROC曲线

# Data
norm     = rep(1:5, times=c(33,6,6,11,2))
abnorm   = rep(1:5, times=c(3,2,2,11,33))
testres  = c(abnorm,norm)
truestat = c(rep(1,length(abnorm)), rep(0,length(norm)))

# Summary table (Table I in the paper)
( tab=as.matrix(table(truestat, testres)) )


        testres
truestat  1  2  3  4  5
0 33  6  6 11  2
1  3  2  2 11 33


( tot=colSums(tab) )                            # Number of patients w/ each test result
( truepos=unname(rev(cumsum(rev(tab[2,])))) )   # Number of true positives
( falsepos=unname(rev(cumsum(rev(tab[1,])))) )  # Number of false positives
( totpos=sum(tab[2,]) )                         # The total number of positives (one number)
( totneg=sum(tab[1,]) )                         # The total number of negatives (one number)
(sens=truepos/totpos)                           # Sensitivity (fraction true positives)
(omspec=falsepos/totneg)                        # 1 − specificity (false positives)
sens=c(sens,0); omspec=c(omspec,0)              # Numbers when we classify all as normal


plot(omspec, sens, type="b", xlim=c(0,1), ylim=c(0,1), lwd=2,
xlab="1 − specificity", ylab="Sensitivity") # perhaps with xaxs="i"
grid()
abline(0,1, col="red", lty=2)


# 手动计算AUC

height = (sens[-1]+sens[-length(sens)])/2
width = -diff(omspec) # = diff(rev(omspec))
sum(height*width)


# 一致措施

AUC也可以看作是一种一致性度量。如果我们将所有可能的一患者正常，而另一对异常的患者进行配对，则我们可以计算出具有最高（最“看起来异常”）测试结果的异常患者的频率（如果他们具有相同的值，认为这是“半场胜利”）：

o = outer(abnorm, norm, "-")
mean((o>0) + .5*(o==0))


# 图形化的视图

plot(jitter(truestat,.2), jitter(testres,.8), las=1,
xlab="True disease status", ylab="Test score")


d = cbind(x_norm=0, x_abnorm=1, expand.grid(y_norm=norm, y_abnorm=abnorm))
library(ggplot2)
ggplot(d, aes(x=x_norm, xend=x_abnorm, y=y_norm, yend=y_abnorm)) +
geom_segment(colour="#ff000006",
position=position_jitter(width=0, height=.1)) +
xlab("True disease status") + ylab("Test\nscore") +
theme_light()  + theme(axis.title.y=element_text(angle=0))


d = transform(d, slope=(y_norm-y_abnorm)/(x_norm-x_abnorm))
mean((d$slope > 0) + .5*(d$slope==0))


# Wilcoxon–Mann–Whitney检验

> ( wi = wilcox.test(abnorm,norm) )
Wilcoxon rank sum test with continuity correction

data:  abnorm and norm
W = 2642, p-value = 1.944e-13
alternative hypothesis: true location shift is not equal to 0


w = wi$statistic w/(length(abnorm)*length(norm))  是的，它是0.8931711，ROC曲线下的面积。 # 计算AUC的简便方法（以R表示） 但是，让我们自己过上轻松的生活。有多种软件包可以自动为我们计算AUC。 ## Epi包 Epi软件包创建了一个不错的ROC曲线，其中嵌入了各种统计信息（包括AUC）： library(Epi) ROC(testres, truestat) # also try adding plot="sp"  ## pROC软件包 我也喜欢这个pROC软件包，因为它可以平滑ROC估算值（并基于平滑的ROC来计算AUC估算值）： （红线是原始的ROC，黑线是平滑的ROC。另请注意默认的1：1宽高比。使用此设置很有意义，因为灵敏度和特异性都在0-1范围内。） 平滑后的 ROC 估计的AUC 为0.9107，与未平滑的 ROC 的估计AUC 相似，但比后者略大（如果您查看该图，您会很容易看出为什么它更大）。（尽管我们实际上只有很少的可能的不同测试结果值来计算平滑的AUC）。 ## rms软件包 Harrell的rms软件包可以使用该rcorr.cens()函数计算各种相关的一致性统计信息。将C Index在其输出是AUC： > library(rms) > rcorr.cens(testres,truestat)[1] C Index 0.8931711  ## caTools软件包 最后，我们有了caTools软件包及其colAUC()功能。与其他软件包相比，它具有一些优势（主要是速度和使用多维数据的能力–请参阅参考资料?colAUC），有时可能有所帮助。但是，当然，它给出的答案与我们一遍又一遍地计算出的结果相同： library(caTools) colAUC(testres, truestat, plotROC=TRUE) [,1] 0 vs. 1 0.8931711  # 最后的话 许多人似乎认为AUC告诉我们测试的“好”程度。有人认为AUC是测试正确分类患者的概率。这是不是。正如你可以从上面的例子和计算看到，AUC告诉我们一些有关家庭的测试，一个测试为每个可能截止。 而且，AUC是根据在实践中永远不会使用的临界值来计算的。我们为什么要关心“无意义”的临界值的敏感性和特异性？尽管如此，这还是AUC（部分）基于的基础。（当然，如果AUC 非常接近1，几乎所有可能的测试都将具有很大的歧视性，我们都会感到非常高兴。） AUC的“随机正常-异常”对解释很好（并且可以扩展到生存模型，例如，我们可以看看生存率最高的（相对）危险最早的人）。但是人们永远不会在实践中使用它。在一种罕见的情况下，人们知道一个人有一个健康的人和一个患病的人，不知道哪个人是病的人，必须决定对他们进行治疗。（在任何情况下，决定都是容易的；对待估计风险最高的人。） 因此，我认为研究实际的ROC曲线比仅查看AUC汇总度量更为有用。而且，如果您将ROC与误报和误报的成本（估算值）一起使用，以及所研究课程的基本费率，您将可以找到所需的费用。 另请注意，AUC仅测量辨别力，而不测量校准值。也就是说，它根据风险评分来衡量您是否可以区分两个人（一个病人和一个健康人）。为此，它仅查看相对风险值（如果可以，请参阅排名，请参阅Wilcoxon–Mann–Whitney测试解释），而不是您应该关注的绝对风险值。例如，如果您将每种风险均分根据您的逻辑模型估算2，您将获得完全相同的AUC（和ROC）。 在评估风险模型时，校准也非常重要。为了对此进行检查，您将查看所有风险评分约为0.7（例如0.7）的患者，并查看其中大约70％是否实际生病。对每个可能的风险评分执行此操作（可能使用某种平滑/局部回归）。绘制结果图，您将获得图形化的校准度量。 如果同时具有良好校准和良好辨别力的模型，那么您将开始拥有良好模型。:) 8 谢谢@Karl Ove Hufthammer，这是我收到的最彻底的答复。我特别感谢您的“最终用语”部分。优秀作品！再次感谢！ 马特·赖兴巴赫 非常感谢您提供详细的答案。我正在使用Epi :: ROC（）v2.2.6确信AUC为1.62（不是心理研究）的数据集，但是根据ROC，我相信上述代码结果会在0.56中产生更多影响英寸 BurninLeo 32 看看这个问题：了解ROC曲线 这是建立ROC曲线的方法（根据该问题）： ### 绘制ROC曲线 给定由您的排名分类器处理的数据集 • 对分数递减的测试示例进行排名 • 开始于$\left(0,0\right)$$(0, 0)$ • 对于每个示例（以降序排列） $x$$x$ • 如果为正，则将向上移动$x$$x$$1/\text{pos}$$1/\text{pos}$ • 如果为负数，向右移动$x$$x$$1/\text{neg}$$1/\text{neg}$ 其中和分别是正例和负例的分数。$\text{pos}$$\text{pos}$$\text{neg}$$\text{neg}$ 您可以使用以下想法使用以下算法来手动计算AUC ROC： auc = 0.0 height = 0.0 for each training example x_i, y_i if y_i = 1.0: height = height + tpr else auc = auc + height * fpr return auc  这张精美的gif动画图片应更清楚地说明此过程 1 感谢@Alexey Grigorev，这是一个很棒的视觉效果，将来可能会有用！+1 马特·赖兴巴赫2015年 1 请解释一下“正例和负例的分数”，您是说两轴的最小单位值吗？ 艾伦·卢恩 1 @Allan Ruin：pos这里指的是阳性数据的数量。假设您有20个数据点，其中11个点是1。因此，绘制图表时，我们有一个11x9矩形（高x宽）。阿列克谢·格里戈列夫（Alexey Grigorev）确实可以扩展，但是只要您愿意就可以扩展。现在，只需在图表的每一步移动1。 Catbuilts 5 卡尔的帖子有很多很好的信息。但是在过去的20年中，我还没有看到ROC曲线能够改变任何人的思维方向的例子。在我拙见中，ROC曲线的唯一值是它的面积恰好等于一个非常有用的一致性概率。ROC曲线本身会诱使读者使用临界值，这是不好的统计实践。 如作为手动远计算 -index，使曲线与上的轴和连续预测器或预测的概率的轴。如果将的每个点与每个点连接，则具有正斜率的线的比例为一致性概率。$c$$c$$Y=0,1$$Y=0,1$$x$$x$$Y=1$$Y=1$$y$$y$$Y=0$$Y=0$$Y=1$$Y=1$ 在此设置中，分母为任何度量都是不正确的准确性评分规则，应避免使用。这包括正确分类的比例，敏感性和特异性。$n$$n$ 对于R Hmiscrcorr.cens功能，请打印整个结果以查看更多信息，尤其是标准错误。 谢谢@弗兰克·哈雷尔，谢谢您的见解。我只是将c统计量用作一致性概率，因为我不喜欢使用临界值。再次感谢！ 马特·赖兴巴赫 4 这是自然计算AUC的另一种方法，只需使用梯形法则即可得出ROC曲线下的面积。 AUC等于随机抽样的阳性观察结果的预测概率（为阳性）大于随机抽样的阴性观察结果的概率。您可以通过正向和负向观测的所有成对组合使用它来在任何编程语言中轻松地计算AUC。如果样本量太大，也可以随机抽样观察值。如果要使用笔和纸来计算AUC，除非您有非常少的样本/很多时间，否则这可能不是最佳方法。例如在R中： n <- 100L x1 <- rnorm(n, 2.0, 0.5) x2 <- rnorm(n, -1.0, 2) y <- rbinom(n, 1L, plogis(-0.4 + 0.5 * x1 + 0.1 * x2)) mod <- glm(y ~ x1 + x2, "binomial") probs <- predict(mod, type = "response") combinations <- expand.grid(positiveProbs = probs[y == 1L], negativeProbs = probs[y == 0L]) mean(combinations$positiveProbs > combinations\$negativeProbs)
[1] 0.628723


library(pROC)
auc(y, probs)
Area under the curve: 0.6287


mean(sample(probs[y == 1L], 100000L, TRUE) > sample(probs[y == 0L], 100000L, TRUE))
[1] 0.62896


1
1. 您具有观察的真正价值。
2. 计算后验概率，然后根据该概率对观察值进行排名。
3. 假设的截止概率和观察值：$P$$P$$N$$N$
$\frac{\text{Sum of true ranks}-0.5PN\left(PN+1\right)}{PN\left(N-PN\right)}$

1
@ user73455 ... 1）是的，我对观察有真正的价值。2）后验概率与每个观测值的预测概率同义吗？3）了解；但是，什么是“真实等级总和”？如何计算此值？也许有一个例子可以帮助您更彻底地解释这个答案？谢谢！