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

Extract Adj R Square from a list of lm results

我已经使用 50 个预测变量为单个结果变量创建了超过 200 万个回归模型的组合。其中大部分都是无稽之谈——我想消除所有调整后的 R 方 (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)] 

这可行,但它看起来很丑陋且效率低下。似乎应该有一种优雅的方式来使用其中一个应用命令(lapply,sapply),但问题是双重的。首先,AR2 实际上不是正常 lm 结果的一部分——我必须使用 "summary" 来获得 AR2。其次,存在子集问题,因为这是一个列表列表。我不能只提取摘要,然后从中获取 AR2,使用 bb <- lapply(b, 摘要) - 我将不得不使用类似的东西 bb <- lapply(b, 摘要[[]]) 但当然 R 不喜欢那样。

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

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

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