在 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
函数本身会使用上面的第一个代码来完成。
我有一个包含许多变量的数据框。我想应用线性回归来解释最后一个与其他人的关系。因此,由于我不得不写很多东西,所以我考虑过使用自变量创建一个字符串,例如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
函数本身会使用上面的第一个代码来完成。