Indian Ocean Skipjack
data.hpp
1 #pragma once
2 
3 #include "model.hpp"
4 #include "variable.hpp"
5 
6 namespace IOSKJ {
7 
13 class Data : public Structure<Data> {
14 public:
15 
19  Array<Variable<Lognormal>,DataYear,Quarter> m_pl_cpue;
20 
24  Array<Variable<Lognormal>,DataYear> w_ps_cpue;
25 
29  Array<Variable<Normal>,DataYear,Quarter,ZSize> z_ests;
30 
35  Array<SizeFreqVariable,DataYear,Quarter,Region,Method,Size> size_freqs;
36 
40  double exp_rate_high;
41 
45  double m_pl_cpue_ll;
46  double w_ps_cpue_ll;
47  double z_ests_ll;
48  double size_freqs_ll;
49  double exp_rate_high_ll;
50 
54  template<class Mirror>
55  void reflect(Mirror& mirror){
56  mirror
57  .data(m_pl_cpue,"m_pl_cpue")
58  .data(w_ps_cpue,"w_ps_cpue")
59  .data(z_ests,"z_ests")
60  .data(size_freqs,"size_freqs")
61  ;
62  }
63 
64  void read(void){
65  m_pl_cpue.read("data/input/m_pl_cpue.tsv",true);
66  w_ps_cpue.read("data/input/w_ps_cpue.tsv",true);
67  size_freqs.read("data/input/size_freqs.tsv",true);
68  z_ests.read("data/input/z_ests.tsv",true);
69  }
70 
71  void write(void){
72  m_pl_cpue.write("data/output/m_pl_cpue.tsv",true);
73  w_ps_cpue.write("data/output/w_ps_cpue.tsv",true);
74  z_ests.write("data/output/z_ests.tsv",true);
75  size_freqs.write("data/output/size_freqs.tsv",
76  {"value","proportion","size","sd"},
77  [](std::ostream& stream, const SizeFreqVariable& var){
78  stream<<var<<"\t"<<var.proportion<<"\t"<<var.size<<"\t"<<var.sd();
79  }
80  );
81  }
82 
91  void get(uint time, const Model& model){
92  uint year = IOSKJ::year(time);
93  uint quarter = IOSKJ::quarter(time);
94 
95  // Maldive PL quarterly CPUE
96  if(year>=2000 and year<=2014){
97  // Just get M/PL vulnerable biomass
98  m_pl_cpue(year,quarter) = model.biomass_vulnerable(MA,PL) * model.m_pl_quarter(quarter);
99 
100  // At end, scale expected by geometric mean over period 2004-2012
101  if(year==2014 and quarter==3){
102  GeometricMean geomean;
103  for(uint year=2004;year<=2012;year++){
104  for(uint quarter=0;quarter<4;quarter++){
105  geomean.append(m_pl_cpue(year,quarter));
106  }
107  }
108  double scaler = 1/geomean.result();
109  for(auto& fit : m_pl_cpue) fit *= scaler;
110  }
111  }
112 
113  // West PS annual CPUE
114  if(year>=1985 and year<=2014){
115  // Currently take a mean of vulnerable biomass over all quarters in the year...
116  static Array<double,Quarter> cpue_quarters;
117  // ... get this quarter's CPUE and save it
118  cpue_quarters(quarter) = model.biomass_vulnerable(WE,PS);
119  // ... if this is the last quarter then take the geometric mean
120  if(quarter==3){
121  w_ps_cpue(year) = geomean(cpue_quarters);
122  }
123 
124  // At end, scale expected by geometric mean over period 1991-2010
125  if(year==2014 and quarter==3){
126  GeometricMean geomean;
127  for(uint year=1991;year<=2010;year++){
128  geomean.append(w_ps_cpue(year,quarter));
129  }
130  double scaler = 1/geomean.result();
131  for(auto& fit : w_ps_cpue) fit *= scaler;
132  }
133  }
134 
135  // Size frequencies by region and method
136  if(year>=1982 and year<=2014){
137  // Generate expected size frequencies for each method in each
138  // region regardless of whether there is observed data or not
139  for(auto region : regions){
140  for(auto method : methods){
141  Array<double,Size> composition = 0;
142  // Calculate selected numbers by size accumulated over ages
143  for(auto size : sizes){
144  for(auto age : ages){
145  composition(size) += model.numbers(region,age) *
146  model.age_size(age,size) *
147  model.selectivity_size(method,size);
148  }
149  }
150  // Proportionalise
151  composition /= sum(composition);
152  // Store
153  for(auto size : sizes) size_freqs(year,quarter,region,method,size) = composition(size);
154  }
155  }
156  }
157 
158  // Size based Z-estimates for WE region from tagging
159  if(year>=2005 and year<=2014){
160  // Generate expected values of Z for each size bin
161  // Expected values of Z are calculated by combining natural mortality and
162  // fishing mortality rates
163  for(auto z_size : z_sizes){
164  // Model size classes are 2mm wide, so for each of the 5mm wide Z-estimate bins there are three model
165  // size classes to average over e.g.
166  // 45-50 Z-estimate size bin ~ 45,47,49 model size class mid points ~ ([44,46,48])/2 ~ 22,23,24 size dimension levels
167  // Calculate the mean Z for the model size classes in each Z-estimate size bin
168  double z = 0;
169  uint z_lower = 45+z_size.index()*5;
170  uint size_class = (z_lower-1)/2;
171  for(uint size=size_class;size<size_class+3;size++){
172  // Calculate a weighted overall survival across age classes for the size
173  double numerator = 0;
174  double denominator = 0;
175  for(auto age : ages){
176  // Expected number in this size bin
177  double number = model.numbers(WE,age) * model.age_size(age,size);
178  // Survival for this age
179  double survival = model.survival(age) * model.escapement(WE,age);
180  // Add to average
181  numerator += survival*number;
182  denominator += number;
183  }
184  // Calculate weighted mean
185  double survival = numerator/denominator;
186  // Capture cases where survuval is estimated to be zero to prevent overflow
187  if(survival>0) z += -log(survival);
188  else z += -log(0.000001);
189  }
190  z /= 3;
191  // Store
192  z_ests(year,quarter,z_size) = z;
193  }
194  }
195 
196  // Check number of region/gear exploitation rates that are above 90%;
197  if(year==year_min) exp_rate_high = 0;
198  for(auto& er : model.exploitation_rate){
199  if(er>0.9) exp_rate_high++;
200  }
201  }
202 
203  double loglike(void){
204  m_pl_cpue_ll = 0;
205  for(auto& item : m_pl_cpue) m_pl_cpue_ll += item.loglike();
206 
207  w_ps_cpue_ll = 0;
208  for(auto& item : w_ps_cpue) w_ps_cpue_ll += item.loglike();
209 
210  z_ests_ll = 0;
211  for(auto& item : z_ests) z_ests_ll += item.loglike();
212 
213  FournierRobustifiedMultivariateNormal::max_size = 30;
214  size_freqs_ll = 0;
215  for(auto& item : size_freqs) size_freqs_ll += item.loglike();
216 
217  exp_rate_high_ll = -exp_rate_high;
218 
219  return
220  m_pl_cpue_ll +
221  w_ps_cpue_ll +
222  z_ests_ll +
223  size_freqs_ll +
224  exp_rate_high_ll +
225  0
226  ;
227  }
228 
229 }; // class Data
230 
231 } // namespace IOSKJ
Definition: data.hpp:6
Definition: model.hpp:13
Definition: variable.hpp:4
Definition: dimensions.hpp:39
double exp_rate_high
Definition: data.hpp:40
double m_pl_cpue_ll
Definition: data.hpp:45
Definition: data.hpp:13
Variable< FournierRobustifiedMultivariateNormal > SizeFreqVariable
Definition: data.hpp:34
Array< Variable< Normal >, DataYear, Quarter, ZSize > z_ests
Definition: data.hpp:29
Array< Variable< Lognormal >, DataYear > w_ps_cpue
Definition: data.hpp:24
Array< Variable< Lognormal >, DataYear, Quarter > m_pl_cpue
Definition: data.hpp:19
void reflect(Mirror &mirror)
Definition: data.hpp:55