R:使用模式匹配从模型摘要列表中提取值

R: Extracting values from list of model summaries using pattern matching

我有一个模型摘要列表(假设它是一个线性模型;但这可以适用于任何模型摘要)。

目前,我正在使用以下方法从此摘要列表中提取某个系数:

coef <- sapply(modelsummaries, function(x) x[[4]][[4,1]])

如何通过调用变量名而不是依赖行位置来做到这一点?

对于列表中的每个模型摘要,只有一个变量不同,命名为V_01、V_02、V_03等。这是我想要的变量系数喜欢提取。

我正在考虑使用 grep 函数,例如:

coef <- sapply(modelsummaries, function(x) x[[4]][[grep("^[V]"),1]]) 

...但还没有成功。有什么建议吗?

这是一个可重现的例子(只需要调整最后一行):

newdata <- as.data.frame(seq(from = 0.1, to = 0.9, by = 0.1))
newdata <- as.data.frame(t(newdata))
colnames(newdata) = newdata[1, ]
colnames(newdata) <- paste("V", colnames(newdata), sep = "_")

mtcars <- mtcars
mtcarsmodel <- data.frame(mtcars, newdata)

mtcarsmodel[c(12:20)] <- sample(1:100, 288, replace=TRUE)

xnam <- paste(colnames(mtcarsmodel)[c(4:5)], sep="")
xnam2 <- paste(colnames(mtcarsmodel)[c(12:20)], sep="") 

fmla <- paste(xnam, collapse= "+")
fmla2 <- paste(paste(fmla), "+")
fla <- paste("mpg ~", paste(fmla2))

models <- lapply(setNames(xnam2, xnam2), function(var) {
  form = paste(fla, var)
  lm(form, data=mtcarsmodel)
})

modelsummaries <-lapply(models, summary)
coef <- sapply(modelsummaries, function(x) x[[4]][[4,1]]) 

在与 grep 解决方案斗争之后,我犯了亵渎罪并改用 sql 解决方案:

library('sqldf')
new <- lapply(modelsummaries, function(x) setDT(data.frame(x[[4]]), keep.rownames = TRUE)[])
values <- sapply(new, function(x) sqldf("SELECT x.estimate, x.'Pr...t..' FROM x WHERE rn like '%V_%'"))
data <- as.data.frame(t(rbind(values)))

我还想出了一个(有点难看的)基于 grep 的解决方案:

coef <- sapply(modelsummaries, function(x) as.numeric(unlist(strsplit(grep("^V_", capture.output(x), value = TRUE), "\s+"))[[2]])) 

你已经很接近了,你只需要告诉 grep 要搜索的内容,这是 coef() 返回的系数矩阵的行名(这是一种比获取它们更好的方法[[4]])。另外,为了不重复使用该名称,我建议将结果保存为不同的名称,例如 coefs.

coefs <- sapply(modelsummaries, function(x) {
  coef(x)[grep("^V", rownames(coef(x))),"Estimate"]
})
       V_0.1        V_0.2        V_0.3        V_0.4        V_0.5        V_0.6        V_0.7        V_0.8 
 0.030927774 -0.053437459  0.009335911 -0.011009187 -0.010303494 -0.001705420 -0.036297492  0.021838044 
       V_0.9 
 0.005457086 

此外,请查看新的 broom 包,它可以更轻松地以整洁的方式从模型中提取某些信息。