多重共线性检验-方差膨胀系数(VIF)

 

  方差膨胀系数(variance inflation factor,VIF)是衡量多元线性回归模型中复 (多重)共线性严重程度的一种度量。它表示回归系数估计量的方差与假设自变量间不线性相关时方差相比的比值。

  多重共线性是指自变量之间存在线性相关关系,即一个自变量可以是其他一个或几个自变量的线性组合。若存在多重共线性,计算自变量的偏回归系数时矩阵不可逆。其表现主要有:整个模型的方差分析结果与各个自变量的回归系数的检验结果不一致,专业判断有统计学意义的自变量检验结果却无意义,自变量的系数或符号与实际情况严重不符等。
检验方法主要有:容忍度(Tolerance)和方差膨胀系数(Variance inflation factor,VIF)。其中最常用的是VIF,计算公式为:
VIF的取值大于1。VIF值越接近于1,多重共线性越轻,反之越重。当多重共线性严重时,应采取适当的方法进行调整  [3]  。容忍度的值界于0至1之间,当容忍度值较小时,表示此自变量与其他自变量之间存在共线性。容忍度这个变量回归系数的估计值不够稳定,则回归系数的计算值也会有很大误差。方差膨胀系数是容忍度的倒数,VIF越大,表示自变量的容忍度越小,越有共线性问题。
  通常以10作为判断边界。当VIF<10,不存在多重共线性;当10<=VIF<100,存在较强的多重共线性;当VIF>=100, 存在严重多重共线性。

import numpy as np
from sklearn.linear_model import LinearRegression

coef0=np.array([5,6,7,8,9,10,11,12])
X1=np.random.rand(100,8)
y=np.dot(X1,coef0)+np.random.normal(0,1.5,size=100)
training=np.random.choice([True,False],p=[0.8,0.2],size=100)
lr1=LinearRegression()
lr1.fit(X1[training],y[training])
# 系数的均方误差MSE
print(((lr1.coef_-coef0)**2).sum()/8)
# 测试集准确率(R2)
print(lr1.score(X1[~training],y[~training]))


X2=np.column_stack([X1,np.dot(X1[:,[0,1]],np.array([1,1]))+np.random.normal(0,0.05,size=100)])
X2=np.column_stack([X2,np.dot(X2[:,[1,2,3]],np.array([1,1,1]))+np.random.normal(0,0.05,size=100)])
X3=np.column_stack([X1,np.random.rand(100,2)])

import matplotlib.pyplot as plt
clf=LinearRegression()
vif2=np.zeros((10,1))
for i in range(10):
tmp=[k for k in range(10) if k!=i]
clf.fit(X2[:,tmp],X2[:,i])
vifi=1/(1-clf.score(X2[:,tmp],X2[:,i]))
vif2[i]=vifi

plt.figure()
ax = plt.gca()
ax.plot(vif2)
#ax.plot(vif3)
plt.xlabel('feature')
plt.ylabel('VIF')
plt.title('VIF coefficients of the features')
plt.axis('tight')
plt.show()

转载于:https://www.cnblogs.com/liu-304711/p/10945717.html

### 如何在MATLAB中计算VIF(方差膨胀因子) #### 计算原理 方差膨胀因子 (Variance Inflation Factor, VIF) 是衡量多元线性回归模型中自变量之间是否存在多重共线性的指标。当多个自变量彼此高度相关时,这会影响估计系数的标准误差并降低统计检验的有效性。具体而言,VIF定义为: \[ \text{VIF}_j = \frac{1}{1 - R_j^2} \] 其中 \(R_j^2\) 表示第 j 个预测变量对其余所有预测变量做回归得到的决定系数。 对于每一个解释变量都应计算相应的 VIF 值来评估潜在的多重共线性问题[^1]。 #### MATLAB实现过程 以下是用于计算一组数据集中各列作为独立变量对应的VIF值的具体代码片段: ```matlab function vifs = calculate_vif(X) % X is the design matrix with each column as a predictor variable nVars = size(X, 2); vifs = zeros(nVars, 1); for i = 1:nVars % Extract current independent variables and dependent variable y = X(:,i); X_rest = [X(:,1:i-1), X(:,i+1:end)]; % Fit linear model without intercept term to get R-squared value mdl = fitlm(X_rest, y, 'Intercept', false); Rsq_adj = mdl.Rsquared.Adjusted; vifs(i) = 1 / (1 - double(Rsq_adj)); end end ``` 此函数接收设计矩阵 `X` 作为输入参数,并返回一个向量 `vifs`, 它包含了针对每一列特征所计算出来的VIF数值。注意这里采用调整后的\(R^2\)(即adj-),这是因为它更能反映实际情况下增加新因素带来的影响变化程度[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值