11  ROC 曲线与 cutoff

本文演示如何使用 ivdtools 评价一个定量标记物区分目标状态的能力,并在明确判定方向后查看候选 cutoff。ROC 曲线描述一组阈值下灵敏度与特异度的权衡,AUC 概括整个经验 ROC,cutoff 则对应一个具体决策点,三者回答的问题不同。

重要使用边界

ROC 结论以参考状态正确、研究对象具有代表性以及阳性定义正确为前提。ivdtools 当前提供经验 ROC、梯形 AUC、Hanley–McNeil 单曲线标准误和两种样本内 cutoff 准则;不提供部分 AUC、固定灵敏度或特异度下的区间、配对 ROC 检验、cutoff 的重抽样不确定度、样本量设计或外部验证。

函数会根据阳性组和阴性组的标记物均值自动选择 geq 或 leq 方向,没有单独的方向参数。正式分析必须核对自动方向是否符合预设临床含义。样本内“最优” cutoff 具有选择偏倚,不能直接解释为独立人群的验证结果或标准推荐阈值。

单标记物 ROC 工作流为:

%%{init: {"theme":"base","themeVariables":{"primaryColor":"#EAF2FB","primaryBorderColor":"#2780E3","primaryTextColor":"#212529","lineColor":"#6C757D","secondaryColor":"#EAF7E6","tertiaryColor":"#FFF4E8","fontSize":"13px"},"flowchart":{"nodeSpacing":18,"rankSpacing":24,"padding":6}}}%%

flowchart LR
    A["二分类参考状态<br/>定量标记物"] --> B["roc()<br/>完整病例与方向"]
    B --> C["describe()<br/>数据核查"]
    B --> D["auc()<br/>AUC 与区间"]
    D --> E["cutoff()<br/>候选阈值与指标"]
    E --> F["plot() / summary()<br/>解释与报告"]

    classDef input fill:#EAF2FB,stroke:#2780E3,color:#212529
    classDef process fill:#EAF7E6,stroke:#3FB618,color:#212529
    classDef output fill:#F4EEFB,stroke:#9954BB,color:#212529
    class A input
    class B,C,D,E process
    class F output

代码
library(ivdtools)
library(readr)

11.1 主要函数

函数 主要用途 主要结果
continuous_to_binary() 按给定阈值把连续参考变量转换为 0/1 原数据及新增 <变量>_binary 列
roc() 建立 ROC 对象并确定共同完整病例和方向 样本信息、参考编码、标记物值和方向
describe() 描述对象中的原始变量 数值摘要和分类频数
auc() 计算经验 ROC、AUC、标准误和 95% CI auc_list 和 auc_table
cutoff() 计算各候选阈值的诊断指标和两个最优准则 cutoff_table
plot() 绘制 ROC 或 cutoff—指标图 ggplot 图形
summary() 汇总已经执行的分析槽 ROC 对象摘要

11.1.1 连续参考变量转换 continuous_to_binary()

代码
continuous_to_binary(data, cols, cutoff)
参数 说明
data 数据框。
cols 一个或多个需要转换的数值列名。
cutoff 有限数值;长度为 1 时循环用于全部列,否则必须与 cols 等长。

对第 \(j\) 个变量使用

\[ B_{ij}=I(X_{ij}\ge c_j). \]

函数保留原列并新增 <变量>_binary。它固定把“等于 cutoff”划入 1,不支持 <= 方向;因此只有当该二分定义已经由方案或外部参考确定时才应使用。不要为了提高 ROC 表现而在同一数据中反复寻找参考变量的二分阈值。

返回保留原列并新增 <变量>_binary 列的数据框。

11.1.2 建立分析对象 roc()

代码
roc(data, cols, reference, id = NULL, positive = NULL)
参数 说明
data 数据框。
cols 一个或多个数值型标记物列名。
reference 单个参考状态列名;可为数值 0/1、二水平因子或二取值字符。
id 可选受试者标识列;仅用于报告重复 ID,不会自动去重。
positive 因子或字符参考列的阳性水平;省略时取排序后的最后一个水平。数值 0/1 省略时以 1 为阳性。

