Antithetic Approach to Variance Reduction Rayleigh density:


library(extraDistr)
## Warning: package 'extraDistr' was built under R version 3.4.2
set.seed(123)

MC.Ray <- function(sigma, R = 10000, antithetic = TRUE) { 
  
  u <- runif(R/2) 
  
  if (!antithetic) v <- runif(R/2)  else v <- 1 - u 
  
  u <- c(u, v) 
  
  x <- rrayleigh(u, sigma)
  
  hist(x, 100, freq = FALSE)
  curve(drayleigh(x, sigma), 0, 60, col = "red", add = TRUE)
 
  return(x)   
}


# using sigma = 3
ray <- MC.Ray(3, 1000, FALSE)

Using antithetic variables

# using sigma = 3
ray_anti <- MC.Ray(3, 1000, TRUE)

Calculate the Percent Reduction In Variance

# variance of the random sampling of the Rayleigh dist
var_ray <- var(ray); var_ray
## [1] 3.804526
# variance of the random sampling of the Rayleigh dist using antithetic variables
var_ray_anti <- var(ray_anti); var_ray_anti
## [1] 3.70242
reduction <- round((var_ray - var_ray_anti)/var_ray * 100, 3)

We see a 2.684% reduction in variance.