假设有一些data.frame foo_data_frame,并且想要找到某些其他列的目标列Y的回归.为此目的,通常使用一些公式和模型.例如:
linear_model <- lm(Y ~ FACTOR_NAME_1 + FACTOR_NAME_2, foo_data_frame)
Run Code Online (Sandbox Code Playgroud)
如果公式是静态编码的话,这确实很有效.如果希望使用常数的因变量(例如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...
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是当程序运行期间变量的数量动态变化时,如何做同样的影响?
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?)
}
}
Run Code Online (Sandbox Code Playgroud)
Jor*_*eys 93
参见?as.formula
,例如:
factors <- c("factor1", "factor2")
as.formula(paste("y~", paste(factors, collapse="+")))
# y ~ factor1 + factor2
Run Code Online (Sandbox Code Playgroud)
其中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
Run Code Online (Sandbox Code Playgroud)
mne*_*nel 57
一个经常被遗忘的功能是reformulate
.来自?reformulate
:
reformulate
从字符向量创建公式.
一个简单的例子:
listoffactors <- c("factor1","factor2")
reformulate(termlabels = listoffactors, response = 'y')
Run Code Online (Sandbox Code Playgroud)
将产生这个公式:
y ~ factor1 + factor2
虽然没有明确记录,但您也可以添加交互术语:
listofintfactors <- c("(factor3","factor4)^2")
reformulate(termlabels = c(listoffactors, listofintfactors),
response = 'y')
Run Code Online (Sandbox Code Playgroud)
会产生:
y ~ factor1 + factor2 + (factor3 + factor4)^2
Sac*_*amp 11
另一种选择可能是在公式中使用矩阵:
Y = rnorm(10)
foo = matrix(rnorm(100),10,10)
factors=c(1,5,8)
lm(Y ~ foo[,factors])
Run Code Online (Sandbox Code Playgroud)
你实际上并不需要公式。这有效:
lm(data_frame[c("Y", "factor1", "factor2")])
Run Code Online (Sandbox Code Playgroud)
就像这样:
v <- c("Y", "factor1", "factor2")
do.call("lm", list(bquote(data_frame[.(v)])))
Run Code Online (Sandbox Code Playgroud)