# Verifying the variances.

## Introduction

Combining the `type` and `parallel` options of `alphaci` yields a total of \(6\) different asymptotic variance estimates. In this file we informally verify the computations of these estimates.

Distribution | Parallel
--- | ---
Normal | Yes
Normal | No
Elliptical | Yes
Elliptical | No
Arbitrary | Yes
Arbitrary | No

In our setup we have \(n = 1,000,000\), which should suffice. We use \(k = 5\) across the board.

    library("future.apply")
    plan(multisession)
    avar <- alphaci:::avar
    avar_std <- alphaci:::avar_std
    set.seed(313)
    k <- 5
    n <- 10 ** 6
    print_table <- function(x) {
      table <- rbind(
      c("normal" = avar(x, sigma_mat, type = "normal", parallel = FALSE),
        "adf" = avar(x, sigma_mat, type = "adf", parallel = FALSE),
        "elliptical" = avar(x, sigma_mat, type = "elliptical", parallel = FALSE),
        "normal_par" = avar(x, sigma_mat, type = "normal", parallel = TRUE),
        "adf_par" = avar(x, sigma_mat, type = "adf", parallel = TRUE),
        "elliptical_par" = avar(x, sigma_mat, type = "elliptical", parallel = TRUE)),
      c("normal" = avar_std(x, sigma_mat, type = "normal", parallel = FALSE),
        "adf" = avar_std(x, sigma_mat, type = "adf", parallel = FALSE),
        "elliptical" = avar_std(x, sigma_mat, type = "elliptical", parallel = FALSE),
        "normal_par" = avar_std(x, sigma_mat, type = "normal", parallel = TRUE),
        "adf_par" = avar_std(x, sigma_mat, type = "adf", parallel = TRUE),
        "elliptical_par" = avar_std(x, sigma_mat, type = "elliptical", parallel = TRUE))
      )
      rownames(table) <- c("alpha", "alpha_std")
      knitr::kable(round(table, 3))
    }

## Normality

First we simulate from a normal model that isn’t parallel. Then the normal model should not be equal to the normal parallel method. Moreover, the adf method should be approximately equal to the normal method, but the adpf paralell model should not be equal to the adf model. The table below confirms these points.

    lambda <- 1/(5:1)^2
    sigma <- 1/(1:5)^2
    x <- alphaci:::simulate_congeneric(n, k, sigma, lambda)
    sigma_mat <- cov(x)
    print_table(x)

| normal | adf | elliptical | normal_par | adf_par | elliptical_par
--- | --- | --- | --- | --- | --- | ---
alpha | 0.666 | 0.665 | 0.665 | 0.865 | 0.019 | 0.865
alpha_std | 0.187 | 0.187 | 0.187 | 0.233 | 0.153 | 0.233

If the normal parallel model is true, all of the methods should yield approximately the same result. Again, this is the case.

    lambda <- 1
    sigma <- 2
    x <- alphaci:::simulate_congeneric(n, k, sigma, lambda)
    sigma_mat <- cov(x)
    print_table(x)

| normal | adf | elliptical | normal_par | adf_par | elliptical_par
--- | --- | --- | --- | --- | --- | ---
alpha | 0.495 | 0.494 | 0.495 | 0.495 | 0.494 | 0.495
alpha_std | 0.495 | 0.494 | 0.495 | 0.495 | 0.494 | 0.495

## Ellipticity

We simulate from an elliptical model, the multivariate Laplace, that is neither parallel nor normal. Then the elliptical model should not be equal to the elliptical parallel method, the normal models should not equal the elliptical models. Moreover, the adf method should be approximately equal to the elliptical method, but the adpf paralell model should not be equal to the adf model. The table below confirms these points.

    lambda <- 1/(5:1)^2
    sigma <- 1/(1:5)^2
    mat <- lambda %*% t(lambda) + diag(sigma)
    x <- LaplacesDemon::rmvl(n, mu = 0, Sigma = mat)
    sigma_mat <- cov(x)
    print_table(x)

| normal | adf | elliptical | normal_par | adf_par | elliptical_par
--- | --- | --- | --- | --- | --- | ---
alpha | 0.851 | 1.700 | 1.696 | 1.005 | 0.335 | 2.002
alpha_std | 0.611 | 1.219 | 1.218 | 0.679 | 0.983 | 1.352

Finally, we check the eliptical parallel model. The adfs and elliptical should be equal, but not equal to the normal. The table below confirms this.

    lambda <- 1
    sigma <- 2
    mat <- rep(1, k) %*% t(rep(1, k)) * lambda^2 + diag(sigma, nrow = k)
    x <- LaplacesDemon::rmvl(n, mu = 0, Sigma = mat)
    sigma_mat <- cov(x)
    print_table(x)

| normal | adf | elliptical | normal_par | adf_par | elliptical_par
--- | --- | --- | --- | --- | --- | ---
alpha | 0.205 | 0.405 | 0.408 | 0.205 | 0.405 | 0.408
alpha_std | 0.205 | 0.405 | 0.408 | 0.205 | 0.405 | 0.408