roc() 同时要求 reference 和全部 cols 为有限完整值。设完整性指示为

\[ R_i=I(Y_i\text{ 完整})\prod_{j=1}^{p}I(X_{ij}\text{ 有限且完整}), \]

只有 \(R_i=1\) 的受试者进入对象。即使以后只对一个 cols 子集调用 auc(),分析样本仍是建对象时由全部标记物确定的共同完整病例。若希望每个标记物使用各自完整病例,应分别建立对象。

对标记物 \(X_j\),源码比较两组均值:

\[ \bar X_{j,+}\ge\bar X_{j,-}\Rightarrow \widehat Y=I(X_j\ge c)\quad(\texttt{geq}), \]

\[ \bar X_{j,+}<\bar X_{j,-}\Rightarrow \widehat Y=I(X_j\le c)\quad(\texttt{leq}). \]

这是计算方向,不是临床方向验证。一个受极端值影响的组均值可能选择错误方向;必须查看 col_direction 并与方案核对。

主要字段包括 n、n_pos、n_neg、n_total、cols_values、reference_binary、col_direction、print,以及后续逐步写入的 describe、auc_list、auc_table、cutoff_table 和 mlr_results。

返回 roc 类对象,保存共同完整病例、参考状态、标记物值和自动方向,并逐步写入后续分析槽。

11.1.3 描述统计 describe()

返回描述统计数据框;数值列包含样本量、均值、SD、分位数和范围,分类列包含频数和百分比。

代码
describe(x, cols = NULL, digits = 4L)

cols=NULL 时描述原数据中除显式 ID 外的所有列,而不只是 ROC 标记物。数值列给出 \(n\)、均值、SD、最小值、四分位数和最大值;因子、字符以及参考列给出频数和百分比。当前实现不会按阳性/阴性分别汇总标记物,因此两组分布差异需另行制表或绘图。

11.1.4 AUC auc()

代码
auc(x, cols = NULL)

经验 ROC 在所有不同观测值和两端的 \(\pm\infty\) 阈值上计算,再按假阳性率 \(\mathrm{FPR}=1-\mathrm{Sp}\) 对灵敏度作梯形积分。等价的秩解释为

\[ \widehat A= \frac{1}{n_+n_-} \sum_{i:Y_i=1}\sum_{j:Y_j=0} \left[I(X_i>X_j)+\frac12I(X_i=X_j)\right], \]

其中低值代表阳性时按反向次序理解。AUC 是随机抽取一个阳性和一个阴性时,标记物按所选方向正确排序二者的概率估计;它不等于某 cutoff 下的准确率。

当前标准误采用 Hanley–McNeil 近似。令

\[ Q_1=\frac{\widehat A}{2-\widehat A},\qquad Q_2=\frac{2\widehat A^2}{1+\widehat A}, \]

则

\[ \operatorname{SE}(\widehat A)= \sqrt{\frac{ \widehat A(1-\widehat A) (n_+-1)(Q_1-\widehat A^2) (n_--1)(Q_2-\widehat A^2)} {n_+n_-}}. \]

95% CI 为 \(\widehat A\pm1.96\,\operatorname{SE}(\widehat A)\),并截断到 \([0,1]\)。当 AUC 恰为 0 或 1 时当前实现返回 NA 标准误和区间,而不是精确区间或重抽样区间。

返回更新后的 roc 对象;auc_list 保存各标记物 ROC 点、AUC、标准误和区间,auc_table 为汇总表。

11.1.5 cutoff 分析 cutoff()

代码
cutoff(x, cols = NULL)

必须先执行 auc()。对 geq 方向,预测阳性定义为 \(X_i\ge c\);对 leq 方向定义为 \(X_i\le c\)。每个候选阈值计算

\[ \mathrm{Se}=\frac{TP}{TP+FN},\qquad \mathrm{Sp}=\frac{TN}{TN+FP}, \]

