将所有 RHS 变量放入 vector 并使用 combn 获得一和二的组合(使用 lapply)。我们用reformulate 和paste 得到的公式用* 折叠。在combn 之后,我们需要另一个lapply 来循环组合。
v <- c("X1", "X2", "X3")
res <- lapply(1:2, function(n) {
.env <- environment()
cb <- combn(c("X1", "X2", "X3"), n, function(x) paste(x, collapse=" * "))
lapply(cb, function(cb) lm(reformulate(cb, "y", env=.env), dat))
})
结果
res
# [[1]]
# [[1]][[1]]
#
# Call:
# lm(formula = reformulate(cb, "y", env = .env), data = dat)
#
# Coefficients:
# (Intercept) X1
# -0.3433 0.3382
#
#
# [[1]][[2]]
#
# Call:
# lm(formula = reformulate(cb, "y", env = .env), data = dat)
#
# Coefficients:
# (Intercept) X2
# 0.008104 1.017076
#
#
# [[1]][[3]]
#
# Call:
# lm(formula = reformulate(cb, "y", env = .env), data = dat)
#
# Coefficients:
# (Intercept) X3
# 0.02774 1.04382
#
#
#
# [[2]]
# [[2]][[1]]
#
# Call:
# lm(formula = reformulate(cb, "y", env = .env), data = dat)
#
# Coefficients:
# (Intercept) X1 X2 X1:X2
# -0.577 1.408 1.157 0.296
#
#
# [[2]][[2]]
#
# Call:
# lm(formula = reformulate(cb, "y", env = .env), data = dat)
#
# Coefficients:
# (Intercept) X1 X3 X1:X3
# 0.7378 -0.6141 1.3707 -1.1076
#
#
# [[2]][[3]]
#
# Call:
# lm(formula = reformulate(cb, "y", env = .env), data = dat)
#
# Coefficients:
# (Intercept) X2 X3 X2:X3
# 0.257141 1.148571 1.290523 -0.009836
数据:
dat <- structure(list(X1 = c(1.37095844714667, -0.564698171396089, 0.363128411337339,
0.63286260496104, 0.404268323140999, -0.106124516091484, 1.51152199743894,
-0.0946590384130976, 2.01842371387704, -0.062714099052421), X2 = c(1.30486965422349,
2.28664539270111, -1.38886070111234, -0.278788766817371, -0.133321336393658,
0.635950398070074, -0.284252921416072, -2.65645542090478, -2.44046692857552,
1.32011334573019), X3 = c(-0.306638594078475, -1.78130843398,
-0.171917355759621, 1.2146746991726, 1.89519346126497, -0.4304691316062,
-0.25726938276893, -1.76316308519478, 0.460097354831271, -0.639994875960119
), y = c(2.8246396305329, 0.645476124553837, -0.162546123564699,
0.959822161909057, 2.67109557131028, -1.61765192870095, 0.185540684874441,
-5.36518513868917, -2.37615350981384, 0.653526977609908)), row.names = c(NA,
-10L), class = "data.frame")