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

조회 수: 3 (최근 30일)
Armando MAROZZI
Armando MAROZZI 2020년 9월 6일
댓글: Armando MAROZZI 2020년 9월 6일
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
Mohammad Sami
Mohammad Sami 2020년 9월 6일
편집: Mohammad Sami 2020년 9월 6일
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
Armando MAROZZI
Armando MAROZZI 2020년 9월 6일
Thanks a lot! Super helpful!

댓글을 달려면 로그인하십시오.

채택된 답변

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

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Logical에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by