\[ \mathrm{PPV}=\frac{TP}{TP+FP},\qquad \mathrm{NPV}=\frac{TN}{TN+FN},\qquad \mathrm{Accuracy}=\frac{TP+TN}{N}. \]

表中的 precision 指 PPV。两种自动选择准则为

\[ J(c)=\mathrm{Se}(c)+\mathrm{Sp}(c)-1 \]

的最大值(Youden),以及

\[ d(c)=\sqrt{[1-\mathrm{Se}(c)]^2+[1-\mathrm{Sp}(c)]^2} \]

的最小值(Corner)。候选集合是实际观测值和两个无穷端点;无穷端点用于补全 ROC,但不会作为报告的最优 cutoff。若多个有限阈值并列,源码按内部阈值顺序选第一个:geq 为从高到低,leq 为从低到高。因此自动结果还包含一个确定性的并列处理规则。

警告观测值 cutoff 与开区间 cutoff

EP24 的手工表通常把 cutoff 写成相邻观测值之间的开区间。ivdtools 把观测值本身作为阈值,且等号归入阳性侧。报告时必须同时给出判定式,例如“结果 \(\ge9.5\) 为阳性”,不能只写 “cutoff 9.5”,也不能把开区间端点和实际判定阈值混为一谈。

返回更新后的 roc 对象;cutoff_table 保存候选阈值、混淆矩阵、诊断指标及两个选择准则的结果。

11.1.6 绘图与汇总 plot()、summary()

代码
plot(x, curves = NULL, cutpoint = NULL,
     type = c("roc", "cutoff"))
summary(x)
  • curves=NULL 默认选择全部原始标记物;curves="all" 选择全部原始标记物和已保存 MLR;也可用字符向量混合指定二者,例如 c("x1", "combined")。
  • type="roc" 绘制灵敏度对 \(1-\mathrm{Sp}\);选择原始标记物时需要先执行 auc()。cutpoint 可取 "Youden"、"Corner" 或 "all",且需先执行 cutoff();它只标注所选原始标记物。
  • type="cutoff" 绘制一个原始标记物的灵敏度和特异度随有限阈值变化,只允许在 curves 中指定一个原始标记物,暂不支持 MLR 模型概率。
  • summary() 只汇总对象中已经执行的分析,不会自动补做 describe()、auc() 或 cutoff()。

plot() 不可见地返回 ggplot 对象;summary() 打印并不可见地返回输入的 roc 对象。

11.2 分析案例

11.2.1 教学数据:单标记物完整流程

代码
roc_dat <- as.data.frame(read_csv(
  "./data/011-ROC曲线与cutoff/roc-example.csv",
  show_col_types = FALSE
))
head(roc_dat, 6)
  sid ref       x1
1   1   0 7.594080
2   2   0 8.312513
3   3   0 5.885744
4   4   0 5.585100
5   5   0 9.568483
6   6   0 2.364555
代码
roc_fit <- roc(
  roc_dat, cols = "x1", reference = "ref", id = "sid"
)
print(roc_fit)

ROC Analysis
  Data class:        data.frame
  Total rows:        100
  Complete cases:    100
  Reference:         ref (binary)
  Reference coding:  binary (0/1)
  Positive / Neg:    50 / 50
  Evaluation cols:   1  (x1)
  Duplicate IDs:     none

Analysis slots:
    [ ] Describe
    [ ] AUC
    [ ] Paired AUC comparison
    [ ] Cutoff
    [ ] MLR
代码
roc_fit <- describe(roc_fit, cols = c("x1", "ref"))

Descriptive Statistics
  Variable               n     Mean       SD      Min       Q1   Median       Q3      Max  NA
  --------------------------------------------------------------------------- 
  x1                   100   9.2576   4.4744  -0.3894   5.8224   8.5472  12.9591  18.7295  

  ref
  Level                Count  Percent
   -------------------------------------- 
  0                       50    50.0%
  1                       50    50.0%
