numChannels=size(dataA{1},1);
stackedplot(dataA{i,1}',DisplayLabels=["AT","SS","Res","TG"])
numObservations = numel(dataA);
idxTrain = 1:floor(0.9*numObservations);
idxTest = floor(0.9*numObservations)+1:numObservations;
dataTrain = dataA(idxTrain);
dataTest = dataA(idxTest);
for n = 1:numel(dataTrain)
XTrain{n} = X(:,1:end-1);
muX = mean(cat(2,XTrain{:}),2);
sigmaX = std(cat(2,XTrain{:}),0,2);
muT = mean(cat(2,TTrain{:}),2);
sigmaT = std(cat(2,TTrain{:}),0,2);
XTrain{n} = (XTrain{n} - muX) ./ sigmaX;
TTrain{n} = (TTrain{n} - muT) ./ sigmaT;
sequenceInputLayer(numChannels)
fullyConnectedLayer(numChannels)
options = trainingOptions("adam", ...
SequencePaddingDirection="left", ...
Shuffle="every-epoch", ...
Plots="training-progress", ...
net = trainNetwork(XTrain,TTrain,layers,options);
disp("After training.Press any key to continue.")
for n = 1:size(dataTest,1)
XTest{n} = (X(:,1:end-1) - muX) ./ sigmaX;
TTest{n} = (X(:,2:end) - muT) ./ sigmaT;
YTest = predict(net,XTest,SequencePaddingDirection="left");
rmse(i) = sqrt(mean((YTest{i} - TTest{i}).^2,"all"));
for i=idxTest(1,1):idxTest(1,size(idxTest,2))
TtA(j,1)=year(tA{i}(1,1));
stackedplot(tA{idxTest(1,idx)}(1,1:end-1)',X',DisplayLabels=["AT","SS","Res","TG"])
title("Test Observation " + year(tA{idxTest(1,idx)}(1,1)))
lfdpred=floor((size(XTest{1,idx},2)/24)/2);
firstDays=input("give first days for initial prediction (equal or lower than " + lfdpred + ")");
[net,~] = predictAndUpdateState(net,X(:,1:offset));
numTimeSteps = size(X,2);
numPredictionTimeSteps = numTimeSteps - offset;
Y = zeros(numChannels,numPredictionTimeSteps);
for t = 1:numPredictionTimeSteps
[net,Y(:,t)] = predictAndUpdateState(net,Xt);
t = tiledlayout(numChannels,1);
title(t,"Open Loop Forecasting")
lab=["AT","SS","Res","TG"];
plot(tA{idxTest(1,idx)}(1,2:end),T(i,:))
plot(tA{idxTest(1,idx)}(1,offset+1:numTimeSteps+1),[T(i,offset) Y(i,:)],'--')
legend(["Input" "Forecasted"])
disp("press any key for closed loop forecasting")
[net,Z] = predictAndUpdateState(net,X);
numPredictionTimeSteps = 7*24;
Y = zeros(numChannels,numPredictionTimeSteps);
for t = 1:numPredictionTimeSteps
[net,Y(:,t)] = predictAndUpdateState(net,Xt);
numTimeSteps = offset + numPredictionTimeSteps;
t = tiledlayout(numChannels,1);
title(t,"Closed Loop Forecasting")
plot(tA{idxTest(1,idx)}(1,2:end),T(i,1:offset))
plot(tA{idxTest(1,idx)}(1,offset):dt:tA{idxTest(1,idx)}(1,offset)+(numPredictionTimeSteps)*dt,[T(i,offset) Y(i,:)],'--')
legend(["Input" "Forecasted"])
pred=[T(1:4,1:offset).*sigmaT+muT Y(1:4,:).*sigmaT+muT];
out_time(1,:)=tA{idxTest(1,idx)}(1,2):dt:tA{idxTest(1,idx)}(1,1)+numTimeSteps*dt;
for j=1:size(alld{21,1},2)
if out_time(1,i)==allt{21,1}(1,j)
in_data(1:4,i)=alld{21,1}(1:4,j);
t1=tiledlayout(numChannels,1);
title(t1,"Closed loop prediction")
plot(out_time(1,offset+1:end),in_data(i,offset+1:end))
plot(out_time(1,offset+1:end),out_data(i,offset+1:end),'--')
legend(["Raw Data" "Prediction"])