- 积分
- 763
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2012-12-18
- 最后登录
- 1970-1-1
|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
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) #返回值
}
|
|