在 lm 函数中使用自变量字符串

Use string of independent variables within the lm function

我有一个包含许多变量的数据框。我想应用线性回归来解释最后一个与其他人的关系。因此,由于我不得不写很多东西,所以我考虑过使用自变量创建一个字符串,例如Var1 + Var2 +...+ VarK。我使用以下代码实现了将“+”粘贴到除最后一个以外的所有列名:

ExVar <- toString(paste(names(datos)[1:11], "+ ", collapse = ''))

我还必须删除最后一个“+”:

ExVar <- substr(VarEx, 1, nchar(ExVar)-2)

所以我在 lm() 函数中复制并粘贴了 ExVar 字符串,结果如下所示:

m1 <- lm(calidad ~ Var1 + Var 2 +...+ Var K)

问题是:有没有什么方法可以在 lm() 函数中将 "ExVar" 作为字符串而不是变量来使用,以获得更简洁的代码?

为了更好地理解:

如果我使用此代码:

m1 <- lm(calidad ~ ExVar)

ExVar解释为自变量。

以下将产生相同的结果。我提供了多种方法,因为有更简单的方法可以完成您的要求(参见示例 2 和 3),而不是将表达式写成字符串。

首先,我将生成一些示例数据:

n <- 100
p <- 11
dat <- array(rnorm(n*p),c(n,p))

dat <- as.data.frame(dat)
colnames(dat) <- paste0("X",1:p)

如果您真的想将模型指定为字符串,此示例代码将有所帮助:

ExVar <- toString(paste(names(dat[2:11]), "+ ", collapse = ''))
ExVar <- substr(ExVar, 1, nchar(ExVar)-3)
model1 <- paste("X1 ~ ",ExVar) 
fit1 <- lm(eval(parse(text = model1)),data = dat)

否则,请注意 'dot' 表示法会将模型中的所有其他变量指定为预测变量。

fit2 <- lm(X1 ~ ., data = dat)

或者,如果您的数据结构为矩阵,您可以 select 按列显示预测变量和结果变量。

dat <- as.matrix(dat)
fit3 <- lm(dat[,1] ~ dat[,-1])

这三个拟合对象都具有相同的估计值:

fit1
fit2
fit3

如果你有一个数据框,并且你想用所有其他的来解释最后一个,那么你可以使用下面的代码:

 lm(calidad~.,dat)

或者您可以使用

 lm(rev(dat))#Only if the last column is your response variable

以上两项中的任何一项都会为您提供所需的结果。

按您的方式进行:

 EXV=as.formula(paste0("calidad~",paste0(names(datos)[-12],collapse = '+')))
 lm(EXV,dat)

没有必要这样做,因为 lm 函数本身会使用上面的第一个代码来完成。