我试图自动化一段代码,以便编程变得不那么乏味.
基本上我试图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)
我今天遇到了类似的问题,如果你想让它更通用,你甚至不必拥有固定的类名,你可以使用
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)