我正在使用不同的型号,然后我想从包车中计算出VIF。 VIF在公式中需要多个回归量,因此返回错误。这个想法是在运行函数之前检查是否有多个回归量。或者,我可以尝试按回归量的数量对模型进行排序,这样只能从第i个位置调用VIF函数。
我的代码是:
ctl <- c(4.17,5.58,5.18,6.11,4.50,4.61,5.17,4.53,5.33,5.14)
trt <- c(4.81,4.17,4.41,3.59,5.87,3.83,6.03,4.89,4.32,4.69)
ot=rnorm(length(trt))
ot2=rnorm(length(trt))
DF=as.data.frame(cbind(ot,ot2,ctl,trt))
y=colnames(DF[1])
x = colnames(DF)
x = x[! x %in% y]
n = length(x)
id = unlist(
lapply(1:n,
function(i)combn(1:n,i,simplify=F)
)
,recursive=F)
models = sapply(id,function(i)
paste(y,paste(x[i],collapse="+"), sep="~")
)
allModelsResults=lapply(models, function(i)
lm(as.formula(i), data=DF))
library(car)
vif.r=sapply(allModelsResults,vif)
答案 0 :(得分:3)
这有效:
sapply(allModelsResults,
function(mod) if (length(labels(terms(mod))) < 2) NA else vif(mod))
# [[1]]
# [1] NA
#
# [[2]]
# [1] NA
#
# [[3]]
# [1] NA
#
# [[4]]
# ot2 ctl
# 1.157776 1.157776
#
# [[5]]
# ot2 trt
# 1.439415 1.439415
#
# [[6]]
# ctl trt
# 1.264959 1.264959
#
# [[7]]
# ot2 ctl trt
# 1.47575 1.29689 1.61237
请注意,length(labels(terms(mod))) < 2
是vif
使用的标准,请参阅getAnywhere(vif.lm)
。