草庐IT

【统计】关联与建模,何时使用逐步回归?

超短裙的小人 2023-03-28 原文

前言

辗转数月,思考了很久,想要以什么角度开始与大家分享一些医学统计学相关的观点,却迟迟没有动笔,直到数天前偶然阅读到郑老师一文——“为什么我不建议随便用逐步回归法构建回归模型?”,觉得较有感触,因此增加了一些自己的观点,希望与各位分享。如果有什么不足,欢迎大家指教。

问题1:目前常见的医学研究类型有影响因素分析与模型构建两种,而逐步回归则经常出现在以上两种研究类型的混杂or预测因子筛选过程中(混杂筛选尤其常见于国内学术论文)。那么,这样的研究思路是否毫无问题呢?

“事实上,逐步回归都是被应用于预测模型构建的变量筛选过程中的,并不推荐用来探讨影响因素(危险因素、关联等)。以国内众多影响因素研究方法部分的误区——“逐步回归”为例,它的目的是用最少的预测因子,成功构建出不逊于全变量模型的“最优模型”。

它的实施步骤是这样的(以逐步后退法为例):1)构建全模型;2)删除P值最大的变量,评估两个模型的效果(以决定系数、-2倍对数似然值、AIC、BIC等指标为评价指标),如果模型前后对比没统计学差异,则保留后者;3)继续删除下一个变量并进行模型评估,直到出现“最优模型”。这也就是大家常问到的逐步回归法后为什么会出现P值大于0.05的自变量的原因啦。

如果理解逐步回归的原理我们不难发现,它的目的是找到那个拟合效果最佳的“最优模型”,这个模型能够最大程度地删除对模型拟合没有太大帮助的变量,同时保留最佳的预测效果。因此,在模型构建相关研究中,使用逐步回归进行预测因子(变量、特征)选择是合适的。

Tips

推荐大家也可以尝试LASSO回归、弹性网络回归、特征递归消除等前沿的特征选择策略哦!然而在影响因素分析的混杂偏倚筛选过程中,逐步回归法在大多数情况下都不是最合适的选择!

举例

看这个例子:首先把X1、X2、X3、X4、X5全放入方程(方程一),其中X1的P值最大,从模型中剔出X1得方程二,方程二X4的p值0.122比较大,再剔除X4得方程三,这就是逐步回归得出的最终回归模型。这有什么问题呢?

如果要分析的是X2对Y的独立作用,方程一、方程二、方程三得出的X2对Y的回归系数都一样。

如果要分析的是X5对Y的独立作用,方程一、方程二、方程三得出来的回归系数虽有不同,但差异不大(在10%之内)。

如果要分析的是X3对Y的独立作用,方程一、方程二得出来的是0.28,而方程三得出0.36,相差比较大(相差28.6%)。到底X3对Y的独立作用是0.28还是0.36?答案是0.28,因为方程三没有调整X4,其X3的回归系数0.36包含了X4的作用。这里看出,逐步回归得出的方程三不能正确评价X3对Y的独立作用。

为什么调整X4 与不调整X4,X3 的回归系数变化很大呢?是因为X3与X4 关系较大,不调整X4,X4 的作用就加到X3身上去了;调整了X4 ,就是把X4 的作用从X3中剥离出来了。

不论调整什么,X2的回归系数都没变化,为什么?因为X2 与X1、X3、X4、X5都没有关系。

纠误

(1)逐步回归法可以减少冗余的自变量?

解决冗余的合适方案不应该是逐步回归,可以考虑以下两种方案:

第一,在纳入模型伊始就应该慎重考虑哪些因素可能是研究因素的混杂。只有与结局变量可能存在着因果关系的变量,才推荐开展回归分析。这一点,是需要从专业上去考虑的。建议使用DAG(有向无环图)理清暴露、结局、协变量间的关系;

第二,在统计分析过程中,若自变量个数很多,在单因素分析时设置阈值,不随便纳入自变量进入最终的多因素回归模型(如0.05/0.1/0.2)。如果出现临界阈值的变量,也可以纳入到多因素模型尝试,看研究因素的OR/RR变化的情况,决定其是否纳入。

Tips

推荐是否纳入多因素回归进行校正的界值为偏回归系数变化10%,大于10%则需要纳入校正,而不用考虑P值大小。

图1 参考文献来自NEJM杂志,供大家引用哦~

(2)逐步回归法能够把没有统计学意义的自变量淘汰出去,没有统计学意义的自变量不需要校正?

这种理解是不对的!

第一,逐步回归也可能会保留P值大于0.05的变量;第二,P值大于0.05的自变量也可以在多因素分析时被报告,因为统计学意义并不等于实际意义。

(3)逐步回归法效果更好?

不一定。这种情况大都发生在协变量很多时,一股脑地把它们放入逐步回归可能会减少烦恼,但是有一些重要的混杂也可能会被剔除在外。

(4)逐步回归法可以处理多重共线性?

我相信许多非专业的朋友连多重共线性是什么可能都不是很清楚。

Tips——多重共线性的常见表现形式

为什么会出现多重共线性?多重共线性是由于自变量(X)与Z之间存在着某种联系所导致的,这种联系可以分为以下几种情况:

第一,这个变量是混杂变量,但是该混杂变量与X相关,所以造成部分共线性;

第二,这个变量是中介变量,中介变量是比较常见的多重共线性的原因(X->Z->Y);

第三,X与Z实际上是同一变量。比如年龄这一定量变量和根据年龄进行分组产生年龄的等级变量,那么原先的年龄定量数据和等级变量的年龄就是高度相关,如果它们一同纳入模型,就会造成共线性;

第四,一个事物的两个属性。比如身高与坐高,相关高度相关,如果,如果他们一同纳入模型,就会造成共线性。

实际上,除了第一点之外,我们在处理多重共线性时,典型的方法是排除造成多重共线性的变量。比如身高坐高在回归分析应该2选1,定量年龄和分类年龄应该2选1,中介变量不能纳入模型。

逐步回归法解决不了多重共线性,但会给不明白它原理的“小盆友们”一种假象:我用了逐步回归法,所以我的结果很可靠。而残酷的现实往往是,当你忽视自变量之间的关系而直接应用逐步回归法,结果往往也不大理想。

Tips

检验多重共线性可以尝试VIF(方差膨胀因子,常见阈值2/5/10);

LASSO回归能够较好地控制多重共线性。

建议

综上所述,逐步回归法在探讨影响因素的过程中,不是主要的策略。

(1)协变量过多时,推荐DAG等因果推断手段筛选出真正需要控制的混杂因素;

(2)影响因素分析不需要所有协变量都有统计学意义,关键的混杂因素无论是否具有统计学意义,都应该在模型中;

(3)应该评估中介变量带来的影响,可能要排除中介变量,或者进一步采用中介效应分析;

(4)尽量避免多重共线性,推荐VIF评估并人工剔除造成多重共线性的变量或者尝试LASSO回归。

(5)同时可以评估可能存在的“对撞变量”对结局的影响(打个*号,不要求掌握,有兴趣的童鞋自行研究)

总结

(1)影响因素分析时,不建议采用逐步回归法。

(2)预测/诊断模型的构建,可以使用逐步回归法,更推荐尝试LASSO回归、弹性网络回归、特征递归消除等前沿的特征选择策略。

添加图片注释,不超过 140 字(可选)

有关【统计】关联与建模,何时使用逐步回归?的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  4. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  5. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  6. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  7. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  8. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  9. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  10. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

随机推荐