Controlling Parameter Estimation

By default all parameters in the models are free to vary within their predefined search ranges. The default search ranges are predefined based on being applicable to a wide variety of plants. Initial parameters can be adjusted in two ways.

  • The search range can be ajdusted.
  • Any or all parameters can be set to a fixed value

Both of these are done via the parameters argument in the initial model call.

Setting parameters to fixed values

Here is a common example, where in the thermal time model t1, the day when warming accumulation begins, is set to Jan. 1 (doy 1) by setting it to an integer. The other two parameters, F and T, and then estimated:

from pyPhenology import models, utils
observations, temp = utils.load_test_data(name='vaccinium')

model = models.ThermalTime(parameters={'t1':1})
model.fit(observations, temp)
model.get_params()

{'T': 8.6286577557177608, 'F': 156.76212563809247, 't1': 1}

Similarly, we can also set the temperature threshold T to fixed values. Then only F, the total degree days required, is estimated:

model = models.ThermalTime(parameters={'t1':1,'T':5})
model.fit(observations, temp)
model.get_params()

{'F': 274.29110894742541, 't1': 1, 'T': 5}

Note that if you set all the parameters of a model to fixed values then no fitting can be done:

model = models.ThermalTime(parameters={'t1':1,'T':5, 'F':50})
model.fit(observations, temp)

RuntimeError: No parameters to estimate

One more example where the Uniforc model is set to a t1 of 60 (about March 1), and the other parameters are estimated:

model = models.Uniforc(parameters={'t1':1})
model.fit(observations, temp)
model.get_params()

{'F': 11.050063297905695, 'b': -2.0395193186815908, 'c': 9.3016675933620956, 't1': 1}

Setting a search range for parameters

To specify a different search range for a parameter use tuples with a high and low value. These can be mixed and matched with setting fixed values.

For example the Thermal Time model with narrow search range for t1 and F but T fixed at 5 degrees C:

model = models.ThermalTime(parameters={'t1':(-10,10), 'F':(100,500),'T':5})
model.fit(observations, temp)
model.get_params()

{'t1': 4.9538373877994291, 'F': 270.006971948699, 'T': 5}

The above works for the optimization methods Differential Evolution (the default), Basin Hopping, and Simulated Annealing. For the brute force method you must specify slice.

TODO