如何高效实现效用值0-1区间截断?参数敏感性分析优化
问题描述
我需要为一组参数分别计算基准值上下20%的数值,示例代码如下:
d_e Minimum_d_e <- d_e - 0.20*d_e Maximum_d_e <- d_e + 0.20*d_e
得到各参数的最小、最大值后,我创建了两个包含所有参数极值的向量:
min_vec = c(Minimum_HR_FP_Exp, Minimum_HR_FP_SoC, Minimum_HR_PD_SoC, Minimum_HR_PD_Exp, Minimum_P_OSD_SoC, Minimum_P_OSD_Exp, Minimum_p_FA1_STD, Minimum_p_FA2_STD, Minimum_p_FA3_STD, Minimum_p_FA1_EXPR, Minimum_p_FA2_EXPR, Minimum_p_FA3_EXPR, Minimum_administration_cost, Minimum_c_PFS_Folfox, Minimum_c_PFS_Bevacizumab, Minimum_c_OS_Folfiri, Minimum_c_AE1, Minimum_c_AE2, Minimum_c_AE3, Minimum_d_e, Minimum_d_c, Minimum_u_F, Minimum_u_P, Minimum_AE1_DisUtil, Minimum_AE2_DisUtil, Minimum_AE3_DisUtil) max_vec = c(Maximum_HR_FP_Exp, Maximum_HR_FP_SoC, Maximum_HR_PD_SoC, Maximum_HR_PD_Exp, Maximum_P_OSD_SoC, Maximum_P_OSD_Exp, Maximum_p_FA1_STD, Maximum_p_FA2_STD, Maximum_p_FA3_STD, Maximum_p_FA1_EXPR, Maximum_p_FA2_EXPR, Maximum_p_FA3_EXPR, Maximum_administration_cost, Maximum_c_PFS_Folfox, Maximum_c_PFS_Bevacizumab, Maximum_c_OS_Folfiri, Maximum_c_AE1, Maximum_c_AE2, Maximum_c_AE3, Maximum_d_e, Maximum_d_c, Maximum_u_F, Maximum_u_P, Maximum_AE1_DisUtil, Maximum_AE2_DisUtil, Maximum_AE3_DisUtil)
其中像Maximum_AE3_DisUtil这类效用值需要限制在0到1之间。我原本用手动替换的方式处理:
Maximum_AE3_DisUtil<- replace(Maximum_AE3_DisUtil, Maximum_AE3_DisUtil<0, 0) Maximum_AE3_DisUtil<- replace(Maximum_AE3_DisUtil, Maximum_AE3_DisUtil>1, 1)
这种方法虽然可行,但效率很低,想找更高效的实现方式。
解决方案
方法1:用pmin()和pmax()直接处理
这是R里最简洁高效的方式,通过嵌套函数直接把数值限制在[0,1]区间:
# 单个效用值处理 Maximum_AE1_DisUtil <- pmax(pmin(Maximum_AE1_DisUtil, 1), 0) Maximum_AE2_DisUtil <- pmax(pmin(Maximum_AE2_DisUtil, 1), 0) Maximum_AE3_DisUtil <- pmax(pmin(Maximum_AE3_DisUtil, 1), 0)
如果要批量处理多个效用值,可以打包成向量一次性操作:
util_values <- c(Maximum_AE1_DisUtil, Maximum_AE2_DisUtil, Maximum_AE3_DisUtil) util_values_clamped <- pmax(pmin(util_values, 1), 0) # 把处理结果赋值回原变量 c(Maximum_AE1_DisUtil, Maximum_AE2_DisUtil, Maximum_AE3_DisUtil) <- util_values_clamped
方法2:封装自定义限制函数
如果需要多次复用这个逻辑,可以写一个自定义函数:
clamp <- function(x, lower = 0, upper = 1) { pmax(pmin(x, upper), lower) } # 单个变量调用 Maximum_AE1_DisUtil <- clamp(Maximum_AE1_DisUtil) Maximum_AE2_DisUtil <- clamp(Maximum_AE2_DisUtil) Maximum_AE3_DisUtil <- clamp(Maximum_AE3_DisUtil) # 批量处理多个变量 util_list <- list(Maximum_AE1_DisUtil, Maximum_AE2_DisUtil, Maximum_AE3_DisUtil) util_list_clamped <- lapply(util_list, clamp) # 赋值回原变量 c(Maximum_AE1_DisUtil, Maximum_AE2_DisUtil, Maximum_AE3_DisUtil) <- util_list_clamped
方法3:创建极值向量时直接处理
如果想在生成max_vec的阶段就完成范围限制,可以直接在向量定义中插入函数调用:
max_vec = c(Maximum_HR_FP_Exp, Maximum_HR_FP_SoC, Maximum_HR_PD_SoC, Maximum_HR_PD_Exp, Maximum_P_OSD_SoC, Maximum_P_OSD_Exp, Maximum_p_FA1_STD, Maximum_p_FA2_STD, Maximum_p_FA3_STD, Maximum_p_FA1_EXPR, Maximum_p_FA2_EXPR, Maximum_p_FA3_EXPR, Maximum_administration_cost, Maximum_c_PFS_Folfox, Maximum_c_PFS_Bevacizumab, Maximum_c_OS_Folfiri, Maximum_c_AE1, Maximum_c_AE2, Maximum_c_AE3, Maximum_d_e, Maximum_d_c, Maximum_u_F, Maximum_u_P, clamp(Maximum_AE1_DisUtil), clamp(Maximum_AE2_DisUtil), clamp(Maximum_AE3_DisUtil))
内容的提问来源于stack exchange,提问作者James Moore
相关产品推荐
相关产品推荐

