huber_weight
Called by:
calc_weight
each iteration that weighting_type
is set to huber.
Includes: iscloc.h
External:
Threshold for difference between residual and alpha, CUT_OFF [0.8275].
min_phases
set in read_config
init_max_resid
set in read_config
max_resid
set in read_config
Input arguments:
Pointer to
solution
structure.
Array of
phase
structures.
Structure members updated:
weight
in
phase
structure.
alpha
in
solution
structure.
prev_alpha
in
solution
structure first iteration only.
Return: 0/1 for success/failure.
Huber-t weighting designed to get a basic solution before using more
complex but less stable uniform reduction weighting (implemented here
in buland_weight) to get a final solution. First the average weighted residual, alpha,
is calculated then each phase is given a weight depending on the difference
between its residual and alpha. If the difference is greater than CUT_OFF,
a constant defined as a macro in this file, then the weight is set to CUT_OFF
divided by the difference. Otherwise the weight is set to 1.
No weight is given to a phase if its residual is greater than
max_resid
and before a weight is assigned it is multiplied by
weight_factor
for this phase, which will be 0 unless this type of
phase
is wanted at this particular delta. Once all phases have been weighted the number with non-zero weights
is counted and if the total is less than
min_phases
then the solution is aborted and restarted with the next option or seed.
The first time that this function is called it can not calculate alpha in
the normal way because the phases do not have weights yet. Instead
provisional weights are calculated with alpha as the unweighted average of
all residuals less than init_max_resid. Then alpha is recalculated from these provisional weights and used
in the calculation of the weights that will be used in the solution. The
initial, unweighted alpha is stored as
prev_alpha
in the
solution
structure for comparison with alpha
in the function decide_iter.
This weighting scheme was first programmed at the ISC by R. Buland in 1987.
Here is his comment from that code:
The cutoff, s, between least squares behavior and one-norm behavior
has been determined empirically to optimize efficiency against the distribution
of teleseismic travel-time residuals. For this case, the efficiency
is about .905 which is quite close to the optimal efficiency achievable with
a non-decreasing influence function. Except for the non-linearity inherent
in the earthquake location problem, this weighting would always produce unique
results.