REBayes Ошибка в KWDual MKS_RES_TERM_STALL - PullRequest
0 голосов
/ 09 ноября 2019

Я пытаюсь запустить следующую симуляцию ниже. Обратите внимание, что это требует установки Mosek и RMosek!

Я получаю сообщение об ошибке

Ошибка в KWDual (A, d, w, ...): Ошибка Mosek:MSK_RES_TRM_STALL: оптимизатор отключен из-за медленного прогресса.

Как устранить ошибку MSK_RES_TRM_STALL?

Дальнейшие исследования

При поиске документации дляэто я нашел это:

Оптимизатор остановлен из-за медленного прогресса. Задержка означает, что числовые проблемы мешают оптимизатору добиться разумного прогресса и что нет смысла продолжать. Во многих случаях это происходит, если проблема плохо масштабируется или иным образом плохо обусловлена. Нет никаких гарантий, что решение будет осуществимым или оптимальным. Однако часто задержка происходит вблизи оптимального значения, и возвращаемое решение может быть хорошего качества. Поэтому рекомендуется проверять состояние решения. Если статус решения является оптимальным, решение, скорее всего, достаточно хорошее для большинства практических целей. Обратите внимание, что если задача линейной оптимизации решается с использованием оптимизатора внутренней точки с включенной идентификацией баз, возвращенное базовое решение может иметь высокую точность, даже если оптимизатор остановился. Некоторые типичные причины задержки: а) плохо масштабируемые модели, б) почти возможные или почти неосуществимые проблемы.

Итак, я проверил окончательное значение A, но в нем ничего не было. Я обнаружил, что если я изменяю моделирование с 1000 на 30, я получаю значения (A <- sim1(30, 30, setting = 1)), но это неоптимально.

Воспроизводимый скрипт

KFE <- function(y, T = 300, lambda = 1/3){
    # Kernel Fourier Estimator: Stefanski and Carroll (Statistics, 1990)
    ks <- function(s,x) exp(s^2/2) * cos(s * x)
    K <- function(t, y, lambda = 1/3){
    k <- y
    for(i in 1:length(y)){
        k[i] <- integrate(ks, 0, 1/lambda, x = (y[i] - t))$value/pi 
    }
    mean(k)
    }
    eps <- 1e-04
    if(length(T) == 1) T <- seq(min(y)-eps, max(y)+eps, length = T)
    g <- T
    for(j in 1:length(T))
    g[j] <- K(T[j], y, lambda = lambda)
    list(x = T, y = g)
}
BDE <- function(y, T = 300, df = 5, c0 = 1){
    # Bayesian Deconvolution Estimator: Efron (B'ka, 2016)
    require(splines)
    eps <- 1e-04
    if(length(T) == 1) T <- seq(min(y)-eps, max(y)+eps, length = T)
    X <- ns(T, df = df)
    a0 <- rep(0, ncol(X))
    A <- dnorm(outer(y,T,"-"))
    qmle <- function(a, X, A, c0){
    g <- exp(X %*% a)
    g <- g/sum(g)
    f <- A %*% g
    -sum(log(f)) + c0 * sum(a^2)^.5
    }
    ahat <- nlm(qmle, a0, X=X, A=A, c0 = c0)$estimate
    g <- exp(X %*% ahat)
    g <- g/integrate(approxfun(T,g),min(T),max(T))$value
    list(x = T,y = g)
}
W <- function(G, h, interp = FALSE, eps = 0.001){
    #Wasserstein distance:  ||G-H||_W
    H <- cumsum(h$y)
    H <- H/H[length(H)]
    W <- integrate(approxfun(h$x, abs(G(h$x) - H)),min(h$x),max(h$x))$value
    list(W=W, H=H)
}

biweight <- function(x0, x, bw){
    t <- (x - x0)/bw
    (1-t^2)^2*((t> -1 & t<1)-0) *15/16
}
Wasser <- function(G, h, interp = FALSE, eps = 0.001, bw = 0.7){
    #Wasserstein distance:  ||G-H||_W
    if(interp == "biweight"){
    yk = h$x
    for (j in 1:length(yk))
        yk[j] = sum(biweight(h$x[j], h$x, bw = bw)*h$y/sum(h$y))
    H <- cumsum(yk)
    H <- H/H[length(H)]
    }
    else {
    H <- cumsum(h$y)
    H <- H/H[length(H)]
    }
    W <- integrate(approxfun(h$x, abs(G(h$x) - H)),min(h$x),max(h$x), 
           rel.tol = 0.001, subdivisions = 500)$value
    list(W=W, H=H)
}

sim1 <- function(n, R = 10, setting = 0){
    A <- matrix(0, 4, R)
    if(setting == 0){
    G0 <- function(t) punif(t,0,6)/8 + 7 * pnorm(t, 0, 0.5)/8  
    rf0 <- function(n){
        s <- sample(0:1, n, replace = TRUE, prob = c(1,7)/8)
        rnorm(n) + (1-s) * runif(n,0,6) + s * rnorm(n,0,0.5)
    }
    }
    else{   
    G0 <- function(t) 0 + 7 * (t > 0)/8 + (t > 2)/8
    rf0 <- function(n){
        s <- sample(0:1, n, replace = TRUE, prob = c(1,7)/8)
        rnorm(n) + (1-s) * 2 + s * 0
    }
    }
    for(i in 1:R){
    y <- rf0(n)
    g <- BDE(y)
    Wg <- Wasser(G0, g)
    h <- GLmix(y)
    Wh <- Wasser(G0, h)
    Whs <- Wasser(G0, h, interp = "biweight")
    k <- KFE(y)
    Wk <- Wasser(G0, k)
    A[,i] <- c(Wg$W, Wk$W, Wh$W, Whs$W)
    }
    A
}
require(REBayes)
set.seed(12)
A <- sim1(1000, 1000, setting = 1)


1 Ответ

1 голос
/ 11 ноября 2019

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

17  1.7e-07  3.1e-10  6.8e-12  1.00e+00   5.345949918e+00   5.345949582e+00   2.4e-10  0.40  
18  2.6e-08  3.8e-11  2.9e-13  1.00e+00   5.345949389e+00   5.345949348e+00   2.9e-11  0.41  
19  2.6e-08  3.8e-11  2.9e-13  1.00e+00   5.345949389e+00   5.345949348e+00   2.9e-11  0.48  
20  2.6e-08  3.8e-11  2.9e-13  1.00e+00   5.345949389e+00   5.345949348e+00   2.9e-11  0.54  
Optimizer terminated. Time: 0.62    


Interior-point solution summary
  Problem status  : PRIMAL_AND_DUAL_FEASIBLE
  Solution status : OPTIMAL
  Primal.  obj: 5.3459493890e+00    nrm: 6e+00    Viol.  con: 2e-08    var: 0e+00    cones: 4e-09  
  Dual.    obj: 5.3459493482e+00    nrm: 7e-01    Viol.  con: 1e-11    var: 4e-11    cones: 0e+00

Быстрый взлом на данный момент, который работал для меняэто немного ослабить допуски на завершение при вызове GLmix:

control <- list()
control$dparam <- list(INTPNT_CO_TOL_REL_GAP=1e-7,INTPNT_CO_TOL_PFEAS=1e-7,INTPNT_CO_TOL_DFEAS=1e-7)
h <- GLmix(y,control=control,verb=5)

Лучшее решение, как я указал в комментариях, - не обрабатывать код завершения срыва как ошибку пакета REBayes. но вместо этого используйте статус / качество решения.

...