How to perform this for loop for multiple parameter values

8 ビュー (過去 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 Center および File ExchangeGet Started with MATLAB についてさらに検索

製品


リリース

R2021a

Community Treasure Hunt

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

Start Hunting!

Translated by