如何以正确的方式减少逻辑回归模型的预测变量

机器算法验证 物流 预测模型 特征选择 回归策略
2022-03-04 07:14:33

所以我一直在阅读一些关于建模的书籍(或其中的一部分)(F. Harrell 的“回归建模策略”等),因为我现在的情况是我需要基于二进制响应数据做一个逻辑模型。我的数据集中既有连续数据、分类数据和二进制数据(预测变量)。基本上我现在有大约 100 个预测变量,这对于一个好的模型来说显然太多了。此外,这些预测变量中的许多都是相关的,因为它们通常基于相同的指标,尽管有些不同。

无论如何,我一直在阅读的内容,使用单变量回归和逐步技术是您可以做的一些最糟糕的事情,以减少预测变量的数量。我认为 LASSO 技术非常好(如果我理解正确的话),但显然你不能在 100 个预测变量上使用它,并认为它会带来任何好处。

那么我在这里有什么选择?我真的只需要坐下来,与我所有的主管和工作中的聪明人交谈,并真正思考前 5 个最佳预测指标可能/应该是什么(我们可能错了),或者我应该采用哪种方法考虑一下?

是的,我也知道这个话题被大量讨论(在线和书籍),但是当你是这个建模领域的新手时,它有时似乎有点压倒性。

编辑:

首先,我的样本量是 +1000 名患者(这在我的领域中很多),其中有 70-170 名阳性反应(即 170 名有反应,而其中一个病例大约有 900 名无反应) . 基本上,这个想法是预测放射治疗后的毒性。我有一些预期的二元响应数据(即毒性,要么你有它(1),要么你没有(0)),然后我有几种类型的指标。一些指标是患者特定的,例如年龄、使用的药物、器官和目标体积、糖尿病等,然后我有一些基于目标模拟治疗领域的治疗特定指标。从中我可以检索到几个预测因子,这些预测因子通常与我的领域高度相关,因为大多数毒性与接受的辐射量(iedose)高度相关。因此,例如,如果我治疗肺部肿瘤,一定量的剂量就有可能击中心脏。然后我可以计算出多少 x 量的心脏体积接受了 x 量的剂量,例如“ 不只是选择一个开始(尽管这是过去的实验当然尝试过的,也是我希望做的),因为我需要“确切地”知道在何种程度上心脏毒性之间实际上存在很大的相关性和体积剂量(再次作为示例,还有其他类似的指标,其中应用了相同的策略)。所以是的,这就是我的数据集的样子。一些不同的指标,以及一些有些相似的指标。不只是选择一个开始(尽管这是过去的实验当然尝试过的,也是我希望做的),因为我需要“确切地”知道在何种程度上心脏毒性之间实际上存在很大的相关性和体积剂量(再次作为示例,还有其他类似的指标,其中应用了相同的策略)。所以是的,这就是我的数据集的样子。一些不同的指标,以及一些有些相似的指标。s 几乎是我的数据集的样子。一些不同的指标,以及一些有些相似的指标。s 几乎是我的数据集的样子。一些不同的指标,以及一些有些相似的指标。

然后我想做的是建立一个预测模型,这样我就可以有希望地预测哪些患者会有出现某种毒性的风险。由于响应数据是二元的,我的主要想法当然是使用逻辑回归模型。至少这是其他人在我的领域所做的。然而,在阅读这些已经完成的许多论文时,其中一些似乎是错误的(至少在阅读这些特定类型的建模书籍时,如 F. Harrel 的)。许多人使用单变量回归分析来选择预测变量,并将它们用于多变量分析(如果我没记错的话,建议不要这样做),还有许多人使用逐步技术来减少预测变量的数量。当然,也不全是坏事。许多使用 LASSO、PCA、交叉验证、引导等,但我看过的那些,

关于特征选择,这可能就是我现在所处的位置。如何选择/找到要在我的模型中使用的正确预测器?我已经尝试过这些单变量/逐步方法,但每次我都在想:“如果它错了,为什么还要这样做?”。但也许这是一个很好的方式来展示,至少在最后,一个“好模型”是如何以正确的方式完成的,而“坏模型”是如何以错误的方式完成的。所以我现在可能会以某种错误的方式来做这件事,我需要帮助的是找到正确的方向。

很抱歉编辑,它是如此之长。

编辑 2: 只是我的数据看起来如何的一个快速示例:

