我有一个包含 4 个名字的向量,名为 var.names
。使用combn()
,我获得了存储在 com.names
中的这 4 个名称的所有唯一组合(例如,每个单独的名称、2、3 和所有 4 个名称的唯一组合)。 .
我怎样才能制作lm()
com.names
中每一列的公式与 +
在超过 1 个名字的名字之间签名?
例如,在com.names[[1]][,1]
中,我们只有一个名字( "gear"
),所以我的公式将是 mpg ~ gear
。但是,在 com.names[[2]][,1]
,我们有两个名字( "gear" "cyl"
),所以我的公式将是 mpg ~ gear + cyl
等等(总的来说,我们将有 15 个公式)。
var.names <- c("gear", "cyl", "drat", "disp") # from BASE R 'mtcars' dataset
com.names <- lapply(seq_along(var.names), function(i)combn(var.names, i)) # all combinations
# My incomplete attempt:
lapply(com.names, function(x, d) lm(as.formula("mpg ~ ") )), data = mtcars) # ???
最佳答案
你已经很接近了。让我们使用您的 com.names
并更新它以创建组合字符串:
# thanks to thelatemail for use of 'combn(..., FUN=)'
com.names <- lapply(seq_along(var.names), function(i) combn(var.names, i, FUN = paste, collapse = " + "))
com.names
# [[1]]
# [1] "gear + cyl + drat + disp"
# [[2]]
# [1] "gear + gear + gear + cyl + cyl + drat" "cyl + drat + disp + drat + disp + disp"
# [[3]]
# [1] "gear + gear + gear + cyl" "cyl + cyl + drat + drat" "drat + disp + disp + disp"
# [[4]]
# [1] "gear" "cyl" "drat" "disp"
现在我们可以直接将它们转换为公式(公式?):
head(lapply(unlist(com.names), function(s) as.formula(paste("mpg ~ ", s))), n=3)
# [[1]]
# mpg ~ gear
# <environment: 0x0000000053e86950>
# [[2]]
# mpg ~ cyl
# <environment: 0x0000000031730970>
# [[3]]
# mpg ~ drat
# <environment: 0x0000000032c38d58>
从那里,它只是在 lm
中使用它:
head(lapply(unlist(com.names), function(s) lm(as.formula(paste("mpg ~ ", s)), data=mtcars)), n=2)
# [[1]]
# Call:
# lm(formula = as.formula(paste("mpg ~ ", s)), data = mtcars)
# Coefficients:
# (Intercept) gear
# 5.623 3.923
# [[2]]
# Call:
# lm(formula = as.formula(paste("mpg ~ ", s)), data = mtcars)
# Coefficients:
# (Intercept) cyl
# 37.885 -2.876
关于r - 如何在 R 中创建迭代 lm() 公式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58761009/