具有dynamic数量variables的公式
假设存在一些data.frame foo_data_frame,并且想要通过其他列find目标列Y的回归。 为此通常使用一些公式和模型。 例如:
linear_model <- lm(Y ~ FACTOR_NAME_1 + FACTOR_NAME_2, foo_data_frame)
如果公式是静态编码的,那么效果会很好。 如果需要根据具有固定数量的因variables(例如2)的几个模型,可以这样处理:
for (i in seq_len(factor_number)) { for (j in seq(i + 1, factor_number)) { linear_model <- lm(Y ~ F1 + F2, list(Y=foo_data_frame$Y, F1=foo_data_frame[[i]], F2=foo_data_frame[[j]])) # linear_model further analyzing... } }
我的问题是,如何在程序运行期间dynamic地改变variables的数量时,也会产生相同的影响?
for (number_of_factors in seq_len(5)) { # Then root over subsets with #number_of_factors cardinality. for (factors_subset in all_subsets_with_fixed_cardinality) { # Here I want to fit model with factors from factors_subset. linear_model <- lm(Does R provide smth to write here?) } }
请参阅?as.formula
,例如:
factors <- c("factor1", "factor2") as.formula(paste("y~", paste(factors, collapse="+"))) # y ~ factor1 + factor2
其中factors
是包含要在模型中使用的因素的名称的字符向量。 这可以粘贴到lm
模型中,例如:
set.seed(0) y <- rnorm(100) factor1 <- rep(1:2, each=50) factor2 <- rep(3:4, 50) lm(as.formula(paste("y~", paste(factors, collapse="+")))) # Call: # lm(formula = as.formula(paste("y~", paste(factors, collapse = "+")))) # Coefficients: # (Intercept) factor1 factor2 # 0.542471 -0.002525 -0.147433
一个被遗忘的function是reformulate
。 从?reformulate
:
reformulate
创build一个人物vector的公式。
一个简单的例子:
listoffactors <- c("factor1","factor2") reformulate(termlabels = listoffactors, response = 'y')
会产生这个公式:
y ~ factor1 + factor2
虽然没有明确logging,但您也可以添加交互术语:
listofintfactors <- c("(factor3","factor4)^2") reformulate(termlabels = c(listoffactors, listofintfactors), response = 'y')
会产生:
y ~ factor1 + factor2 + (factor3 + factor4)^2
另一个select可能是在公式中使用一个matrix:
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)])))
我通常通过更改我的响应列的名称来解决这个问题。 dynamic更容易,可能更干净。
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, ...)