方差膨胀因子(VIF)学习

本文通过R语言介绍方差膨胀因子(VIF)的概念及其在检测多重共线性中的应用。首先导入研究共线性的数据集,建立回归模型,接着对自变量进行t检验,计算VIF值,并验证其另一种定义。通过相关关系图发现存在严重的多重共线性问题。最后,使用step()函数筛选变量,并探讨F-value与R2的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考博客:https://blog.youkuaiyun.com/jiabiao1602/article/details/39177125

1.导入数据,R自带研究共线性的数据集

该数据集有7个变量,其中GNP.deflator可以作为yyy

rm(list=ls())
data=longley
print(data)

在这里插入图片描述

2.对全变量建立回归模型

model=lm(GNP.deflator~.,data=data)
summary(model)

在这里插入图片描述
结论:\color{red}{结论:}从上面的结果可以看出,6个自变量中,只有两个变量的ppp值是显著的,此处看结果,要知道,多元线性回归的检验两种:一种是对回归方程的检验(F检验),另一种是对各个回归系数的检验,因为在回归方程中,即使回归方程显著,也不能说明每个自变量对y的影响都是显著的,因此我们总想从回归方程中剔除哪些次要的,可有可无的变量,重新建立更简单的方程。所以需要我们对每个自变量进行显著性检验。其中对自变量进行检验使用的t检验,从上面的summary()可以看出,Residual standard error是sigma_hat的估计

3.t检验计算,以GNP为例

# 显然此处p=6,此处的model$fitted_value与predict(model)是相同的值
# 这个和glm模型的值是不一样的
# 
sig_2=sum((data$GNP.deflator-predict(model))*(data$GNP.deflator-predict(model))) 
sig_hat=sqrt(sig_2/9)
#我一直不知道R里面把拟合的sigma_hat怎么取出来,可以以下面的方式
#不要以为summary(model)只是返回结果,如果输入a=summary(model)
#那么a是一个对象,那么就可以以a$sigma来获得sigma的估计值了
# 其余的属性也是类似的,其中拟合优度为a$r.squared
y=data[,1];
design_matrix=data[,c(-1)];
design_matrix=cbind(interc=rep(1,16),design_matrix)#直接Ctrl+enter就可以运行
design_matrix=as.matrix(design_matrix)
y=as.matrix(y)
beta=solve(t(design_matrix)%*%design_matrix)%*%t(design_matrix)%*%y

t_test=beta/(sqrt(diag(solve(t(design_matrix)%*%design_matrix)))*sig_hat)
print(t_test)

在这里插入图片描述
此处可以看到,对于截距项的检验也是t检验算出来的(虽然一般不看这个),
检验的公式为t=β^j(cjj)σ^t=\frac{\hat\beta_{j}}{\sqrt(c_{jj})\hat\sigma}t=

### 方差膨胀因子 (VIF) 的概念 方差膨胀因子(Variance Inflation Factor, VIF)是用来衡量回归模型中多重共线性严重程度的一个指标。它表示某个自变量由于与其他自变量之间存在线性关系而导致其估计标准误增大的倍数[^3]。 当 VIF 值较大时,意味着该自变量与其它自变量高度相关,从而可能导致参数估计不稳定以及显著性检验失效。通常认为,如果某变量的 VIF 超过 10,则可能存在严重的多重共线性问题。 --- ### 方差膨胀因子 (VIF) 的计算方法 #### 数学定义 对于多元线性回归模型 \( y = \beta_0 + \beta_1 X_1 + \cdots + \beta_p X_p + \epsilon \),假设我们关注第 \( j \) 个自变量 \( X_j \)VIF。可以通过以下步骤来计算: 1. **建立辅助回归模型** 将 \( X_j \) 对其他所有自变量进行回归,即: \[ X_j = c_0 + c_1X_{(j-1)} + c_2X_{(j+1)} + \ldots + c_kX_k + u \] 2. **提取决定系数 \( R^2_j \)** 计算上述辅助回归模型的决定系数 \( R^2_j \),这反映了 \( X_j \) 可以被其余自变量解释的比例。 3. **计算 VIF** 使用公式: \[ \text{VIF}_j = \frac{1}{1 - R^2_j} \] 如果 \( R^2_j \) 接近于 1,则表明 \( X_j \) 和其他自变量间具有较强的线性关系,此时对应的 VIF 值会很大;反之亦然。 --- ### Python 实现代码示例 以下是基于 `statsmodels` 库实现 VIF 计算的具体代码片段: ```python import pandas as pd from statsmodels.stats.outliers_influence import variance_inflation_factor from statsmodels.tools.tools import add_constant # 构造数据框 df (这里仅作为示意) df = pd.DataFrame({ 'X1': [1, 2, 3, 4], 'X2': [2, 4, 6, 8], # 高度相关的列 'X3': [5, 7, 9, 11] }) # 添加常数项以便后续计算 df_with_const = add_constant(df) # 初始化存储结果的数据帧 vif_data = pd.DataFrame() vif_data["Variable"] = df_with_const.columns # 计算每个变量的 VIF 并存入 DataFrame 中 vif_data["VIF"] = [ variance_inflation_factor( df_with_const.values, i ) for i in range(df_with_const.shape[1]) ] print(vif_data) ``` 运行此脚本后可以得到各变量及其对应 VIF 值组成的表格形式输出。 --- ### 解释 VIF 在回归模型中的作用 通过观察各个预测器的 VIF 值可以帮助识别哪些输入特征可能引起过多冗余信息或干扰最终结论准确性的问题所在。一旦发现某些特定字段具备异常高的数值表现出来之后就可以考虑采取相应措施加以改进比如移除那些贡献较小却容易引发冲突矛盾之处重新调整整体结构布局等等方式达到优化目的提升整个系统的性能水平同时增强可读性和易维护特性等方面优势明显可见一斑[^1][^2].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值