假设我们有一个结果变量为y且有5个协变量的数据集。假设我们想要拟合回归模型,其中y在每个可能的协变量组合上回归。所以,由于我们有5个协变量,我们有5个! = 120回归方程。我一直在尝试使用reformulate()
和update()
编写一个自动执行此功能的解决方案:
match_variables <- c("x1", "x2","x3", "x4", "x5")
match_equation <- y ~ x1
matchvar_list <- lapply(match_variables, function(x, orig = match_equation) {
new <- reformulate(c(x,'.'))
update(orig, new)})
matchvar_list
[[1]]
y ~ x1
[[2]]
y ~ x2 + x1
[[3]]
y ~ x3 + x1
[[4]]
y ~ x4 + x1
[[5]]
y ~ x5 + x1
最终目标是得到长度为120的列表,其中每个元素是协变量的可能组合之一。我大约有4%的路在那里,你可以想象用蛮力的方法缩小差距,但似乎应该有一个简单的修改,我没有看到。
其实我犯了一个愚蠢的错误,数学错了。它应该是31个回归方程。 y~x1 + x2与y~x2 + x1相同所以我们有:选择(5,5)+选择(5,4)+选择(5,3)+选择(5,2)+选择(5, 1)= 31
答案 0 :(得分:1)
这是我之前评论的详细版本:
match_variables <- c("x1", "x2","x3", "x4", "x5")
combos <- sapply( seq(5), function(i) {
as.list(as.data.frame(combn( x=match_variables, m=i ) ) )
})
combos <- unlist(combos,recursive=FALSE)
forms <- sapply( combos, function(x) as.formula(paste0("y~",paste(x,collapse="+")) ))
> forms[[2]]
y ~ x2
<environment: 0x5c64a58>
as.list(as.data.frame(
位只是将矩阵拆分为列向量的技巧。 unlist
会停止累积的嵌套列表级别。然后as.formula(paste
将所有内容组合在一起。
答案 1 :(得分:1)
根据@Ari的建议建立一个远非完美的解决方案:
require(combinat)
require(roxygen)
match_variables <- c("x1", "x2","x3", "x4", "x5")
combos <- sapply( seq(5), Curry( combn, x=match_variables ) )
x <- list("y~x1+x2+x3+x4+x5")
for(i in 1:ncol(combos[[1]])) {
x <- append(x, paste("y",paste(combos[[1]][,i]), sep = "~"))
}
for(i in 1:ncol(combos[[2]])) {
x <- append(x, paste("y",paste(combos[[2]][1,i],combos[[2]][2,i],sep="+"),sep = "~"))
}
for(i in 1:ncol(combos[[3]])) {
x <- append(x, paste("y",paste(combos[[3]][1,i],combos[[3]][2,i],combos[[3]][3,i],sep="+"),sep="~"))
}
for(i in 1:ncol(combos[[4]])) {
x <- append(x,paste("y",paste(combos[[4]][1,i],combos[[4]][2,i],combos[[4]][3,i],combos[[4]][4,i],sep="+"),sep="~"))
}