2016-01-20 3 views
1

Итак, до настоящего времени я написал только несколько R-кодов (точнее, 2 проекта), что, вероятно, могло бы оправдать степень немощи в этом вопросе, которая показалась бы опытному программисту.Как получить доступ к счетчику во вложенном цикле foreach?

Я пытаюсь распараллелить свой код проверки перекрестного ключа 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 

Может ли кто-нибудь помочь мне в этом?

Edit: Я на Windows 7.

ответ

0

при работе с paralleisation вы должны убедиться, что переменные, которые необходимо являются своего рода доступными для сердечников («сред»). вы можете достичь этого с помощью таких команд, как force(i) - для более подробной информации смотрите, например, это http://www.win-vector.com/blog/2016/01/parallel-computing-in-r/

1

Я думаю, проблема в том, что вы не используете оператора вложенности, %:%, правильно. Вы должны использовать его с формой, такие как:

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

Вы не можете использовать фигурные скобки после %:% включать дополнительные операции до и после внутреннего цикла Еогеаспа.

Я предлагаю вам изменить ваш код:

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)) 
} 

Обратите внимание, что внутренний цикл Еогеасп является последовательным, что позволяет избежать проблем, связанных с вложенными параллельными циклами. Параллелизация только внешней петли обычно приводит к хорошим результатам и намного проще. Я бы только беспокоился о вложенном параллелизме, если внешнему циклу не хватает итераций, чтобы использовать все ваши ядра.

+0

Я пробовал распараллеливать только один цикл раньше, параллельный внешний контур дал лучшие результаты, чем при распараллеливании внутреннего цикла. Я просто хотел проверить, улучшит ли вложенное распараллеливание. – Smit