我有一个包含许多变量的数据框。我想应用线性回归来解释最后一个与其他人。因此,我不得不写很多东西,我想到创建一个带有独立变量的字符串,例如: 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
解释为一个独立变量。
答案 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
函数本身将通过使用上面的第一个代码来实现。