我想测试一个简单的线性回归模型的输出与通过“网格搜索”组合的方法改变的数据的输出,以找到最佳的数据准备。
假设我有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的列中的值缩放字段1,并按字段2的值缩放字段2。我的缩放函数实际上是filter(tbl, v, method="recursive")
(thanks!) -所以在第一次迭代中,我的数据帧将保持不变( Field1和Field2都有v=0),在第二次迭代中,字段1将应用参数v= 0.1的过滤函数,但字段2将保持不变(v=0)……并且组合4将使字段1保持不变(v = 0),但是字段2将应用参数v= 0.1的滤波器。
我可以通过嵌套一个循环来强行实现这一点,但是我会有不同数量的x变量(可能在1到10之间),v的长度也可能不同。写出10个嵌套循环感觉是错误的。
我可以创建这些可能的组合的矩阵,然后以某种方式将它们应用于我的数据框架吗?我不知道该怎么做,如果是这样的话,任何帮助都将不胜感激!
非常感谢。
发布于 2018-03-07 10:09:15
最后,我选择了一个半暴力的回答。
首先,我创建了一个包含所有组合的网格
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
}
应用函数可能会更好,但我不确定它是如何工作的。正确答案奖励给任何能做到的人:) -但除此之外,我准备好了。谢谢。
https://stackoverflow.com/questions/49114927
复制相似问题