1

我正在拟合不同的模型,然后我想从包车中计算 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)
4

1 回答 1

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))) < 2vif是用作其标准的内容,请参阅getAnywhere(vif.lm)

于 2013-02-02T01:44:16.143 回答