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

问题描述 投票:1回答:2

我有一个包含许多变量的数据框。我想应用线性回归来解释最后一个与其他人。因此,我不得不写很多东西,我想到创建一个带有独立变量的字符串,例如: 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解释为一个独立变量。

r regression linear-regression lm
2个回答
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)

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

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

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

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

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

fit1
fit2
fit3

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

© www.soinside.com 2019 - 2024. All rights reserved.