View source: R/fit_c3_variable_j.R
fit_c3_variable_j | R Documentation |
Fits the Farquhar-von-Caemmerer-Berry + Variable J model to an experimentally measured C3 A-Ci + CF curve.
It is possible to fit the following parameters: alpha_g
,
alpha_old
, alpha_s
, alpha_t
, Gamma_star_at_25
,
J_at_25
, Kc_at_25
, Ko_at_25
RL_at_25
, tau
,
Tp_at_25
, and Vcmax_at_25
.
By default, only a subset of these parameters are actually fit:
alpha_old
, J_at_25
, RL_at_25
, tau
,
Tp_at_25
, and Vcmax_at_25
. This can be altered using the
fit_options
argument, as described below.
Best-fit parameters are found using maximum likelihood fitting, where the
optimizer (optim_fun
) is used to minimize the error function (defined
by error_function_c3_variable_j
).
Once best-fit parameters are found, confidence intervals are calculated
using confidence_intervals_c3_variable_j
, and unreliable
parameter estimates are removed.
For temperature-dependent parameters, best-fit values and confidence intervals are returned at 25 degrees C and at leaf temperature.
See below for more details.
fit_c3_variable_j(
replicate_exdf,
Ca_atmospheric = NA,
a_column_name = 'A',
ca_column_name = 'Ca',
ci_column_name = 'Ci',
etr_column_name = 'ETR',
gamma_star_norm_column_name = 'Gamma_star_norm',
j_norm_column_name = 'J_norm',
kc_norm_column_name = 'Kc_norm',
ko_norm_column_name = 'Ko_norm',
oxygen_column_name = 'oxygen',
phips2_column_name = 'PhiPS2',
qin_column_name = 'Qin',
rl_norm_column_name = 'RL_norm',
total_pressure_column_name = 'total_pressure',
tp_norm_column_name = 'Tp_norm',
vcmax_norm_column_name = 'Vcmax_norm',
sd_A = 'RMSE',
Wj_coef_C = 4.0,
Wj_coef_Gamma_star = 8.0,
optim_fun = optimizer_deoptim(400),
lower = list(),
upper = list(),
fit_options = list(),
cj_crossover_min = NA,
cj_crossover_max = NA,
require_positive_gmc = 'positive_a',
gmc_max = Inf,
check_j = TRUE,
relative_likelihood_threshold = 0.147,
hard_constraints = 0,
calculate_confidence_intervals = TRUE,
remove_unreliable_param = 2,
...
)
replicate_exdf |
An |
Ca_atmospheric |
The atmospheric CO2 concentration (with units of |
a_column_name |
The name of the column in |
ca_column_name |
The name of the column in |
ci_column_name |
The name of the column in |
etr_column_name |
The name of the column in |
gamma_star_norm_column_name |
The name of the column in |
j_norm_column_name |
The name of the column in |
kc_norm_column_name |
The name of the column in |
ko_norm_column_name |
The name of the column in |
oxygen_column_name |
The name of the column in |
phips2_column_name |
The name of the column in |
qin_column_name |
The name of the column in |
rl_norm_column_name |
The name of the column in |
total_pressure_column_name |
The name of the column in |
tp_norm_column_name |
The name of the column in |
vcmax_norm_column_name |
The name of the column in |
sd_A |
A value of the standard deviation of measured |
Wj_coef_C |
A coefficient in the equation for RuBP-regeneration-limited carboxylation,
whose value depends on assumptions about the NADPH and ATP requirements of
RuBP regeneration; see |
Wj_coef_Gamma_star |
A coefficient in the equation for RuBP-regeneration-limited carboxylation,
whose value depends on assumptions about the NADPH and ATP requirements of
RuBP regeneration; see |
optim_fun |
An optimization function that accepts the following input arguments: an
initial guess, an error function, lower bounds, and upper bounds. It should
return a list with the following elements: |
lower |
A list of named numeric elements representing lower bounds to use when
fitting. Values supplied here override the default values (see details
below). For example, |
upper |
A list of named numeric elements representing upper bounds to use when
fitting. Values supplied here override the default values (see details
below). For example, |
fit_options |
A list of named elements representing fit options to use for each parameter.
Values supplied here override the default values (see details below). Each
element must be |
cj_crossover_min |
To be passed to |
cj_crossover_max |
To be passed to |
require_positive_gmc |
To be passed to |
gmc_max |
To be passed to |
check_j |
To be passed to |
relative_likelihood_threshold |
To be passed to |
hard_constraints |
To be passed to |
calculate_confidence_intervals |
A logical value indicating whether or not to estimate confidence intervals
for the fitting parameters using
|
remove_unreliable_param |
An integer value indicating the rules to use when identifying and removing unreliable parameter estimates. A value of 2 is the most conservative option. A value of 0 disables this feature, which is not typically recommended. See below for more details. |
... |
Additional arguments to be passed to |
This function calls calculate_c3_variable_j
and
calculate_c3_assimilation
to calculate values of net
assimilation. The user-supplied optimization function is used to vary the
values of alpha_g
, alpha_old
, alpha_s
, alpha_t
,
Gamma_star_at_25
, J_at_25
, Kc_at_25
, Ko_at_25
,
RL_at_25
, tau
, Tp_at_25
, and Vcmax_at_25
to find
ones that best reproduce the experimentally measured values of net
assimilation. By default, the following options are used for the fits:
alpha_g
: lower = 0, upper = 10, fit_option = 0
alpha_old
: lower = 0, upper = 10, fit_option = 'fit'
alpha_s
: lower = 0, upper = 10, fit_option = 0
alpha_t
: lower = 0, upper = 10, fit_option = 0
Gamma_star_at_25
: lower = -20, upper = 200, fit_option = 'column'
J_at_25
: lower = -50, upper = 1000, fit_option = 'fit'
Kc_at_25
: lower = -50, upper = 1000, fit_option = 'column'
Ko_at_25
: lower = -50, upper = 1000, fit_option = 'column'
RL_at_25
: lower = -10, upper = 100, fit_option = 'fit'
tau
: lower = -10, upper = 10, fit_option = 'fit'
Tp_at_25
: lower = -10, upper = 100, fit_option = 'fit'
Vcmax_at_25
: lower = -50, upper = 1000, fit_option = 'fit'
With these settings, all "new" alpha
parameters are set to 0; values of
Gamma_star_at_25
, Kc_at_25
, and Ko_at_25
are taken from
the Gamma_star_at_25
, Kc_at_25
, and Ko_at_25
columns of
replicate_exdf
; and the other parameters are fit during the process
(see fit_options
above). The bounds are chosen liberally to avoid any
bias.
An initial guess for the parameters is generated by calling
initial_guess_c3_variable_j
as follows:
cc_threshold_rd
is set to 100 micromol / mol.
If alpha_g
is being fit, the alpha_g
argument of
initial_guess_c3_variable_j
is set to 0.5; otherwise, the
argument is set to the value specified by the fit options.
If alpha_old
is being fit, the alpha_old
argument of
initial_guess_c3_variable_j
is set to 0.5; otherwise, the
argument is set to the value specified by the fit options.
if alpha_s
is being fit, the alpha_s
argument of
initial_guess_c3_variable_j
is set to
0.3 * (1 - alpha_g)
; otherwise, the argument is set to the
value specified by the fit options.
if alpha_t
is being fit, the alpha_t
argument of
initial_guess_c3_variable_j
is set to 0; otherwise, the
argument is set to the value specified by the fit options.
If Gamma_star_at_25
is being fit, the Gamma_star_at_25
argument of initial_guess_c3_variable_j
is set to 40;
otherwise, the argument is set to the value specified by the fit
options.
If Kc_at_25
is being fit, the Kc_at_25
argument of
initial_guess_c3_variable_j
is set to 400; otherwise, the
argument is set to the value specified by the fit options.
If Ko_at_25
is being fit, the Ko_at_25
argument of
initial_guess_c3_variable_j
is set to 275; otherwise, the
argument is set to the value specified by the fit options.
Note that any fixed values specified in the fit options will override the values returned by the guessing function.
The fit is made by creating an error function using
error_function_c3_variable_j
and minimizing its value using
optim_fun
, starting from the initial guess described above. The
optimizer_deoptim
optimizer is used by default since it has been
found to reliably return great fits. However, it is a slow optimizer. If speed
is important, consider reducing the number of generations or using
optimizer_nmkb
, but be aware that this optimizer is more likely
to get stuck in a local minimum.
The photosynthesis model used here is not smooth in the sense that small
changes in the input parameters do not necessarily cause changes in its
outputs. This is related to the final step in the calculations, where the
overall assimilation rate is taken to be the minimum of three enzyme-limited
rates. For example, if the assimilation rate is never phosphate-limited,
modifying Tp_at_25
will not change the model's outputs. For this
reason, derivative-based optimizers tend to struggle when fitting C3 A-Ci
curves. Best results are obtained using derivative-free methods.
Sometimes the optimizer may choose a set of parameter values where one or more
of the potential limiting carboxylation rates (Wc
, Wj
, or
Wp
) is never the smallest rate. In this case, the corresponding
parameter estimates (Vcmax
, J
, or alpha
& Tp
)
will be severely unreliable. This will be indicated by a value of 0
in
the corresponding trust column(for example, Vcmax_trust
). If
remove_unreliable_param
is 1
or larger, then such parameter
estimates (and the corresponding rates) will be replaced by NA
in the
fitting results.
It is also possible that the upper limit of the confidence interval for a
parameter is infinity; this indicates a potentially unreliable parameter
estimate. This will be indicated by a value of 1
in the corresponding
trust column (for example, Vcmax_trust
). If
remove_unreliable_param
is 2
or larger, then such parameter
estimates (but not the corresponding rates) will be replaced by NA
in
the fitting results.
The trust value for fully reliable parameter estimates is set to 2
and
they will never be replaced by NA
.
Once the best-fit parameters have been determined, this function also
estimates the operating value of 'Cc
from the atmospheric CO2
concentration atmospheric_ca
using
estimate_operating_point
, and then uses that value to estimate
the modeled An
at the operating point via
calculate_c3_assimilation
. It also estimates the
Akaike information criterion (AIC).
This function assumes that replicate_exdf
represents a single
C3 A-Ci curve. To fit multiple curves at once, this function is often used
along with by.exdf
and consolidate
.
A list with two elements:
fits
: An exdf
object including the original contents of
replicate_exdf
along with several new columns:
The fitted values of net assimilation will be stored in a
column whose name is determined by appending '_fit'
to
the end of a_column_name
; typically, this will be
'A_fit'
.
Residuals (measured - fitted) will be stored in a column whose
name is determined by appending '_residuals'
to the end
of a_column_name
; typically, this will be
'A_residuals'
.
Values of fitting parameters at 25 degrees C will be stored in
the Gamma_star_at_25
, J_at_25
, Kc_at_25
,
Ko_at_25
, RL_at_25
, Tp_at_25
, and
Vcmax_at_25
columns.
The other outputs from calculate_c3_variable_j
and calculate_c3_assimilation
will be stored in
columns with the usual names: alpha_g
,
alpha_old
, alpha_s
, alpha_t
,
Gamma_star_tl
, J_tl
, Kc_tl
, Ko_tl
,
RL_tl
, tau
, Tp_tl
, Vcmax_tl
,
Ac
, Aj
, Ap
, gmc
, J_F
, and
Cc
.
fits_interpolated
: An exdf
object including the
calculated assimilation rates at a fine spacing of Ci
values
(step size of 1 micromol mol^(-1)
).
parameters
: An exdf
object including the identifiers,
fitting parameters, and convergence information for the A-Ci curve:
The number of points where An = Ac
, An = Aj
, and
An = Ap
are stored in the n_Ac_limiting
,
n_Aj_limiting
, and n_Ap_limiting
columns.
The best-fit values are stored in the alpha_g
,
alpha_old
, alpha_s
, alpha_t
,
Gamma_star_at_25
, J_at_25
, Kc_at_25
,
Ko_at_25
, RL_at_25
, tau
, Tp_at_25
,
and Vcmax_at_25
columns. If
calculate_confidence_intervals
is TRUE
, upper
and lower limits for each of these parameters will also be
included.
For parameters that depend on leaf temperature, the average
leaf-temperature-dependent values are stored in
Gamma_star_tl_avg
, J_tl_avg
, Kc_tl_avg
,
Ko_tl_avg
, RL_tl_avg
, Tp_tl_avg
, and
Vcmax_tl_avg
.
Information about the operating point is stored in
operating_Cc
, operating_Ci
, operating_An
,
and operating_An_model
.
The convergence
column indicates whether the fit was
successful (==0
) or if the optimizer encountered a
problem (!=0
).
The feval
column indicates how many cost function
evaluations were required while finding the optimal parameter
values.
The residual stats as returned by residual_stats
are included as columns with the default names: dof
,
RSS
, RMSE
, etc.
The Akaike information criterion is included in the AIC
column.
# Read an example Licor file included in the PhotoGEA package
licor_file <- read_gasex_file(
PhotoGEA_example_file_path('c3_aci_1.xlsx')
)
# Define a new column that uniquely identifies each curve
licor_file[, 'species_plot'] <-
paste(licor_file[, 'species'], '-', licor_file[, 'plot'] )
# Organize the data
licor_file <- organize_response_curve_data(
licor_file,
'species_plot',
c(9, 10, 16),
'CO2_r_sp'
)
# Calculate the total pressure in the Licor chamber
licor_file <- calculate_total_pressure(licor_file)
# Calculate temperature-dependent values of C3 photosynthetic parameters
licor_file <- calculate_temperature_response(licor_file, c3_temperature_param_bernacchi)
# For these examples, we will use a faster (but sometimes less reliable)
# optimizer so they run faster
optimizer <- optimizer_nmkb(1e-7)
# Fit just one curve from the data set (it is rare to do this).
one_result <- fit_c3_variable_j(
licor_file[licor_file[, 'species_plot'] == 'tobacco - 1', , TRUE],
Ca_atmospheric = 420,
optim_fun = optimizer
)
# Fit all curves in the data set (it is more common to do this).
aci_results <- consolidate(by(
licor_file,
licor_file[, 'species_plot'],
fit_c3_variable_j,
Ca_atmospheric = 420,
optim_fun = optimizer
))
# View the fitting parameters for each species / plot
col_to_keep <- c(
'species', 'plot', # identifiers
'n_Ac_limiting', 'n_Aj_limiting', 'n_Ap_limiting', # number of points where
# each process is limiting
'tau', 'Tp_at_25', # parameters with temperature response
'J_at_25', 'RL_at_25', 'Vcmax_at_25', # parameters scaled to 25 degrees C
'J_tl_avg', 'RL_tl_avg', 'Vcmax_tl_avg', # average temperature-dependent values
'operating_Ci', 'operating_An', 'operating_An_model', # operating point info
'dof', 'RSS', 'MSE', 'RMSE', 'RSE', # residual stats
'convergence', 'convergence_msg', 'feval', 'optimum_val' # convergence info
)
aci_results$parameters[ , col_to_keep, TRUE]
# View the fits for each species / plot
plot_c3_aci_fit(aci_results, 'species_plot', 'Ci')
# View the residuals for each species / plot
lattice::xyplot(
A_residuals ~ Ci | species_plot,
data = aci_results$fits$main_data,
type = 'b',
pch = 16,
auto = TRUE,
grid = TRUE,
xlab = paste0('Intercellular CO2 concentration (', aci_results$fits$units$Ci, ')'),
ylab = paste0('Assimilation rate residuals (', aci_results$fits$units$A_residuals, ')')
)
# View the estimated mesophyll conductance values for each species / plot
lattice::xyplot(
gmc ~ Ci | species_plot,
data = aci_results$fits$main_data,
type = 'b',
pch = 16,
auto = TRUE,
grid = TRUE,
xlab = paste0('Intercellular CO2 concentration (', aci_results$fits$units$Ci, ')'),
ylab = paste0('Mesophyll conductance to CO2 (', aci_results$fits$units$gmc, ')'),
ylim = c(0, 2)
)
# In some of the curves above, there are no points where carboxylation is TPU
# limited. Estimates of Tp are therefore unreliable and are removed.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.