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

Ana*_*and 43 r paste lm

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

基本上我试图fastbw()rms包中逐步选择变量.我想将选择的变量列表传递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)
Run Code Online (Sandbox Code Playgroud)

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

jor*_*ran 58

你快到了.你只需要paste整个配方一起,像这样:

paste("roll_pct ~ ",b,sep = "")
Run Code Online (Sandbox Code Playgroud)

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


cco*_*ell 21

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

b <- paste(OAW0$names.kept, collapse="+")
Run Code Online (Sandbox Code Playgroud)

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

paste("roll_pct ~ ",b,sep = "")
Run Code Online (Sandbox Code Playgroud)

或者只是使用:

paste("roll_pct ~ ",paste(OAW0$names.kept, collapse="+"),sep = "")
Run Code Online (Sandbox Code Playgroud)


dis*_*lus 9

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

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

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

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

然后继续lm使用:

bestp.OAW0.r060 <- lm(frmla , data = modelready, ... )
Run Code Online (Sandbox Code Playgroud)

  • 这个答案已经有将近 3 年的历史了,但非常简单和优雅 - 为我节省了很多时间 - 点赞。 (2认同)