1

因此,到目前为止,我只编写了少数 R 代码(准确地说是 2 个项目),这可能证明了这个问题对于经验丰富的程序员来说是多么愚蠢。

我正在尝试并行化我的 K 折交叉验证代码,该代码旨在找到用于最终模型的最佳变量集。

代码有点像这样

child <- foreach(i=icount(ncol(parentModel)-1),.combine = 'rbind') %:%{
  childModel<-parentModel
  childModel[,i]<-NULL
  filteredTestMTM <-foreach(j = icount(nFolds),.combine = c, .export =    c("DataSplit","getProbabilityThreshold","SharpeRatio")) %dopar% {
    splitData <- DataSplit(childModel, nFolds = nFolds, testFold=j)
    testData<-splitData$testData
    trainingData<-splitData$trainingData
    trainingMTM <- trainingData[,ncol(trainingData)]
    testMTM <- testData[,ncol(testData)]
    Trade <- (trainingMTM > 0.001)*1.0   #mtmThreshold to be used here instead of 0.001
    trainingData <- trainingData[,1:(ncol(trainingData)-1),drop=FALSE]
    trainingData <- cbind(trainingData, Trade)

    logmodel <- glm(Trade ~ .,data=trainingData, family = "binomial"(link="logit") )
    trainingData <- trainingData[,1:(ncol(trainingData)-1),drop=FALSE]
    trainingResults <- predict(logmodel, newdata=trainingData, type="response")
    probabilityThreshold <- getProbabilityThreshold(trainingResults, trainingMTM, 0.001)   #new Probability function to be defined to use optimParam
    tR <- predict(logmodel, newdata=testData, type="response")
    tMTM <- testMTM * ((tR>probabilityThreshold)*1.0)

    return(tMTM)
  }

  totalSharpe <- (mean(filteredTestMTM)/sd(filteredTestMTM))

  if (is.nan(totalSharpe)) {
    totalSharpe = 0.0
  }

  return(c(totalSharpe,i ))
}

综上所述——我取parentModel,一一去掉变量,运行K折交叉验证,收集结果。但是我不断收到错误

Error in `[<-.data.frame`(`*tmp*`, , i, value = NULL) : 
object 'i' not found

有人可以帮我吗?

编辑:我在 Windows 7 上。

4

2 回答 2

1

我认为问题在于您没有%:%正确使用嵌套运算符 , 。您必须将其与以下形式一起使用:

foreach(...) %:%
  foreach(...) %dopar% {
    ..
  }

您不能使用花括号 after%:%在内部 foreach 循环之前和之后包含其他操作。

我建议您将代码更改为:

foreach(...) %dopar% {
  childModel<-parentModel
  childModel[,i]<-NULL
  filteredTestMTM <- foreach(...) %do% {
    ...
  }
  totalSharpe <- (mean(filteredTestMTM)/sd(filteredTestMTM))
  if (is.nan(totalSharpe)) {
    totalSharpe = 0.0
  }
  return(c(totalSharpe,i ))
}

请注意,内部 foreach 循环是顺序的,这避免了与嵌套并行循环相关的问题。仅并行化外循环通常会产生良好的结果并且要简单得多。如果外部循环没有足够的迭代来利用所有内核,我只会为嵌套并行而烦恼。

于 2016-01-20T17:00:11.667 回答
0

在处理并行化时,您必须确保您需要的变量对您的核心(“环境”)可用。您可以通过以下命令来实现这一点force(i)- 有关更多详细信息,请查看例如http://www.win-vector.com/blog/2016/01/parallel-computing-in-r/

于 2016-01-20T13:24:31.260 回答