MyNixOS website logo
Description

Lactation Curve Model Fitting for Dairy Animals.

Fits up to 20 nonlinear lactation curve models to dairy animal milk yield data. Models fitted include exponential, polynomial, mixed logarithmic, inverse polynomial, and sigmoid families published between 1923 and 2000. Supports batch processing of multiple animals from a single CSV file, with flexible selection of animals and models. Produces per-animal parameter tables, goodness-of-fit metrics including R-squared (R2), Root Mean Square Error (RMSE), Akaike Information Criterion (AIC), Bayesian Information Criterion (BIC), and a serial autocorrelation statistic, 15 diagnostic figures, and combined cross-animal comparison outputs. References: <doi:10.1085/jgp.5.4.441>, <doi:10.1038/216164a0>, <doi:10.1016/0301-6226(87)90003-0>, <doi:10.4141/cjas87-067>, <doi:10.3168/jds.S0022-0302(00)75136-8>.

LactCurveModels

CRAN status License: GPL-3 R

Overview

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.


The 20 Lactation Curve Models

No.Model NameReference
1Brody (1923)Brody, 1923
2Brody (1924)Brody, 1924
3Parabolic ExponentialSikka, 1950
4WoodWood, 1967
5Wood-DhanoaDhanoa, 1981
6Cobby and Le DuCobby and Le Du, 1978
7QuadraticDave, 1971
8Mixed LogGuo and Swalve, 1995
9KhandekarKhandekar, 1993
10Wilmink (k = 0.05)Wilmink, 1987
11Wilmink (k estimated)Wilmink, 1987
12Ali and SchaefferAli and Schaeffer, 1987
13Cappio-BorlinoCappio-Borlino et al., 1995
14Papajcsik and Bodero 1Papajcsik and Bodero, 1988
15Papajcsik and Bodero 2Papajcsik and Bodero, 1988
16Papajcsik and Bodero 3Papajcsik and Bodero, 1988
17Inverse PolynomialNelder, 1966
18Log-QuadraticAdediran et al., 2012
19Morant and GnanasakthyMorant and Gnanasakthy, 1989
20Pollott MultiplicativePollott, 2000

Installation

From CRAN (once published)

install.packages("LactCurveModels")

From GitHub (development version)

# install.packages("devtools")
devtools::install_github("VenkatesanRaja/LactCurveModels")

Input Data Format

The package reads a CSV file with exactly three columns (column order does not matter):

ColumnTypeDescription
animal_idcharacterUnique identifier for each animal
dimintegerDays-in-milk time index (fortnightly: 1, 2, ..., 20)
dmynumericDaily 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

Usage

Analyse all animals with all 20 models

library(LactCurveModels)

results <- run_lactation_analysis(
  input_csv_path = "C:/data/myanimals.csv"
)

Analyse selected animals only

results <- run_lactation_analysis(
  input_csv_path   = "C:/data/myanimals.csv",
  selected_animals = c("Animal_A", "Animal_B")
)

Fit selected models only

results <- run_lactation_analysis(
  input_csv_path  = "C:/data/myanimals.csv",
  selected_models = c("Wood_1967", "Wilmink_k005", "Ali_Schaeffer")
)

Combine both selections with a custom output folder

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"
)

Fit models directly (advanced use)

# 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)

Outputs

For each animal, the following are saved in a dedicated sub-folder:

CSV Tables (4 files per animal)

FileContents
AnimalID_parameter_estimates.csvFitted parameters and standard errors for all models
AnimalID_summary_metrics.csvR2, Adjusted R2, AIC, BIC, RMSE, Durbin-Watson
AnimalID_actual_and_predicted_values.csvObserved vs predicted milk yield at each time point
AnimalID_residuals.csvResiduals (predicted minus actual) at each time point

Diagnostic Figures (15 PNG files per animal)

FigureDescription
Fig01All fitted models overlaid on observed data
Fig024-panel ranked model fits (best to worst R2)
Fig03Best 3 vs Worst 3 models
Fig04Models grouped by mathematical family
Fig05Residual diagnostics for top 4 models (4 sub-plots each)
Fig06Residual bubble chart across all models and time points
Fig07R2 and Adjusted R2 bar chart
Fig08RMSE bar chart
Fig09AIC and BIC bar chart
Fig10Durbin-Watson statistic bar chart
Fig11R2 vs RMSE performance bubble chart (coloured by model family)
Fig12Multi-metric ranking dot-plot (6 metrics simultaneously)
Fig13Predicted vs actual scatter plots (one panel per model)
Fig14Pearson correlation heatmap of model predictions
Fig15Predicted peak yield and time-to-peak bar charts

