R如何使用集合中的所有协变量组合自动回归?

时间:2013-11-25 01:00:39

标签: r data-mining bigdata regression

假设我们有一个结果变量为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

2 个答案:

答案 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="~"))  
}