\[\mu=\left[ {\begin{array}{*{20}{c}}{{\mu _1}}\\{{\mu _2}}\\\end{array}} \right] = \left[ {\begin{array}{*{20}{c}}1\\2\\\end{array}} \right]\]
\[\Sigma=\left[ {\begin{array}{*{20}{c}}1 & \rho\\\rho & 1 \\\end{array}} \right] = \left[ {\begin{array}{*{20}{c}}1 & {0.9} \\{0.9} & 1 \\\end{array}} \right]\]
The conditional distribution $f(x_1|x_2)$ is univariate normal $N(\mu_1+\rho(x_2-\mu_2), 1-\rho^2)$ and $f(x_2|x_1)$ is $N(\mu_2+\rho(x_1-\mu_1), 1-\rho^2)$.
The Matlab code for the Gibbs sampling is
n=5000;
x=zeros(n,2);
rho=0.9;
mu=[1;2];
sig=sqrt(1-rho^2);
%initial point
x(1,:)=[10,10];
for i=2:n
x(i,1)=normrnd(mu(1)+rho*(x(i-1,2)-mu(2)),sig);
x(i,2)=normrnd(mu(2)+rho*(x(i,1)-mu(1)),sig);
end
x=zeros(n,2);
rho=0.9;
mu=[1;2];
sig=sqrt(1-rho^2);
%initial point
x(1,:)=[10,10];
for i=2:n
x(i,1)=normrnd(mu(1)+rho*(x(i-1,2)-mu(2)),sig);
x(i,2)=normrnd(mu(2)+rho*(x(i,1)-mu(1)),sig);
end
and the result after 1,000 samples burn-in is
plot(x(1001:end,1),x(1001:end,2),'.');
axis square;
To check the result, calculate the sample mean and sample covariance matrix of x
>> mean(x)
ans =
0.9942 1.9960
>> corrcoef(x)
ans =
1.0000 0.8943
0.8943 1.0000
This problem is, in fact, easily solved with Matlab's mvnrnd().
covm=[1 rho;rho 1];
X = mvnrnd(mu,covm,4000);
figure;
plot(X(:,1),X(:,2),'.');
axis square;
X = mvnrnd(mu,covm,4000);
figure;
plot(X(:,1),X(:,2),'.');
axis square;
No comments:
Post a Comment