代码
roc_fit <- auc(roc_fit)

AUC Table
  Column               AUC          95% CI  Direction
  ------------------------------------------------------------ 
  x1                0.9420  [0.8940, 0.9900]       geq

本例 AUC 为 0.9420,Hanley–McNeil 95% CI 为 0.8937~0.9903;方向为 geq。这些结果描述当前 100 例教学数据的表观区分能力。

代码
roc_fit <- cutoff(roc_fit)

Optimal Cutoff Analysis
  Column: x1
    Youden / Corner: cutoff = 8.7617  (sens = 0.9000, spec = 0.9200, Youden = 0.8200)

  Full cutoff table:
        Cutoff      Sens      Spec     TP    FP    TN    FN    Youden
  ---------------------------------------------------------------------- 
           Inf    0.0000    1.0000      0     0    50    50    0.0000
       18.7295    0.0200    1.0000      1     0    50    49    0.0200
       18.5675    0.0400    1.0000      2     0    50    48    0.0400
       18.2248    0.0600    1.0000      3     0    50    47    0.0600
       17.7837    0.0800    1.0000      4     0    50    46    0.0800
       16.4453    0.1000    1.0000      5     0    50    45    0.1000
       15.8893    0.1200    1.0000      6     0    50    44    0.1200
       15.8087    0.1400    1.0000      7     0    50    43    0.1400
       15.6058    0.1600    1.0000      8     0    50    42    0.1600
       15.5003    0.1800    1.0000      9     0    50    41    0.1800
       15.2855    0.2000    1.0000     10     0    50    40    0.2000
       15.0168    0.2200    1.0000     11     0    50    39    0.2200
       14.8639    0.2400    1.0000     12     0    50    38    0.2400
       14.6980    0.2600    1.0000     13     0    50    37    0.2600
       14.4757    0.2800    1.0000     14     0    50    36    0.2800
       14.4469    0.3000    1.0000     15     0    50    35    0.3000
       14.4042    0.3200    1.0000     16     0    50    34    0.3200
       14.1952    0.3400    1.0000     17     0    50    33    0.3400
       14.1938    0.3600    1.0000     18     0    50    32    0.3600
       13.9382    0.3800    1.0000     19     0    50    31    0.3800
       13.7845    0.4000    1.0000     20     0    50    30    0.4000
       13.3718    0.4200    1.0000     21     0    50    29    0.4200
       13.0699    0.4400    1.0000     22     0    50    28    0.4400
       12.9970    0.4600    1.0000     23     0    50    27    0.4600
       12.9854    0.4800    1.0000     24     0    50    26    0.4800
       12.9659    0.5000    1.0000     25     0    50    25    0.5000
       12.9569    0.5200    1.0000     26     0    50    24    0.5200
       12.7812    0.5400    1.0000     27     0    50    23    0.5400
       12.7534    0.5600    1.0000     28     0    50    22    0.5600
       12.5227    0.5800    1.0000     29     0    50    21    0.5800
       12.3440    0.6000    1.0000     30     0    50    20    0.6000
       12.2962    0.6200    1.0000     31     0    50    19    0.6200
       12.1394    0.6400    1.0000     32     0    50    18    0.6400
       12.1354    0.6600    1.0000     33     0    50    17    0.6600
       12.0393    0.6800    1.0000     34     0    50    16    0.6800
       11.7418    0.6800    0.9800     34     1    49    16    0.6600
       11.6642    0.7000    0.9800     35     1    49    15    0.6800
       11.5082    0.7000    0.9600     35     2    48    15    0.6600
       11.4038    0.7200    0.9600     36     2    48    14    0.6800
       11.2133    0.7400    0.9600     37     2    48    13    0.7000
       11.0696    0.7600    0.9600     38     2    48    12    0.7200
       10.3902    0.7800    0.9600     39     2    48    11    0.7400
       10.1719    0.8000    0.9600     40     2    48    10    0.7600
        9.8836    0.8200    0.9600     41     2    48     9    0.7800
        9.5685    0.8200    0.9400     41     3    47     9    0.7600
        9.3526    0.8400    0.9400     42     3    47     8    0.7800
        9.1944    0.8600    0.9400     43     3    47     7    0.8000
        9.1032    0.8800    0.9400     44     3    47     6    0.8200
        8.8558    0.8800    0.9200     44     4    46     6    0.8000
        8.7617    0.9000    0.9200     45     4    46     5    0.8200
        8.5538    0.9000    0.9000     45     5    45     5    0.8000
        8.5406    0.9000    0.8800     45     6    44     5    0.7800
        8.5296    0.9200    0.8800     46     6    44     4    0.8000
        8.5259    0.9200    0.8600     46     7    43     4    0.7800
        8.3125    0.9200    0.8400     46     8    42     4    0.7600
        8.2985    0.9200    0.8200     46     9    41     4    0.7400
        7.9078    0.9200    0.8000     46    10    40     4    0.7200
        7.8493    0.9200    0.7800     46    11    39     4    0.7000
        7.6187    0.9200    0.7600     46    12    38     4    0.6800
        7.5941    0.9200    0.7400     46    13    37     4    0.6600
        7.5556    0.9200    0.7200     46    14    36     4    0.6400
        7.5150    0.9200    0.7000     46    15    35     4    0.6200
        7.4355    0.9200    0.6800     46    16    34     4    0.6000
        7.1837    0.9200    0.6600     46    17    33     4    0.5800
        6.8235    0.9400    0.6600     47    17    33     3    0.6000
        6.8029    0.9400    0.6400     47    18    32     3    0.5800
        6.7765    0.9400    0.6200     47    19    31     3    0.5600
        6.6770    0.9400    0.6000     47    20    30     3    0.5400
        6.5446    0.9400    0.5800     47    21    29     3    0.5200
        6.5440    0.9600    0.5800     48    21    29     2    0.5400
        6.1603    0.9600    0.5600     48    22    28     2    0.5200
        6.0665    0.9600    0.5400     48    23    27     2    0.5000
        6.0554    0.9600    0.5200     48    24    26     2    0.4800
        6.0361    0.9600    0.5000     48    25    25     2    0.4600
        5.9000    0.9600    0.4800     48    26    24     2    0.4400
        5.8857    0.9600    0.4600     48    27    23     2    0.4200
        5.6326    0.9600    0.4400     48    28    22     2    0.4000
        5.6281    0.9600    0.4200     48    29    21     2    0.3800
        5.5851    0.9600    0.4000     48    30    20     2    0.3600
        5.5802    0.9600    0.3800     48    31    19     2    0.3400
        5.4514    0.9600    0.3600     48    32    18     2    0.3200
        5.3207    0.9600    0.3400     48    33    17     2    0.3000
        5.1582    0.9600    0.3200     48    34    16     2    0.2800
        5.0599    0.9600    0.3000     48    35    15     2    0.2600
        5.0167    0.9600    0.2800     48    36    14     2    0.2400
        4.5654    0.9600    0.2600     48    37    13     2    0.2200
        3.9706    0.9800    0.2600     49    37    13     1    0.2400
        3.9552    0.9800    0.2400     49    38    12     1    0.2200
        3.9103    1.0000    0.2400     50    38    12     0    0.2400
        3.7719    1.0000    0.2200     50    39    11     0    0.2200
        3.5881    1.0000    0.2000     50    40    10     0    0.2000
        3.4583    1.0000    0.1800     50    41     9     0    0.1800
        3.4422    1.0000    0.1600     50    42     8     0    0.1600
        2.9673    1.0000    0.1400     50    43     7     0    0.1400
        2.9111    1.0000    0.1200     50    44     6     0    0.1200
        2.7698    1.0000    0.1000     50    45     5     0    0.1000
        2.5203    1.0000    0.0800     50    46     4     0    0.0800
        2.3646    1.0000    0.0600     50    47     3     0    0.0600
        2.2596    1.0000    0.0400     50    48     2     0    0.0400
        0.4733    1.0000    0.0200     50    49     1     0    0.0200
       -0.3894    1.0000    0.0000     50    50     0     0    0.0000
          -Inf    1.0000    0.0000     50    50     0     0    0.0000

