如何遍历变量名列表以将其与lm的更新函数一起使用

时间:2016-03-09 15:16:20

标签: r formula lm

我有一个变量名列表,我希望使用lm中的函数更新从最佳拟合模型中顺序排除。因为变量列表可能会改变,所以我想循环遍历给定的列表但是我无法将列表的元素作为因变量读取。 我找到了一些我认为可行的代码:

示例代码

hsb2 <-read.csv("www.ats.ucla.edu/stat/data/hsb2.csv")
names(hsb2)
varlist <- names(hsb2)[8:11]
models <- lapply(varlist, function(x) {
lm(substitute(read ~ i, list(i = as.name(x))), data = hsb2)
})

但是如果我在之前的lm对象上使用更新功能

words<-c('Age','Sex', 'Residuals')
models <- lapply(words, function(x){update(substitute(
 lmobject,~.-i,list(i = as.name(x))),data =data_complete)})

我也试过

re<-c()
for (i in 1:3) {
lmt<-update(lmobject,~.-words[i])
r2no_i<-summary(lmt)$r.squared
re<-c(re, r2no_i)
}

我认为这很简单,但我无法正确读取变量 任何提示都非常受欢迎

1 个答案:

答案 0 :(得分:0)

内置的stats::drop1()函数是否可以满足您的需求?

读取数据(需要注释"http://..."

hsb2 <- read.csv("http://www.ats.ucla.edu/stat/data/hsb2.csv")
varlist <- names(hsb2)[8:11]

适合所有模型:构建公式列表:

formList <- lapply(varlist,reformulate,response="read")

构建模型(需要一些花哨的步法才能使$call组件看起来正确)

modList <- lapply(formList,
                  function(x) {
                    m <- lm(x,data=hsb2)
                    m$call$formula <- eval(m$call$formula)
                    return(m)
})

words <- c('Age','Sex', 'Residuals')

选择一个合适的模型:

lmobject <- modList[[1]]

构造. ~ . - w

形式的公式
minus_form <- function(w) 
    reformulate(c(".",paste0("-",w)),response=".")

minus_form("abc")  ## . ~ . + -abc

使用删除的术语改装模型:

newMods <- lapply(words,
                  function(w) {
                     update(lmobject,minus_form(w))
              })