[Ifeffit] the use of constraints
Bruce Ravel
bravel at bnl.gov
Fri May 28 13:04:20 CDT 2010
On Friday 28 May 2010 12:01:25 pm Kellie Aldi wrote:
> I like better the idea of penalizing a fit when percap is outside of a
> defined range and thus "encouraging" the fit to settle percap somewhere
> inside this range. But in trying to use the restraint idea, including the
> fix suggested by Matt Newville for only penalizing the fit outside of the
> min/max range, percap still goes slightly above 1 (about 1.02) and in my
> results I get a value for the "penalty" that I am unsure how to interpret.
> Can this value be used to understand why the restraint still allows the
> value of percap to be outside of the defined "ideal" range?
>
Hi Kellie,
There are two ways of bounding a parameter in Ifeffit.
1. These math expression will provide a hard-walled boundary:
guess a = 1
def b = max( 1.2, min(0.8, a) )
If you then use "b" as a parameter in some other math expression,
"a" will float as part of the fit. "b" will take the value of "a"
as long as it is in between 0.8 and 1.2. If "a" floats outside of
that range, then the value of "b" is limited.
This certainly works to put a boundary on the value of "b", but it
has a serious downside. If "a" floats out of range, Ifeffit can
no longer evaluate uncertainties. This is because changing the
value of "a" from 1.25 to 1.3 results in no change in the fitting
model. This the covarience matrix cannot be evaluated.
So, what we need is a way to encourage "a" to stay with its
boundaries, but in a gentler way.
2. Try this instead:
guess a = 1
set scale = 100
def b = scale * penalty(a, 0.8, 1.2)
later on, tell Ifeffit to use "b" as a restraint. I don't know how
this is done in SixPack, but in Artemis you simply flag "b" as a
restraint. In Ifeffit itself, you add the "restraint" argument to
the argument list of the feffit() command.
You then use "a" in subsequent math expressions rather "b" as in
the previous example.
This allows "a" to float outside the boundaries, but with a cost.
As long as "a" remains within its boundaries, no problem. If "a"
floats outside its boundaries, the value of "b" is added in
quadrature to the evaluation of chi-square, the fitting metric
that is minimized in the fit. The penalty function evaluates to 0
when the first argument is between the values of the second and
third arguments. When it is outside that range, penalty evaluates
to difference between the first argument and the value of the
offended argument (i.e. a=0.7 evaluates to 0.1, as does a=1.3).
If a fit really wants "a" to be outside the range, it can, but it
has to minimize chi-square with the penalty added in quadrature.
This, then nudges "a" into the range that you think is
reasonable.
There are three mystery parameters: the upper and lower bounds and
the value of "scale". It is hard to come up with a fast rule for
any of them. Presumably, you have a sense of what the boundaries
should be and are willing to argue for why you would choose them.
"scale" is important in that it sets the "strength" of the
penalty. If scale is too small compared to chi-square, "a" will
be too free to wander away from the boundaries. If "scale" is to
big, the penalty begins to behave like the hard-wall math
expression from the other example.
So, what is the right value of "scale"? Hmmm... tough question.
In my experience, the square root of reduced chi-square evaluated
without the restraint is a good starting place. That is usually
big enough to make the restraint important without making it
dominate the fit.
As for the value of the penalty -- it doesn't have much inherent
meaning. It depends on the size of the scaling parameter. Ditto
for the extent to which the real variable drifts outside the
range.
As a more general comment, when a parameter is trying to be something
that you think it shouldn't be, you should look upon that as an
opportunity rather than a problem. It is probably telling you that
one or more of your assumptions about your fitting model is poorly
cosidered. What you usually need isn't another fancy trick of the
fitting software -- what you need is to make sure that you processed
the data correctly, implemented the mathematics of the fitting model
correctly, ran Feff correctly, and didn't make any other silly
mistakes while using a ridiculously complex and user-hostile program
like Artemis or SixPack!
Hope that helps,
B
--
Bruce Ravel ------------------------------------ bravel at bnl.gov
National Institute of Standards and Technology
Synchrotron Methods Group at NSLS --- Beamlines U7A, X24A, X23A2
Building 535A
Upton NY, 11973
My homepage: http://xafs.org/BruceRavel
EXAFS software: http://cars9.uchicago.edu/~ravel/software/exafs/
More information about the Ifeffit
mailing list