R使用插入符号和方法= gamLoess进行训练时崩溃

时间:2015-08-17 04:53:01

标签: r r-caret gam parallel-foreach

当我运行下面的代码时,R崩溃了。如果我在火车通话中注释掉tuneGrid线,那么就没有崩溃。我已尝试使用另一个数据集,但仍然崩溃R. Crash消息是  R会话中止  R遇到致命错误  会议结束了  开始新的会议。

代码是:

library(splines)
library(foreach)
library(gam)
library(lattice)
library(ggplot2)
library(caret)

# crashes when I uncomment the tuneGrid = tuneGrid line

Set_seed_seed <- 100
data_set <- diamonds[, c(1, 5, 6, 7, 8, 9, 10)]
data_set <- data_set[1:1000,]
formula <- price ~ carat + depth + table + x + y + z
training_control <- trainControl(method = "cv", allowParallel = FALSE)
tune_grid <- expand.grid(span = seq(0.1, 0.9, length = 9), degree = seq(1, 2, length = 2))
set.seed(Set_seed_seed)
GAM_model <- train(formula,
                  data = data_set,
                  method = "gamLoess", 
                  tuneGrid = tune_grid,
                  trControl = training_control
               )

使用R Studio在R3.2.1和3.2.2中发生。

在R gui,也会发生崩溃。

2 个答案:

答案 0 :(得分:2)

这是gam包中的错误。我于2014年3月3日向Trevor Hastie发出了关于它的警告:

 library(gam)
 set.seed(1)
 x <- rnorm(1000)
 y <- x^2+0.1*rnorm(1000)
 tdat <- data.frame(y = y, x = x)

 m1 <- gam(y ~ lo(x, span = .5, degree = 2), data = tdat)

这样可以正常工作,但是当我适应多个模型时会出现seg故障(但仅限于此 用黄土和度数= 2)。

这将为我产生:

 for(i in 1:10) m1 <- gam(y ~ lo(x, span = .5, degree = 2), data = tdat)

答案 1 :(得分:1)

我确认问题存在。我调试了程序,发现程序卡住,如图所示。这是foreach

的错误
train(formula, data=data_set, ...) 
    useMethod("train") # train(); namespace:caret
        train(x, y, weight = w, ...) train.formula(); # namespace:caret
            useMethod("train") # train(); namespace:caret
                nominalTrainWorkflow(x = x, ...) # train.default(); namespace:caret  
                    result <- foreach(iter = , ...) # nominalTrainWorkflow(); namespace:caret
                        e <- getDoSeq() # %op%; namespace:foreach
                            list(fun = doSeq, data=NULL) # getDoSeq(); namespace:foreach
                                e$fun(obj, substitute(ex), parent.frame(), e$data) # %op%; namespace:foreach
                                    tryCatch(accumulator(list(r), i) # e$fun; namespace:foreach