Nothing
library(testthat)
library(magi)
context("x theta phi log likelihood")
nobs <- 11
noise <- 0.05
VRtrue <- read.csv(system.file("testdata/FN.csv", package="magi"))
pram.true <- list(
abc=c(0.2,0.2,3),
rphi=c(0.9486433, 3.2682434),
vphi=c(1.9840824, 1.1185157),
sigma=noise
)
fn.true <- VRtrue
fn.true$time <- seq(0,20,0.05)
fn.sim <- fn.true
fn.sim[,1:2] <- fn.sim[,1:2]+rnorm(length(unlist(fn.sim[,1:2])), sd=noise)
fn.sim <- fn.sim[seq(1,nrow(fn.sim), length=nobs),]
tvec.nobs <- fn.sim$time
foo <- outer(tvec.nobs, t(tvec.nobs),'-')[,1,]
r <- abs(foo)
r2 <- r^2
signr <- -sign(foo)
dataInput <- data.matrix(fn.sim[,1:2])
dataInputFullObs <- dataInput
dataInputWithMissing <- dataInput
dataInputWithMissing[-seq(1,nrow(dataInputWithMissing),4),] <- NA
xlatentTest <- data.matrix(fn.true[seq(1,nrow(fn.true), length=nobs),1:2])
thetaTest <- pram.true$abc
phiTest <- cbind(pram.true$vphi, pram.true$rphi)
sigmaTest <- rep(pram.true$sigma, 2)
testthat::test_that("xthetaphisigmallik differs to xthetallik and loglikOrig by constant fixing phi sigma", {
skip_on_cran()
curCovV <- calCov(phiTest[,1], r, signr, kerneltype = "generalMatern")
curCovR <- calCov(phiTest[,2], r, signr, kerneltype = "generalMatern")
realDiff <- sapply(1:40, function(dummy){
xlatentTest <- data.matrix(fn.true[seq(1,nrow(fn.true), length=nobs),1:2]) * rexp(length(fn.true[,1:2]))
thetaTest <- pram.true$abc * rexp(length(pram.true$abc))
if(dummy %% 2 == 0){
dataInput <- dataInputWithMissing
constDiff12 <- 16.10664
}else{
dataInput <- dataInputFullObs
constDiff12 <- -17.12206
}
xthInit <- c(xlatentTest, thetaTest)
out1 <- magi:::xthetallikC(dataInput, curCovV, curCovR, sigmaTest, xthInit)
out2 <- magi:::loglikWithNormalizingConstants(xlatentTest,
thetaTest,
phiTest,
sigmaTest[1],
dataInput,
r,
signr,
kerneltype = "generalMatern")
out3 <- magi:::xthetaphisigmallikRcpp(xlatentTest,
thetaTest,
phiTest,
sigmaTest,
dataInput,
fn.sim$time)
c(out1$value - as.numeric(out2) - constDiff12,
out3$value - as.numeric(out2) )
})
expect_gt(mean(realDiff < 1e-3), 0.95)
})
testthat::test_that("xthetaphisigmallik differs to loglikOrig by constant (the pi part)", {
skip_on_cran()
# phi could give numerical instability issue
realDiff <- sapply(1:40, function(dummy){
xlatentTest <- data.matrix(fn.true[seq(1,nrow(fn.true), length=nobs),1:2]) * rexp(length(fn.true[,1:2]))
thetaTest <- pram.true$abc * rexp(length(pram.true$abc))
phiTest <- cbind(pram.true$vphi, pram.true$rphi) * exp(rnorm(4))
sigmaTest <- rep(pram.true$sigma * exp(rnorm(1)), 2)
if(dummy %% 2 == 0){
dataInput <- dataInputWithMissing
}else{
dataInput <- dataInputFullObs
}
xthInit <- c(xlatentTest, thetaTest)
out2 <- magi:::loglikWithNormalizingConstants(xlatentTest,
thetaTest,
phiTest,
sigmaTest[1],
dataInput,
r,
signr,
kerneltype = "generalMatern")
out3 <- magi:::xthetaphisigmallikRcpp(xlatentTest,
thetaTest,
phiTest,
sigmaTest,
dataInput,
fn.sim$time)
out3$value - as.numeric(out2)
})
expect_gt(mean(abs(realDiff) < 0.01), 0.4)
})
set.seed(123)
xlatentTest <- data.matrix(fn.true[seq(1,nrow(fn.true), length=nobs),1:2]) * rexp(length(fn.true[,1:2]))
thetaTest <- pram.true$abc * rexp(length(pram.true$abc))
phiTest <- cbind(pram.true$vphi, pram.true$rphi) * exp(rnorm(4))
sigmaTest <- rep(pram.true$sigma * exp(rnorm(1)), 2)
out <- magi:::xthetaphisigmallikRcpp(xlatentTest,
thetaTest,
phiTest,
sigmaTest,
dataInputWithMissing,
fn.sim$time)
testthat::test_that("xthetaphisigmallik derivatives", {
testthat::skip_on_cran()
out$value
delta <- 1e-5
# xlatent
gradNum <- c()
for(it in 1:length(xlatentTest)){
xlatentTest1 <- xlatentTest
xlatentTest1[it] <- xlatentTest1[it] + delta
gradNum[it] <-
(magi:::xthetaphisigmallikRcpp(xlatentTest1,
thetaTest,
phiTest,
sigmaTest,
dataInputWithMissing,
fn.sim$time)$value -
out$value)/delta
}
x <- (gradNum - out$grad[1:length(xlatentTest)])/abs(gradNum)
testthat::expect_true(all(abs(x) < 5e-3)) # gradient is self-consistent
# theta
gradNum <- c()
for(it in 1:length(thetaTest)){
thetaTest1 <- thetaTest
thetaTest1[it] <- thetaTest1[it] + delta
gradNum[it] <-
(magi:::xthetaphisigmallikRcpp(xlatentTest,
thetaTest1,
phiTest,
sigmaTest,
dataInputWithMissing,
fn.sim$time)$value -
out$value)/delta
}
x <- (gradNum - out$grad[(length(xlatentTest)+1):(length(xlatentTest)+length(thetaTest))])/abs(gradNum)
testthat::expect_true(all(abs(x) < 5e-3)) # gradient is self-consistent
# phi
gradNum <- c()
for(it in 1:length(phiTest)){
phiTest1 <- phiTest
phiTest1[it] <- phiTest1[it] + delta
gradNum[it] <-
(magi:::xthetaphisigmallikRcpp(xlatentTest,
thetaTest,
phiTest1,
sigmaTest,
dataInputWithMissing,
fn.sim$time)$value -
out$value)/delta
}
x <- (gradNum - out$grad[(length(xlatentTest)+length(thetaTest)+1):
(length(xlatentTest)+length(thetaTest)+length(phiTest))])/abs(gradNum)
testthat::expect_true(all(abs(x) < 5e-3)) # gradient is self-consistent
# two seperate sigma
gradNum <- c()
for(it in 1:length(sigmaTest)){
sigmaTest1 <- sigmaTest
sigmaTest1[it] <- sigmaTest1[it] + delta
gradNum[it] <-
(magi:::xthetaphisigmallikRcpp(xlatentTest,
thetaTest,
phiTest,
sigmaTest1,
dataInputWithMissing,
fn.sim$time)$value -
out$value)/delta
}
x <- (gradNum - tail(out$grad, 2))/abs(gradNum)
testthat::expect_true(all(abs(x) < 5e-3)) # gradient is self-consistent
# one combined sigma
sigmaTest1 <- sigmaTest[1]
sigmaTest1 <- sigmaTest1 + delta
out1sigma <- magi:::xthetaphisigmallikRcpp(xlatentTest,
thetaTest,
phiTest,
sigmaTest[1],
dataInputWithMissing,
fn.sim$time)
gradNum <-
(magi:::xthetaphisigmallikRcpp(xlatentTest,
thetaTest,
phiTest,
sigmaTest1,
dataInputWithMissing,
fn.sim$time)$value -
out1sigma$value)/delta
x <- (gradNum - tail(out1sigma$grad, 1))/abs(gradNum)
testthat::expect_true(all(abs(x) < 5e-3)) # gradient is self-consistent
})
test_that("xthetaphisigma sampler can run", {
stepsize <- rep(0.01, length(out$grad))
ret <- magi:::xthetaphisigmaSample(xlatentTest,
thetaTest,
phiTest,
sigmaTest,
dataInputWithMissing,
fn.sim$time,
stepsize,
"FN",
20)
testthat::expect_equal(length(ret$final), 31)
stepsize <- rep(0.001, length(out$grad)-1)
ret <- magi:::xthetaphisigmaSample(xlatentTest,
thetaTest,
phiTest,
sigmaTest[1],
dataInputWithMissing,
fn.sim$time,
stepsize,
"FN",
200)
testthat::expect_equal(length(ret$final), 30)
})
#if(interactive()){
# # speed benchmark
# mb <- microbenchmark::microbenchmark(
# magi::xthetallikC(dataInput, curCovV, curCovR, pram.true$sigma, xthInit),
# loglikOrig(fn.true[seq(1,nrow(fn.true), length=nobs),],
# pram.true$abc,
# c(pram.true$vphi, pram.true$rphi),
# pram.true$sigma,
# dataInput,
# r,
# signr,
# kerneltype = "generalMatern"),
# xthetaphisigmallikRcpp(data.matrix(fn.true[seq(1,nrow(fn.true), length=nobs),1:2]),
# pram.true$abc,
# cbind(pram.true$vphi, pram.true$rphi),
# rep(pram.true$sigma, 2),
# dataInput,
# fn.sim$time)
# )
# print(mb)
#}
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.