R 将变量向量传递到lm()公式中
我试图自动化我的一段代码,这样编程就不那么乏味了 基本上,我尝试使用rms包中的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",
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)