From 11b24a0663148ea3cb5dd8d457aedd91748a60a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Adjemia=20=28Scylla=29?= Date: Wed, 19 Dec 2018 15:43:36 +0100 Subject: [PATCH] Add a constraint on the share of optimizing agents PAC/Iterative OLS. Ensure that the parameter value lies betwwen 0 and 1. --- matlab/+pac/+estimate/iterative_ols.m | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/matlab/+pac/+estimate/iterative_ols.m b/matlab/+pac/+estimate/iterative_ols.m index 31eb4d1ab..132e0f9f4 100644 --- a/matlab/+pac/+estimate/iterative_ols.m +++ b/matlab/+pac/+estimate/iterative_ols.m @@ -73,6 +73,9 @@ if is_non_optimizing_agents estimate_non_optimizing_agents_share = ismember(M_.param_names(M_.pac.(pacmodl).share_of_optimizing_agents_index), fieldnames(params)); if ~estimate_non_optimizing_agents_share share_of_optimizing_agents = M_.params(M_.pac.(pacmodl).share_of_optimizing_agents_index); + if share_of_optimizing_agents>1 || share_of_optimizing_agents<0 + error('The share of optimizing agents shoud be in (0,1).') + end end else share_of_optimizing_agents = 1.0; @@ -167,6 +170,9 @@ if estimate_non_optimizing_agents_share [~, share_param_id] = setdiff(1:length(ipnames_), ecm_params_id); params0_ = params0(ecm_params_id); share_of_optimizing_agents = params0(share_param_id); + if share_of_optimizing_agents>1 || share_of_optimizing_agents<0 + error('Initial value for the share of optimizing agents shoud be in (0,1).') + end else params0_ = params0; end @@ -225,6 +231,8 @@ while noconvergence ZDATA = XDATA*params0_+PacExpectations-dataForNonOptimizingBehaviour(range).data*non_optimizing_behaviour_params; % Update the (estimated) share of optimizing agents by running OLS share_of_optimizing_agents = (ZDATA\YDATA); + % Force the share of optimizing agents to be in [0,1]. + share_of_optimizing_agents = max(min(share_of_optimizing_agents, 1.0), 0.0); M_.params(ipnames_(share_param_id)) = share_of_optimizing_agents; else M_.params(ipnames_) = params0_;