白鳥

1索

ラプラス分布に従う乱数の生成

Rでは様々な確率分布の乱数を使えます.しかし,ラプラス分布はありません.
個人的に必要に駆られたので,作りました.
逆関数法を使っています.
基本的には,既存のRの関数の書き方に沿っているつもりです.
以下はコード. nは乱数の個数,aは平均,bはスケール,pは確率,qは確率点

rlaplace = function(n, a, b) {
   u = log(runif(n))
   v = ifelse(runif(n)>1/2, 1, -1)
   return(a + b*v*u)
}

dlaplace = function(q, a, b){
  pdf = 1/(2*b^2)*exp(-abs(q-a)/b)
  return(pdf)
}

plaplace = function(q, a, b){
  cdf = ifelse(q<a, exp((q-a)/b)/2, 1-exp(-(q-a)/b)/2)
  return(cdf)
}

qlaplace = function(p, a, b){
  if(0<p&&p<=1/2){
    quantile = a + b*log(2*p)
  }else if(1/2<p&&p<=1){
    quantile = a - b*log(2*(1-p))
  }
  return(quantile)
}

f:id:wp6106:20180918205651p:plain

実際にrlaplace(100000, 0, 1))を使い,ggplotしてみました.
良さげ?