我使用了50个预测变量为单个结果变量创建了超过200万个回归模型的组合。其中大部分都是无稽之谈 - 我想要消除调整后的R-Square(AR2)低于0.7的所有模型,其成员的vif> 4(来自汽车包)。我首先创建了所有模型的列表(b),然后在第二步中,使用for / if循环消除所有符合我标准的模型,创建第二个对象(bb)。这是第二步:
### Create the filtered list
mlen <- length(b)
for (i in 1:mlen) {
if(summary(b[[i]])$adj.r.squared > .7 & all(vif(b[[i]]) <4)) {
bb[i]<-b[i]
}
}
### Get rid of all of the null results
bb <- bb[!sapply(bb, is.null)]
这很有效,但看起来很丑陋而效率低下。看起来应该有一种优雅的方式来使用其中一个apply命令(lapply,sapply),但问题是双重的。首先,事实上AR2实际上并不是正常lm结果的一部分 - 我必须使用&#34;摘要&#34;获得AR2。其次,存在子集化问题,因为这是列表列表。我不能只提取摘要,并从中获取AR2,使用 bb&lt; - lapply(b,摘要) - 我必须使用类似的东西 bb&lt; - lapply(b,summary [[]]) 但当然R并不喜欢这样。
答案 0 :(得分:2)
听起来像Filter()
可以派上用场了
bb <- Filter(function(x) {
summary(x)$adj.r.squared > .7 & all(vif(x) <4)
}, b)
你只需传递一个函数来告诉它你想要保留哪些对象,以及列表中你想要过滤的项目。