当前位置: 首页 > 工具软件 > VIF > 使用案例 >

R语言中做VIF分析的问题探索

喻元龙
2023-12-01

写在前面
To perform VIF analysis on multiple factors in the R language, do I have to specify the dependent and independent variables?
这是我想问的问题。

即当在R中做VIF检验时候能不能不要因变量,只要自变量。我这样问的原因是:我有一组变量,我想剔除其相关性比较大的变量,但是在R中进行分析时,要先设置一个回归函数。在默认的情况下,第一个变量就变成了因变量,其他变量就变成了自变量。这我认为的VIF的原理不一样呀!

VIF原理

方差膨胀因子(Variance Inflation Factor, VIF),可以表征自变量之间的共线性程度,它的大小可以反映出自变量的观察值之间是否存在复共线性以程度。
一、用VIF来检测共线性
VIF的计算公式为: ,其中 是多个解释变量辅助回归的可决系数,举个例子:

V I F = 1 / ( 1 − R 2 ) VIF = 1/{}(1-R^2) VIF=1/(1R2)

假如现在的因变量为y,自变量有A、B和C,假设A和B和C之间存在共线性,我们想把他们找出来,就可以使用VIF来测算。具体的做法是:单独把A和B和C拎出来,做回归。

把A作为因变量,B和C作为自变量,做一次回归,可以算得该回归方程的 ,进而得到变量A的VIF ;
把B作为因变量,A和C作为自变量,做一次回归,可以算得该回归方程的 ,进而得到变量B的VIF;
变量C同理,可以得到变量C的VIF.

参考文献:使用方差膨胀因子(Variance Inflation Factor)来特征选择

问题:如果正如上面说的一样,第一个因变量应该也有vif值呀,然而在计算过程中因变量根本没有VIF值。

经过本人深入研究

[1] VIF方法(方差膨胀因子)因子独立性检验 全流程解读

[2] vif: Variance Inflation Factors

[3]Computing Variance Inflation Factor VIF in R Studio

无果后,

灵光一现,先上结论哈:vif中首先要有个回归,但回归是y不管怎么样,最后计算的结果根据自变量来计算结果。同时要记住,建立回归方程不能存在自变量和因变量一样。

语言比较可能难以理解,直接上代码:

library(dplyr)
library(ggplot2)
library(caret)
library(car)
library(tidyverse)

getwd()

incsv <- read.csv("C:\\Users\\xiaye\\Desktop\\zone_analyse\\workspace\\zone_analyse\\VIF\\bio19_con.csv")


indf <- data.frame(incsv)


summary(indf) # 得到特征值的

indf[indf=='-9999'] <- NA
indf=na.omit(indf)



# 解决方法

# way 1
vif(lm(bio1 ~ bio2 + bio3 +bio4 , data=indf), type="predictor")

vif(lm(bio2 ~ bio1 + bio3 +bio4 , data=indf), type="predictor")

vif(lm(bio3 ~ bio1 + bio2 +bio4 , data=indf), type="predictor")

vif(lm(bio4 ~ bio1 + bio2 +bio3 , data=indf), type="predictor")

# way2 
vif(lm(bio1 ~ bio2 + bio3 +bio4 , data=indf), type="terms")

vif(lm(bio2 ~ bio1 + bio3 +bio4 , data=indf), type="terms")

vif(lm(bio3 ~ bio1 + bio2 +bio4 , data=indf), type="terms")

vif(lm(bio4 ~ bio1 + bio2 +bio3 , data=indf), type="terms")

# way 3
vif(lm(bio1 ~ bio1 + bio3 +bio4 , data=indf))

vif(lm(bio1 ~ bio1 + bio3 +bio4 , data=indf))

vif(lm(bio3 ~ bio1 + bio2 +bio4 , data=indf))

vif(lm(bio4 ~ bio1 + bio2 +bio3 , data=indf))


# > vif(lm(bio11 ~ bio1 + bio3 +bio4 , data=indf))
# bio1     bio3     bio4 
# 7.918207 3.436049 6.910886 
# > 
#   > vif(lm(bio12 ~ bio1 + bio3 +bio4 , data=indf))
# bio1     bio3     bio4 
# 7.918207 3.436049 6.910886 
# > vif(lm(bio18 ~ bio1 + bio3 +bio4 , data=indf))
# bio1     bio3     bio4 
# 7.918207 3.436049 6.910886 
# > 
#   > vif(lm(bio16 ~ bio1 + bio3 +bio4 , data=indf))
# bio1     bio3     bio4 
# 7.918207 3.436049 6.910886 
# > View(indf)
# > View(indf)
# > vif(lm(grid_code ~ bio1 + bio3 +bio4 , data=indf))
# bio1     bio3     bio4 
# 7.918207 3.436049 6.910886 
# Warning message:
#   In summary.lm(object, ...) :
#   essentially perfect fit: summary may be unreliable
# > 
#   > vif(lm(grid_code ~ bio1 + bio3 +bio4 , data=indf))
# bio1     bio3     bio4 
# 7.918207 3.436049 6.910886
# > vif(lm(bio1 ~ bio1 + bio3 +bio4 , data=indf))
# GVIF Df GVIF^(1/(2*Df))
# bio1 2.900571  0             Inf
# bio3 2.900571  1        1.703106
# bio4 2.900571  1        1.703106

#总结:vif中首先要有个回归,但回归是y不管怎么样,最后计算的结果根据自变量来计算结果。同时要记住,建立回归方程不能存在自变量和因变量一样。

承认:这个只是本人的一个测试,同时也是我的一个猜想,可能存在不对的地方,具体的结论还需要深入内部,看内部代码!

 类似资料: