Getting started

Aims

There is further information in the Introduction to rust vignette.

# We need the rust and mvtnorm packages
pkg <- c("rust", "mvtnorm")
pkg_list <- pkg[!pkg %in% installed.packages()[, "Package"]]
install.packages(pkg_list)
# Load both packages
invisible(lapply(pkg, library, character.only = TRUE))
library(rust)
# Information about the ru() function
?ru

# Simulation sample size
n <- 1000

1D normal

# By default r = 1/2
# init is an initial estimate of the mode of logf
x1 <- ru(logf = dnorm, log = TRUE, d = 1, n = n, init = 0.1)
x1$pa
[1] 0.805153
plot(x1)

# r = 1 will be slightly less efficient
x2 <- ru(logf = dnorm, log = TRUE, d = 1, n = n, init = 0.1, r = 1)
x2$pa
[1] 0.739645

1D log-normal

# lower = 0 tells ru() that the log-normal is bounded below at 0
x1 <- ru(logf = dlnorm, log = TRUE, d = 1, n = n, lower = 0, init = 1)
x1$pa
[1] 0.5827506
plot(x1)

# We know that ln(X) is normal.  
# First transform using a Box-Cox transformation with lambda=0 then simulate
lambda <- 0
x2 <- ru(logf = dlnorm, log = TRUE, d = 1, n = n, init = 0.1, trans = "BC",
         lambda = lambda)
x2$pa
[1] 0.7949126
# Plot the (normal) distribution from which we have simulated using ROU 
plot(x2, ru_scale = TRUE)

# A check that the inverse (exponential) transformation has been applied
plot(x2)

2D normal

library(mvtnorm)
# two-dimensional normal with positive association ----------------
rho <- 0.9
covmat <- matrix(c(1, rho, rho, 1), 2, 2)
x1 <- ru(logf = mvtnorm::dmvnorm, sigma = covmat, log = TRUE, d = 2, n = n, 
         init = c(0, 0), rotate = FALSE)
x2 <- ru(logf = mvtnorm::dmvnorm, sigma = covmat, log = TRUE, d = 2, n = n, 
         init = c(0, 0), rotate = TRUE)
c(x1$pa, x2$pa)
[1] 0.2313208 0.5422993
plot(x1, ru_scale = TRUE)
plot(x2, ru_scale = TRUE)

1D gamma

# Exponential case, with strong skewness
# A cube root transformation results in approximate symmetry
alpha <- 1
x1 <- ru(logf = dgamma, shape = alpha, log = TRUE, d = 1, n = n, trans = "BC",
       lambda = 1/3, init = alpha)
x1$pa
# If alpha < 1 then the gamma density is extremely skewed and unbounded at 0
# A transformation can avoid this, but it needs to be stronger than a cube root
alpha <- 0.1
x2 <- ru(logf = dgamma, shape = alpha, log = TRUE, d = 1, n = n, trans = "BC",
         lambda = 0.068, init = 0)
x2$pa
plot(x2)
plot(x2, ru_scale = TRUE)

Can you break rust?

