找回密码
 立即注册
查看: 5323|回复: 0

R计算VIFVariance Inflation Factor

[复制链接]
发表于 2015-6-5 13:49:27 | 显示全部楼层 |阅读模式
【作者】(必填):青易
【问题描述】(必填):R似乎没有现成做Variance Inflation Factor分析的包,以前有个间接的包,后来不能用了。
【R语言代码】
  1. # 方差膨胀因子(VIF)计算函数
  2. # 20150605
  3. # By qingyi1207@126.com
  4. # 方差膨胀因子计算公式及定义见:http://en.wikipedia.org/wiki/Variance_inflation_factor
  5. # 需要传入拟比较的变量和所在的数据集
  6. VIF <- function(variable,data){  
  7.   var.nums <- length(variable)                 #获取变量个数
  8.   vif.table <- matrix(,nrow=var.nums,ncol=2)   #声明一个矩阵,用于返回计算结果

  9.   for(i in 1:var.nums)                        #循环计算各个变量的VIF
  10.     {
  11.     #以下部分用于对字符串进行拼接,用于执行lm()函数。代码并不是最优。   
  12.       text=""
  13.       for(ii in variable[-i])
  14.       {
  15.         text=paste(text,ii,sep="+")
  16.       }
  17.       
  18.       text=paste(text, ",data=",sep="")
  19.       text=paste(text,data,sep="")
  20.       text=paste(variable[i],substr(text, 2, nchar(text)),sep="~")      
  21.       text=paste("temp.lm <- lm(",text,sep="")
  22.       text=paste(text,")",sep="")
  23.     #字符串拼接结束。  
  24.       eval(parse(text=text))                #执行lm()
  25.       temp.d <- summary(temp.lm)            #取得r2所在数据集
  26.       
  27.       vif.table[i,1] <- variable[i]         #标明变量
  28.       vif.table[i,2] <- round(1/(1-temp.d$r.squared),2) #给出具体的数字,显示两位小数  
  29.   }
  30.   
  31.   colnames(vif.table) <- c("Var.", "VIF")   #给表格Header
  32.   vif.table <- as.data.frame(vif.table)     #转化为数据框
  33.   return(vif.table)                         #返回值
  34. }
复制代码

【代码说明】:VIF(c("TN","TP","COD","Global","Diffuse","Direct"),"env")                          其中前面是变量名称,后面"env"是数据集的名称,都必须要有。
【运行结果】:

计算结果

计算结果

【参考出处】:VIF定义及计算公式:http://en.wikipedia.org/wiki/Variance_inflation_factor
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|R语言中文网

GMT+8, 2024-11-22 12:30 , Processed in 0.043236 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表