十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

SPSS中VIF方差膨胀因子怎么看?一文搞定多重共线性诊断

SPSS中VIF方差膨胀因子怎么看?一文搞定多重共线性诊断 做回归分析时我最常被同行问的问题之一就是“SPSS到底在哪里看方差膨胀因子VIF”找了半天结果表里根本没有这一列。其实不是SPSS不给而是它默认把这个功能藏起来了需要在线性回归的“统计量”对话框里手动勾选“共线性诊断”结果才会出现容差和VIF。这篇文章就是专门解决这个问题的适合需要做多元线性回归、又被多重共线性困扰的SPSS使用者。读完你不仅能自己算出VIF还会知道怎么解读以及算完发现VIF很高时下一步应该做什么。1. 方差膨胀因子是什么为什么要用SPSS算它1.1 从回归系数不稳定的现象说起很多人在实际分析中会遇到一种很憋屈的情况模型整体拟合得很好F检验显著R方也不低但单独看某个变量的回归系数却是不显著的甚至正负号都和理论预期相反。换个变量进入方式系数又大变样。这十有八九是自变量之间存在多重共线性。多重共线性说白了就是自变量之间“太像了”。比如说你想研究什么因素影响收入同时把“工作年限”和“入职本单位年限”都放进模型这两个变量本身就高度重叠模型很难分清收入差异到底归功于哪一个。结果就是估计标准误被放大系数变得极不稳定。VIF就是用来量化这种“相互解释”程度的指标。为啥用SPSS算因为SPSS本身就在做回归时内置了这个计算只是它不默认输出。你只要找对地方把共线性诊断的复选框打上钩容差和VIF会跟着回归结果一并出现不需要自己动手算异常方便。1.2 VIF的数学定义与判断标准VIF全称是Variance Inflation Factor翻译过来叫方差膨胀因子。它的定义式是VIF_j 1 / (1 - R_j²)这里的R_j²是把第j个自变量当作因变量用剩下所有自变量做回归时得到的拟合优度。如果这个自变量和其他自变量毫不相关R_j²就是0VIF就是1表示没有任何共线性问题。反过来如果其他自变量几乎能完全解释它R_j²趋近于11减去它就是很小很小的数VIF就会瞬间变大。举个例子某个变量被其他变量解释的程度达到0.9代入公式就是1除以(1-0.9)VIF为10。解释程度到0.95VIF就变成20。这种解释程度越接近1分母越小VIF的增长是指数级的所以高VIF往往高得特别夸张。至于阈值怎么定统计教材里其实不太统一。我习惯的判断标准给你列成表格指标常用阈值说明VIF 1完全无共线性该变量与其他变量完全独立1 VIF 5通常可接受有轻微共线性一般不额外处理5 ≤ VIF 10需要警惕系数标准误已经明显膨胀结合其他指标判断VIF ≥ 10必须处理该变量标准误膨胀超过3倍系数极不可靠容差 0.1严重共线性容差是1/VIF小于0.1意味着VIF大于10容差 0.2需要警惕严格的学者认为容差低于0.2就要处理很多课程喜欢用VIF大于10作为判断线实际使用中我个人更看中5这个分界线。原因很简单VIF达到10时标准误已经是理想情况下的约3.16倍检验的把握度下降非常多实证论文里出现这种情况审稿人大概率会追问。1.3 VIF不是唯一指标SPSS共线性诊断怎么看SPSS勾选“共线性诊断”后不仅会输出VIF还会额外生成一张“共线性诊断表”里面有特征值、条件索引、方差比例这几个指标。VIF反映的是单个变量被其他变量解释的程度而这张表是看整个模型整体上的共线性结构。条件索引是判断共线性严重程度的另一个重要依据某一个维度上的条件索引大于30同时同一维度下有多个变量的方差比例大于0.5就说明这几个变量之间存在较强的共线性。这个判断比单纯看VIF更精细能帮你定位到底是哪几个变量在“扎堆”。实操里我通常是几个指标一起看。VIF负责任务是快速定位出问题变量条件索引和方差比例负责任务是理解这个共线性是怎么形成的。只报VIF不说明原因等于只诊断不给药方对解决问题帮助不大。2. 正式计算前先确认数据和模型够不够格2.1 哪些模型可以输出VIF哪些不行不是所有回归分析都自动带上VIF这个选项。SPSS里最标准、最方便输出VIF的模型是“线性回归”对话框下的普通最小二乘回归也就是我们常说的OLS回归。这个对话框里“统计量”按钮下有共线性诊断的选项勾上就能出结果。如果是二元逻辑回归也就是因变量是0和1分类的那种SPSS的结果输出里是没有“共线性诊断”这个选项的。很多人在Logistic回归的结果表里翻半天都找不到容差和VIF就是因为这条路根本走不通。相比之下线性回归中对共线性的处理方法在SPSS里成熟得多。如果你的模型恰好是逻辑回归又实在想用SPSS算VIF常见做法是先把连续型自变量的线性回归跑一遍只为了得到VIF列然后回到逻辑回归里用这些信息辅助判断。严格来说这不算精确但作为筛查手段是够用的。更正式的替代方案我会在第四部分展开讲。2.2 数据准备清单在动手敲菜单之前先把数据质量检查一遍这一步比操作本身更影响结果。至少要满足下面几个条件自变量至少有两个。只有一个自变量就没有“其他变量解释它”的概念SPSS的VIF列很可能不显示。因变量必须是连续型数值变量。如果因变量是0/1分类直接走线性回归在模型设定上就不严谨。不能有大量缺失值。SPSS默认会删除有缺失值的个案删多了样本量骤减VIF的稳定性也会打折扣。样本量别太小。一个粗糙的经验标准是自变量个数的10到20倍。样本太少估计本身就不稳这时候谈共线性意义不大。对于异常值有问题但不用过度紧张。如果是明显的数据录入错误可以直接修正如果是真实但极端的观测可以先看看它对结果的影响有多大不要一上来就删。2.3 分类变量和连续变量的处理差异很多人卡在这里明明勾了共线性诊断结果表里其他变量都有VIF某个分类变量就是没有或者整个表都没有VIF列。这多半和变量的测量类型设置有关。在SPSS线性回归对话框里自变量栏有两种角色连续变量会进入“自变量”框分类变量会进入“因子”框。当你把分类变量拖进因子框时SPSS会自动把它转换成虚拟变量但在共线性统计里它往往不会像普通连续变量那样在系数表里整整齐齐地给出每一类的VIF。尤其是当模型里只有分类变量、没有数值型协变量时VIF列很容易不出现。所以我的建议是连续变量直接放自变量框分类变量如果非要用也要理解它在输出上的特殊性。如果模型里的核心变量全是连续型的VIF的读取就是顺畅的。分类变量太多时我更倾向于先用“分析 → 描述统计 → 交叉表”或者相关分析提前观察类别变量之间的关联模式。3. SPSS方差膨胀因子操作步骤菜单级教程3.1 打开线性回归对话框以IBM SPSS Statistics为例中文版菜单路径是分析 → 回归 → 线性英文版对应的是Analyze → Regression → Linear弹出主对话框后把因变量选入“因变量”框将待检验的自变量全部选入“自变量”框。这里要特别注意“方法”下拉框默认是“进入”也就是全部自变量一起进入模型。你也可以选“逐步”“向前”“向后”但不影响VIF的输出SPSS会照样计算共线性统计量。如果你是用SPSS在线版、Mac版或较新的28版菜单名称基本没变只是界面风格略有差异。核心按钮和选项都还在原来的位置。3.2 “统计量”里勾选共线性诊断这是整个操作里最要紧的一步。在主对话框里找到“统计量”按钮点进去之后会看到一组复选框。我需要勾选的是“共线性诊断”英文界面是“Collinearity diagnostics”。同一对话框里的“描述性”和“模型拟合”选项建议顺手也勾上。描述性会给你输出均值、标准差和相关系数矩阵方便你前期观察两两相关模型拟合会输出R方和F检验反正回归结果大概率也要写进报告里一并勾出来不亏。勾完之后一路“继续”“确定”SPSS就会在主输出窗口生成一大串回归结果表。记住VIF本身不会单独出现在一个叫“VIF”的独立表格里。它是藏在“系数”表右侧的某个列里要往下翻甚至要横向滚动窗口才能看到。3.3 运行后去哪里读VIFSPSS输出窗口里找到“系数”这张表英文是“Coefficients”。这张表会列出每个自变量的未标准化系数B、标准误、标准化系数Beta、t值、显著性p值然后在表格最右侧会多出两列列名是“容差”和“VIF”两者合起来属于“共线性统计”。注意如果这张表是直接在“系数”下一行紧挨着的一般就是线性回归的结果。如果你没勾选“共线性诊断”这张表里只有系数、t、p那些列没有容差和VIF。所以找不到VIF时第一反应该是返回去重新勾选而不是怀疑自己数据坏了。有一个特例模型里只有一个自变量进回归时SPSS不会给出VIF列因为不存在可以被“其他自变量解释”的情况。如果你有两个以上的自变量却仍然没有VIF那多半是操作或变量设置出了问题。3.4 一个典型输出表的完整解读为了让你对结果长什么样有个直观概念我模拟一个三个自变量的回归输出片段。数据是虚拟的但结构和真实SPSS输出完全一致变量未标准化系数B标准误tp值容差VIF常量1.8200.4334.2030.000X10.2140.0683.1470.0020.4742.11X2-0.1050.087-1.2070.2300.2743.65X30.3360.1582.1270.0360.08411.87这张表里X1的VIF是2.11属于正常范围说明它和其他变量有一定关联但不严重。X2的VIF是3.65稍微高一点但还处于许多教材认为可控的区间。最值得注意的是X3VIF达到11.87已经超过10了说明它几乎能被X1、X2联合解释殆尽。进一步回看它的容差只有0.084对应就是VIF的倒数关系。4. 结果解读与没有VIF时的排查4.1 VIF值怎么翻译成可执行的结论VIF值真正对应的意义是回归系数估计方差被放大的倍数。比如VIF等于4意味着这个变量的系数估计方差是没有共线性时候的4倍标准差被放大到2倍。VIF等于10标准差约变成3.16倍。这意味着你和假设检验越来越难通过因为标准误太大t值被压缩了。高VIF和系数是否“显著”是两码事。有时候某个变量VIF很高但p值依然小于0.05这时候先别开心——这个显著的系数极不稳定。换几个样本进来或者加一个变量进去它可能立刻变成不显著甚至符号反向。所以我的建议是遇到高VIF变量它的系数解读要格外谨慎最好标记为“存在共线性影响系数不稳定”。如果那个高VIF变量不是你的研究核心那你可以在报告里如实说明删除了该变量但如果它是核心解释变量就得用第四部分的方法去处理而不是简单地删掉否则可能出现遗漏核心变量的问题。4.2 为什么SPSS结果中没有VIF列这个问题我被人问过无数次。排查时按顺序检查这几个地方基本都能找到答案第一看“统计量”里是否勾选了“共线性诊断”。没有勾选是最大的原因尤其是不熟悉操作的人很容易忽略这一步。返回去重新在统计量里把共线性诊断勾上再运行即可。第二看自变量数量。如果只有一个自变量SPSS不会输出共线性统计列这属于正常现象不用处理。第三看变量类型。如果自变量全部是分类变量并且放进了“因子”框SPSS输出的共线性统计不会像连续变量那样一目了然。遇到分类变量较多的情况我建议直接用“一般线性模型”里的“多变量”去分析或者手动把分类变量编码成虚拟变量后再放回归。第四看模型类型。逻辑回归、Probit、非线性回归、Cox回归等模型不会输出VIF列这不是表格问题是功能限制。4.3 逻辑回归等模型想算VIF的替代方案如果你做的是二元逻辑回归又想知道模型里的共线性水平最直接的办法是在逻辑回归之前快速跑一遍相同自变量的线性回归只看共线性统计那一列。这个做法的前提是共线性是自变量之间的结构问题理论上和因变量分布关系不大。线性回归里VIF高逻辑回归里大概率也高因此用线性回归的VIF作为筛查参考资料是可接受的。更严谨的操作是把数据导出后用R或Python计算广义方差膨胀因子GVIF。GVIF来自car包它能把分类变量的自由度考虑进去。这个在SPSS里没有现成菜单会用Python的读者可以参考我第五部分写的补充脚本。还有一个小技巧在进行逻辑回归之前先看一眼自变量的相关矩阵。如果两两相关系数已经超过0.8那不用看VIF也知道大概率有问题可以直接进入处理阶段。5. 高VIF的应对思路与实用避坑5.1 发现高VIF后的排查流程VIF高不是终点只是个起点。直接开始删变量是最简单粗暴的做法但未必合理。我建议按下面的顺序排查先看相关矩阵找出和出问题变量相关性较强的同伴。很多时候高VIF其实只集中在两个变量高度相关的情况。比如X2和X3相关系数0.9VIF就可能是7或者8如果X2同时和X1相关就会导致多个变量VIF同时偏高。再看条件索引和方差比例判断是否是整体层面的共线性结构而不是单纯两两相关。如果条件索引大于30方差比例里有两个变量同时过高那就说明它们之间存在严重的线性组合关系。最后结合变量在理论模型里的地位综合判断。如果两个高度相关的变量都是核心变量简单删掉一个可能在理论上说不通那就要考虑岭回归或者主成分分析。5.2 删变量、换变量、改造变量的取舍面对高VIF常见处理方式有几种各有适用场景。最常用的就是删除变量。如果两个变量高度相关而且其中一个只是控制变量或者次要变量那么删掉它是合理的。但要注意删除变量可能带来遗漏变量偏误尤其是被删变量和因变量本身有很强关系时参数估计可能反而不干净。融合变量是第二个思路。两个高度相关的自变量本质是在测量同一个潜在构念比如“工作年限”和“在本单位年限”那可以考虑把它们合并成一个综合指标。SPSS里可以用“计算变量”功能求均值或加总也可以用“降维 → 因子分析”提取公因子再用因子得分作为新自变量。改造变量的第三个办法是中心化。这个方法对交互项尤其有效。如果一个模型里有X1*X2这类交互项原始变量和交互项之间的相关性常常高得吓人中心化之后能明显降低VIF。但对于普通线性相关引起的共线性中心化帮助有限。所以不要指望中心化能解决所有问题。5.3 想用岭回归时新版SPSS怎么操作当高VIF变量躲不开、删不了时岭回归是一个很实用的替代估计方法。它通过给估计方程加上一个小的惩罚项换取更稳定的系数估计代价是系数会有轻微偏误但预测稳定性通常更好。新版SPSS里做岭回归最方便的道路是利用“分析 → 回归 → 自动线性建模”的正则化选项。在“高级”面板里选择正则化方法勾选山脊回归RidgeSPSS会自动估计最优惩罚参数并输出标准化回归系数。这是图形界面里最接近岭回归的现成功能。老版本SPSS没有这个菜单想要岭回归一般要通过语法编辑器调用RIDGEREG宏。因为宏脚本在不同版本里差异不小这里不贴具体代码了。如果你用的是老版本建议优先考虑升级版本或者直接用Python、R做岭回归省去调宏的折腾。5.4 用Python做补充计算的思路前面提过逻辑回归、多水平模型里SPSS不给VIF这时候我一般直接把数据导出到Python里补一个计算。思路其实和SPSS背后的算法一模一样对每一个自变量用其余自变量做回归取R方求VIF。import numpy as np import pandas as pd from statsmodels.stats.outliers_influence import variance_inflation_factor from statsmodels.tools.tools import add_constant # 读入数据这里换成你自己的文件路径 df pd.read_excel(your_data.xlsx) # 选择自变量列并手动加一列常数项 X add_constant(df[[x1, x2, x3]]) vif_data pd.DataFrame({ variable: X.columns, VIF: [variance_inflation_factor(X.values, i) for i in range(X.shape[1])] }) print(vif_data)输出结果里会有一行是const也就是常数项对应的VIF那个没有实际解释意义直接忽略。后面x1、x2、x3的VIF和SPSS线性回归的结果基本一致。这个脚本我用来处理逻辑回归的共线性筛查已经很多次了算是SPSS之外一个比较省事的补充工具。5.5 我自己处理共线性时的三个原则踩过不少坑之后我慢慢总结出几条习惯在这里分享一下。第一条不背VIF的数值包袱。VIF高不代表模型就没救它只提醒我这个变量的系数估计不够稳定。要不要处理取决于变量在模型中的角色。一个纯粹的控制变量VIF高删掉就删掉一个核心解释变量VIF高哪怕只有6都要认真想办法。第二条相关矩阵和VIF一起看。有时候VIF高是因为三个变量之间形成了“三角关系”两两相关并不高但联合起来却能把其中一个完全解释。只看相关矩阵会漏掉这种隐蔽共线性所以我会两个指标同时参考。第三条处理结果要能讲清楚逻辑。删变量、合并变量、改用岭回归都是技术决策但最后写在报告里的理由一定要有理论和经验支撑。不能说“因为VIF太大所以删了”而要说“这个变量与另一变量在概念上高度重叠保留后造成估计不稳定故考虑合并处理”。清晰的决策逻辑比一个完美的数字更重要。这些操作和判断习惯是我在一次次跑模型、一次次被审稿人问“共线性问题怎么处理”之后慢慢磨出来的。下次你遇到VIF偏高先别急着删变量按这个流程走一遍多半能找到合理的处理方式。
返回列表