从lm结果列表中提取Adj R Square

时间:2016-03-23 02:05:18

标签: r lm sapply

我使用了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实际上并不是正常l​​m结果的一部分 - 我必须使用&#34;摘要&#34;获得AR2。其次,存在子集化问题,因为这是列表列表。我不能只提取摘要,并从中获取AR2,使用     bb&lt; - lapply(b,摘要)   - 我必须使用类似的东西     bb&lt; - lapply(b,summary [[]])  但当然R并不喜欢这样。

1 个答案:

答案 0 :(得分:2)

听起来像Filter()可以派上用场了

bb <- Filter(function(x) {
    summary(x)$adj.r.squared > .7 & all(vif(x) <4)
}, b)

你只需传递一个函数来告诉它你想要保留哪些对象,以及列表中你想要过滤的项目。