R - мегаполис RW с использованием гиббса терпит неудачу

Я хочу сделать выборку из апостериорной, где LambdaA и LambdaB - экспоненциальные скорости A и B. Кроме того, y - это наблюдения случайных величин.

Апостериор дается

введите здесь описание изображения

и по числовым причинам я беру журнал этой функции.

Данные:

n<-100
y<- c(rexp(n))

Логарифм апостериорного:

dmix<-function(LambdaA,LambdaB,w){


ifelse( LambdaA<=0|LambdaB<=0|w<0|w>1 ,0,log(w*LambdaA*LambdaB*exp(-2*(LambdaA+LambdaB))*prod(w*LambdaA*exp(-
LambdaA*y) + (1-w)*LambdaB*exp(-LambdaB*y)) ))}

U-значения

U.lambdaB <- runif(1)
U.lambdaA<- runif(1)
U.w<- runif(1)

Считать шаги

REJLambdaB <- 1
REJw <- 1
REJLambdaA<-1

Начальные точки

LambdaB <- LambdaA<- w<- numeric(n)
LambdaA[1]<-0.5
LambdaB[1] <- 0.5
w[1] <- 0.5

Алгоритм случайного блуждания MH, обновляющий каждый компонент за раз:

for (t in 2:n){


 LambdaBprop<- rnorm(1,LB[t-1],0.5)
 wprop<- rnorm(1,w[t-1],0.5)
 LambdaAprop<- rnorm(1,LB[t-1],0.5)

logalpha1 = dmix(LambdaAprop,LambdaB[t-1],w[t-1])-dmix(LambdaA[t-1],LambdaB[t-
1],w[t-1])

logalpha2 = dmix(LambdaA[t-1],LambdaBprop,w[t-1])-dmix(LA[t-1],LB[t-1],w[t-
 1])




if (!is.null(log(U.lambdaB) > logalpha2))

{LambdaB[t] <- LambdaBprop}  ## accepted 

else{LambdaB[t] <- LambdaB[t-1] ##rejected
REJLambdaB<-REJLambdaB+1} 


if (!is.null(log(U.lambdaA) > logalpha1)) 

{LambdaA[t]<-LambdaAprop}

else {LambdaA[t]<-LambdaA[t-1]
REJLambdaA<-REJLambdaA+1}

 if (w[t]<0|w[t]>1) 

{w[t]<-w[t-1]}

else {w[t]<-wprop
REJw<-REJw+1}

}

В конечном счете, у меня проблемы с апостериором, так как я продолжаю получать либо бесконечность, либо 0 при оценке логарифма. Обратите внимание, что я хочу сравнить log($\alpha(x'|x))$ с log(U). Любая помощь, чтобы заставить этот код работать?


person Btzzzz    schedule 29.11.2017    source источник
comment
Я думаю, что этот вопрос должен быть перенесен обратно в X, подтвержденный, поскольку сложность связана с плохим пониманием алгоритма Метрополиса, а не чем для R-кодирования.   -  person Xi'an    schedule 05.12.2017


Ответы (1)


Если вы действительно думаете, что случайное блуждание означает

lambdB[t]<- lambdB[t-1] + runif(1)
w[t]<- w[t-1] + runif(1)
lambdA[t] <- lambdB[t-1] + runif(1)

вам следует пересмотреть и инвестировать в чтение основ теории цепей Маркова и цепей Маркова Монте-Карло: на каждой итерации вы добавляете универсальную переменную U (0,1) к текущему значению. Поэтому вы всегда предлагаете увеличить текущее значение. Как вы думаете, может ли это когда-нибудь создать эргодическую цепь Маркова?

В dmix также есть ошибка: поскольку вы работаете с логарифмом, помните, что log(0)=-oo. И количества logalpha1 и logalpha2 обновляются неправильно. И еще много ошибок программирования, например неправильное использование !is.null... В любом случае, вот исправленный код R, который работает:

n<-100
y<- c(rexp(n))

#Logarithm of posterior:

dmix<-function(LambdaA,LambdaB,w){

  ifelse( (LambdaA<=0)|(LambdaB<=0)|(w<0)|(w>1) ,
    -1e50,log(w*LambdaA*LambdaB)-2*(LambdaA+LambdaB)+sum(log(w*LambdaA*exp(-
    LambdaA*y) + (1-w)*LambdaB*exp(-LambdaB*y))) )}

#Count steps

REJLambdaB <- 1
REJw <- 1
REJLambdaA<-1

#Initial points
N <- 1e4
LambdaB <- LambdaA <- w<- numeric(N)
LambdaA[1] <- LambdaB[1] <- w[1] <- 0.5

U.lambdaB <- runif(N)
U.lambdaA<- runif(N)
U.w <- runif(N)

for (t in 2:N){
LambdaBprop=rnorm(1,LambdaB[t-1],0.5)
LambdaAprop=rnorm(1,LambdaA[t-1],0.5)
wprop=rnorm(1,w[t-1],0.05)

logalpha2 = dmix(LambdaA[t-1],LambdaBprop,w[t-1])-dmix(LambdaA[t-1],LambdaB[t-1],w[t-1])

if ((log(U.lambdaB[t]) < logalpha2))
  {LambdaB[t] <- LambdaBprop}  ## accepted
else{LambdaB[t] <- LambdaB[t-1] ##rejected
     REJLambdaB<-REJLambdaB+1}

logalpha1 = dmix(LambdaAprop,LambdaB[t],w[t-1])-dmix(LambdaA[t-1],LambdaB[t],w[t-1])

if ((log(U.lambdaA[t]) < logalpha1)) 
  {LambdaA[t]<-LambdaAprop}
else {LambdaA[t]<-LambdaA[t-1]
  REJLambdaA<-REJLambdaA+1}

logw = dmix(LambdaA[t],LambdaB[t],wprop)-dmix(LambdaA[t],LambdaB[t],w[t-1])

if (w[t]<0|w[t]>1|(log(U.w[t])>logw))
    {w[t]<-w[t-1]}
else {w[t]<-wprop
    REJw<-REJw+1}

}

Как показал результат

введите здесь описание изображения

задний дает симметричный результат в лямбда.

person Xi'an    schedule 30.11.2017
comment
Ясно... так что я должен использовать нормально распределенные значения (rnorm) для lambdaA и lambdaB, чтобы они либо уменьшались, либо увеличивались? Но тогда, поскольку w больше [0,1], я должен использовать для этого что-то другое? - person Btzzzz; 30.11.2017
comment
Спасибо за совет. Я все еще не могу заставить код работать, я думаю, что в апостериорной ошибке есть какие-либо предложения ?? - person Btzzzz; 03.12.2017
comment
А, спасибо, я неправильно скопировал сюда код. Тем не менее, я буду продолжать попытки, я думаю, что это проблема с моим апостериором, потому что мне нужно, чтобы он оценивал неотрицательные лямбды и w в [0,1] - person Btzzzz; 04.12.2017
comment
Этот код по-прежнему производит NAN или Infinity для logalpha? он также выдает сообщение: Error in if ((log(U.lambdaB[t]) < logalpha2)) { : missing value where TRUE/FALSE needed .... поэтому я ранее использовал is.null для удаления такой ошибки - person Btzzzz; 05.12.2017
comment
Я думаю, что это была скорее ошибка (ошибки) кодирования, чем: вы ничего не понимаете в MCMC. - person Glen; 28.12.2017