Statistical Analysis of Induced Mutagenesis Experiments in Crop Plants
BKMutate is an R package for the statistical analysis of mutation
breeding experiments — gamma rays, EMS, sodium azide and any other
physical or chemical mutagen. Every analysis returns a tidy result
object and a publication-ready colour figure through a
single verb, bm_plot().
Mutagenic effectiveness and efficiency are the two numbers on which every mutation-breeding paper turns — and they are almost universally reported as bare point estimates, with no indication of uncertainty.
BKMutate treats them as what they actually are:
This lets you say whether two mutagens really differ, instead of comparing two numbers and hoping.
The package also uses Fieller’s theorem for LD50 confidence intervals — the correct, asymmetric interval for a ratio of two correlated coefficients — rather than the symmetric delta approximation used by most software.
# from CRAN (after release)
install.packages("BKMutate")
# development version
# remotes::install_github("bkpraveenars-del/BKMutate")Depends only on ggplot2. No compiled code, so no Rtools needed.
| Function | Analysis | Answers |
|---|---|---|
bm_dose() |
Dose-response, LD50 / GR50 + Fieller CI | What dose kills half the population? |
bm_effect() |
Effectiveness & efficiency with CIs | Which mutagen gives most mutations per unit damage? |
bm_spectrum() |
Chlorophyll mutation spectrum | Which mutant classes does each mutagen induce? |
bm_m2() |
Poisson / quasi-Poisson GLM for M2 counts | Is the mutation rate really different? |
bm_compare() |
Mutagen comparison, RBE | Is mutagen A significantly better than B? |
library(BKMutate)
## 1. LD50 with Fieller intervals
d <- bm_data("dose")
ld <- bm_dose(d, dose = "dose", n_total = "n_treated",
n_affected = "n_survived", mutagen = "mutagen")
ld; bm_plot(ld)
## 2. Effectiveness and efficiency WITH confidence intervals
m <- bm_data("m2")
ef <- bm_effect(m, mutagen = "mutagen", dose = "dose",
m2_total = "M2_plants", m2_mutants = "M2_mutants",
lethality_n = "lethality_n", lethality_x = "lethality_x",
sterility_n = "sterility_n", sterility_x = "sterility_x",
injury = "injury_pct")
ef
bm_plot(ef) # effectiveness with confidence bands
bm_plot(ef, type = "efficiency") # efficiency with error bars
## 3. Chlorophyll mutation spectrum
s <- bm_spectrum(bm_data("spectrum"), "mutagen",
c("albina","xantha","chlorina","viridis"), "dose")
s; bm_plot(s)
## 4. M2 counts with overdispersion handled properly
cts <- bm_m2(bm_data("counts"), "mutants", "mutagen", "dose", "plants")
cts; bm_plot(cts)
## 5. Formal comparison of mutagens
cmp <- bm_compare(ef, dose_fit = ld, reference = "Gamma")
cmp; bm_plot(cmp)Dose-response — mutagen,
dose, n_treated, n_survived (or a
continuous seedling_height for GR50)
M1 damage + M2 mutation — mutagen,
dose, M2_plants, M2_mutants,
lethality_n, lethality_x,
sterility_n, sterility_x,
injury_pct
Spectrum — mutagen, dose,
albina, xantha, chlorina,
viridis
M2 family counts — mutagen,
dose, family, plants,
mutants
Column names are yours to choose; you tell each function which is which.
bm_m2() →
counts are overdispersed; quasi-Poisson standard errors are used
automatically, because Poisson would overstate significance.bm_data("dose") · bm_data("m2") ·
bm_data("spectrum") · bm_data("counts")
Three mutagens (gamma rays in kR, EMS in %, sodium azide in mM) across five doses each. These are synthetic benchmark datasets generated from known parameters with a fixed seed, so the true LD50 and mutation rates are known and estimates can be checked against them.
GPL-3. Author: Dr. Praveen Kumar B. K., Department of Genetics and Plant Breeding, Agriculture University, Jodhpur, India.