写在前面
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/(1−R2)
假如现在的因变量为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不管怎么样,最后计算的结果根据自变量来计算结果。同时要记住,建立回归方程不能存在自变量和因变量一样。
承认:这个只是本人的一个测试,同时也是我的一个猜想,可能存在不对的地方,具体的结论还需要深入内部,看内部代码!