R 中的 MCMC 修改提案
MCMC in R Modify Proposal
我一直在 MCMC 研究群体遗传学,我有一些疑问。
我在统计方面没有经验,因此我有困难。
我有 运行 MCMC 的代码,1000 次迭代。我首先创建一个包含 0 的矩阵(50 列 = 50 个人和 1000 行用于 1000 次迭代)。
然后我创建一个随机向量来替换矩阵的第一行。这个向量有 1 和 2,代表人口 1 或人口 2。
我还有基因型频率和 50 个人的基因型。
我想要的是,根据基因型频率和基因型,确定个体属于哪个人群。
然后,我将继续更改分配给随机个体的人口并检查是否应接受新值。
niter <- 1000
z <- matrix(0,nrow=niter,ncol=ncol(targetinds))
z[1,] <- sample(1:2, size=ncol(z), replace=T)
lhood <- numeric(niter)
lhood[1] <- compute_lhood_K2(targetinds, z[1,], freqPops)
accepted <- 0
priorz <- c(1e-6, 0.999999)
for(i in 2:niter) {
z[i,] <- z[i-1,]
# propose new vector z, by selecting a random individual, proposing a new zi value
selind <- sample(1:nind, size=1)
# proposal probability of selecting individual at random
proposal_ratio_ind <- log(1/nind)-log(1/nind)
# propose a new index for the selected individual
if(z[i,selind]==1) {
z[i,selind] <- 2
} else {
z[i,selind] <- 1
}
# proposal probability of changing the index of individual is 1/2
proposal_ratio_cluster <- log(1/2)-log(1/2)
propratio <- proposal_ratio_ind+proposal_ratio_cluster
# compute f(x_i|z_i*, p)
# the probability of the selected individual given the two clusters
probindcluster <- compute_lhood_ind_K2(targetinds[,selind],freqPops)
# likelihood ratio f(x_i|z_i*,p)/f(x_i|z_i, p)
lhoodratio <- probindcluster[z[i,selind]]-probindcluster[z[i-1,selind]]
# prior ratio pi(z_i*)/pi(z_i)
priorratio <- log(priorz[z[i,selind]])-log(priorz[z[i-1,selind]])
# accept new value according to the MH ratio
mh <- lhoodratio+propratio+priorratio
# reject if the random value is larger than the MH ratio
if(runif(1)>exp(mh)) {
z[i,] <- z[i-1,] # keep the same z
lhood[i] <- lhood[i-1] # keep the same likelihood
} else { # if accepted
lhood[i] <- lhood[i-1]+lhoodratio # update the likelihood
accepted <- accepted+1 # increase the number of accepted
}
}
有人问我必须更改提案概率,以便新的提案值与可能性成正比。据推测,这导致了吉布斯采样 MCMC 算法。
我不知道要在代码中更改什么才能执行此操作。我也不是很明白proposal probability的概念以及如何选择先验
如果有人知道如何澄清我的疑惑,将不胜感激。
您当前的提案已在此处完成:
# propose a new index for the selected individual
if(z[i,selind]==1) {
z[i,selind] <- 2
} else {
z[i,selind] <- 1
}
如果个人被分配到集群 1,那么您建议通过将他们分配到集群 2 来确定性地切换分配(反之亦然)。
你没有告诉我们什么是freqPops,但是如果你想根据freqPops求婚那么我相信上面的代码必须被替换为
z[i,selind] <- sample(c(1,2),size=1,prob=freqPops)
(至少当你说你想根据可能性提出建议时我是这么理解的——但是,你的说法不清楚)。
现在要使它成为有效的 mcmc 吉布斯采样算法,您还需要更改下一行代码:
proposal_ratio_cluster <- log(freqPops[z[i-1,selind]])-log(fregPops[z[i,selind]])
我一直在 MCMC 研究群体遗传学,我有一些疑问。 我在统计方面没有经验,因此我有困难。
我有 运行 MCMC 的代码,1000 次迭代。我首先创建一个包含 0 的矩阵(50 列 = 50 个人和 1000 行用于 1000 次迭代)。 然后我创建一个随机向量来替换矩阵的第一行。这个向量有 1 和 2,代表人口 1 或人口 2。 我还有基因型频率和 50 个人的基因型。 我想要的是,根据基因型频率和基因型,确定个体属于哪个人群。 然后,我将继续更改分配给随机个体的人口并检查是否应接受新值。
niter <- 1000
z <- matrix(0,nrow=niter,ncol=ncol(targetinds))
z[1,] <- sample(1:2, size=ncol(z), replace=T)
lhood <- numeric(niter)
lhood[1] <- compute_lhood_K2(targetinds, z[1,], freqPops)
accepted <- 0
priorz <- c(1e-6, 0.999999)
for(i in 2:niter) {
z[i,] <- z[i-1,]
# propose new vector z, by selecting a random individual, proposing a new zi value
selind <- sample(1:nind, size=1)
# proposal probability of selecting individual at random
proposal_ratio_ind <- log(1/nind)-log(1/nind)
# propose a new index for the selected individual
if(z[i,selind]==1) {
z[i,selind] <- 2
} else {
z[i,selind] <- 1
}
# proposal probability of changing the index of individual is 1/2
proposal_ratio_cluster <- log(1/2)-log(1/2)
propratio <- proposal_ratio_ind+proposal_ratio_cluster
# compute f(x_i|z_i*, p)
# the probability of the selected individual given the two clusters
probindcluster <- compute_lhood_ind_K2(targetinds[,selind],freqPops)
# likelihood ratio f(x_i|z_i*,p)/f(x_i|z_i, p)
lhoodratio <- probindcluster[z[i,selind]]-probindcluster[z[i-1,selind]]
# prior ratio pi(z_i*)/pi(z_i)
priorratio <- log(priorz[z[i,selind]])-log(priorz[z[i-1,selind]])
# accept new value according to the MH ratio
mh <- lhoodratio+propratio+priorratio
# reject if the random value is larger than the MH ratio
if(runif(1)>exp(mh)) {
z[i,] <- z[i-1,] # keep the same z
lhood[i] <- lhood[i-1] # keep the same likelihood
} else { # if accepted
lhood[i] <- lhood[i-1]+lhoodratio # update the likelihood
accepted <- accepted+1 # increase the number of accepted
}
}
有人问我必须更改提案概率,以便新的提案值与可能性成正比。据推测,这导致了吉布斯采样 MCMC 算法。
我不知道要在代码中更改什么才能执行此操作。我也不是很明白proposal probability的概念以及如何选择先验
如果有人知道如何澄清我的疑惑,将不胜感激。
您当前的提案已在此处完成:
# propose a new index for the selected individual
if(z[i,selind]==1) {
z[i,selind] <- 2
} else {
z[i,selind] <- 1
}
如果个人被分配到集群 1,那么您建议通过将他们分配到集群 2 来确定性地切换分配(反之亦然)。
你没有告诉我们什么是freqPops,但是如果你想根据freqPops求婚那么我相信上面的代码必须被替换为
z[i,selind] <- sample(c(1,2),size=1,prob=freqPops)
(至少当你说你想根据可能性提出建议时我是这么理解的——但是,你的说法不清楚)。
现在要使它成为有效的 mcmc 吉布斯采样算法,您还需要更改下一行代码:
proposal_ratio_cluster <- log(freqPops[z[i-1,selind]])-log(fregPops[z[i,selind]])