For an introduction to this topic see the publication by Archontoulis and Miguez (https://doi.org/10.2134/agronj2012.0506) and the book chapter by Miguez, Archontoulis and Dokoohaki ( https://doi.org/10.2134/appliedstatistics.2016.0003.c15).
One of the objectives of those publications was to introduce a large family of nonlinear functions to practicioners in the agricultural research area to a variety of tools that can use to fit data which does not conform to a linear relationship. The feature that distinguishes this approach from others such as ploynomials, splines or gams (to name a few) is that the parameters of the model have biologically meaningful interpretations. In R the approach that makes fitting nonlinear mixed models almost as easy as fitting linear mixed models is the use of self starting functions.
stats package
For the reference on the Beta growth function see Yin et al. 2003 (https://doi.org/10.1093/aob/mcg029) and Erratum: (https://doi.org/10.1093/aob/mcg091). For a reference on a use of the declining logistic see Oddi et al. (2019) (and vignette in this package). For the Ricker model see: (https://en.wikipedia.org/wiki/Ricker_model). For the protein profile in the canopy see Johnson et al. (2010) (https://doi.org/10.1093/aob/mcq183).
The SSbgrp function is a reparameterized version of SSbgf. The original SSbgf does not enforce the constraint that t.m < t.e and this makes it somewhat numerically unstable for routine use (but more testing is needed). To recover the original parameters from SSbgrp, take the exponential of lt.e, so t.e = exp(lt.e) and likewise t.m = exp(lt.e) - exp(ldt). There is a similar function for the four parameter Beta growth SSbg4rp.
The main benefit of having these self starting functions is that they can be incorporated in the workflow of package ‘nlme’ which allows for fitting nonlinear mixed models. Although there are other tools available, package nlme is still appropriate for most applications in agricultural, environmental and biological sciences.
## [1] "SS" "SSasymp" "SSasympOff" "SSasympOrig" "SSbell"
## [6] "SSbg4rp" "SSbgf" "SSbgf4" "SSbgrp" "SSbiexp"
## [11] "SSblin" "SSD" "SSdlf" "SSexpf" "SSexpfp"
## [16] "SSexplin" "SSfol" "SSfpl" "SSgompertz" "SSlinp"
## [21] "SSlogis" "SSlogis5" "SSmicmen" "SSnrh" "SSpexpf"
## [26] "SSplin" "SSpquad" "SSprofd" "SSquadp" "SSratio"
## [31] "SSricker" "SStrlin" "SSweibull"
These are the available datasets distributed with this package:
## Sorghum and Maize dataset
data(sm)
ggplot(data = sm, aes(x = DOY, y = Yield, color = Crop)) +
geom_point() +
facet_wrap(~ Input)
## Live fuel moisture content
data(lfmc)
ggplot(data = lfmc, aes(x = time, y = lfmc, color = leaf.type)) +
geom_point() +
ylab("Live fuel moisture content (%)")
The most common issue with nonlinear regression models is related to convergence problems. Convergence problems in nonlinear models can be caused by many different reasons. These are a few of them:
Model specification (choosing the correct model) is clearly very important when using nonlinear models, the references above and this package are a resource that tries to alleviate this issue.
For convergence problems related to poor starting values there are some alternatives:
When fitting nonlinear models some error messages will be commonly encountered. For example,
## Error in nls(y ~ SSratio(x, a, b, c, d), data = dat) :
## step factor 0.000488281 reduced below 'minFactor' of 0.000976562
Although one option is to reduce minFactor
under control
in nls
it is better to first check that the model is appropriate for the data and that starting values are reasonable. Another option is to use nlsLM
from the minpack.lm
package, which can be more robust.
Another possible error message is:
This can be caused by the presence of missing data, which your model cannot handle, or by the presence of zeros in the data that can generate NA/NaN/Inf
inside other functions. The solution is to remove missing data and/or zeros.
For background see: (http://miguezlab.agron.iastate.edu/OldWebsite/Research/Talks/ASA_Miguez.pdf).
library(nlme)
data(barley, package = "nlraa")
barley$yearf <- as.factor(barley$year)
barleyG <- groupedData(yield ~ NF | yearf, data = barley)
First step is to create the grouped data object. Then fit the asymptotic regression to each year and the mixed model.
## Fit the nonlinear model for each year
fit.nlis <- nlsList(yield ~ SSasymp(NF, Asym, R0, lrc), data = barleyG)
## Use this to fit a nonlinear mixed model
fit.nlme <- nlme(fit.nlis)
## Investigate residuals
plot(fit.nlme)
## Approximate 95% confidence intervals
##
## Fixed effects:
## lower est. upper
## Asym 337.331378 390.15370 442.976023
## R0 106.772016 131.75233 156.732636
## lrc -1.890842 -1.66514 -1.439438
## attr(,"label")
## [1] "Fixed effects:"
##
## Random Effects:
## Level: yearf
## lower est. upper
## sd(Asym) 69.3531468 106.6362143 163.9620225
## sd(R0) 35.5041417 51.0293371 73.3433655
## sd(lrc) 0.1236613 0.3169539 0.8123783
## cor(Asym,R0) -0.1758864 0.3541783 0.7250264
## cor(Asym,lrc) -0.9574850 -0.7989574 -0.2698169
## cor(R0,lrc) -0.5375575 0.2143155 0.7763412
##
## Within-group standard error:
## lower est. upper
## 13.81175 18.79545 25.57744
Other modeling approaches do not use such a rigid specification as the models classically used in nonlinear relationships. Some examples are:
Although these previous methods are much more flexible than classical nonlinear regression, the traditional approaches have the benefit of being simple and providing parameters with a straight-forward interpretation.
I have not tested any of these packages. They are here for reference.
See Oswald, Nisbet, Chiaradia and Arnold, MEE, (2012) ( https://doi.org/10.1111/j.2041-210X.2012.00231.x).
Available from CRAN. See: See Umut Caglar, Teufel and Wilke (https://peerj.com/articles/4251/)
Package available at https://github.com/wilkelab/sicegar
Dose-response curves package
Ritz C, Baty F, Streibig JC, Gerhard D (2015) Dose-Response Analysis Using R. PLoS ONE 10(12): e0146021. .
This package actually has very useful functions, datasets and examples. In particular drm is an alternative to nls.
Might make it easier to fit and plot a few different models.
chngpt: threshold regression model estimation and inference. .
mcp: package for multiple change points. Similar to the previous one, but it seems to use a Bayesian approach through JAGS. (https://lindeloev.github.io/mcp/)
This is an effort to replace ‘nls’ with a better algorithm, but it seems to be still in development. Main function is nlxb.
This provides uncertainty for ‘nls’ objects via function ‘predictNLS’.
“Companion to Applied Regression”. It has function ‘Boot’ which can do bootstrapping for ‘nls’ objects.
This package has functions for fitting water retention curves. It uses the ‘minpack.lm’ package which has a different implementation of the minimization algorithm (Levenberg-Marquardt).
This package has the following selfStart functions:
And additional models, such as:
A unified approach to the Richards-model family for use in growth analyses: Why we need only two model forms. . Might incorporate this function in the package in the future.
The use of Gompertz models in growth analyses, and new Gompertz-model approach: An addition to the Unified-Richards family. (https://doi.org/10.1371/journal.pone.0178691).
Choosing the right sigmoid growth function using the unified-models approach. .
I find this post by Ben Bolker very interesting… https://stats.stackexchange.com/questions/231074/confidence-intervals-on-predictions-for-a-non-linear-mixed-model-nlme