Combined Cross-Animal Outputs (produced when more than 1 animal is analysed)

FileContents
COMBINED_summary_metrics_all_animals.csvAll metrics for all animals and models
COMBINED_parameter_estimates_all_animals.csvAll parameter estimates across animals
COMBINED_best_model_per_animal.csvBest fitting model for each animal
COMBINED_Fig_R2_CrossAnimal.pngR2 comparison across all animals
COMBINED_Fig_RMSE_CrossAnimal.pngRMSE comparison across all animals
COMBINED_Fig_BestModel_Overlay.pngBest-fit curves for all animals on one plot

Output Folder Structure

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

Valid Model Names

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"

Goodness-of-Fit Metrics

The package computes and reports the following metrics for every fitted model:

MetricSymbolInterpretation
Coefficient of DeterminationR2Higher is better (maximum = 1)
Adjusted R2Adj. R2Penalises extra parameters; higher is better
Root Mean Square ErrorRMSELower is better (units: kg/day)
Akaike Information CriterionAICLower is better
Bayesian Information CriterionBICLower is better
Durbin-Watson StatisticDWIdeal = 2.0; range 1.5 to 2.5 is acceptable

Authors

NameRoleEmail
Raja TVAuthor, Maintainer[email protected]
Lalremruati PCAuthor[email protected]
Priyadharshini PAuthor[email protected]
Nidhishree NSAuthor[email protected]
Dheeraj GurjarAuthor[email protected]
Rani AlexAuthor[email protected]
Vikas VohraAuthor[email protected]

License

This package is licensed under the GNU General Public License v3.0. See GPL-3.0 License for details.


Citation

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")

Bug Reports and Contributions

  • Bug reports: https://github.com/VenkatesanRaja/LactCurveModels/issues
  • Pull requests are welcome for new models, additional figure types, or performance improvements.
Metadata

Version

0.1.5

License

Unknown

Platforms (80)

    Darwin
    FreeBSD
    Genode
    GHCJS
    Linux
    MMIXware
    NetBSD
    none
    OpenBSD
    Redox
    Solaris
    uefi
    WASI
    Windows
Show all
  • aarch64-darwin
  • aarch64-freebsd
  • aarch64-genode
  • aarch64-linux
  • aarch64-netbsd
  • aarch64-none
  • aarch64-uefi
  • aarch64-windows
  • aarch64_be-none
  • arc-linux
  • arm-none
  • armv5tel-linux
  • armv6l-linux
  • armv6l-netbsd
  • armv6l-none
  • armv7a-linux
  • armv7a-netbsd
  • armv7l-linux
  • armv7l-netbsd
  • avr-none
  • i686-cygwin
  • i686-freebsd
  • i686-genode
  • i686-linux
  • i686-netbsd
  • i686-none
  • i686-openbsd
  • i686-windows
  • javascript-ghcjs
  • loongarch64-linux
  • m68k-linux
  • m68k-netbsd
  • m68k-none
  • microblaze-linux
  • microblaze-none
  • microblazeel-linux
  • microblazeel-none
  • mips-linux
  • mips-none
  • mips64-linux
  • mips64-none
  • mips64el-linux
  • mipsel-linux
  • mipsel-netbsd
  • mmix-mmixware
  • msp430-none
  • or1k-none
  • powerpc-linux
  • powerpc-netbsd
  • powerpc-none
  • powerpc64-linux
  • powerpc64le-linux
  • powerpcle-none
  • riscv32-linux
  • riscv32-netbsd
  • riscv32-none
  • riscv64-linux
  • riscv64-netbsd
  • riscv64-none
  • rx-none
  • s390-linux
  • s390-none
  • s390x-linux
  • s390x-none
  • sh4-linux
  • vc4-none
  • wasm32-wasi
  • wasm64-wasi
  • x86_64-cygwin
  • x86_64-darwin
  • x86_64-freebsd
  • x86_64-genode
  • x86_64-linux
  • x86_64-netbsd
  • x86_64-none
  • x86_64-openbsd
  • x86_64-redox
  • x86_64-solaris
  • x86_64-uefi
  • x86_64-windows