1

さまざまなモデルをフィッティングしていますが、パッケージカーから VIF を計算したいと思います。VIF では、式に複数のリグレッサーが必要なため、エラーが返されます。アイデアは、関数を実行する前に複数のリグレッサーがあるかどうかを確認することです。または、リグレッサーの数でモデルを並べ替えて、VIF 関数が i 番目の位置からのみ呼び出されるようにすることもできます。

私のコードは次のとおりです。

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))) < 2いることに注意してください。 を参照してください。vifgetAnywhere(vif.lm)

于 2013-02-02T01:44:16.143 に答える