【问题标题】:Pass a vector of variables into lm() formula将变量向量传递给 lm() 公式
【发布时间】:2012-03-03 12:40:02
【问题描述】:

我试图自动化我的一段代码,以便让编程变得不那么乏味。

基本上,我试图使用 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 新手,但还没有经历过陡峭的学习曲线,因此对于明显的编程错误深表歉意。

【问题讨论】:

    标签: r paste lm


    【解决方案1】:

    你快到了。你只需要将paste整个公式组合在一起,如下所示:

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

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

    【讨论】:

    • JJoran,谢谢,我仍然有错误。请看一下 hpi model.frame.default 中的错误(公式 = as .formula(paste("roll_pct~", "hpi",:variable lengths different (found for 'hpi')
    • @user1199861 您将hpi 放在第二行的引号中。在控制台输入hpi.form,你就会明白为什么会这样了。
    • Joran,再次感谢,我认为 lm() 不会将对象“hpi”作为字符串强制转换为公式。当我尝试在 lm() 公式中输入变量时,它起作用了
    • @user1199861 不,你把它贴错了。您写的是:paste("roll_pct~", "hpi", sep = ""),而不是我在回答中指出的paste("roll_pct~", hpi, sep = "")
    • @Peter.k 是的,aggregate 是您需要通过as.formula 自己强制执行的情况之一。
    【解决方案2】:

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

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

    然后你可以把它放在joran answer中

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

    或者直接使用:

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

    【讨论】:

      【解决方案3】:

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

      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 年的历史了,但非常简单和优雅——为我节省了很多时间——点赞。
      【解决方案4】:

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

      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
      

      【讨论】:

        【解决方案5】:

        只是为了简化和收集上面的答案,基于一个函数

        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)
        

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 2017-10-25
            • 1970-01-01
            • 2023-02-24
            • 2020-02-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多