R/rmf.vector.R

Defines functions rmf.vector

Documented in rmf.vector

#' Simulate a Random Normal Vector
#' 
#' Simulate a random normal vector from the von Mises-Fisher distribution as
#' described in Wood(1994).
#' 
#' 
#' @param kmu a vector.
#' @return a vector.
#' @author Peter Hoff
#' @references Wood(1994), Hoff(2009)
#' @examples
#' 
#' ## The function is currently defined as
#' function (kmu) 
#' {
#'     kap <- sqrt(sum(kmu^2))
#'     mu <- kmu/kap
#'     m <- length(mu)
#'     if (kap == 0) {
#'         u <- rnorm(length(kmu))
#'         u<-matrix(u/sqrt(sum(u^2)),m,1) 
#'     }
#'     if (kap > 0) {
#'         if (m == 1) {
#'             u <- (-1)^rbinom(1, 1, 1/(1 + exp(2 * kap * mu)))
#'         }
#'         if (m > 1) {
#'             W <- rW(kap, m)
#'             V <- rnorm(m - 1)
#'             V <- V/sqrt(sum(V^2))
#'             x <- c((1 - W^2)^0.5 * t(V), W)
#'             u <- cbind(NullC(mu), mu) %*% x
#'         }
#'     }
#'     u
#'   }
#' 
#' @export rmf.vector
rmf.vector <-
function(kmu)
{
  #simulate from the vector mf distribution as described in Wood(1994)
  kap<-sqrt(sum(kmu^2)) ; mu<-kmu/kap ; m<-length(mu)
  if(kap==0){ u<-rnorm(length(kmu)) ; u<-matrix(u/sqrt(sum(u^2)),m,1) }
  if(kap>0)
  {
    if(m==1){ u<- (-1)^rbinom( 1,1,1/(1+exp(2*kap*mu))) }
    if(m>1)
    {
      W<-rW(kap,m)
      V<-rnorm(m-1) ;  V<-V/sqrt(sum(V^2))
      x<-c((1-W^2)^.5*t(V),W)
      u<-cbind( NullC(mu),mu)%*%x
    }
  }
  u
}

Try the rstiefel package in your browser

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

rstiefel documentation built on June 15, 2021, 5:07 p.m.