我想测试一个简单的线性回归模型的输出,对照通过组合的“网格搜索”方法改变的数据来找到最佳的数据准备。
假设我有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个嵌套循环感觉错误的方法。
我可以创建这些可能组合的矩阵,然后以某种方式将它们应用于我的数据框吗?我不清楚如果这样做怎么做,任何帮助都会受到赞赏!
非常感谢。
答案 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
}
应用功能可能会更好,但我对这将如何工作没有信心。任何能够:)的人都能得到正确答案 - 但除此之外,我很高兴能够去。感谢。