爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7331|回复: 1

R计算方差膨胀因子——回归分析变量共线性诊断的一个方法

[复制链接]
发表于 2015-6-5 13:37:10 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 zhouyuanshen 于 2015-6-5 16:47 编辑

R似乎没有现成做Variance Inflation Factor分析的包,以前有个间接的包,后来不能用了。想想根据定义自己搞了一个。

计算结果与SPSS的分析结果进行过对比,没有友好提示,需要严格遵守参数传递。

假设有数据集 命名为  env,在这个数据集下面有Global, Direct,Diffuse,Temp,Rain等指标,需要计算这些指标间是否存在共线性。
调用函数如下:

VIF(c("Global","Direct","Diffuse","Temp","Rain"),"env")

供参考使用!PS:在R中需要先运行函数体,才能调用。

原来这里没有R代码的识别,希望坛主增加一个
# 方差膨胀因子(VIF)计算函数
# 20150605
# By qingyi1207@126.com
# 方差膨胀因子计算公式及定义见:http://en.wikipedia.org/wiki/Variance_inflation_factor
# 需要传入拟比较的变量和所在的数据集
VIF <- function(variable,data){  
  var.nums <- length(variable)                 #获取变量个数
  vif.table <- matrix(,nrow=var.nums,ncol=2)   #声明一个矩阵,用于返回计算结果

  for(i in 1:var.nums)                        #循环计算各个变量的VIF
    {
    #以下部分用于对字符串进行拼接,用于执行lm()函数。代码并不是最优。   
      text=""
      for(ii in variable[-i])
      {
        text=paste(text,ii,sep="+")
      }

      text=paste(text, ",data=",sep="")
      text=paste(text,data,sep="")
      text=paste(variable,substr(text, 2, nchar(text)),sep="~")      
      text=paste("temp.lm <- lm(",text,sep="")
      text=paste(text,")",sep="")
    #字符串拼接结束。  
      eval(parse(text=text))                #执行lm()
      temp.d <- summary(temp.lm)            #取得r2所在数据集

vif.table[i,1] <- variable         #标明变量
      vif.table[i,2] <- round(1/(1-temp.d$r.squared),2) #给出具体的数字,显示两位小数  
  }

  colnames(vif.table) <- c("Var.", "VIF")   #给表格Header
  vif.table <- as.data.frame(vif.table)     #转化为数据框
  return(vif.table)                         #返回值
}
密码修改失败请联系微信:mofangbao
发表于 2015-6-5 14:42:26 | 显示全部楼层
不错不错~~~~~~~~~
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

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

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

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