決策曲線分析(DCA)中平均凈收益用于評價模型算法
DCA分析雖然不強調用來評價模型算法或者變量組合的優劣,但是實際應用過程中感覺DCA曲線的走勢和模型的效能具有良好的一致性,其實這種一致性也可以找到內在的聯系,比如通過凈閾值的計算公式可以知道凈閾值的大小與真陽性率有密切的關系,而真陽性率和模型的效能也有一致性。
如果想用DCA曲線來挑選算法或者變量組合,有一個定量的指標就更加方便一些,這就有了為DCA曲線找一個定量指標的想法。
1. 微積分法
曲線下面積可能是比較直觀的一種方法,首先想到的是用微積分的方法計算DCA曲線下面積,代碼如下。因為對微積分并不熟悉,加上計算出的結果還會有負值的情況,所以不是太確定代碼的正確性,大家謹慎采用。
WA_NBC <- function(df, pred, real, integration_limits = c(0, 1), prevalence) {# 內部函數計算凈獲益calculate_nbc <- function(pt) {# NBC函數的代碼tp <- sum(df[[pred]] >= pt & df[[real]] == 1)fp <- sum(df[[pred]] >= pt & df[[real]] == 0)net_benefit <- tp/nrow(df) - fp/nrow(df) * pt/(1-pt)if (!is.null(prevalence)) {net_benefit <- net_benefit / prevalence}return(net_benefit)}# 計算加權平均凈獲益integrand <- function(x) {calculate_nbc(x)}integral_result <- stats::integrate(integrand, lower = integration_limits[1], upper = integration_limits[2])wa_nbc <- integral_result$value / diff(integration_limits)return(wa_nbc)
}
2. 凈收益平均法
這種方法是計算指定閾值范圍內的凈閾值然后求平均。感覺更好理解一些,但是似乎技術含量低些。
library(purrr)mean_benefit <- function(df, pred, real, integration_limits = c(0, 1), prevalence) {calculate_nbc <- function(pt) {# NBC函數的代碼tp <- sum(df[[pred]] >= pt & df[[real]] == 1)fp <- sum(df[[pred]] >= pt & df[[real]] == 0)net_benefit <- tp/nrow(df) - fp/nrow(df) * pt/(1-pt)if (!is.null(prevalence)) {net_benefit <- net_benefit / prevalence}return(net_benefit)}# 使用map_dbl對每個閾值計算凈獲益net_benefits <- map_dbl(seq(integration_limits[1], integration_limits[2], by = 0.01), ~ calculate_nbc(.x))# 計算加權平均凈獲益mean(net_benefits)
}
初步測試感覺在一定程度上能達到設計的目的,能反映變量組合之間的優劣(如下圖),但是也有不好解釋的地方,比如計算出的絕對值有沒有意義,歡迎大家測試反饋。在和鯨社區上有一個項目可以進行體驗和測試,包含了數據和代碼。