是否有可能将Rpply与R中的一个约束结合起来?

时间:2013-02-02 01:03:48

标签: r

我正在使用不同的型号,然后我想从包车中计算出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)

1 个答案:

答案 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))) < 2vif使用的标准,请参阅getAnywhere(vif.lm)