在 R 中模拟狄利克雷过程

机器算法验证 r 贝叶斯 马尔可夫链蒙特卡罗 狄利克雷分布 狄利克雷过程
2022-04-13 13:43:22

我正在阅读 LA Hannah 撰写的“广义线性模型的狄利克雷过程混合”论文。如果我想模拟以下模型

PDP(cG0)
θi|PP
Xi,j|θi,xN(μij,σij2),j=1,...d
Yi|Xi,θi,yN(βi0+jd=βijXij,σij2)

在 R 中,我怎样才能得到Pθi|P

PDP(cG0)
θi|PP

3个回答

可以肯定的是,狄利克雷过程的实现是具有可数支持的概率度量,正如D. Blackwell 在统计年鉴1(1973 年)第 1 期所证明的那样。2、356--358您可以使用 J. Sethuraman 在Statistica Sinica , 4 , 639 (1994) 中介绍的构造性断棒表示从狄利克雷过程中采样实现。对于浓度参数且以某个分布函数为中心的 Dirichlet 过程,您必须绘制独立随机变量 并计算 c>0G0

BiBeta(1,c),
P1=B1,Pi=Bij=1i1(1Bj),i>1,
直到对于一些你有,对于一些然后,绘制独立的,对于,狄利克雷过程的(截断)近似实现是分布函数 为了从狄利克雷过程的这种近似实现中对 进行采样,请使用's给出的概率替换n1i=1nPi1ϵ0<ϵ<1YiG0i=1,,n
H(t)=i=1nPiI[Yi,)(t).
θiRsampleYiPi

现在内存太便宜了,一个更实用的截断方法是取 “足够大”。这是一个等于分布函数的示例。nc=2G0N(0,10)

c <- 2
G_0 <- function(n) rnorm(n, 0, 10)
n <- 100
b <- rbeta(n, 1, c)
p <- numeric(n)
p[1] <- b[1]
p[2:n] <- sapply(2:n, function(i) b[i] * prod(1 - b[1:(i-1)]))
y <- G_0(n)
theta <- sample(y, prob = p, replace = TRUE)

查看DPackageR 中的包。它具有许多用于从狄利克雷过程进行模拟的功能。这是文档的链接:DPackageZen 上面的回答也是很好的信息。

不知道为什么sample(y, prob = p, replace = TRUE)禅宗的回答是必要的。

library(tidyverse)

##concentration parameter
c <- 1000
##base distribution
G_0 <- function(n) rnorm(n, 0, 1)
##finite approximate realization of Dirichlet Process
n <- 1000
b <- rbeta(n, 1, c)
p <- numeric(n)
p[1] <- b[1]
p[2:n] <- sapply(2:n, function(i) b[i] * prod(1 - b[1:(i-1)]))
##check summation of p must be 1
sum(p)
##P(theta_i)=p_i where theta follows i.i.d G_0
theta <- G_0(n)
##plot is similar to https://en.wikipedia.org/wiki/File:Dirichlet_process_draws.svg
df1 <- data.frame(theta = theta, p = p)
df1 %>%
    ggplot(aes(x = theta , y = p)) +
    geom_col(color = "black") +
    xlim(-4,4)

在此处输入图像描述