'data.frame':   1151 obs. of  100 variables:
 $ Toxicity              : Factor w/ 2 levels "0","1": 2 1 1 1 1 1 1 1 1 1 ...
 $ Age                   : num  71.9 64 52.1 65.1 63.2 ...
 $ Diabetes              : Factor w/ 2 levels "n","y": 1 1 1 1 1 1 1 1 1 1 ...
 $ Risk.Category         : Ord.factor w/ 3 levels "LOW"<"INTERMEDIATE"<..: 1 1 1 1 2 1 1 1 1 3 ...
 $ Organ.Volume.CC       : num  136.1 56.7 66 136.6 72.8 ...
 $ Target.Volume.CC      : num  102.7 44.2 58.8 39.1 56.3 ...
 $ D1perc                : num  7961 7718 7865 7986 7890 ...
 $ D1.5CC                : num  7948 7460 7795 7983 7800 ...
 $ D1CC                  : num  7996 7614 7833 7997 7862 ...
 $ D2perc                : num  7854 7570 7810 7944 7806 ...
 $ D2.5CC                : num  7873 7174 7729 7952 7604 ...
 $ D2CC                  : num  7915 7313 7757 7969 7715 ...
 $ D3perc                : num  7737 7379 7758 7884 7671 ...
 $ D3.5CC                : num  7787 6765 7613 7913 7325 ...
 $ D3CC                  : num  7827 6953 7675 7934 7480 ...
 $ D4perc                : num  7595 7218 7715 7798 7500 ...
 $ D5perc                : num  7428 7030 7638 7676 7257 ...
 $ DMEAN                 : num  1473 1372 1580 1383 1192 ...
 $ V2000CGY              : num  24.8 23.7 25.9 22.3 19.3 ...
 $ V2000CGY_CC           : num  33.7 13.4 17.1 30.4 14 ...
 $ V2500CGY              : num  22.5 21.5 24 20.6 17.5 ...
 $ V2500CGY_CC           : num  30.7 12.2 15.9 28.2 12.7 ...
 $ V3000CGY              : num  20.6 19.6 22.4 19.1 15.9 ...
 $ V3000CGY_CC           : num  28.1 11.1 14.8 26.2 11.6 ...
 $ V3500CGY              : num  18.9 17.8 20.8 17.8 14.6 ...
 $ V3500CGY_CC           : num  25.7 10.1 13.7 24.3 10.6 ...
 $ V3900CGY              : num  17.5 16.5 19.6 16.7 13.6 ...
 $ V3900CGY_CC           : num  23.76 9.36 12.96 22.85 9.91 ...
 $ V4500CGY              : num  15.5 14.4 17.8 15.2 12.2 ...
 $ V4500CGY_CC           : num  21.12 8.18 11.76 20.82 8.88 ...
 $ V5000CGY              : num  13.9 12.8 16.4 14 11 ...
 $ V5000CGY_CC           : num  18.91 7.25 10.79 19.09 8.03 ...
 $ V5500CGY              : num  12.23 11.14 14.84 12.69 9.85 ...
 $ V5500CGY_CC           : num  16.65 6.31 9.79 17.33 7.17 ...
 $ V6000CGY              : num  10.56 9.4 13.19 11.34 8.68 ...
 $ V6000CGY_CC           : num  14.37 5.33 8.7 15.49 6.32 ...
 $ V6500CGY              : num  8.79 7.32 11.35 9.89 7.44 ...
 $ V6500CGY_CC           : num  11.96 4.15 7.49 13.51 5.42 ...
 $ V7000CGY              : num  6.76 5.07 9.25 8.27 5.86 ...
 $ V7000CGY_CC           : num  9.21 2.87 6.1 11.3 4.26 ...
 $ V7500CGY              : num  4.61 2.37 6.22 6.13 4 ...
 $ V7500CGY_CC           : num  6.27 1.34 4.11 8.38 2.91 ...
 $ V8000CGY              : num  0.7114 0.1521 0.0348 0.6731 0.1527 ...
 $ V8000CGY_CC           : num  0.9682 0.0863 0.023 0.9194 0.1112 ...
 $ V8200CGY              : num  0.087 0 0 0 0 ...
 $ V8200CGY_CC           : num  0.118 0 0 0 0 ...
 $ V8500CGY              : num  0 0 0 0 0 0 0 0 0 0 ...
 $ V8500CGY_CC           : num  0 0 0 0 0 0 0 0 0 0 ...
 $ n_0.02                : num  7443 7240 7371 7467 7350 ...
 $ n_0.03                : num  7196 6976 7168 7253 7112 ...
 $ n_0.04                : num  6977 6747 6983 7055 6895 ...
 $ n_0.05                : num  6777 6542 6811 6871 6693 ...
 $ n_0.06                : num  6592 6354 6649 6696 6503 ...
 $ n_0.07                : num  6419 6180 6496 6531 6325 ...
 $ n_0.08                : num  6255 6016 6350 6374 6155 ...
 $ n_0.09                : num  6100 5863 6211 6224 5994 ...
 $ n_0.1                 : num  5953 5717 6078 6080 5840 ...
 $ n_0.11                : num  5813 5579 5950 5942 5692 ...
 $ n_0.12                : num  5679 5447 5828 5809 5551 ...
 $ n_0.13                : num  5551 5321 5709 5681 5416 ...
 $ n_0.14                : num  5428 5201 5595 5558 5285 ...
 $ n_0.15                : num  5310 5086 5485 5439 5160 ...
 $ n_0.16                : num  5197 4975 5378 5324 5039 ...
 $ n_0.17                : num  5088 4868 5275 5213 4923 ...
 $ n_0.18                : num  4982 4765 5176 5106 4811 ...
 $ n_0.19                : num  4881 4666 5079 5002 4702 ...
 $ n_0.2                 : num  4783 4571 4985 4901 4597 ...
 $ n_0.21                : num  4688 4478 4894 4803 4496 ...
 $ n_0.22                : num  4596 4389 4806 4708 4398 ...
 $ n_0.23                : num  4507 4302 4720 4616 4303 ...
 $ n_0.24                : num  4421 4219 4636 4527 4210 ...
 $ n_0.25                : num  4337 4138 4555 4440 4121 ...
 $ n_0.26                : num  4256 4059 4476 4355 4035 ...
 $ n_0.27                : num  4178 3983 4398 4273 3951 ...
 $ n_0.28                : num  4102 3909 4323 4193 3869 ...
 $ n_0.29                : num  4027 3837 4250 4115 3790 ...
 $ n_0.3                 : num  3955 3767 4179 4039 3713 ...
 $ n_0.31                : num  3885 3699 4109 3966 3639 ...
 $ n_0.32                : num  3817 3633 4041 3894 3566 ...
 $ n_0.33                : num  3751 3569 3975 3824 3496 ...
 $ n_0.34                : num  3686 3506 3911 3755 3427 ...
 $ n_0.35                : num  3623 3445 3847 3689 3361 ...
 $ n_0.36                : num  3562 3386 3786 3624 3296 ...
 $ n_0.37                : num  3502 3328 3725 3560 3233 ...
 $ n_0.38                : num  3444 3272 3666 3498 3171 ...
 $ n_0.39                : num  3387 3217 3609 3438 3111 ...
 $ n_0.4                 : num  3332 3163 3553 3379 3053 ...
 $ n_0.41                : num  3278 3111 3498 3321 2996 ...
 $ n_0.42                : num  3225 3060 3444 3265 2941 ...
 $ n_0.43                : num  3173 3010 3391 3210 2887 ...
 $ n_0.44                : num  3123 2961 3339 3156 2834 ...
 $ n_0.45                : num  3074 2914 3289 3103 2783 ...
 $ n_0.46                : num  3026 2867 3239 3052 2733 ...
 $ n_0.47                : num  2979 2822 3191 3002 2684 ...
 $ n_0.48                : num  2933 2778 3144 2953 2637 ...
 $ n_0.49                : num  2889 2734 3097 2905 2590 ...

