J'ai un problème qui m'a rendu fou pendant les deux dernières heures.Objet non trouvé numéro
J'utilise les packages suivants dans R: forecast
, fracdiff
, doParallel
, foreach
et d'autres. J'ai aussi la fonction suivante.
doparPredictions <- function(train, test, cl){
training = train
pred = foreach (i = 1:length(test), .combine=c) %dopar% {
if (i > 1) {
training = c(train,test[1:i-1])
}
fit = nnetar(training, 8, P=1, 5)
forecast(fit, 1)$mean
}
}
... et la fonction ci-dessus FONCTIONNE!
Toutefois, si je remplace nnetar(training, 8, P=1, 5)
par fracdiff(training, 3, 1, h=0.00001)
, la fonction commence à échouer avec l'erreur suivante.
Error in { : task 1 failed - "object 'training' not found"
Voici où cela devient intéressant. Il n'échoue pas réellement sur la ligne éditée. Il échoue en fait sur la ligne suivante: forecast(fit, 1)$mean
En d'autres termes, ce qui suit fonctionne.
fits = foreach (i = 1:length(test)) %dopar% {
if (i > 1) {
training = c(train,test[1:i-1])
}
fracdiff(training, p, q, h=0.00001)
}
mais ...
pred = foreach (i = 1:length(test), .combine=c) %dopar% {
forecast(fits[[i]], 1)$mean
}
lancers francs l'erreur a été mentionné précédemment à propos "object 'training' not found"
EDIT: Comme par exemple la demande ... un ... reproductible
require(quantmod)
require(forecast)
require(fracdiff)
require(doParallel)
require(foreach)
cl <- makeCluster((detectCores() - 1), type="FORK")
registerDoParallel(cl)
predictionsThatWork <- function(train, test, cl){
training = train
pred = foreach (i = 1:length(test), .combine=c) %dopar% {
if (i > 1) {
training = c(train,test[1:i-1])
}
fit = nnetar(training, 8, P=1, 5)
forecast(fit, 1)$mean
}
return(pred)
}
predictionsThatDoNotWork <- function(train, test, cl){
training = train
pred = foreach (i = 1:length(test), .combine=c) %dopar% {
if (i > 1) {
training = c(train,test[1:i-1])
}
fit = fracdiff(training, 3, 1, h=0.00001)
forecast(fit, 1)$mean
}
return(pred)
}
ticker = 'IBM' #feel free to replace with ticker of your choice
getSymbols(ticker, from='2010-01-01', to='2016-08-31')
fullts = get(ticker)
returnTS = diff(log(fullts[,4]),lag=1)[-1]
returnTS = returnTS - mean(returnTS)
numObs = length(returnTS)
cutOff = ceiling(numObs*.85)
train = returnTS[1:cutOff-1]
test = returnTS[cutOff:numObs]
predictionsThatWork(train, test, cl)
predictionsThatDoNotWork(train, test, cl)
stopCluster(cl)
EDIT 2: Ok, ce problème n'a rien à voir avec le parallélisme. Cela a tout à voir avec l'interaction entre fracdiff
et forecast
. La fonction suivante ne fonctionne pas non plus
anotherBrokenFunction <- function(train, test) {
training = train
print(exists('training'))
predictions = test
for (i in 1:length(test)){
print(exists('training'))
arf = fracdiff(x=training, nar=3, nma=1, h=0.00001)
print(exists('training'))
predictions[i] = forecast(arf, 1)$mean
print(exists('training'))
training = c(training, test[i])
}
return(predictions)
}
Il évalue les éléments suivants
> anotherBrokenFunction(train, test)
[1] TRUE
[1] TRUE
[1] TRUE
Error in eval(expr, envir, enclos) : object 'training' not found
Pouvez-vous fournir un exemple reproductible minimal s'il vous plaît? –
J'ai fait l'édition demandée – Constantine
@WeihuangWong, j'ai fait une autre mise à jour. Voir au dessus. Merci – Constantine