# Pick a standard distribution
?Distributions
# Change dnorm to a d???? of your choice below
# Perhaps also set lower, upper or init
x <- ru(logf = dnorm, log = TRUE, n = n)
LS0tCnRpdGxlOiAiRVZBIDIwMjEgcmV2ZGJheWVzIGV4ZXJjaXNlcyAxIgpzdWJ0aXRsZTogIlJhdGlvLW9mLXVuaWZvcm1zIHVzaW5nIHJ1c3QiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCiMjIEdldHRpbmcgc3RhcnRlZAoKKiBJbnN0YWxsIFtSU3R1ZGlvIERlc2t0b3BdKGh0dHBzOi8vd3d3LnJzdHVkaW8uY29tL3Byb2R1Y3RzL3JzdHVkaW8vZG93bmxvYWQvI2Rvd25sb2FkKSAoaWYgeW91IGRvIG5vdCBhbHJlYWR5IGhhdmUgaXQpIGFuZCBvcGVuIGl0CiogU2F2ZSBbZXgxcmV2ZGJheWVzLlJtZF0oaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3BhdWxub3J0aHJvcC9yZXZkYmF5ZXMvbWFzdGVyL3ZpZ25ldHRlcy9leDFyZXZkYmF5ZXMuUm1kKSB0byB5b3VyIGNvbXB1dGVyICh0aGVyZSBpcyBhbHNvIGEgbGluayB0byBpdCBhYm92ZSkKKiBPcGVuIGBleDFyZXZkYmF5ZXMuUm1kYCBpbiBSc3R1ZGlvCiogVGhlIFIgY29kZSBpcyBhcnJhbmdlZCBpbiAqY2h1bmtzKiBoaWdobGlnaHRlZCBpbiBncmV5CiogWW91IGNhbiBydW4gdGhlIGNvZGUgaW4gYSBjaHVuayBieSBjbGlja2luZyBvbiB0aGUgKipncmVlbiB0cmlhbmdsZSoqIG9uIHRoZSB0b3AgcmlnaHQgb2YgdGhlIGNodW5rCiogVGhlcmUgaXMgaW5mb3JtYXRpb24gYWJvdXQgRXhlcmNpc2VzIDEgKGFuZCBFeGVyY2lzZXMgMikgaW4gdGhlIFtFVkEyMDIxIHJldmRiYXllcyBzbGlkZXNdKGh0dHBzOi8vcGF1bG5vcnRocm9wLmdpdGh1Yi5pby9yZXZkYmF5ZXMvYXJ0aWNsZXMvRVZBMjAyMXJldmRiYXllcy5odG1sKQoKIyMgQWltcwoKKiBTaG93IHRoZSBST1UgbWV0aG9kIGluIGFjdGlvbgoqIFVzZSByb3RhdGlvbiBhbmQgdHJhbnNmb3JtYXRpb24gdG8KICAgIC0gaW5jcmVhc2UgdGhlIHByb2JhYmlsaXR5IG9mIGFjY2VwdGFuY2UKICAgIC0gZW5hYmxlIHRoZSBST1UgdG8gYmUgdXNlZCBpbiBvdGhlcndpc2UgdW5zdWl0YWJsZSBjYXNlcyAKICAgIApUaGVyZSBpcyBmdXJ0aGVyIGluZm9ybWF0aW9uIGluIHRoZSBbSW50cm9kdWN0aW9uIHRvIHJ1c3RdKGh0dHBzOi8vcGF1bG5vcnRocm9wLmdpdGh1Yi5pby9ydXN0L2FydGljbGVzL3J1c3QtYS12aWduZXR0ZS5odG1sKSB2aWduZXR0ZS4KCmBgYHtyIHBhY2thZ2VzLCBtZXNzYWdlPUZBTFNFfQojIFdlIG5lZWQgdGhlIHJ1c3QgYW5kIG12dG5vcm0gcGFja2FnZXMKcGtnIDwtIGMoInJ1c3QiLCAibXZ0bm9ybSIpCnBrZ19saXN0IDwtIHBrZ1shcGtnICVpbiUgaW5zdGFsbGVkLnBhY2thZ2VzKClbLCAiUGFja2FnZSJdXQppbnN0YWxsLnBhY2thZ2VzKHBrZ19saXN0KQojIExvYWQgYm90aCBwYWNrYWdlcwppbnZpc2libGUobGFwcGx5KHBrZywgbGlicmFyeSwgY2hhcmFjdGVyLm9ubHkgPSBUUlVFKSkKYGBgCgpgYGB7ciBzZXR1cH0KIyBJbmZvcm1hdGlvbiBhYm91dCB0aGUgcnUoKSBmdW5jdGlvbgo/cnUKCiMgU2ltdWxhdGlvbiBzYW1wbGUgc2l6ZQpuIDwtIDEwMDAKYGBgCgojIyAxRCBub3JtYWwKCmBgYHtyIG5vcm1hbH0KIyBCeSBkZWZhdWx0IHIgPSAxLzIKIyBpbml0IGlzIGFuIGluaXRpYWwgZXN0aW1hdGUgb2YgdGhlIG1vZGUgb2YgbG9nZgp4MSA8LSBydShsb2dmID0gZG5vcm0sIGxvZyA9IFRSVUUsIGQgPSAxLCBuID0gbiwgaW5pdCA9IDAuMSkKeDEkcGEKcGxvdCh4MSkKIyByID0gMSB3aWxsIGJlIHNsaWdodGx5IGxlc3MgZWZmaWNpZW50CngyIDwtIHJ1KGxvZ2YgPSBkbm9ybSwgbG9nID0gVFJVRSwgZCA9IDEsIG4gPSBuLCBpbml0ID0gMC4xLCByID0gMSkKeDIkcGEKYGBgCgojIyAxRCBsb2ctbm9ybWFsCgpgYGB7ciBsb2ctbm9ybWFsfQojIGxvd2VyID0gMCB0ZWxscyBydSgpIHRoYXQgdGhlIGxvZy1ub3JtYWwgaXMgYm91bmRlZCBiZWxvdyBhdCAwCngxIDwtIHJ1KGxvZ2YgPSBkbG5vcm0sIGxvZyA9IFRSVUUsIGQgPSAxLCBuID0gbiwgbG93ZXIgPSAwLCBpbml0ID0gMSkKeDEkcGEKcGxvdCh4MSkKIyBXZSBrbm93IHRoYXQgbG4oWCkgaXMgbm9ybWFsLiAgCiMgRmlyc3QgdHJhbnNmb3JtIHVzaW5nIGEgQm94LUNveCB0cmFuc2Zvcm1hdGlvbiB3aXRoIGxhbWJkYT0wIHRoZW4gc2ltdWxhdGUKbGFtYmRhIDwtIDAKeDIgPC0gcnUobG9nZiA9IGRsbm9ybSwgbG9nID0gVFJVRSwgZCA9IDEsIG4gPSBuLCBpbml0ID0gMC4xLCB0cmFucyA9ICJCQyIsCiAgICAgICAgIGxhbWJkYSA9IGxhbWJkYSkKeDIkcGEKIyBQbG90IHRoZSAobm9ybWFsKSBkaXN0cmlidXRpb24gZnJvbSB3aGljaCB3ZSBoYXZlIHNpbXVsYXRlZCB1c2luZyBST1UgCnBsb3QoeDIsIHJ1X3NjYWxlID0gVFJVRSkKIyBBIGNoZWNrIHRoYXQgdGhlIGludmVyc2UgKGV4cG9uZW50aWFsKSB0cmFuc2Zvcm1hdGlvbiBoYXMgYmVlbiBhcHBsaWVkCnBsb3QoeDIpCmBgYAoKIyMgMkQgbm9ybWFsCgpgYGB7ciAyRG5vcm1hbH0KIyB0d28tZGltZW5zaW9uYWwgbm9ybWFsIHdpdGggcG9zaXRpdmUgYXNzb2NpYXRpb24gLS0tLS0tLS0tLS0tLS0tLQpyaG8gPC0gMC45CmNvdm1hdCA8LSBtYXRyaXgoYygxLCByaG8sIHJobywgMSksIDIsIDIpCngxIDwtIHJ1KGxvZ2YgPSBtdnRub3JtOjpkbXZub3JtLCBzaWdtYSA9IGNvdm1hdCwgbG9nID0gVFJVRSwgZCA9IDIsIG4gPSBuLCAKICAgICAgICAgaW5pdCA9IGMoMCwgMCksIHJvdGF0ZSA9IEZBTFNFKQp4MiA8LSBydShsb2dmID0gbXZ0bm9ybTo6ZG12bm9ybSwgc2lnbWEgPSBjb3ZtYXQsIGxvZyA9IFRSVUUsIGQgPSAyLCBuID0gbiwgCiAgICAgICAgIGluaXQgPSBjKDAsIDApLCByb3RhdGUgPSBUUlVFKQpjKHgxJHBhLCB4MiRwYSkKYGBgCgpgYGB7cn0KcGxvdCh4MSwgcnVfc2NhbGUgPSBUUlVFKQpwbG90KHgyLCBydV9zY2FsZSA9IFRSVUUpCmBgYAoKIyMgMUQgZ2FtbWEKCmBgYHtyIGdhbW1hfQojIEV4cG9uZW50aWFsIGNhc2UsIHdpdGggc3Ryb25nIHNrZXduZXNzCiMgQSBjdWJlIHJvb3QgdHJhbnNmb3JtYXRpb24gcmVzdWx0cyBpbiBhcHByb3hpbWF0ZSBzeW1tZXRyeQphbHBoYSA8LSAxCngxIDwtIHJ1KGxvZ2YgPSBkZ2FtbWEsIHNoYXBlID0gYWxwaGEsIGxvZyA9IFRSVUUsIGQgPSAxLCBuID0gbiwgdHJhbnMgPSAiQkMiLAogICAgICAgbGFtYmRhID0gMS8zLCBpbml0ID0gYWxwaGEpCngxJHBhCiMgSWYgYWxwaGEgPCAxIHRoZW4gdGhlIGdhbW1hIGRlbnNpdHkgaXMgZXh0cmVtZWx5IHNrZXdlZCBhbmQgdW5ib3VuZGVkIGF0IDAKIyBBIHRyYW5zZm9ybWF0aW9uIGNhbiBhdm9pZCB0aGlzLCBidXQgaXQgbmVlZHMgdG8gYmUgc3Ryb25nZXIgdGhhbiBhIGN1YmUgcm9vdAphbHBoYSA8LSAwLjEKeDIgPC0gcnUobG9nZiA9IGRnYW1tYSwgc2hhcGUgPSBhbHBoYSwgbG9nID0gVFJVRSwgZCA9IDEsIG4gPSBuLCB0cmFucyA9ICJCQyIsCiAgICAgICAgIGxhbWJkYSA9IDAuMDY4LCBpbml0ID0gMCkKeDIkcGEKcGxvdCh4MikKcGxvdCh4MiwgcnVfc2NhbGUgPSBUUlVFKQpgYGAKCiMjIENhbiB5b3UgYnJlYWsgcnVzdD8KCmBgYHtyIEVwaWNGYWlsP30KIyBQaWNrIGEgc3RhbmRhcmQgZGlzdHJpYnV0aW9uCj9EaXN0cmlidXRpb25zCiMgQ2hhbmdlIGRub3JtIHRvIGEgZD8/Pz8gb2YgeW91ciBjaG9pY2UgYmVsb3cKIyBQZXJoYXBzIGFsc28gc2V0IGxvd2VyLCB1cHBlciBvciBpbml0CnggPC0gcnUobG9nZiA9IGRub3JtLCBsb2cgPSBUUlVFLCBuID0gbikKYGBgCg==