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


    写在前面
    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不管怎么样,最后计算的结果根据自变量来计算结果。同时要记住,建立回归方程不能存在自变量和因变量一样。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84

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

  • 相关阅读:
    设计模式 实践案例
    QT+OSG/osgEarth编译之四十五:osgViewer+Qt编译(一套代码、一套框架,跨平台编译,版本:OSG-3.6.5核心库osgViewer)
    恭喜获奖得主 | 互动有礼获赠 Navicat Premium
    找不到concrt140.dll无法继续执行此代码的解决方法总结,快速解决dll问题的5种方法
    diskgenius数据恢复软件,亲测可用!
    测试面试精选题:可用性测试主要测试哪些方面,举例说明
    Netty之I/O模型
    [如何编译openGauss对应版本的wal2json.so]
    React 入门:组件实例三大属性之props
    React常见面试题
  • 原文地址:https://blog.csdn.net/qq_45697428/article/details/127579020