将变量向量传递给lm()公式

时间:2012-02-11 05:23:22

标签: 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", 
                    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)

我是R的新手,仍然没有落后于陡峭的学习曲线,所以为明显的编程错误道歉。

6 个答案:

答案 0 :(得分:56)

你快到了。您只需要paste 整个公式,如下所示:

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

使用as.formula将其强制转换为实际公式,然后将 传递给lm。从技术上讲,我认为lm可能会强制使用字符串本身,但是自己强迫它通常更安全。 (一些期望公式的函数不会为你做强制,其他函数会。)

答案 1 :(得分:18)

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

b <- paste(OAW0$names.kept, collapse="+")

然后你可以把它放在joran回答中

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

或只是使用:

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

答案 2 :(得分:8)

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

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

这假设您在第一列中有类变量或因变量,但索引可以很容易地切换到最后一列:

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

然后继续lm使用:

bestp.OAW0.r060 <- lm(frmla , data = modelready, ... )

答案 3 :(得分:1)

如果你正在寻找一些不那么冗长的东西:

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

答案 4 :(得分:0)

只是为了基于函数简化和收集以上答案

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)

答案 5 :(得分:0)

我在类似情况下使用的一个技巧是对数据进行子集化并简单地使用例如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)