2009-10-20 23 views

回答

11

这里是一个(慢)实施反cdf方法,当你只有一个密度。

den<-dnorm #replace with your own density 

#calculates the cdf by numerical integration 
cdf<-function(x) integrate(den,-Inf,x)[[1]] 

#inverts the cdf 
inverse.cdf<-function(x,cdf,starting.value=0){ 
lower.found<-FALSE 
lower<-starting.value 
while(!lower.found){ 
    if(cdf(lower)>=(x-.000001)) 
    lower<-lower-(lower-starting.value)^2-1 
    else 
    lower.found<-TRUE 
} 
upper.found<-FALSE 
upper<-starting.value 
while(!upper.found){ 
    if(cdf(upper)<=(x+.000001)) 
    upper<-upper+(upper-starting.value)^2+1 
    else 
    upper.found<-TRUE 
} 
uniroot(function(y) cdf(y)-x,c(lower,upper))$root 
} 

#generates 1000 random variables of distribution 'den' 
vars<-apply(matrix(runif(1000)),1,function(x) inverse.cdf(x,cdf)) 
hist(vars) 
-1

您可以使用大都会黑社会从密度中获取样本。

6

为了澄清上述 “使用大都市黑斯廷斯” 的答案:

假设ddist()是您的概率密度函数

类似:

n <- 10000 
cand.sd <- 0.1 
init <- 0 
vals <- numeric(n) 
vals[1] <- init 
oldprob <- 0 
for (i in 2:n) { 
    newval <- rnorm(1,mean=vals[i-1],sd=cand.sd) 
    newprob <- ddist(newval) 
    if (runif(1)<newprob/oldprob) { 
     vals[i] <- newval 
    } else vals[i] <- vals[i-1] 
    oldprob <- newprob 
} 

注:

  1. 完全未经测试
  2. 效率取决于候选分布(即,值为cand.sd)。 为了获得最大的效率,调cand.sd至25-40%的录取率
  3. 结果将是自相关的...(虽然我猜你总是可以 sample()结果,以争夺他们,或薄)
  4. 可能需要丢弃的“烙印”,如果你的初始值是怪异

的经典方法这个问题是拒绝采样(例如见Press等人数值方法