2017-03-07 77 views
0

我試圖創建一個遺傳算法(不挑剔庫,GA和genalg產生同樣的錯誤),以確定潛在的列使用線性迴歸模型,通過最小化-adj。 R^2。使用mtcars作爲遊戲設置,試圖在mpg上退步。R「在terms.formula錯誤」使用GA/genalg庫

我有以下的適應度函數:

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 == 1)是GA應該能夠處理的「string」,所以我不知道GA對我的函數的問題是什麼。

上的方式來寫這讓GA或genalg接受功能有什麼想法?

回答

0

原來我並不認爲0的解串(或實際上,0的一個1字符串)將導致內部粘貼改爲「哩〜」,這是不是一個可能的線性迴歸。