r-将变量向量传递到km()公式中

我试图使我的代码片段自动化,以使编程变得不再那么乏味。

基本上,我试图使用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语言的新手,但仍然没有走过陡峭的学习曲线,因此,对明显的编程失误表示歉意。

Anand asked 2020-08-01T16:08:26Z
5个解决方案
58 votes

您快到了。 您只需要将整个公式2992991281283047662592在一起,就像这样:

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

使用2992391283047667662将其强制转换为实际公式,然后将其传递给lm。从技术上讲,我认为lm可以强制转换字符串本身,但通常自己进行强制转换更安全。 (某些期望公式的函数不会为您提供强制性,其他函数则可以。)

joran answered 2020-08-01T16:08:49Z
20 votes

定义b时,实际上需要使用折叠而不是seb。

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

然后你可以把它放在乔兰答案

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

或仅使用:

paste("roll_pct ~ ",paste(OAW0$names.kept, collapse="+"),sep = "")
cconnell answered 2020-08-01T16:09:17Z
9 votes

我今天遇到了类似的问题,如果您想使其更通用,甚至不需要固定的类名,则可以使用

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, ... )
discipulus answered 2020-08-01T16:09:47Z
1 votes

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

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
Travis Heeter answered 2020-08-01T16:10:11Z
0 votes

只是为了基于功能简化和收集以上答案

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)
user3169330 answered 2020-08-01T16:10:36Z
translate from https://stackoverflow.com:/questions/9238038/pass-a-vector-of-variables-into-lm-formula