%This m-file runs the SSVS algorithm using a 
%generated data set
%
%generate data from y = beta0 + beta1x1 + beta2x2 + beta3x3 + u, 
%but allow for 5 potential explanatory variables. 
%set conditions for design of experiment
clear;
clc;
randn('seed',sum(100*clock));
rand('seed',sum(100*clock));

nobs = 1000;
covmat = [ 1 .4 .4 0 .6;
          .4  1 .7 0 .3;
           .4 .7 1 0 .3;
           0 0 0 1 0 ;
           .6 .3 .3 0 1];
H = chol(covmat);

beta0 = 2;
beta1 = .25;
beta2 = -.4;
beta3 = .6;

sig = .2^2;

x_mat = zeros(nobs,5);
for i = 1:nobs;
    xmat(i,:) = (H'*randn(5,1))';
    y(i,1) = beta0 + beta1*xmat(i,1) + beta2*xmat(i,2) + beta3*xmat(i,3) + sqrt(sig)*randn(1,1);
end;
xmat = [ones(nobs,1) xmat];

%set some initial conditions and prior hyperparameters
V0= 10^2;
tau2 = .0000001;
c2 = (9)/tau2;
mu_sigeps = .15;
a = 3;
b = (1/(2*mu_sigeps));

gammas = ones(5,1);
sigsq = 1;


iter = 10000;
burn = 200;
gammas_final = zeros(iter-burn,5);
betas_final = zeros(iter-burn,6);
sig_final = zeros(iter-burn,1);

for i = 1:iter;
    
    %-----------------
    %sample the betas
    %-----------------
    V_betas_temp = [V0 ;
        (gammas(1)*c2*tau2 + (1-gammas(1))*tau2);
        (gammas(2)*c2*tau2 + (1-gammas(2))*tau2);
        (gammas(3)*c2*tau2 + (1-gammas(3))*tau2);
        (gammas(4)*c2*tau2 + (1-gammas(4))*tau2);
        (gammas(5)*c2*tau2 + (1-gammas(5))*tau2)];
    V_betas = diag(V_betas_temp);
    D_beta = inv(xmat'*xmat/sigsq + inv(V_betas));
    d_beta = xmat'*y/sigsq ;
    H_beta = chol(D_beta);
    betas = D_beta*d_beta + H_beta'*randn(6,1);
    
    %-----------------
    %sample the gammas
    %-----------------
    for j = 1:5;
        numerator = normpdf(betas(j+1),0,sqrt(c2*tau2));
        denominator  = numerator + normpdf(betas(j+1),0,sqrt(tau2));
        prob = numerator/ denominator;
        unif = rand(1,1);
        gammas(j,1) = .5*sign(prob-unif) + .5;
    end;
    
    %---------------
    %sample the variance parameter
    %---------------
    resid = (y-xmat*betas)'*(y - xmat*betas);
    sigsq = invgamrnd((nobs/2) + a, inv( inv(b) + .5*resid),1,1);
    
    if i > burn;
        betas_final(i-burn,:) = betas';
        sig_final(i-burn,1) = sigsq;
        gammas_final(i-burn,:) = gammas';
    end;
end;

mean(betas_final)
mean(sig_final)
mean(gammas_final)
    