The hardware and bandwidth for this mirror is donated by dogado GmbH, the Webhosting and Full Service-Cloud Provider. Check out our Wordpress Tutorial.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]dogado.de.
LactCurveModels is an R package for fitting, comparing, and visualising nonlinear lactation curve models for dairy animals. It fits up to 20 published lactation curve models simultaneously to daily milk yield data, produces publication-ready diagnostic figures, and generates comprehensive goodness-of-fit tables – all from a single function call.
The package supports batch processing of multiple animals from one CSV file, with flexible options to analyse all animals or a selected subset, and to fit all 20 models or any chosen combination.
| No. | Model Name | Reference |
|---|---|---|
| 1 | Brody (1923) | Brody, 1923 |
| 2 | Brody (1924) | Brody, 1924 |
| 3 | Parabolic Exponential | Sikka, 1950 |
| 4 | Wood | Wood, 1967 |
| 5 | Wood-Dhanoa | Dhanoa, 1981 |
| 6 | Cobby and Le Du | Cobby and Le Du, 1978 |
| 7 | Quadratic | Dave, 1971 |
| 8 | Mixed Log | Guo and Swalve, 1995 |
| 9 | Khandekar | Khandekar, 1993 |
| 10 | Wilmink (k = 0.05) | Wilmink, 1987 |
| 11 | Wilmink (k estimated) | Wilmink, 1987 |
| 12 | Ali and Schaeffer | Ali and Schaeffer, 1987 |
| 13 | Cappio-Borlino | Cappio-Borlino et al., 1995 |
| 14 | Papajcsik and Bodero 1 | Papajcsik and Bodero, 1988 |
| 15 | Papajcsik and Bodero 2 | Papajcsik and Bodero, 1988 |
| 16 | Papajcsik and Bodero 3 | Papajcsik and Bodero, 1988 |
| 17 | Inverse Polynomial | Nelder, 1966 |
| 18 | Log-Quadratic | Adediran et al., 2012 |
| 19 | Morant and Gnanasakthy | Morant and Gnanasakthy, 1989 |
| 20 | Pollott Multiplicative | Pollott, 2000 |
install.packages("LactCurveModels")# install.packages("devtools")
devtools::install_github("VenkatesanRaja/LactCurveModels")The package reads a CSV file with exactly three columns (column order does not matter):
| Column | Type | Description |
|---|---|---|
| animal_id | character | Unique identifier for each animal |
| dim | integer | Days-in-milk time index (fortnightly: 1, 2, …, 20) |
| dmy | numeric | Daily milk yield (kg/day) |
Example CSV layout:
animal_id,dim,dmy
Animal_A,1,9.265
Animal_A,2,9.957
Animal_A,3,10.421
Animal_B,1,8.100
Animal_B,2,8.750
library(LactCurveModels)
results <- run_lactation_analysis(
input_csv_path = "C:/data/myanimals.csv"
)results <- run_lactation_analysis(
input_csv_path = "C:/data/myanimals.csv",
selected_animals = c("Animal_A", "Animal_B")
)results <- run_lactation_analysis(
input_csv_path = "C:/data/myanimals.csv",
selected_models = c("Wood_1967", "Wilmink_k005", "Ali_Schaeffer")
)results <- run_lactation_analysis(
input_csv_path = "C:/data/myanimals.csv",
selected_models = c("Wood_1967", "Wilmink_k005", "Ali_Schaeffer",
"Pollott_Multiplicative"),
selected_animals = c("Animal_A", "Animal_C"),
out_dir = "C:/results/lactation_analysis"
)# Build the data frame manually
animal_df <- data.frame(
x = 1:20,
y = c(9.3, 9.9, 10.2, 10.4, 10.3, 10.1, 9.9, 9.6, 9.3, 9.0,
8.7, 8.4, 8.1, 7.8, 7.5, 7.2, 6.9, 6.6, 6.3, 6.0),
z = (1:20) / 365
)
fits <- fit_lactation_models(animal_df, selected_models = "all")
# Extract results for Wood (1967)
fits[["Wood_1967"]]$metrics
fits[["Wood_1967"]]$predictions
coef(fits[["Wood_1967"]]$model)For each animal, the following are saved in a dedicated sub-folder:
| File | Contents |
|---|---|
| AnimalID_parameter_estimates.csv | Fitted parameters and standard errors for all models |
| AnimalID_summary_metrics.csv | R2, Adjusted R2, AIC, BIC, RMSE, Durbin-Watson |
| AnimalID_actual_and_predicted_values.csv | Observed vs predicted milk yield at each time point |
| AnimalID_residuals.csv | Residuals (predicted minus actual) at each time point |
| Figure | Description |
|---|---|
| Fig01 | All fitted models overlaid on observed data |
| Fig02 | 4-panel ranked model fits (best to worst R2) |
| Fig03 | Best 3 vs Worst 3 models |
| Fig04 | Models grouped by mathematical family |
| Fig05 | Residual diagnostics for top 4 models (4 sub-plots each) |
| Fig06 | Residual bubble chart across all models and time points |
| Fig07 | R2 and Adjusted R2 bar chart |
| Fig08 | RMSE bar chart |
| Fig09 | AIC and BIC bar chart |
| Fig10 | Durbin-Watson statistic bar chart |
| Fig11 | R2 vs RMSE performance bubble chart (coloured by model family) |
| Fig12 | Multi-metric ranking dot-plot (6 metrics simultaneously) |
| Fig13 | Predicted vs actual scatter plots (one panel per model) |
| Fig14 | Pearson correlation heatmap of model predictions |
| Fig15 | Predicted peak yield and time-to-peak bar charts |
| File | Contents |
|---|---|
| COMBINED_summary_metrics_all_animals.csv | All metrics for all animals and models |
| COMBINED_parameter_estimates_all_animals.csv | All parameter estimates across animals |
| COMBINED_best_model_per_animal.csv | Best fitting model for each animal |
| COMBINED_Fig_R2_CrossAnimal.png | R2 comparison across all animals |
| COMBINED_Fig_RMSE_CrossAnimal.png | RMSE comparison across all animals |
| COMBINED_Fig_BestModel_Overlay.png | Best-fit curves for all animals on one plot |
lactation_results/
|-- Animal_A/
| |-- Animal_A_parameter_estimates.csv
| |-- Animal_A_summary_metrics.csv
| |-- Animal_A_actual_and_predicted_values.csv
| |-- Animal_A_residuals.csv
| |-- Fig01_All_Models_Overlay.png
| |-- Fig02_Ranked_Panels.png
| |-- Fig03_Best_vs_Worst.png
| |-- Fig04_Family_Panels.png
| |-- Fig05_Residuals_ModelName.png
| |-- Fig06_Residual_BubbleChart.png
| |-- Fig07_R2_AdjR2.png
| |-- Fig08_RMSE.png
| |-- Fig09_AIC_BIC.png
| |-- Fig10_DurbinWatson.png
| |-- Fig11_R2_RMSE_Bubble.png
| |-- Fig12_ModelRanking.png
| |-- Fig13_Pred_vs_Actual.png
| |-- Fig14_Correlation_Heatmap.png
| `-- Fig15_Peak_Yield_Time.png
|-- Animal_B/
| `-- (same structure as Animal_A)
|-- COMBINED_summary_metrics_all_animals.csv
|-- COMBINED_parameter_estimates_all_animals.csv
|-- COMBINED_best_model_per_animal.csv
|-- COMBINED_Fig_R2_CrossAnimal.png
|-- COMBINED_Fig_RMSE_CrossAnimal.png
`-- COMBINED_Fig_BestModel_Overlay.png
Use these exact strings in the selected_models
argument:
"Brody_1923" "Brody_1924" "Parabolic_Exp_Sikka"
"Wood_1967" "Wood_Dhanoa" "Cobby_LeDu"
"Quadratic_Dave" "Mixed_Log_GS" "Khandekar"
"Wilmink_k005" "Wilmink_k_estimated" "Ali_Schaeffer"
"Cappio_Borlino" "Papajcsik_Bodero1" "Papajcsik_Bodero2"
"Papajcsik_Bodero3" "Inverse_Poly_Nelder" "Log_Quadratic_Adediran"
"Morant_Gnanasakthy" "Pollott_Multiplicative"The package computes and reports the following metrics for every fitted model:
| Metric | Symbol | Interpretation |
|---|---|---|
| Coefficient of Determination | R2 | Higher is better (maximum = 1) |
| Adjusted R2 | Adj. R2 | Penalises extra parameters; higher is better |
| Root Mean Square Error | RMSE | Lower is better (units: kg/day) |
| Akaike Information Criterion | AIC | Lower is better |
| Bayesian Information Criterion | BIC | Lower is better |
| Durbin-Watson Statistic | DW | Ideal = 2.0; range 1.5 to 2.5 is acceptable |
| Name | Role | |
|---|---|---|
| Raja TV | Author, Maintainer | venkatesanraja09@gmail.com |
| Lalremruati PC | Author | lalremruatichalthleng221@gmail.com |
| Priyadharshini P | Author | priyapandian733@gmail.com |
| Nidhishree NS | Author | nidhishreens9216@gmail.com |
| Dheeraj Gurjar | Author | dheeraj.gurjar.singh@gmail.com |
| Rani Alex | Author | ranialex01vet@gmail.com |
| Vikas Vohra | Author | vohravikas@gmail.com |
This package is licensed under the GNU General Public License v3.0. See GPL-3.0 License for details.
If you use LactCurveModels in your research, please cite it as:
Raja TV, Lalremruati PC, Priyadharshini P, Nidhishree NS, Gurjar D,
Alex R, Vohra V (2025). LactCurveModels: Lactation Curve Model Fitting
for Dairy Animals. R package version 0.1.0.
https://github.com/VenkatesanRaja/LactCurveModels
To get the citation from within R:
citation("LactCurveModels")These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.
Health stats visible at Monitor.