How to perform this for loop for multiple parameter values

조회 수: 3 (최근 30일)
Leo Tu
Leo Tu 2021년 7월 7일
편집: Leo Tu 2021년 7월 8일
I have the following script and vector of temperatures. I need to run it for parameter values of s=0:1:999, mu=0.1:0.1:100, om=0.01:0.01:10, i.e I need to run the script so many times such that all combinations of the parameters are used. I should end up with 1000^3 nll values stored in an array or table.
If anyone could offer some advice on how to approach this, it would be much appreciated.
% T is temperatures, t = time in days
load("Temperature.mat")
T = T'; % from column vector to row vector
AT = T-min(T); % this is the adjusted positive temperatures
s = 0; % lag in days
mu = 0.1;
om = 0.01; % omega
for t=s+1:length(AT)
k = abs(s:-1:(s-t+1));
id=[(t-1):-1:0]+1;
lambda(t) = mu+sum(om.^k.*AT(id))/sum(om.^k);
end
for j=1:length(lambda)
nll = -sum(j*log(lambda(j)))+sum(lambda(j));
end
  댓글 수: 4
Are Mjaavatten
Are Mjaavatten 2021년 7월 8일
In line 16, you throw away all results except the last. Should it rather be
nll(j) = -sum(j*log(lambda(j)))+sum(lambda(j));
I think you need to rethink what you want and if you are on the right track. I recommend to start with just one year of data so things are quicker and easier to inspect.
Try to compare results for, say, s = 0 and s = 30 or 180. What do you want to use in your final plot? You surely do not want to plot 12054 x 1000 x 1000 x 1000 data points?
Leo Tu
Leo Tu 2021년 7월 8일
편집: Leo Tu 2021년 7월 8일
@Are Mjaavatten This is now my updated code
% parameter values
srange = [0 9];
om = 0.1;
mu = 0.1;
r = mypoiss(5,om,mu);
s = srange(1):srange(2);
nll = zeros(numel(s));
for si = 1:numel(s)
t = max(srange)+1:numel(AT);
for ti = 1:numel(t)
k = abs(s(si):-1:(s(si)-t(ti)+1));
id = ((t(ti)-1):-1:0)+1;
lambda(t(ti)) = mu+sum(om.^k.*AT(id))/sum(om.^k);
% store all the results
end
nll(si) = 0;
nll(si) = nll(si) - (r(ti).*log(lambda(t(ti)))) + (lambda(t(ti)));
end
where I am still loading the temperatures in same as before. r is the function
function r = mypoiss(s,om,mu)
% output; r is synthetic time series for number of cases
% input; s is lag, om is decay rate, mu is baseline rate
% T is temperatures, t = time in days
load("Temperature.mat")
T = T'; % from column vector to row vector
AT = T-min(T); % this is the adjusted positive temperatures
for t=s+1:length(AT)
k = abs(s:-1:(s-t+1));
id=[(t-1):-1:0]+1;
lambda(t) = mu+sum(om.^k.*AT(id))/sum(om.^k);
end
r = poissrnd(lambda);
So now this loops for all values of s from 0 to 9 and gives 10 nll values stored in a 10x10. I now want the parameter s to be from 0 to 60 but mu and om I think I can get away with just 100 equally spaced points for each.
The problem here is that I don't know how I can loop this for all the other parameter values.
An example of what I am looking for is the second plot from here:
The axis should be the parameters s, mu, om and the colorbar should be values of nll.
Thank you for your help so far!

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

답변 (0개)

카테고리

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

제품


릴리스

R2021a

Community Treasure Hunt

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

Start Hunting!

Translated by