两种准则均选择 8.76;由于方向为 geq,其含义是 \(x_1\ge8.76\) 判为阳性。当前样本中的灵敏度为 0.90、特异度为 0.92、Youden 指数为 0.82。PPV 和 NPV 还受研究数据中阳性比例影响,不能不经校正直接外推到患病率不同的人群。

代码
plot(roc_fit, cutpoint = "Youden")

代码
plot(roc_fit, curves = "x1", type = "cutoff", cutpoint = "all")

11.2.2 CLSI EP24-A2 示例 1:经验 ROC 与阈值区间

EP24 表 1 给出 8 名受试者、7 个不同测量值;阳性和阴性各 4 例,15.1 ng/mL 有一对跨组并列值。

代码
ep24_example1 <- as.data.frame(read_csv(
  "./data/011-ROC曲线与cutoff/std-ep24-example1.csv",
  show_col_types = FALSE
))
ep24_example1_fit <- roc(
  ep24_example1, cols = "assay",
  reference = "status", id = "id"
)
ep24_example1_fit <- auc(ep24_example1_fit)

AUC Table
  Column               AUC          95% CI  Direction
  ------------------------------------------------------------ 
  assay             0.7812  [0.4390, 1.0000]       geq
代码
ep24_example1_fit <- cutoff(ep24_example1_fit)