如果我运行table(data$Toxicity)输出是:

> table(data$Toxicity)
   0    1 
1088   63 

同样,这是针对一种毒性。我还有另外 3 个。

3个回答

+1 表示“有时似乎有点压倒性”。这真的取决于(正如 Harrell 明确指出的那样;请参阅第 4 章末尾的部分)您是否想这样做

  • 验证性分析(您的预测器复杂性降低到合理水平而不查看响应)
  • 预测分析(适当的惩罚方法)。如果您有相当大的样本,Lasso 可以很好地处理 100 个预测变量。特征选择会不稳定,但如果你只关心预测,那也没关系。我个人偏爱在技术上不“选择特征”的类似山脊的方法(因为它们永远不会将任何参数减少到完全为零),但不管怎样……

    您必须使用交叉验证来选择惩罚程度,这将破坏您进行推理的能力(构建预测的置信区间),除非您使用尖端的高维推理方法(例如Dezeure et al 2015;I没有尝试过这些方法,但它们似乎很明智......)

  • 探索性分析:玩得开心,保持透明和诚实,不要引用任何 p 值。

对于您现在描述的特定用例(您的一堆预测变量基本上代表心脏不同部分接收的剂量的累积分布),您可能需要研究可变系数模型(有点难以搜索) ,基本上适合CDF效果的平滑曲线(这些可以在R的mgcv包中实现)。

您收到的一些关于推送功能选择的答案是错误的。

套索或更好的弹性网络将进行特征选择,但如上所述,您将对“选定”特征集的波动性感到非常失望。我相信在你的情况下唯一真正的希望是数据缩减,即无监督学习,正如我在书中所强调的那样。数据缩减带来了更多的可解释性,尤其是更高的稳定性。我非常推荐稀疏主成分,或变量聚类,然后是集群上的常规主成分。

数据集中的信息内容太少,以至于任何特征选择算法都不可靠。

有许多不同的方法。我建议按照以下顺序尝试一些简单的方法: