How to use if/else on the basis of rows?

3 views (last 30 days)
I have a pre-specified model that runs smoothly. The problem is that I have two datasets for the same model. The two datasets change just on the basis of the rows:e.g. dataset 1 goes from 1 to 60 and dataset 2 from 61 to 115. All the variables are the same. I would like to avoid computing the same code twice. I'd rather write it nicely and compute it in one shot.
I will give you an example dataset with my model:
data = rand(115,5)
Y_data = data(1:60, :) % dataset 1
Y_data = data(61:115, :) % dataset 2
% This is the model that runs nicely on dataset Y_data. I wanted to avoid to run the model twice,
% first with Y_data from row 1 to 60 and then from row to 61 to 100. I would like to do it in one shot
% the code for the model is fully automated so it's just a matter of making it work first on dataset 1 and then
% on dataset 2 in one unique code
T = size(Y_data,1);
P = 3; % number of lags used in LP for controls
H_min = 1;
H_max = 25;
y = Y_data(:,1); % endogenous variable
x = Y_data(:,2); % shock
w = lagmatrix(Y_data(:,[3:5]), 1:P );
newData = cat(2, y, x, w)
% Remove missings from data
newData(any(isnan(newData), 2), :) = [];
% Re-declare variables after removing missings
y = newData(:,1); % endogenous variable
x = newData(:,2); % shock
w = newData(:,3:size(newData,2)); % control variables and lags
r = 3;
lambda = 10000;
slp = locproj(y,x,w,H_min,H_max,'smooth',r,lambda);
%% Cross-Validation Choice of Lambda
slp = locproj(y,x,w,H_min,H_max,'smooth',r,0.01);
lambda = [1:10:1000] * T;
slp = locproj_cv(slp,5,lambda);
lambda_opt = lambda( min( slp.rss ) == slp.rss );
%% Confidence Intervals
r = 3;
slp = locproj(y,x,w,H_min,H_max,'smooth',r,lambda_opt);
slp = locproj_conf(slp,H_max,lambda_opt/2);
What I thought it could sort this out was using if/else, something like:
% This is wrong but it gives you an idea of what I was trying to do and get
% trying to tell MATLAB, fun the code first from dataset 1 (row 1:60) and then the same on dataset 2 (from row 61:115)
if Y_data = data(1:60, :);
else
Y_data = data(61:115, :);
end
% model code as above just here - not to make it too long
% the output therefore should save both results for dataset1 and dataset2
I got stuck and don't manage to go ahead. Can anyone help me? It would make my day.
Thank you very much!
  2 Comments
Mohammad Sami
Mohammad Sami on 6 Sep 2020
Edited: Mohammad Sami on 6 Sep 2020
Write your code as function and then you can call it with any data you want.
if true
Out1 = myfunction(ydata(1:60,:));
Out2 = myfunction(ydata(61:end,:));
end

Sign in to comment.

Accepted Answer

David Hill
David Hill on 6 Sep 2020
m=[1,60,61,115]
for k=1:2:3
Y_data=data(m(k):m(k+1),:);
%everything else the same
end

More Answers (0)

Categories

Find more on Loops and Conditional Statements in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!