---
title: "Getting Started with LactCurveModels"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Getting Started with LactCurveModels}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r, include = FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)
```

## Overview

**LactCurveModels** is an R package for fitting nonlinear lactation curve models
to daily milk yield records from dairy animals. The package fits up to 20
published models simultaneously, evaluates each model using six
goodness-of-fit metrics, and produces publication-ready diagnostic figures and
summary tables — all in a single function call.

Key features:

- Fits 20 nonlinear lactation curve models spanning four mathematical families
- Supports batch processing of multiple animals from a single CSV file
- Produces 15 diagnostic figures per animal plus 3 combined cross-animal outputs
- Reports R², Adjusted R², RMSE, AIC, BIC, and Durbin-Watson for every model
- Flexible selection of any subset of models or animals to analyse

---

## Installation

Install the package from CRAN:

```{r install-cran, eval=FALSE}
install.packages("LactCurveModels")
```

Or install the development version from GitHub:

```{r install-github, eval=FALSE}
# install.packages("devtools")
devtools::install_github("venkatesanraja/LactCurveModels")
```

Load the package:

```{r setup}
library(LactCurveModels)
```

---

## Input Data Format

Your input CSV file must contain exactly **three columns** in any column order:

| Column       | Type      | Description                                        |
|--------------|-----------|----------------------------------------------------|
| `animal_id`  | character | Unique identifier for each animal                  |
| `dim`        | integer   | Days-in-milk time index (typically 1 to 20)        |
| `dmy`        | numeric   | Daily milk yield in kg/day                         |

A typical CSV file looks like this:

```
animal_id,dim,dmy
Animal_A,1,9.3
Animal_A,2,9.9
Animal_A,3,10.2
...
Animal_B,1,8.1
Animal_B,2,8.7
...
```

> **Note:** The `dim` column represents a fortnightly time index across the
> lactation period. Each record corresponds to one fortnightly observation of
> daily milk yield for a given animal.

---

## Basic Usage

### Analyse All Animals with All 20 Models

```{r basic-usage, eval=FALSE}
results <- run_lactation_analysis(
  input_csv_path = "path/to/your/data.csv"
)
```

By default, all animals in the CSV are analysed using all 20 models, and
outputs are saved to a folder named `lactation_results` in the current
working directory.

### Specify a Custom Output Folder

```{r custom-outdir, eval=FALSE}
results <- run_lactation_analysis(
  input_csv_path = "path/to/your/data.csv",
  out_dir        = "D:/my_results/lactation_analysis"
)
```

---

## Selecting Specific Models

Use the `selected_models` argument to fit only a subset of the 20 available
models. This is useful when you already know which model families are most
appropriate for your data, or when you want faster processing.

```{r selected-models, eval=FALSE}
results <- run_lactation_analysis(
  input_csv_path  = "path/to/your/data.csv",
  selected_models = c("Wood_1967", "Wilmink_k005", "Ali_Schaeffer",
                      "Pollott_Multiplicative")
)
```

### All 20 Available Model Names

The full list of valid model name strings is given below, grouped by
mathematical family:

| Family                | Model Name String          | Reference                        |
|-----------------------|----------------------------|----------------------------------|
| Brody / Exponential   | `Brody_1923`               | Brody, 1923                      |
| Brody / Exponential   | `Brody_1924`               | Brody, 1924                      |
| Brody / Exponential   | `Parabolic_Exp_Sikka`      | Sikka, 1950                      |
| Brody / Exponential   | `Papajcsik_Bodero1`        | Papajcsik & Bodero, 1988         |
| Brody / Exponential   | `Papajcsik_Bodero3`        | Papajcsik & Bodero, 1988         |
| Wood / Gamma-type     | `Wood_1967`                | Wood, 1967                       |
| Wood / Gamma-type     | `Wood_Dhanoa`              | Dhanoa, 1981                     |
| Wood / Gamma-type     | `Cappio_Borlino`           | Cappio-Borlino et al., 1995      |
| Wood / Gamma-type     | `Papajcsik_Bodero2`        | Papajcsik & Bodero, 1988         |
| Wood / Gamma-type     | `Pollott_Multiplicative`   | Pollott, 2000                    |
| Polynomial / Linear   | `Cobby_LeDu`               | Cobby & Le Du, 1978              |
| Polynomial / Linear   | `Quadratic_Dave`           | Dave, 1971                       |
| Polynomial / Linear   | `Mixed_Log_GS`             | Guo & Swalve, 1995               |
| Polynomial / Linear   | `Khandekar`                | Khandekar, 1993                  |
| Polynomial / Linear   | `Inverse_Poly_Nelder`      | Nelder, 1966                     |
| Wilmink / Log-exp     | `Wilmink_k005`             | Wilmink, 1987                    |
| Wilmink / Log-exp     | `Wilmink_k_estimated`      | Wilmink, 1987                    |
| Wilmink / Log-exp     | `Ali_Schaeffer`            | Ali & Schaeffer, 1987            |
| Wilmink / Log-exp     | `Log_Quadratic_Adediran`   | Adediran et al., 2012            |
| Wilmink / Log-exp     | `Morant_Gnanasakthy`       | Morant & Gnanasakthy, 1989       |

---

## Selecting Specific Animals

Use the `selected_animals` argument to analyse only a subset of the animals
present in the CSV file. Animal IDs must match the values in the `animal_id`
column exactly.

```{r selected-animals, eval=FALSE}
results <- run_lactation_analysis(
  input_csv_path   = "path/to/your/data.csv",
  selected_animals = c("Animal_A", "Animal_C")
)
```

---

## Combined Selection of Models and Animals

All four arguments can be used together:

```{r combined, eval=FALSE}
results <- run_lactation_analysis(
  input_csv_path   = "path/to/your/data.csv",
  selected_models  = c("Wood_1967", "Wilmink_k005", "Ali_Schaeffer"),
  selected_animals = c("Animal_A", "Animal_B"),
  out_dir          = "D:/results"
)
```

---

## Understanding the Outputs

### Per-Animal Outputs

For each successfully processed animal, a sub-folder named after the animal ID
is created inside `out_dir`. It contains the following files:

#### CSV Tables

| File                                      | Contents                                         |
|-------------------------------------------|--------------------------------------------------|
| `AnimalID_parameter_estimates.csv`        | Fitted parameters and standard errors            |
| `AnimalID_summary_metrics.csv`            | R², Adj. R², AIC, BIC, RMSE, Durbin-Watson      |
| `AnimalID_actual_and_predicted_values.csv`| Observed vs predicted milk yield at each DIM     |
| `AnimalID_residuals.csv`                  | Residuals at each time point for all models      |

#### Diagnostic Figures (15 PNG files)

| Figure  | Description                                                        |
|---------|--------------------------------------------------------------------|
| Fig01   | All 20 fitted curves overlaid on observed data                     |
| Fig02   | Four-panel ranked model fits (best to worst R²)                    |
| Fig03   | Best 3 vs Worst 3 models side by side                              |
| Fig04   | Models grouped and coloured by mathematical family                 |
| Fig05   | Residual diagnostics for top 4 models (4 sub-panels each)         |
| Fig06   | Residual bubble chart across all models and time points            |
| Fig07   | R² and Adjusted R² bar chart for all models                       |
| Fig08   | RMSE bar chart for all models                                      |
| Fig09   | AIC and BIC bar chart for all models                               |
| Fig10   | Durbin-Watson statistic bar chart for all models                   |
| Fig11   | R² 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                   |

### Combined Cross-Animal Outputs

When more than one animal is analysed, the following combined outputs are
saved directly in `out_dir`:

| File / Figure                                  | Contents                                      |
|------------------------------------------------|-----------------------------------------------|
| `COMBINED_summary_metrics_all_animals.csv`     | All metrics for all animals and models        |
| `COMBINED_parameter_estimates_all_animals.csv` | All parameter estimates across all animals    |
| `COMBINED_best_model_per_animal.csv`           | Best fitting model per animal with key metrics|
| `COMBINED_Fig_R2_CrossAnimal.png`              | Grouped bar chart comparing R² across animals |
| `COMBINED_Fig_RMSE_CrossAnimal.png`            | Grouped bar chart comparing RMSE across animals|
| `COMBINED_Fig_BestModel_Overlay.png`           | Best-fit curve overlay for all animals        |

---

## Accessing Results in R

The function returns a named list (one element per animal) which can be
accessed directly in R:

```{r access-results, eval=FALSE}
# View goodness-of-fit metrics for Animal_A
results[["Animal_A"]]$metrics_df

