7 my ( $calling_scm, $direction, $basic_model, $model_number, $ofv_ch_ref ) = @_;
8 my @ofv_changes = @
{$ofv_ch_ref};
10 my %ofv_test = ( 'forward' => 0.05,
12 my %iiv_test = ( 'IVCL' => { 'forward' => -0.05,
14 # 'IVKA' => { 'forward' => -0.15,
15 # 'backward' => 0.3 },
16 'IVV' => { 'forward' => -0.10,
17 'backward' => 0.2 } );
18 my %extreme_test = ( 'TVCL' => { 'forward' => 0.1,
20 # 'TVKA' => { 'forward' => 0.20,
21 # 'backward' => -0.4 },
22 'TVV' => { 'forward' => 0.15,
23 'backward' => -0.3 }, );
25 my @step_relations = @
{$calling_scm -> step_relations
};
26 my @competing_models = @
{$calling_scm -> prepared_models
-> [$model_number-1]{'own'}};
29 my ( $junk, $junk, $junk, $os_ref, $ofv_ref, @junk ) =
30 $calling_scm -> gof_ofv
( $direction,
34 # my ( $os_ref, $ofv_ref ) = &sign_ofv_drops( calling_scm => $calling_scm,
35 # model_number => $model_number,
36 # direction => $direction,
37 # ofv_test => \%ofv_test );
38 my ( $is_ref, $id_ref ) = &sign_iiv_changes
( calling_scm
=> $calling_scm,
39 model_number
=> $model_number,
40 direction
=> $direction,
41 iiv_test
=> \
%iiv_test );
42 my ( $es_ref, $ed_ref ) = &sign_extreme_changes
( calling_scm
=> $calling_scm,
43 model_number
=> $model_number,
44 direction
=> $direction,
45 extreme_test
=> \
%extreme_test );
47 my %ofv_sign = %{$os_ref};
48 my @ofv_drop = @
{$ofv_ref};
49 my %iiv_sign = %{$is_ref};
50 my @iiv_drop = @
{$id_ref};
51 my %extreme_sign = %{$es_ref};
52 my @extreme_drop = @
{$ed_ref};
57 my ( $chosen_parameter, $chosen_covariate );
59 my %chosen_stats_sign;
62 # my %clin_sign = ( %iiv_sign, %extreme_sign );
65 # OFV sign: om droppen är större än den angivna gränsen
66 # IIV_sign: om droppen (skillnaden) är större än den angivna gränsen
67 # extreme_sign: om droppen (skillnaden) är större än den angivna gränsen
69 open( LOG
, ">>".$calling_scm->logfile->[$model_number-1] );
71 if ( $direction eq 'forward' ) {
73 # Om droppen är ofv_sign och antingen iiv_sign eller extreme_sign:
74 # välj den med störst positivt drop.
75 print LOG
"CRITERIA: IF( ofv_sign AND ( iiv_sign OR extreme_sign ) )\n";
76 for ( my $i = 0; $i <= $#competing_models; $i++ ) {
77 my $od = defined $ofv_sign{$i} ?
1 : 0;
78 my $id = defined $iiv_sign{$i} ?
1 : 0;
79 my $ed = defined $extreme_sign{$i} ?
1 : 0;
80 print LOG
sprintf("%-8s",$step_relations[$i]{'parameter'}.
81 $step_relations[$i]{'covariate'}.'-'.
82 $step_relations[$i]{'state'}),
83 " ( $od AND ( $id OR $ed ) ) = ",
84 ($od and ($id or $ed ) ),"\n";
85 $sign{$i} = $ofv_drop[$i] if ($od and ($id or $ed ) );
89 # Om droppen är ofv_(un)sign eller ( iiv_(un)sign och extreme_(un)sign för alla tester):
90 # välj den med minst negativt drop
91 print LOG
"CRITERIA: IF( ofv_sign OR ( iiv_sign AND extreme_sign ) )\n";
92 for ( my $i = 0; $i <= $#competing_models; $i++ ) {
93 my $od = defined $ofv_sign{$i} ?
1 : 0;
94 my ( $id, $ed ) = (1,1);
95 while ( my ( $name, $ref ) = each %iiv_test ) {
96 $id = 0 unless ( defined $iiv_sign{$i}{$name} );
98 while ( my ( $name, $ref ) = each %extreme_test ) {
99 $ed = 0 unless ( defined $extreme_sign{$i}{$name}{'upper_relative_range'} );
100 $ed = 0 unless ( defined $extreme_sign{$i}{$name}{'lower_relative_range'} );
102 print LOG
sprintf("%-8s",$step_relations[$i]{'parameter'}.
103 $step_relations[$i]{'covariate'}.'-'.
104 $step_relations[$i]{'state'}),
105 " ( $od OR ( $id AND $ed ) ) = ",
106 ($od or ($id and $ed ) ),"\n";
107 $sign{$i} = $ofv_drop[$i] if ( $od or ( $id and $ed ) );
111 if ( scalar keys %sign > 0) {
112 my @sorted_ids = sort { $sign{$b} <=> $sign{$a} } keys %sign;
113 $resulting_model = $competing_models[$sorted_ids[0]];
114 $chosen_ofv = $competing_models[$sorted_ids[0]] -> outputs
-> [0] -> ofv
-> [0][0];
115 $chosen_parameter = $step_relations[$sorted_ids[0]]{'parameter'};
116 $chosen_covariate = $step_relations[$sorted_ids[0]]{'covariate'};
117 %chosen_extreme = %{$extreme_drop[$sorted_ids[0]]} if ( defined $extreme_drop[$sorted_ids[0]] );
118 %chosen_iiv = %{$iiv_drop[$sorted_ids[0]]} if ( defined $iiv_drop[$sorted_ids[0]] );
122 if ( defined $calling_scm -> base_criteria_vals
and
123 defined $calling_scm -> base_criteria_vals
->
124 [$model_number-1] -> {'ofv'} ) {
125 $base_ofv = $calling_scm -> base_criteria_vals
->
126 [$model_number-1] -> {'ofv'};
128 $base_ofv = $calling_scm -> models
-> [$model_number-1] -> outputs
-> [0] -> ofv
-> [0][0];
130 # print "BOFV1: ",$base_ofv,"\n";
131 # print "BOFV2: ",$basic_model -> outputs -> [0] -> ofv -> [0][0],"\n";
132 return ( $resulting_model,
136 [\
@ofv_drop, \
@iiv_drop, \
@extreme_drop],
138 { 'BASE_MODEL_OFV' => $base_ofv,
139 'CHOSEN_MODEL_OFV' => $chosen_ofv,
142 {'ofv' => $chosen_ofv,
143 'estimates' => \
%chosen_iiv,
144 'stats' => \
%chosen_extreme } );
148 sub sign_iiv_changes
{
150 my $calling_scm = $parm{'calling_scm'};
151 my $model_number = $parm{'model_number'};
152 my $direction = $parm{'direction'};
153 my %iiv_test = %{$parm{'iiv_test'}};
155 my %iiv_sign; # Flag 0|1 for (un)significance
158 if ( defined $calling_scm -> base_criteria_vals
and
159 defined $calling_scm -> base_criteria_vals
->
160 [$model_number-1] -> {'estimates'} ) {
161 %base_ests = %{$calling_scm -> base_criteria_vals
->
162 [$model_number-1] -> {'estimates'}};
163 } elsif ( $direction eq 'backward' ) {
164 die "GOF_CRC: backward search needs a 'base' IIV estimate\n";
166 if ( defined $calling_scm -> models
-> [$model_number-1] ->
167 name_val
( parameter_type
=> 'theta' )->[0][0] and
168 defined $calling_scm -> models
-> [$model_number-1] ->
169 name_val
( parameter_type
=> 'omega' )->[0][0] ) {
170 %base_ests = ( %{$calling_scm -> models
-> [$model_number-1] ->
171 name_val
( parameter_type
=> 'omega' )->[0][0]} );
173 die "GOF_CRC: OMEGA parameter estimates not available from model",
174 $calling_scm -> models
-> [$model_number-1] -> full_name
,"\n";
178 my @models = @
{$calling_scm -> prepared_models
-> [$model_number-1]{'own'}};
180 foreach my $model ( @models ) {
181 my %mod_name_val = ( %{$model -> name_val
( parameter_type
=> 'omega' )->[0][0]} );
182 push( @ests, \
%mod_name_val );
185 my @step_relations = @
{$calling_scm -> step_relations
};
186 # Clinical relevance of effect on iiv
187 open( LOG
, ">>".$calling_scm->logfile->[$model_number-1] );
188 my $un = $direction eq 'backward' ?
'(UN)' : '';
189 print LOG
sprintf("%-8s",'MODEL'),
190 sprintf("%12s",'TEST NAME'),
191 sprintf("%12s",'BASE VAL'),
192 sprintf("%12s",'NEW VAL'),
193 sprintf("%50s",'TEST VAL (RELATIVE CHANGE OF SQUARED VALUES)'),
194 sprintf("%10s","GOAL"),
195 sprintf("%14s"," $un".'SIGNIFICANT'),"\n";
196 my $direction = $calling_scm -> search_direction
;
197 for ( my $i = 0; $i <= $#models; $i++ ) {
198 my $iiv_significant = 0;
199 while ( my ( $name, $change_ref ) = each %iiv_test ) {
200 die "No such variable name $name defined in base inter-individual variability\n"
201 unless defined $base_ests{$name};
202 my $change = $change_ref -> {$direction};
203 my $test_val = (sqrt($ests[$i]{$name})-sqrt($base_ests{$name}))
204 /sqrt($base_ests{$name});
205 print LOG
sprintf("%-8s",$step_relations[$i]{'parameter'}.
206 $step_relations[$i]{'covariate'}.'-'.
207 $step_relations[$i]{'state'}),
208 sprintf("%12s",$name.' '),
209 sprintf("%12.5f",$base_ests{$name}),
210 sprintf("%12.5f",$ests[$i]{$name}),
211 sprintf("%47.5f",$test_val),' <',
212 sprintf("%10.5f",$change);
213 if ( $test_val < $change ) {
215 print LOG
sprintf("%12s",'YES! ');
216 $iiv_sign{$i}{$name} = 1;
224 return ( \
%iiv_sign, \
@ests );
227 sub sign_extreme_changes
{
229 my $calling_scm = $parm{'calling_scm'};
230 my $model_number = $parm{'model_number'};
231 my $direction = $parm{'direction'};
232 my %extreme_test = %{$parm{'extreme_test'}};
234 my %extreme_sign; # Flag 0|1 for (un)significance
239 if ( defined $calling_scm -> base_criteria_vals
and
240 defined $calling_scm -> base_criteria_vals
->
241 [$model_number-1] -> {'stats'} ) {
242 %base_stats = %{$calling_scm -> base_criteria_vals
->
243 [$model_number-1] -> {'stats'}};
245 die "GOF_CRC: No table files defined in ",
246 $calling_scm -> models
-> [$model_number-1] -> full_name
,"\n" unless
247 ( defined $calling_scm -> models
-> [$model_number-1] -> table_files
and
248 scalar @
{$calling_scm -> models
-> [$model_number-1] -> table_files
} > 0 and
249 scalar @
{$calling_scm -> models
-> [$model_number-1] -> table_files
-> [0]} > 0 );
250 $calling_scm -> models
-> [$model_number-1] -> table_files
->[0][0] -> target
( 'mem' );
251 my @stat_names = ( 'max', 'min', 'median' );
252 while ( my ( $name, $change ) = each %extreme_test ) {
253 foreach my $stat_name ( @stat_names ) {
254 $base_stats{$name}{$stat_name} = $calling_scm -> models
-> [$model_number-1] ->
255 table_files
->[0][0] -> $stat_name( column_head
=> $name );
257 $base_stats{$name}{'upper_relative_range'} =
258 ($base_stats{$name}{'max'}-$base_stats{$name}{'median'})/
259 $base_stats{$name}{'median'};
260 $base_stats{$name}{'lower_relative_range'} =
261 ($base_stats{$name}{'median'}-$base_stats{$name}{'min'})/
262 $base_stats{$name}{'median'};
264 $calling_scm -> models
-> [$model_number-1] -> table_files
->[0][0] -> target
( 'disk' );
267 my @models = @
{$calling_scm -> prepared_models
-> [$model_number-1]{'own'}};
268 for ( my $i = 0; $i <= $#models; $i++ ) {
269 $models[$i] -> table_files
-> [0][0] -> target
( 'mem' );
270 while ( my ( $name, $change ) = each %extreme_test ) {
271 foreach my $stat_name ( 'max', 'min', 'median' ) {
272 $stats[$i]{$name}{$stat_name} = $models[$i] -> table_files
->[0][0] ->
273 $stat_name( column_head
=> $name );
275 $stats[$i]{$name}{'upper_relative_range'} =
276 ($stats[$i]{$name}{'max'}-$stats[$i]{$name}{'median'})/
277 $stats[$i]{$name}{'median'};
278 $stats[$i]{$name}{'lower_relative_range'} =
279 ($stats[$i]{$name}{'median'}-$stats[$i]{$name}{'min'})/
280 $stats[$i]{$name}{'median'};
282 $models[$i] -> table_files
-> [0][0] -> target
( 'disk' );
285 my @step_relations = @
{$calling_scm -> step_relations
};
287 # Clinical relevance of the effect on variuos statistics of the estimates
288 open( LOG
, ">>".$calling_scm->logfile->[$model_number-1] );
289 my $un = $direction eq 'backward' ?
'(UN)' : '';
290 print LOG
sprintf("%-8s",'MODEL'),
291 sprintf("%12s",'TEST NAME'),
292 sprintf("%12s",'BASE VAL'),
293 sprintf("%12s",'NEW VAL'),
294 sprintf("%50s",'TEST VAL (ABSOLUTE CHANGE)'),
295 sprintf("%10s","GOAL"),
296 sprintf("%14s"," $un".'SIGNIFICANT'),"\n";
297 for ( my $i = 0; $i <= $#models; $i++ ) {
298 my $extreme_significant = 0;
299 while ( my ( $name, $change_ref ) = each %extreme_test ) {
300 my $upper_change = $stats[$i]{$name}{'upper_relative_range'} -
301 $base_stats{$name}{'upper_relative_range'};
302 my $lower_change = $stats[$i]{$name}{'lower_relative_range'} -
303 $base_stats{$name}{'lower_relative_range'};
304 my $change = $change_ref -> {$direction};
305 print LOG
sprintf("%-8s",$step_relations[$i]{'parameter'}.
306 $step_relations[$i]{'covariate'}.'-'.
307 $step_relations[$i]{'state'}),
308 sprintf("%12s",$name.'_lower'),
309 sprintf("%12.5f",$base_stats{$name}{'lower_relative_range'}),
310 sprintf("%12.5f",$stats[$i]{$name}{'lower_relative_range'}),
311 sprintf("%47.5f",$lower_change),' >',
312 sprintf("%10.5f",$change);
313 if ( $lower_change > $change ) {
314 print LOG
sprintf("%12s",'YES! ');
315 $extreme_significant++;
316 $extreme_sign{$i}{$name}{'lower_relative_range'} = 1;
319 print LOG
sprintf("%-8s",$step_relations[$i]{'parameter'}.
320 $step_relations[$i]{'covariate'}.'-'.
321 $step_relations[$i]{'state'}),
322 sprintf("%12s",$name.'_upper'),
323 sprintf("%12.5f",$base_stats{$name}{'upper_relative_range'}),
324 sprintf("%12.5f",$stats[$i]{$name}{'upper_relative_range'}),
325 sprintf("%47.5f",$upper_change),' >',
326 sprintf("%10.5f",$change);
327 if ( $upper_change > $change ) {
328 print LOG
sprintf("%12s",'YES! ');
329 $extreme_significant++;
330 $extreme_sign{$i}{$name}{'upper_relative_range'} = 1;
337 return ( \
%extreme_sign, \
@stats );