O algoritmo ideal de Monte Carlo usa valores aleatórios sucessivos independentes . No MCMC, os valores sucessivos não são independentes, o que faz com que o método converja mais lentamente que o Monte Carlo ideal; no entanto, quanto mais rápido ele se mistura, mais rapidamente a dependência decai em iterações sucessivas¹ e mais rápido converge.
¹ Quero dizer aqui que os valores sucessivos são rapidamente "quase independentes" do estado inicial, ou melhor, dado o valor em um ponto, os valores tornam-se rapidamente "quase independentes" de medida que cresce; então, como qkhhly diz nos comentários, "a cadeia não fica presa em uma determinada região do espaço do estado".X ń + K X N kXnXń+kXnk
Editar: acho que o exemplo a seguir pode ajudar
Imagine que você deseja estimar a média da distribuição uniforme em pelo MCMC. Você começa com a sequência ordenada ; em cada etapa, você escolhe elementos na sequência e os embaralha aleatoriamente. Em cada etapa, o elemento na posição 1 é registrado; isso converge para a distribuição uniforme. O valor de controla a rapidez da mistura: quando , é lento; quando , os elementos sucessivos são independentes e a mistura é rápida.( 1 , … , n ) k > 2 k k = 2 k = n{1,…,n}(1,…,n)k>2kk=2k=n
Aqui está uma função R para este algoritmo MCMC:
mcmc <- function(n, k = 2, N = 5000)
{
x <- 1:n;
res <- numeric(N)
for(i in 1:N)
{
swap <- sample(1:n, k)
x[swap] <- sample(x[swap],k);
res[i] <- x[1];
}
return(res);
}
Vamos aplicá-lo para e plotar a estimativa sucessiva da média ao longo das iterações do MCMC:μ = 50n=99μ=50
n <- 99; mu <- sum(1:n)/n;
mcmc(n) -> r1
plot(cumsum(r1)/1:length(r1), type="l", ylim=c(0,n), ylab="mean")
abline(mu,0,lty=2)
mcmc(n,round(n/2)) -> r2
lines(1:length(r2), cumsum(r2)/1:length(r2), col="blue")
mcmc(n,n) -> r3
lines(1:length(r3), cumsum(r3)/1:length(r3), col="red")
legend("topleft", c("k = 2", paste("k =",round(n/2)), paste("k =",n)), col=c("black","blue","red"), lwd=1)
Você pode ver aqui que para (em preto), a convergência é lenta; para (em azul), que é mais rápido, mas ainda mais lenta do que com (a vermelho).k = 50 k = 99k=2k=50k=99
Você também pode plotar um histograma para a distribuição da média estimada após um número fixo de iterações, por exemplo, 100 iterações:
K <- 5000;
M1 <- numeric(K)
M2 <- numeric(K)
M3 <- numeric(K)
for(i in 1:K)
{
M1[i] <- mean(mcmc(n,2,100));
M2[i] <- mean(mcmc(n,round(n/2),100));
M3[i] <- mean(mcmc(n,n,100));
}
dev.new()
par(mfrow=c(3,1))
hist(M1, xlim=c(0,n), freq=FALSE)
hist(M2, xlim=c(0,n), freq=FALSE)
hist(M3, xlim=c(0,n), freq=FALSE)
Você pode ver que, com (M1), a influência do valor inicial após 100 iterações fornece apenas um resultado terrível. Com , parece ok, com desvio padrão ainda maior do que com . Aqui estão os meios e sd:k = 50 k = 99k=2k=50k=99
> mean(M1)
[1] 19.046
> mean(M2)
[1] 49.51611
> mean(M3)
[1] 50.09301
> sd(M2)
[1] 5.013053
> sd(M3)
[1] 2.829185