从leaps regsubsets获取所有模型

3
我使用regsubsets搜索模型。是否可以从参数选择列表自动创建所有的lm
library(leaps)
leaps<-regsubsets(y ~ x1 + x2 + x3, data, nbest=1, method="exhaustive")
summary(leaps)$which
  (Intercept)      x1        x2    x3                                                                                   
1        TRUE   FALSE     FALSE  TRUE                                                                                   
2        TRUE   FALSE      TRUE  TRUE                                                                                   
3        TRUE    TRUE      TRUE  TRUE                                                                                   

现在我需要手动执行model_1 <- lm(y ~ x3)等操作。如何自动化这个过程并将它们放入列表中?

1个回答

5

我不知道为什么您需要所有模型的列表。使用summarycoef方法应该可以满足您的需求。但是我将首先从纯编程角度回答您的问题,然后再回到这一点。


一个简单的方法是使用reformulate

reformulate(termlabels, response = NULL, intercept = TRUE)

以下是方法:

步骤如下:

## you are masking `leaps` and `data` function!!
leaps <- regsubsets(y ~ x1 + x2 + x3, data, nbest = 1, method = "exhaustive")
X <- summary(leaps)$which

xvars <- dimnames(X)[[2]][-1]  ## column names (all covariates except intercept)
responsevar <- "y"  ## name of response

lst <- vector("list", dim(X)[1])  ## set up an empty model list

## loop through all rows / model specifications
for (i in 1:dim(X)[1]) {
  id <- X[i, ]
  form <- reformulate(xvars[which(id[-1])], responsevar, id[1])
  lst[[i]] <- lm(form, data)
  }

不需要使用*apply解决方案。lm成本高,因此for循环根本没有开销。


更快的方法是设置一个包含所有协变量的模型矩阵,并动态选择其列(使用模型矩阵的assign属性;特别适用于因子变量)。模型拟合通过.lm.fit进行。但是,除非你是线性模型专家,否则你将难以使用.lm.fit的原始输出产生模型摘要/预测,但我认为summary(leaps)应该已经返回了各种有用的统计信息。

leaps:::coef.regsubsets函数是这个.lm.fit路线的等效物。只需执行:

coef(leaps, 1:dim(X)[1], TRUE)

你将会得到所有模型的系数和方差协方差矩阵。


问题在于交互项......这些项并未明确地作为变量名出现在模型中。 - igorkf
很好,有没有一种方法可以获取所有模型的所有regsubsets的MSE? - User123456789

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接