%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Xavier Martin G. Bautista
% Econometrics 2
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% The following estimates the coefficents of a simulataneous equations
% model using OLS.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear
clc
% Set the true parameters and placeholders for results.
T = 1000; % Number of observations.
beta0 = 0; % Intercept in equation 1.
beta1 = 0.5; % Coefficient on Y2 in equation 1.
beta2 = 0.3; % Coefficient on X1 in equation 1.
beta4 = 0; % Intercept in equation 2.
beta5 = 0.3; % Coefficient on Y1 in equation 2.
beta6 = 0.2; % Coefficient on X1 in equation 2.
beta7 = 1; % Coefficient on X2 in equation 2.
sigma1 = 1; % Standard deviation of u1.
sigma2 = 2; % Standard deviation of u2.
sim = 1000; % Number of simulations.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% The simultaneous equations model is
% Y1 = beta0 + beta1*Y2 + beta2*x1 + u1
% Y2 = beta4 + beta5*Y1 + beta6*x1 + beta7*x2 + u2
%
% This code estimates the coefficients in the first equation.
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Create the G^{-1} and B matrices.
G_inv = zeros(2,2); % G^{-1} matrix.
det_g = 1 - beta1*beta5; % Determinant of G.
G_inv(1,1) = 1/det_g;
G_inv(1,2) = beta5/det_g;
G_inv(2,1) = beta1/det_g;
G_inv(2,2) = 1/det_g;
B = zeros(3,2); % B matrix.
B(1,1) = beta0;
B(2,1) = beta2;
B(3,1) = 0;
B(1,2) = beta4;
B(2,2) = beta6;
B(3,2) = beta7;
% Generate the data.
x1 = 2 + ((1:1:T)'/T).*normrnd(0,1,T,1); % X1.
x2 = 3 + 0.5*x1 + sigma1.*normrnd(0,1,T,1); % X2.
X = [ones(T,1) x1 x2]; % X.
B_2sls = zeros(sim, size(X,2)); % 2SLS results.
B_ols = zeros(sim, size(X,2)); % OLS results.
for s = 1:sim
u1 = normrnd(0,sigma1,T,1); % Residuls for equation 1.
u2 = normrnd(0,sigma2,T,1) + 0.2*u1; % Residuals for equation 2.
u = [u1 u2]; % Residuals.
Y = X*B*G_inv + u; % System of equations.
Y1 = Y(:,1); % Y1.
Y2 = Y(:,2); % Y2.
% Two-stage Least Squares: Stage 1
%{ MISSING CODE %}
% Two-stage Least Squares: Stage 2
X1_hat = [ones(T,1) Y2_hat x1];
B_2sls(s,:) = inv(X1_hat'*X1_hat)*X1_hat'*Y1; % 2SLS estimates.
% OLS esimation
X1_ols = [ones(T,1) Y2 x1];
B_ols(s,:) = inv(X1_ols'*X1_ols)*X1_ols'*Y1; % OLS estimates.
end
% Display the results of the last estimation.
fprintf('--------------------------------------------------------------\n')
fprintf('Empirical Results: 2SLS estimates for Equation 1\n')
fprintf('--------------------------------------------------------------\n\n')
%{ MISSING CODE %}
fprintf('--------------------------------------------------------------\n')
fprintf('Empirical Results: OLS estimates for Equation 1\n')
fprintf('--------------------------------------------------------------\n\n')
%{ MISSING CODE %}