Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 具有动态变量数的公式_R_Formula_R Formula - Fatal编程技术网

R 具有动态变量数的公式

R 具有动态变量数的公式,r,formula,r-formula,R,Formula,R Formula,假设存在一些data.framefoo_data_frame,希望通过其他一些列找到目标列Y的回归。为此,通常使用一些公式和模型。例如: linear_model <- lm(Y ~ FACTOR_NAME_1 + FACTOR_NAME_2, foo_data_frame) linear\u model参见?as.公式,例如: factors <- c("factor1", "factor2") as.formula(paste("y~", paste(factors, coll

假设存在一些data.framefoo_data_frame,希望通过其他一些列找到目标列Y的回归。为此,通常使用一些公式和模型。例如:

linear_model <- lm(Y ~ FACTOR_NAME_1 + FACTOR_NAME_2, foo_data_frame)

linear\u model参见
?as.公式,例如:

factors <- c("factor1", "factor2")
as.formula(paste("y~", paste(factors, collapse="+")))
# y ~ factor1 + factor2

另一种选择是在公式中使用矩阵:

Y = rnorm(10)
foo = matrix(rnorm(100),10,10)
factors=c(1,5,8)

lm(Y ~ foo[,factors])

你其实不需要公式。这项工作:

lm(data_frame[c("Y", "factor1", "factor2")])
正如这一点:

v <- c("Y", "factor1", "factor2")
do.call("lm", list(bquote(data_frame[.(v)])))

v一个经常被遗忘的函数是
重新格式化
。从
?重新格式化

重新格式化
从字符向量创建公式


一个简单的例子:

listoffactors <- c("factor1","factor2")
reformulate(termlabels = listoffactors, response = 'y')
将产生:


y~factor1+factor2+(factor3+factor4)^2

我通常通过更改我的响应列的名称来解决这个问题。它更容易动态执行,而且可能更干净

model_response <- "response_field_name"
setnames(model_data_train, c(model_response), "response") #if using data.table
model_gbm <- gbm(response ~ ., data=model_data_train, ...)

model_response+1,但请注意这不允许使用交互效果。因此,我们也可以构造一个模型矩阵(请参见
?model.matrix
)+1非常正确,但同样,您必须使用model.matrix来构造一个具有交互效果的矩阵。@JorisMeys,它非常好,因为它允许添加交互术语!多年来我一直在寻找类似的解决方案..如果x变量包含空格怎么办?说“因素1”,“因素2”等等。谢谢!你中间的例子让我意识到我不需要解决你的问题,我可以做更简单的事情!
v <- c("Y", "factor1", "factor2")
do.call("lm", list(bquote(data_frame[.(v)])))
listoffactors <- c("factor1","factor2")
reformulate(termlabels = listoffactors, response = 'y')
listofintfactors <- c("(factor3","factor4)^2")
reformulate(termlabels = c(listoffactors, listofintfactors), 
    response = 'y')
model_response <- "response_field_name"
setnames(model_data_train, c(model_response), "response") #if using data.table
model_gbm <- gbm(response ~ ., data=model_data_train, ...)