将功能应用于“网格搜索”系列组合

时间:2018-03-05 16:20:30

标签: r loops matrix apply

我想测试一个简单的线性回归模型的输出,对照通过组合的“网格搜索”方法改变的数据来找到最佳的数据准备。

假设我有x个测试变量,每个变量包含n行数据。 x和n可能随着不同的数据集而变化。我也有一个缩放矢量v,它也将改变长度。

例如:

tbl <-  read.table(text = 
    "Field1 Field2
    100 200
    150 180
    200 160
    280 250
    300 300
    300 250",
header = TRUE) #length(x) is 2 here

v <- c(0, 0.1, 0.2) # length(v) is 3

我想要做的是循环(或“应用”?)缩放矢量v的每个组合子集,并在每次迭代中测试我的模型。

换句话说,为每个x有效地循环v的可能值:

Field 1   Field 2
0.0       0.0
0.1       0.0
0.2       0.0
0.0       0.1
0.1       0.1
0.2       0.1
0.0       0.2
0.1       0.2
0.2       0.2

并在每次迭代中,将字段1按其列中的值进行缩放,并将字段2按其值进行缩放。我的缩放函数实际上是filter(tbl, v, method="recursive")thanks!) - 所以在第一次迭代中我的数据帧将保持不变(Field1和Field2都有v = 0),在第二次迭代中,Field 1将具有过滤功能应用参数v = 0.1但字段2将保持不变(v = 0)...组合4将使字段1保持不变(v = 0)但字段2将使用参数v = 0.1应用过滤器。

我可以通过嵌套循环来强制执行此操作,但是我将有不同数量的x变量(可能介于1到10之间),v的长度也可能不同。写出10个嵌套循环感觉错误的方法。

我可以创建这些可能组合的矩阵,然后以某种方式将它们应用于我的数据框吗?我不清楚如果这样做怎么做,任何帮助都会受到赞赏!

非常感谢。

1 个答案:

答案 0 :(得分:0)

最后我带着半强力的答案。

首先,我创建了一个包含所有组合的网格

combo.matrix <- expand.grid(replicate(length(x), list(v), simplify = T))

然后我循环遍历这个网格的每一行,在每个v上的一个循环内嵌套。

 for (r in 1:nrow(combo.matrix)) {

   new.df <- source.data  # Reset

   for (x in 1:length(v)) {

        new.df[,colnames(new.df) == v[x]] <- base::filter(
                new.df[,colnames(new.df) == v[x]], 
                combo.matrix[r, colnames(combo.matrix) == v[x]], 
                method="recursive")

    }

    # Run regression
    regression <- lm(lm.formula, data=new.df)
    reg.results$Adjusted.r2[r] <- summary(regression)$adj.r.squared
 }

应用功能可能会更好,但我对这将如何工作没有信心。任何能够:)的人都能得到正确答案 - 但除此之外,我很高兴能够去。感谢。