如何为Logistic回归模型减少正确的预测变量


9

因此,我一直在阅读一些有关建模的书籍(或其中的一部分)(包括F. Harrell的“回归建模策略”),因为我目前的现状是我需要基于二进制响应数据进行逻辑模型处理。我的数据集中有连续数据,分类数据和二进制数据(预测变量)。基本上我现在大约有100个预测变量,对于一个好的模型来说,显然太多了。同样,这些预测变量中有许多是相关的,因为尽管它们有些不同,但它们通常基于相同的度量。

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

那么我在这里有什么选择呢?我是否真的必须坐下来,与我的所有主管和工作中的聪明人交谈,并真的考虑一下(应该是错误的)前5名最佳预测指标是什么,或者我应该选择哪种方法?考虑代替吗?

是的,我也知道这个话题已经被广泛讨论(在线和书籍中),但是当您对该建模领域的新手了解时,有时似乎有点不知所措。

编辑:

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

然后,我要做的是建立一个预测模型,这样我就可以预测哪些患者有发生某种毒性的风险。而且由于响应数据是二进制的,所以我的主要思想当然是使用逻辑回归模型。至少这是其他人在我领域所做的。但是,在完成许多已经完成的论文时,其中有些似乎是错误的(至少在阅读这些特定类型的建模书籍(例如F. Harrel's)时)。许多人使用单变量回归分析来选择预测变量,并将其用于多元分析(如果我没记错的话,建议您这样做),并且许多人使用逐步技术来减少预测变量的数量。当然,这还不是全部。许多人使用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个人。


1
您打算做什么?预测或推断,还是其他?
斯蒂芬·科拉萨

这称为特征选择。如果必须使用回归,则分类特征已被一次性使用,但是对于树方法,可以按原样使用它们。您甚至可以找出您最具预测性的n向互动或关联词,然后使用它们。
smci

“我真的只需要坐下来与别人交谈,并真的考虑/推理出前n位预测变量吗?” 天哪,直觉是一个起点,但是这就是为什么有特征选择方法的原因。许多实验的结果都超越了直觉。
smci

1
@smci抱歉,不清楚。因此,在我的领域(放射肿瘤学)中,我们制定了治疗计划,该计划基本上是放射线/剂量如何在目标周围分布的3D表示。不幸的是,如果不击中至少少量的健康组织就无法做到这一点。因此,可以这么说,例如,我可以从3D地图中获取有关多大体积接收x射线/剂量的信息。但是,您可以想象,我可以“询问”这样的步骤,例如“此结构体积的1%接收多少辐射”,然后是2%,3%。原则上,这些值将有些相似。
丹佛当

1
@smci,如果预测是OP的目标,则相关性应该无关紧要。当试图解释模型中包含的变量时,变量之间的高度相关性才真正引起人们的极大关注。
StatsStudent

Answers:


4

您已收到一些有关选择推功能的答案,这是不合理的。

套索或更好的弹性网将做特征选择,但如上面你所指出将在设定的“选择”功能的波动是相当失望。我相信您所遇到的唯一真正希望是数据减少,即我在书中强调的无监督学习。数据减少带来更多的可解释性,尤其是更高的稳定性。我非常建议使用稀疏的主成分,或者在集群上使用常规聚类的变量聚类。

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


首先,感谢您抽出宝贵时间发表评论。其次,如果我没记错的话,无监督学习就是指您不使用(或不使用)响应变量的特定响应(即1或0),并使计算机“猜测” ”应如何分配。但是据我所知,监督逻辑回归(和线性回归)?那么您的建议是放弃该方法论吗?一方面,我喜欢这个主意,另一方面,逻辑和概率回归是我领域中几乎所有建模论文(与我的数据相似)到目前为止所做的事情。
丹佛当

因此,我不是要在这里四处走动吗,还是只需要假设其他人永远都在做“错误的”事情呢?
丹佛当

3
不是所有人,但大多数人肯定是做错了。这是编写回归建模策略的主要动机。数据减少的目的是减少要求逻辑回归进行的监督学习的数量。例如,您可以将100个候选特征减少为5个聚类得分,然后只需估计5个参数+截距。
Frank Harrell

2
在这种情况下,您对变系数模型有何看法(正如我在回答中所添加的)?
本·博克

@FrankHarrell听起来很有趣。但是遗憾地问,有监督的学习为什么会像您所暗示的那样不好,或者至少有些不好?
丹佛当

8

+1代表“有时似乎有点压倒性的”。确实要(如Harrell明确指出的那样;请参阅第4章末尾的部分)

  • 您将必须使用交叉验证来选择惩罚程度,除非您使用最先进的高维推理方法(例如Dezeure等,2015;有没有尝试过这些方法,但他们似乎懂事......)

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

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


我的样本量为+1000,并且取决于哪个响应变量(我有4个),我会有75-170个+1000的正响应(或负响应,具体取决于您如何看)。我不知道这是否使事情变得容易,即我可以取消一些步骤,因为样本集很大(至少在我的领域)。
丹佛当

交叉验证会破坏推理能力吗?也许。我认为有人可以在交叉验证之前进行引导,以获得预测的置信区间。使用1000个观察值,这可能是可行的。
JTH

选择后推断真的很难;如果您使用整个数据集来调整超参数(例如惩罚强度),那么您将处于相同的情况。您必须先概述您的bootstrap + CV方法,然后才能说出它是否行得通……
Ben Bolker

0

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


1
我相信这三种方法都是不稳定的。
Frank Harrell

这取决于您如何定义不稳定。在实践中,通常使用某种交叉验证,例如k倍或留一法,并根据最终选择的总体性能+方差(也称为1SE方法)进行判断。
resnet

自举和交叉验证仅验证生成模型的过程的一些预测指标。对于使用该过程选择的模型,这会导致对该索引的良好估计,但不会为曾经开发的模型(即整个模型)的结构提供任何安慰。查看整个重采样中选定的结构(即选定的特征)以查看波动性。
Frank Harrell
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.