tests/vmmix.R

options(digits=12)
if(!require("BB"))stop("this test requires package BB.")
if(!require("setRNG"))stop("this test requires setRNG.")

# Use a preset seed so test values are reproducable. 
test.rng <- list(kind="Wichmann-Hill", normal.kind="Box-Muller", seed=c(979,1479,1542))
old.seed <- setRNG(test.rng)

###############################################################
cat("BB test vmmix ...\n")

# Use a preset seed so test values are reproducable. 
test.rng <- list(kind="Wichmann-Hill", normal.kind="Box-Muller", seed=c(979,1479,1542))
old.seed <- setRNG(test.rng)

dvm <- function (theta, mu, kappa) 
{
    1/(2 * pi * besselI(x = kappa, nu = 0, expon.scaled = TRUE)) * 
        (exp(cos(theta - mu) - 1))^kappa
}

##
rmixedvm <- function (n, mu1, mu2, kappa1, kappa2, p) {
temp <- runif(n)
n1 <- sum(temp <= p)
y <- c(rvm(n1,mu1,kappa1),rvm(n-n1,mu2,kappa2))
return(y)
}

##
rvm <- function (n, mean, k) 
{
    vm <- c(1:n)
    a <- 1 + (1 + 4 * (k^2))^0.5
    b <- (a - (2 * a)^0.5)/(2 * k)
    r <- (1 + b^2)/(2 * b)
    obs <- 1
    while (obs <= n) {
        U1 <- runif(1, 0, 1)
        z <- cos(pi * U1)
        f <- (1 + r * z)/(r + z)
        c <- k * (r - f)
        U2 <- runif(1, 0, 1)
        if (c * (2 - c) - U2 > 0) {
            U3 <- runif(1, 0, 1)
            vm[obs] <- sign(U3 - 0.5) * acos(f) + mean
            vm[obs] <- vm[obs]%%(2 * pi)
            obs <- obs + 1
        }
        else {
            if (log(c/U2) + 1 - c >= 0) {
                U3 <- runif(1, 0, 1)
                vm[obs] <- sign(U3 - 0.5) * acos(f) + mean
                vm[obs] <- vm[obs]%%(2 * pi)
                obs <- obs + 1
            }
        }
    }
    vm
}

#
vmmix.loglik <- function(x,y){
p <- x
- sum(log(p[5]*dvm(y,p[1],p[2])+(1-p[5])*dvm(y,p[3],p[4])))
}

y <- rmixedvm(n=500, mu1=pi/2, mu2=3*pi/2, kappa1=1.9, kappa2=2.2, p=0.67)
p <- c(pi/4,2,pi,1,0.5)

lo <- rep(0.001,5)
hi <- c(Inf, Inf, Inf, Inf, 0.999)

p <- c(runif(5,c(0,0.1,0,0.1,0.2),c(2*pi,5,2*pi,5,0.8)))
system.time(ans.spg <- spg(par=p, fn=vmmix.loglik, y=y, 
   lower=lo, upper=hi, 
   control=list(maxit=2500, gtol=1.e-06, M=20, trace=T)))[1]

# this should give the same reult. It just tests passing project arg
Userproject <- function(x, lower, upper, ...) {
       x[x < lower] <- lower[x < lower]
       x[x > upper] <- upper[x > upper]
       return(x)
       }

ans.spg2 <- spg(par=p, fn=vmmix.loglik, y=y, 
   project="Userproject",
   projectArgs=list(lower=lo, upper=hi),
   control=list(maxit=2500, gtol=1.e-06, M=20, trace=T))[1]


z <- sum(ans.spg$par)
good   <-   11.28100000000000
#on Windows 11.28096954777041
#on Linux64 11.28094286243805
#on Linux32 11.28105871638063
#on Linux32 11.28061301609979
print(z, digits=16)
# test tol relaxed from 1e-3 to 5e-3 when ftol arg added to spg  2011.2-1
if(any(abs(good - z) > 5e-3)) stop("BB test vmmix.loglik a1 FAILED")


z <- sum(ans.spg2$par)
print(z, digits=16)
# test tol relaxed from 1e-3 to 5e-3 when ftol arg added to spg  2011.2-1
if(any(abs(good - z) > 5e-3)) stop("BB test vmmix.loglik a2 FAILED")
 

Try the BB package in your browser

Any scripts or data that you put into this service are public.

BB documentation built on Oct. 30, 2019, 11:41 a.m.