Ошибка в коде дифференциальной эволюции в R - PullRequest
0 голосов
/ 24 мая 2019

Я нахожу оптимальные параметры для модели NSS (модель для оценки кривой доходности), для которой у меня есть этот код Дифференциальной эволюции в R. [Я не хочу использовать библиотеку DEoptim). У меня проблемы с запуском этого кода. Я использовал следующий код

DE <- function(de,dataList,OF)
{
# random numbers: like rand(m,n)/randn(m,n) in Matlab
mRU <- function(m,n){
    return(array(runif(m*n), dim = c(m,n)))
}
mRN <- function(m,n){
    return(array(rnorm(m*n), dim = c(m,n)))
}
shift <- function(x)
{
    rr <- length(x)
    return(c(x[rr],x[1:(rr-1)]))
}
# penalty 
pen <- function(mP,pso,vF)
{
    minV <- pso$min
    maxV <- pso$max
    ww <- pso$ww

    # max constraint: if larger than maxV, element in A is positiv
    A <- mP - as.vector(maxV)
    A <- A + abs(A)

    # max constraint: if smaller than minV, element in B is positiv
    B <- as.vector(minV) - mP
    B <- B + abs(B)

    # beta 1 + beta2 > 0
    C <- ww*((mP[1,]+mP[2,])-abs(mP[1,]+mP[2,]))
    A <- ww * colSums(A + B)*vF - C
    return(A)
}

# main algorithm
# ------------------------------------------------------------------
# set up initial population
mP <- de$min + diag(de$max - de$min) %*% mRU(de$d,de$nP)
# include extremes
mP[,1:de$d] <- diag(de$max)
mP[,(de$d+1):(2*de$d)] <- diag(de$min)

# evaluate initial population
vF <- apply(mP,2,OF,data = dataList)

# constraints
vP <- pen(mP,de,vF)
vF <- vF + vP

# keep track of OF
Fmat <- array(NaN,c(de$nG,de$nP))

for (g in 1:de$nG){

    # update population
    vI <- sample(1:de$nP,de$nP)
    R1 <- shift(vI)
    R2 <- shift(R1)
    R3 <- shift(R2)

    # prelim. update
    mPv = mP[,R1] + de$F * (mP[,R2] - mP[,R3])
    if(de$R > 0){mPv <- mPv + de$R * mRN(de$d,de$nP)}

    mI <- mRU(de$d,de$nP) > de$CR
    mPv[mI] <- mP[mI]

    # evaluate updated population
    vFv <- apply(mPv,2,OF,data = dataList)
    # constraints
    vPv <- pen(mPv,de,vF)
    vFv <- vFv + vPv
    vFv[!(is.finite(vFv))] <- 1000000


    # find improvements
    logik <- vFv < vF
    mP[,logik] <- mPv[,logik]
    vF[logik] <- vFv[logik] 
    Fmat[g,] <- vF

} # g in 1:nG
sGbest <- min(vF)
sgbest <- which.min(vF)[1]

# return best solution
return(list(beta = mP[,sgbest], OFvalue = sGbest, popF = vF, Fmat= Fmat))

}

Сообщение об ошибке в моем коде

После вызова функции:

DE(de = de, dataList = dataList, OF = OF2) 

Эта ошибка приходит

Error in FUN(newX[, i], ...) : unused argument (data = dataList)

Я не знаю, что это за ошибка. Пожалуйста, помогите

1 Ответ

0 голосов
/ 24 мая 2019

Это очень похоже на код в Калибровка модели Нельсона-Зигеля-Свенссона .(Раскрытие: я написал этот код.) В этом случае, как указано в комментарии jogo, вам нужно вызвать функцию как

DE(de = de, dataList = dataList, OF = OF2)

Если это не решит вашу проблему, вы должны предоставитьвоспроизводимый пример.

Кстати, пакет NMOF содержит виньетку, которая объясняет, как соответствовать модели Нельсона-Зигеля-Свенссона (а код в виньетке основан накод в статье).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...