R 将变量向量传递到lm()公式中

R 将变量向量传递到lm()公式中,r,paste,lm,R,Paste,Lm,我试图自动化我的一段代码,这样编程就不那么乏味了 基本上,我尝试使用rms包中的fastbw()逐步选择变量。我想将fastbw()选择的变量列表作为y~x1+x2+x3传递到一个公式中,“x1”“x2”“x3”是fastbw()选择的变量列表 这是我试过但不起作用的代码 olsOAW0.r060 <- ols(roll_pct~byoy+trans_YoY+change18m, subset= helper=="POPNOAW0_r060",

我试图自动化我的一段代码,这样编程就不那么乏味了

基本上,我尝试使用rms包中的
fastbw()
逐步选择变量。我想将
fastbw()
选择的变量列表作为
y~x1+x2+x3
传递到一个公式中,“x1”“x2”“x3”是
fastbw()选择的变量列表

这是我试过但不起作用的代码

olsOAW0.r060 <- ols(roll_pct~byoy+trans_YoY+change18m, 
                    subset= helper=="POPNOAW0_r060", 
                    na.action = na.exclude, 
                    data = modelready)

OAW0 <- fastbw(olsOAW0.r060, rule="p", type="residual", sls= 0.05)

vec <- as.vector(OAW0$names.kept, mode="any")

b <- paste(vec, sep ="+") ##I even tried b <- paste(OAW0$names.kept, sep="+")

bestp.OAW0.r060 <- lm(roll_pct ~ b , 
                      data = modelready, 
                      subset = helper =="POPNOAW0_r060",    
                      na.action = na.exclude)

olsOAW0.r060你就快到了。您只需将整个公式粘贴在一起,如下所示:

paste("roll_pct ~ ",b,sep = "")

使用
as.formula
将其强制为实际公式,然后将其传递给
lm
。从技术上讲,我认为
lm
可以强制执行字符串本身,但强制执行通常更安全。(一些期望公式的函数不会对您进行强制,其他函数会。)

在定义b时,您实际上需要使用collapse而不是seb

b <- paste(OAW0$names.kept, collapse="+")
或者直接使用:

paste("roll_pct ~ ",paste(OAW0$names.kept, collapse="+"),sep = "")

我今天遇到了类似的问题,如果您想让它更通用,甚至不必有固定的类名,您可以使用

frmla <- as.formula(paste(colnames(modelready)[1], paste(colnames(modelready)[2:ncol(modelready)], sep = "", 
                              collapse = " + "), sep = " ~ "))

如果您正在寻找不那么冗长的内容:

fm <- as.formula( paste( colnames(df)[i], ".", sep=" ~ ")) 
                                      # i is the index of the outcome column

fm只是基于函数简化和收集上述答案

my_formula<- function(colPosition, trainSet){
    dep_part<- paste(colnames(trainSet)[colPosition],"~",sep=" ")
    ind_part<- paste(colnames(trainSet)[-colPosition],collapse=" + ")
    dt_formula<- as.formula(paste(dep_part,ind_part,sep=" "))
    return(dt_formula)
}

我在类似情况下使用的一个技巧是将数据子集,并简单地使用例如
lm(dep_var~,data=your_data)

范例

data(mtcars)
ind_vars <- c("mpg", "cyl")
dep_var <- "hp"

temp_subset <- dplyr::select(mtcars, dep_var, ind_vars)

lm(hp ~., data = temp_subset)
数据(mtcars)

ind_vars JJoran,谢谢,我仍然有错误。请查看hpi@user1199861,您在第二行的引号中添加了
hpi
。在控制台中键入
hpi.form
,您将看到这是错误的。Joran,再次感谢您,我认为lm()并没有将对象“hpi”强制作为字符串写入公式中。当我尝试将变量键入lm()公式时,它worked@user1199861不,你把它粘错了。您写道:
粘贴(“roll\u pct~”,“hpi”,sep=”“)
,而不是我在回答中指出的
粘贴(“roll\u pct~”,hpi,sep=“”)
。@Peter.k是的,
aggregate
是您需要通过
as.formula
强制执行的一种情况。这个答案已经使用了将近3年,但非常简单和优雅,并且节省了我很多时间。
fm <- as.formula( paste( colnames(df)[i], ".", sep=" ~ ")) 
                                      # i is the index of the outcome column
getFormula<-function(target, df) {

  i <- grep(target,colnames(df))
  as.formula(paste(colnames(df)[i], 
                   ".", 
                   sep = " ~ "))
}
fm <- getFormula("myOutcomeColumnName", myDataFrame)
rp <- rpart(fm, data = myDataFrame) # Use the formula to build a model
my_formula<- function(colPosition, trainSet){
    dep_part<- paste(colnames(trainSet)[colPosition],"~",sep=" ")
    ind_part<- paste(colnames(trainSet)[-colPosition],collapse=" + ")
    dt_formula<- as.formula(paste(dep_part,ind_part,sep=" "))
    return(dt_formula)
}
my_formula( dependent_var_position, myTrainSet)
data(mtcars)
ind_vars <- c("mpg", "cyl")
dep_var <- "hp"

temp_subset <- dplyr::select(mtcars, dep_var, ind_vars)

lm(hp ~., data = temp_subset)