Optimal Cutoff Analysis
  Column: assay
    Youden / Corner: cutoff = 9.5000  (sens = 0.7500, spec = 0.7500, Youden = 0.5000)

  Full cutoff table:
        Cutoff      Sens      Spec     TP    FP    TN    FN    Youden
  ---------------------------------------------------------------------- 
           Inf    0.0000    1.0000      0     0     4     4    0.0000
       24.8000    0.2500    1.0000      1     0     4     3    0.2500
       15.1000    0.5000    0.7500      2     1     3     2    0.2500
        9.5000    0.7500    0.7500      3     1     3     1    0.5000
        7.0000    0.7500    0.5000      3     2     2     1    0.2500
        6.4000    1.0000    0.5000      4     2     2     0    0.5000
        2.1000    1.0000    0.2500      4     3     1     0    0.2500
        1.6000    1.0000    0.0000      4     4     0     0    0.0000
          -Inf    1.0000    0.0000      4     4     0     0    0.0000
EP24-A2 示例 1:经验 ROC 和 cutoff 口径
标准位置 统计量 标准结果 ivdtools结果
EP24-A2 Example 1 AUC 0.78 0.7812
EP24-A2 Example 1 Youden cutoff NA 9.5000
EP24-A2 Example 1 Sensitivity 0.75 0.7500
EP24-A2 Example 1 Specificity 0.75 0.7500

EP24 的表 2 把判定点写在相邻观测值之间,而 ivdtools 用“\(\ge\)”并选择实际观测值 9.5;这是阈值表示方式的差异。

Youden 指数还在 2.1~6.4 区间取得相同最大值;EP24 用这个例子说明最大和与最近左上角可以给出两个 cutoff。当前软件在并列最大 Youden 时按 geq 的降序候选顺序首先取 9.5,于是把该行标为 Youden / Corner。这属于阈值表示和并列处理差异,不是灵敏度、特异度或 AUC 计算错误。

11.2.3 CLSI EP24-A2 附录 D:OxLDL 单曲线 AUC

附录 D 有 50 名受试者,其中诊断阳性 28 例、阴性 22 例。本节仅复核标准公布的 OxLDL 单曲线 AUC、Hanley–McNeil 标准误和正态近似区间。

