从 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)
您只需向它传递一个函数,告诉它您要保留哪些对象以及要过滤的项目的列表。
我已经使用 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)
您只需向它传递一个函数,告诉它您要保留哪些对象以及要过滤的项目的列表。