将变量向量传递给 lm() 公式
Posted
技术标签:
【中文标题】将变量向量传递给 lm() 公式【英文标题】:Pass a vector of variables into lm() formula 【发布时间】: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 新手,但还没有经历过陡峭的学习曲线,因此对于明显的编程错误深表歉意。
【问题讨论】:
【参考方案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)
【讨论】:
以上是关于将变量向量传递给 lm() 公式的主要内容,如果未能解决你的问题,请参考以下文章