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

时间:2017-12-21 17:53:07

标签: r regression linear-regression lm

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

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

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

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

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

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

问题是:有没有办法在lm()函数中使用“ExVar”作为字符串,而不是变量,以获得更清晰的代码?

为了更好地理解:

如果我使用此代码:

m1 <- lm(calidad ~ ExVar)

它将ExVar解释为一个独立变量。

2 个答案:

答案 0 :(得分:2)

以下都将产生相同的结果。我提供了多种方法,因为有更简单的方法可以执行您所要求的操作(请参阅示例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)

否则,请注意&#39; dot&#39;符号将指定模型中的所有其他变量作为预测变量。

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

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

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

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

fit1
fit2
fit3

答案 1 :(得分:1)

如果您有数据框,并且想要使用所有其余部分解释最后一个,那么您可以使用以下代码:

 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函数本身将通过使用上面的第一个代码来实现。