# View parameter estimates for Animal_A
results[["Animal_A"]]$param_table

# Access the fitted nls object for Wood (1967) model
results[["Animal_A"]]$model_fits[["Wood_1967"]]$model

# View model coefficients
coef(results[["Animal_A"]]$model_fits[["Wood_1967"]]$model)

# View individual metrics
results[["Animal_A"]]$model_fits[["Wood_1967"]]$metrics
```

---

## Using fit_lactation_models() Directly

For advanced users, the lower-level function `fit_lactation_models()` fits
models to a single animal's pre-formatted data frame:

```{r fit-direct, eval=FALSE}
# Build a data frame for one animal
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
)

# Fit all 20 models
fits <- fit_lactation_models(animal_df)

# Fit selected models only
fits <- fit_lactation_models(
  animal_df,
  selected_models = c("Wood_1967", "Wilmink_k005", "Ali_Schaeffer")
)

# Access results
fits[["Wood_1967"]]$metrics
fits[["Wood_1967"]]$predictions
coef(fits[["Wood_1967"]]$model)
```

The data frame passed to `fit_lactation_models()` must contain:

| Column | Description                                           |
|--------|-------------------------------------------------------|
| `x`    | Integer time index (days-in-milk, e.g. 1 to 20)      |
| `y`    | Numeric daily milk yield in kg/day                    |
| `z`    | Numeric, equal to `x / 365` (required by Morant-Gnanasakthy model) |

---

## Goodness-of-Fit Metrics

The following metrics are computed for every successfully fitted model:

| Metric          | Description                                                         |
|-----------------|---------------------------------------------------------------------|
| R²              | Coefficient of determination                                        |
| Adjusted R²     | R² penalised for the number of parameters                          |
| RMSE            | Root mean square error (kg/day)                                     |
| AIC             | Akaike information criterion — lower is better                      |
| BIC             | Bayesian information criterion — lower is better                    |
| Durbin-Watson   | Test statistic for autocorrelation in residuals (ideal value = 2)  |

---

## Citation

If you use LactCurveModels in your research, please cite it as:

```{r citation, eval=FALSE}
citation("LactCurveModels")
```

> 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://cran.r-project.org/package=LactCurveModels

---

## Getting Help

- Use `?run_lactation_analysis` and `?fit_lactation_models` for function-level help
- Report bugs at: https://github.com/venkatesanraja/LactCurveModels/issues
