tests/testthat/test-pRQF.R

context("pRQF functions work for various choices of A, B, Sigma")

# Should error

n1 <- 10
A1 <- matrix(data = 1, nrow = n1, ncol = n1)
B1 <- matrix(data = 0, nrow = n1, ncol = n1)
Bneg <- matrix(data = -1, nrow = n1, ncol = n1)

set.seed(12345)
Arnd0 <- matrix(data = runif(n1 ^ 2, min = -1, max = 1),
                nrow = n1, ncol = n1)
Arnd <- matrix(data = runif(n1 ^ 2), nrow = n1, ncol = n1)
Arnd <- Arnd %*% t(Arnd)
Brnd <- matrix(data = runif(n1 ^ 2), nrow = n1, ncol = n1)
Brnd <- Brnd %*% t(Brnd)

test_that("pRQF: test some erroneous settings", {

  expect_error(pRQF(r = 1, A = A1, B = B1))
  expect_error(pRQF(r = 1, A = A1, B = Bneg))
  expect_error(pRQF(r = 1, A = Arnd0, B = Arnd0))
})

theeigen <- eigen(solve(Brnd) %*% Arnd, only.values = TRUE)$values
minsupport <- min(theeigen)
maxsupport <- max(theeigen)
test_that("pRQF: test some trivial cases", {
  expect_equal(pRQF(r = 1, A = Arnd, B = Arnd), 0.5)
  expect_equal(pRQF(r = 0, A = Arnd, B = Arnd), 0)
  expect_equal(pRQF(r = 1, A = B1, B = A1), 1)
  expect_equal(pRQF(r = minsupport, A = Arnd, B = Brnd), 0)
  expect_equal(suppressWarnings(pRQF(r = maxsupport, A = Arnd, B = Brnd)), 1)
  expect_equal(pRQF(r = 1.5, A = diag(n1), B = A1, algorithm = "imhof"),
               pRQF(r = 1.5, A = diag(n1), B = A1, algorithm = "integrate"))
})

set.seed(12345)
Abinrnd <- matrix(data = sample(c(0, -1, 1), n1 ^ 2, replace = TRUE),
                  nrow = n1, ncol = n1)
Abinrnd <- Abinrnd %*% t(Abinrnd)
Bbinrnd <- matrix(data = sample(c(0, -1, 1), n1 ^ 2, replace = TRUE),
                  nrow = n1, ncol = n1)
Bbinrnd <- Bbinrnd %*% t(Bbinrnd)

theeigen2 <- eigen(solve(Bbinrnd) %*% Abinrnd, only.values = TRUE)$values
minsupport2 <- min(theeigen2)
maxsupport2 <- max(theeigen2)
mySigma <- Arnd0 %*% t(Arnd0)

test_that("pRQF: test some trivial cases", {
  expect_equal(pRQF(r = 1, A = Abinrnd, B = Abinrnd), 0.5)
  expect_equal(pRQF(r = 0, A = Abinrnd, B = Abinrnd), 0)
  expect_equal(pRQF(r = minsupport2, A = Abinrnd, B = Bbinrnd), 0)
  expect_equal(suppressWarnings(pRQF(r = maxsupport2, A = Abinrnd, B = Bbinrnd)), 1)
  expect_equal(pRQF(r = exp(1), A = Arnd, B = Brnd, Sigma = mySigma,
                    algorithm = "integrate"),
               pRQF(r = exp(1), A = Arnd, B = Brnd, Sigma = mySigma,
                    algorithm = "imhof"))
})

if (requireNamespace("mvtnorm", quietly = TRUE)) {
  test_that("pRQF: Monte Carlo results", {
    skip_on_cran()
    ### Monte Carlo
    S <- 1e4
    set.seed(1234)
    eps <- replicate(S, rnorm(n1), simplify = FALSE)
    eps2 <- replicate(S, mvtnorm::rmvnorm(n = 1, sigma = mySigma), simplify = FALSE)
    R <- unlist(lapply(eps, function(x)
      (t(x) %*% Arnd %*% x) / (t(x) %*% Brnd %*% x)))
    R2 <- unlist(lapply(eps2, function(x)
      (x %*% Arnd %*% t(x)) / (x %*% Brnd %*% t(x))))

    expect_true(abs(sum(R < 1) / S - pRQF(r = 1, A = Arnd, B = Brnd)) <= 1e-2)
    expect_true(abs(sum(R2 < 0.875) / S -
                      pRQF(r = 0.875, A = Arnd, B = Brnd, Sigma = mySigma)) <= 1e-2)
    expect_true(abs(sum(R >= 1.1) / S - pRQF(r = 1.1, A = Arnd, B = Brnd,
                                             lower.tail = FALSE)) <= 1e-2)
    expect_true(abs(sum(R2 >= 0.62) / S -
                      pRQF(r = 0.62, A = Arnd, B = Brnd, Sigma = mySigma,
                           lower.tail = FALSE)) <= 1e-2)
  })
}

Try the skedastic package in your browser

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

skedastic documentation built on Nov. 10, 2022, 5:43 p.m.