pooled_fgls: make calculation of Sigma_e more efficient

time-shift
Houtan Bastani 2017-11-17 12:30:32 +01:00
parent 80feaeae25
commit 0301029a17
1 changed files with 5 additions and 11 deletions

View File

@ -38,18 +38,12 @@ global M_ oo_
pooled_ols(ds, param_common, param_regex, true, 'pooled_fgls');
neq = length(fieldnames(oo_.pooled_fgls.resid));
nobs = length(oo_.pooled_fgls.sample_range);
for i = 1:neq
ui = oo_.pooled_fgls.resid.(oo_.pooled_fgls.residnames{i});
for j = i:neq
uj = oo_.pooled_fgls.resid.(oo_.pooled_fgls.residnames{j});
M_.Sigma_e(i, j) = (ui'*uj)/nobs;
M_.Sigma_e(j, i) = M_.Sigma_e(i, j);
end
end
oo_.sur.dof = length(oo_.pooled_fgls.sample_range);
resid = oo_.pooled_fgls.Y - oo_.pooled_fgls.X * oo_.pooled_fgls.beta;
resid = reshape(resid, oo_.sur.dof, length(oo_.pooled_fgls.residnames));
M_.Sigma_e = resid'*resid/oo_.sur.dof;
kLeye = kron(chol(inv(M_.Sigma_e)), eye(nobs));
kLeye = kron(chol(inv(M_.Sigma_e)), eye(oo_.sur.dof));
[q, r] = qr(kLeye*oo_.pooled_fgls.X, 0);
oo_.pooled_fgls.beta = r\(q'*kLeye*oo_.pooled_fgls.Y);