# Performance

#### Eunseop Kim

All the tests were done on an Arch Linux x86_64 machine with an Intel(R) Core(TM) i7 CPU (1.90GHz).

## Empirical likelihood computation

We show the performance of computing empirical likelihood with `el_mean()`. We test the computation speed with simulated data sets in two different settings: 1) the number of observations increases with the number of parameters fixed, and 2) the number of parameters increases with the number of observations fixed.

## Increasing the number of observations

We fix the number of parameters at \(p = 10\), and simulate the parameter value and \(n \times p\) matrices using `rnorm()`. In order to ensure convergence with a large \(n\), we set a large threshold value using `el_control()`.

    library(ggplot2)
    library(microbenchmark)
    set.seed(3175775)
    p <- 10
    par <- rnorm(p, sd = 0.1)
    ctrl <- el_control(th = 1e+10)
    result <- microbenchmark(
      n1e2 = el_mean(matrix(rnorm(100 * p), ncol = p), par = par, control = ctrl),
      n1e3 = el_mean(matrix(rnorm(1000 * p), ncol = p), par = par, control = ctrl),
      n1e4 = el_mean(matrix(rnorm(10000 * p), ncol = p), par = par, control = ctrl),
      n1e5 = el_mean(matrix(rnorm(100000 * p), ncol = p), par = par, control = ctrl)
    )

Below are the results:

    result
    #> Unit: microseconds
    #>  expr        min          lq        mean      median          uq        max
    #>  n1e2    480.259    552.6765    605.5336    605.2785    663.4835    747.412
    #>  n1e3   1341.880   1584.8560   1817.1119   1755.0720   1923.7255   4458.305
    #>  n1e4  12227.928  15504.0695  18338.3115  17224.0770  19222.8105 104056.099
    #>  n1e5 248277.438 284915.2620 333091.8719 327406.7725 390166.0540 492460.706
    #>  neval cld
    #>    100 a
    #>    100 a
    #>    100  b
    #>    100   c

    autoplot(result)

## Increasing the number of parameters

This time we fix the number of observations at \(n = 1000\), and evaluate empirical likelihood at zero vectors of different sizes.

    n <- 1000
    result2 <- microbenchmark(
      p5 = el_mean(matrix(rnorm(n * 5), ncol = 5),
        par = rep(0, 5),
        control = ctrl
      ),
      p25 = el_mean(matrix(rnorm(n * 25), ncol = 25),
        par = rep(0, 25),
        control = ctrl
      ),
      p100 = el_mean(matrix(rnorm(n * 100), ncol = 100),
        par = rep(0, 100),
        control = ctrl
      ),
      p400 = el_mean(matrix(rnorm(n * 400), ncol = 400),
        par = rep(0, 400),
        control = ctrl
      )
    )

    result2
    #> Unit: microseconds
    #>  expr        min          lq       mean      median         uq        max neval
    #>    p5    776.637    857.5115   1047.512    954.4555   1097.735   2311.881   100
    #>   p25   2995.186   3093.3480   3720.127   3245.1005   3945.950   7162.429   100
    #>  p100  23567.613  26633.9825  33190.404  31544.7910  37026.504  73363.918   100
    #>  p400 276768.597 329771.0900 417690.242 398333.6365 474940.140 737572.795   100
    #>  cld
    #>  a
    #>  a
    #>   b
    #>    c

    autoplot(result2)

On average, evaluating empirical likelihood with a 100000×10 or 1000×400 matrix at a parameter value satisfying the convex hull constraint takes less than a second.