使用字符作为线性模型(R)的对象

Using character as an object for linear model (R)

我正在尝试测试移除了不同交互的线性模型,例如

lmtest<-lm(out1~(.)^2 - var4:var5, data=dt1)

我正在测试的交互存储在字符向量 cvect = (var1:var2, var1:var3... 等) 中,我希望使用这些来删除交互。我试过了

lmtest<-lm(out1~(.)^2 - cvect[5], data=dt1)
lmtest<-lm(out1~(.)^2 - noquotes(cvect[5]), data=dt1)
lmtest<-lm(out1~(.)^2 - paste(cvect[5]), data=dt1)

但是这些都不起作用。有没有其他方法可以使这种方法起作用?

我永远无法保持公式转换函数的直截了当,所以我通常将公式构建为字符串。你的情况:

# build formulas as characters
my_formula = paste("out1 ~ (.)^2 -", cvect)
# use like this:
lmtest(as.formula(my_formula[1]), data = dt1)

这是一个可重现的例子:

var_names <- names(iris)[-5]
model_list <- lapply(var_names,function(x) lm(paste0('Sepal.Length~Species:',x),data=iris))

您可以将模型输出实现为 model_list[[1]]

您可以构建完整模型,然后依次更新减去 cvec 的每个值。对象 mods 具有每个模型的新版本,删除了一个值 cvec

set.seed(4391)
X <- matrix(rnorm(500), ncol=5)
colnames(X) <- paste0("X", 1:5)
b <- runif(5, -2,2)
yhat <- X %*% b
y <- yhat + rnorm(100, sd=2)
dat <- as.data.frame(X)
dat$y <- y
mod <- lm(y ~ (.)^2, data=dat)
cvec <- c("x1:x2", "x2:x3", "x3:x4")
mods <- lapply(cvec, function(z)
  update(mod, as.formula(paste0(". ~ . -", z))))