代码
ep24 <- as.data.frame(read_csv(
  "./data/公共/std-ep24-appendix-d.csv",
  show_col_types = FALSE
))
ep24_oxldl <- roc(
  ep24, cols = "oxldl",
  reference = "diagnosis", id = "id"
)
ep24_oxldl <- auc(ep24_oxldl)

AUC Table
  Column               AUC          95% CI  Direction
  ------------------------------------------------------------ 
  oxldl             0.7995  [0.6777, 0.9213]       geq
EP24-A2 附录 D:OxLDL 单曲线结果对照
标准位置 统计量 标准结果 ivdtools结果
OxLDL AUC 0.800 0.799513
OxLDL SE 0.062 0.062140
OxLDL CI_lower 0.680 0.677718
OxLDL CI_upper 0.920 0.921308

附录 D 没有给出一个推荐 OxLDL cutoff,因此下列自动选择结果只能作为当前数据的教学派生结果:

代码
ep24_oxldl <- cutoff(ep24_oxldl)

Optimal Cutoff Analysis
  Column: oxldl
    Youden / Corner: cutoff = 71.0000  (sens = 0.6429, spec = 0.8636, Youden = 0.5065)

  Full cutoff table:
        Cutoff      Sens      Spec     TP    FP    TN    FN    Youden
  ---------------------------------------------------------------------- 
           Inf    0.0000    1.0000      0     0    22    28    0.0000
      143.0000    0.0357    1.0000      1     0    22    27    0.0357
      116.0000    0.0714    1.0000      2     0    22    26    0.0714
       96.0000    0.1071    1.0000      3     0    22    25    0.1071
       95.0000    0.1429    1.0000      4     0    22    24    0.1429
       88.0000    0.1786    1.0000      5     0    22    23    0.1786
       86.0000    0.2143    1.0000      6     0    22    22    0.2143
       83.0000    0.2500    1.0000      7     0    22    21    0.2500
       82.0000    0.2857    1.0000      8     0    22    20    0.2857
       78.0000    0.3571    1.0000     10     0    22    18    0.3571
       77.0000    0.4286    0.9545     12     1    21    16    0.3831
       76.0000    0.5357    0.9545     15     1    21    13    0.4903
       74.0000    0.5357    0.9091     15     2    20    13    0.4448
       73.0000    0.5714    0.8636     16     3    19    12    0.4351
       72.0000    0.6071    0.8636     17     3    19    11    0.4708
       71.0000    0.6429    0.8636     18     3    19    10    0.5065
       70.0000    0.6429    0.8182     18     4    18    10    0.4610
       66.0000    0.7143    0.7273     20     6    16     8    0.4416
       64.0000    0.7500    0.6818     21     7    15     7    0.4318
       63.0000    0.7500    0.6364     21     8    14     7    0.3864
       62.0000    0.7500    0.5909     21     9    13     7    0.3409
       61.0000    0.7500    0.5455     21    10    12     7    0.2955
       60.0000    0.8571    0.5000     24    11    11     4    0.3571
       59.0000    0.8571    0.4545     24    12    10     4    0.3117
       57.0000    0.8929    0.4545     25    12    10     3    0.3474
       54.0000    0.8929    0.3636     25    14     8     3    0.2565
       53.0000    0.9286    0.3636     26    14     8     2    0.2922
       52.0000    0.9286    0.3182     26    15     7     2    0.2468
       51.0000    0.9286    0.2727     26    16     6     2    0.2013
       48.0000    0.9286    0.2273     26    17     5     2    0.1558
       45.0000    0.9643    0.2273     27    17     5     1    0.1916
       44.0000    0.9643    0.1818     27    18     4     1    0.1461
       42.0000    0.9643    0.0909     27    20     2     1    0.0552
       41.0000    1.0000    0.0909     28    20     2     0    0.0909
       37.0000    1.0000    0.0455     28    21     1     0    0.0455
       22.0000    1.0000    0.0000     28    22     0     0    0.0000
          -Inf    1.0000    0.0000     28    22     0     0    0.0000