R/mc_rv_sim_normal.R

Defines functions rmvnorm0_dual rmvnorm0 rnorm0_dual rnorm0

Documented in rmvnorm0 rmvnorm0_dual rnorm0

#' @include class_dual_def.R
NULL

# ===============================================================
# Gaussian distribution
# ===============================================================
#' Simulate univariate normal random variates
#' @name rnorm0
#' @param n Positive integer; the number of samples.
#' @param mean A dual number or a numeric vector; the mean of the normal distribution.
#' @param sd A dual number or a numeric vector; the standard deviation of the normal distribution.
#' @export
rnorm0 <- function(n, mean = 0, sd = 1) {
  rnorm(n, mean, sd)
}

rnorm0_dual <- function(n, mean, sd) {
  len_mean <- length(mean)
  assertthat::assert_that(len_mean == 1 || len_mean == n)
  len_sd <- length(sd)
  assertthat::assert_that(len_sd == 1 || len_sd == n)
  mean + as.matrix(sd * rnorm(n))
}

#' @rdname rnorm0
setMethod(
  "rnorm0",
  signature(n = "numeric", mean = "dual", sd = "dual"),
  rnorm0_dual
)

#' @rdname rnorm0
setMethod(
  "rnorm0",
  signature(n = "numeric", mean = "ANY", sd = "dual"),
  rnorm0_dual
)

#' @rdname rnorm0
setMethod(
  "rnorm0",
  signature(n = "numeric", mean = "dual", sd = "ANY"),
  rnorm0_dual
)


#' Simulate multivariate normal random variates
#' @param n Positive integer; the number of samples.
#' @param mean mean vector of the normal distribution.
#' @param sigma covariance matrix of the normal distribution.
#' @return A numeric matrix, where every column is a sample.
#' @export
rmvnorm0 <- function(n, mean, sigma) {
  Z <- t(mvtnorm::rmvnorm(n, numeric(length(mean))))
  t(mean + chol0(sigma) %*% Z)
}

#' Simulate multivariate normal random variates
#' @rdname rmvnorm0_dual
#' @param n Positive integer; the number of samples.
#' @param mean A numeric vector or a dual number; the mean of the normal distribution.
#' @param sigma A numeric matrix or a dual number; the standard deviation of the normal distribution.
rmvnorm0_dual <- function(n, mean, sigma) {
  U <- t(chol0(sigma))
  Z <- mvtnorm::rmvnorm(n, numeric(length(mean)))
  add_vector_to_matrix_row(mean, Z %*% U)
}


#' @rdname rmvnorm0_dual
setMethod(
  "rmvnorm0",
  signature(n = "numeric", mean = "dual", sigma = "dual"),
  rmvnorm0_dual
)

#' @rdname rmvnorm0_dual
setMethod(
  "rmvnorm0",
  signature(n = "numeric", mean = "dual", sigma = "ANY"),
  rmvnorm0_dual
)

#' @rdname rmvnorm0_dual
setMethod(
  "rmvnorm0",
  signature(n = "numeric", mean = "ANY", sigma = "dual"),
  rmvnorm0_dual
)

Try the ADtools package in your browser

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

ADtools documentation built on Nov. 9, 2020, 5:09 p.m.