动态变量数公式

假设存在一些 data.frame Foo _ data _ frame,并且希望找到目标列 为什么与其他列之间的回归。为此,通常采用一些公式和模型。例如:

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

如果公式是静态编码的,那么它就能很好地工作。如果需要在几个具有常数因变量的模型(例如,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...
}
}

我的问题是如何做同样的影响时,变量的数量是动态变化的程序运行?

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?)
}
}
48289 次浏览

See ?as.formula, e.g.:

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

where factors is a character vector containing the names of the factors you want to use in the model. This you can paste into an lm model, e.g.:

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

Another option could be to use a matrix in the formula:

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


lm(Y ~ foo[,factors])

You don't actually need a formula. This works:

lm(data_frame[c("Y", "factor1", "factor2")])

as does this:

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

An oft forgotten function is reformulate. From ?reformulate:

reformulate creates a formula from a character vector.


A simple example:

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

will yield this formula:

y ~ factor1 + factor2


Although not explicitly documented, you can also add interaction terms:

listofintfactors <- c("(factor3","factor4)^2")
reformulate(termlabels = c(listoffactors, listofintfactors),
response = 'y')

will yield:

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

I generally solve this by changing the name of my response column. It is easier to do dynamically, and possibly cleaner.

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, ...)