我一直在与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
}
}
要求我必须更改提案概率,以便新建议的值与可能性成比例。据推测,这导致了Gibbs采样MCMC算法。
我不知道在代码中要改变什么来做到这一点。我也不太了解提案概率的概念以及如何选择先验。
如果有人知道如何澄清我的怀疑,那就感激不尽。
答案 0 :(得分:1)
您目前的提案已在此处完成:
# 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 gibbs采样算法,您还需要更改下一行代码:
proposal_ratio_cluster <- log(freqPops[z[i-1,selind]])-log(fregPops[z[i,selind]])