使用GA / genalg库

时间:2017-03-07 17:36:04

标签: r linear-regression genetic-algorithm

我正在尝试通过最小化-adj来创建遗传算法(不挑剔库,ga和genalg产生相同的错误)以识别用于线性回归模型的潜在列。 R ^ 2。使用mtcars作为游戏集,试图在mpg上回归。

我有以下健身功能:

mtcarsnompg <- mtcars[,2:ncol(mtcars)]

evalFunc <- function(string) {
  costfunc <- summary(lm(mtcars$mpg ~ ., data = mtcarsnompg[, which(string == 1)]))$adj.r.squared
  return(-costfunc)
}

ga("binary",fitness = evalFunc, nBits = ncol(mtcarsnompg), popSize = 100, maxiter = 100, seed = 1, monitor = FALSE)

这会导致:

 Error in terms.formula(formula, data = data) : 
  '.' in formula and no 'data' argument 

研究这个错误,我决定以这种方式解决这个问题:

evalFunc = function(string) {
  child <- mtcarsnompg[, which(string == 1)]
  costfunc <- summary(lm(as.formula(paste("mtcars$mpg ~", paste(child, collapse = "+"))), data = mtcars))$adj.r.squared
  return(-costfunc)
}

ga("binary",fitness = evalFunc, nBits = ncol(mtcarsnompg), popSize = 100, maxiter = 100, seed = 1, monitor = FALSE)

但结果是:

 Error in terms.formula(formula, data = data) : 
  invalid model formula in ExtractVars 

我知道应该工作,因为我可以用任何方式手写评估函数,而不是使用ga:

solution <- c("1","1","1","0","1","0","1","1","1","0")

evalFunc(solution)
[1] -0.8172511

我还在“快速浏览GA”(https://cran.r-project.org/web/packages/GA/vignettes/GA.html)中找到了使用“string”,其中(string == 1)是GA应该能够处理的东西,所以我不知道GA的功能是什么问题。

有关写这个以获得ga或genalg接受函数的方法的任何想法吗?

1 个答案:

答案 0 :(得分:0)

原来我没有考虑到0的解决方案字符串(或者实际上是一个带有1的0字符串)会导致内部粘贴读取“mpg~”,这不是可能的线性回归。