# tests/testthat/test-diagnostics.R # ---- fixtures ------------------------------------------------------------- make_dat <- function(n = 40, seed = 99) { set.seed(seed) x <- seq(0, 180, length.out = n) y <- 3 + 0.03 * x - 0.00008 * x^2 + rnorm(n, 0, 0.2) data.frame(nitrogen = x, yield = y) } dat <- make_dat() # ---- gof_stats ------------------------------------------------------------ test_that("gof_stats returns named list with all keys", { m <- fit_linear(dat, "yield ~ nitrogen") gf <- gof_stats(m) expect_named(gf, c("R2", "adj_R2", "RMSE", "MAE", "AIC", "BIC")) }) test_that("gof_stats R2 is in (0, 1) for a sensible model", { m <- fit_linear(dat, "yield ~ nitrogen") gf <- gof_stats(m) expect_gt(gf$R2, 0) expect_lt(gf$R2, 1) }) test_that("gof_stats RMSE is positive", { m <- fit_linear(dat, "yield ~ nitrogen") gf <- gof_stats(m) expect_gt(gf$RMSE, 0) }) test_that("gof_stats works for agriNLS", { m <- fit_nonlinear(dat, "nitrogen", "yield", "quadratic") gf <- gof_stats(m) expect_named(gf, c("R2", "adj_R2", "RMSE", "MAE", "AIC", "BIC")) }) test_that("gof_stats works on raw lm object", { m <- lm(yield ~ nitrogen, data = dat) gf <- gof_stats(m) expect_named(gf, c("R2", "adj_R2", "RMSE", "MAE", "AIC", "BIC")) }) # ---- compare_models ------------------------------------------------------- test_that("compare_models returns a data frame", { m1 <- fit_linear(dat, "yield ~ nitrogen") m2 <- fit_nonlinear(dat, "nitrogen", "yield", "quadratic") cmp <- compare_models(linear = m1, quadratic = m2) expect_s3_class(cmp, "data.frame") }) test_that("compare_models has expected columns", { m1 <- fit_linear(dat, "yield ~ nitrogen") m2 <- fit_linear(dat, "yield ~ nitrogen + I(nitrogen^2)") cmp <- compare_models(m1 = m1, m2 = m2) expect_true(all(c("model","AIC","BIC","RMSE","delta_AIC") %in% names(cmp))) }) test_that("compare_models ranks best model first (lowest AIC)", { m1 <- fit_linear(dat, "yield ~ 1") # intercept only — poor m2 <- fit_linear(dat, "yield ~ nitrogen") # better cmp <- compare_models(intercept = m1, linear = m2) expect_equal(cmp$model[1], "linear") }) test_that("compare_models works with unnamed args", { m1 <- fit_linear(dat, "yield ~ nitrogen") m2 <- fit_linear(dat, "yield ~ nitrogen + I(nitrogen^2)") cmp <- compare_models(m1, m2) expect_equal(nrow(cmp), 2) expect_true(all(grepl("^model", cmp$model))) }) test_that("delta_AIC of best model is 0", { m1 <- fit_linear(dat, "yield ~ 1") m2 <- fit_linear(dat, "yield ~ nitrogen") cmp <- compare_models(int = m1, lin = m2) expect_equal(cmp$delta_AIC[1], 0) }) # ---- residual_check ------------------------------------------------------- test_that("residual_check returns list of 4 ggplot objects", { skip_if_not_installed("ggplot2") m <- fit_linear(dat, "yield ~ nitrogen") plt <- residual_check(m) expect_type(plt, "list") expect_length(plt, 4) for (p in plt) expect_s3_class(p, "gg") }) # ---- model_summary -------------------------------------------------------- test_that("model_summary.agriLM prints without error", { m <- fit_linear(dat, "yield ~ nitrogen") expect_output(model_summary(m), "agriReg") }) test_that("model_summary.agriNLS prints without error", { m <- fit_nonlinear(dat, "nitrogen", "yield", "quadratic") expect_output(model_summary(m), "agriReg") }) # ---- plot_fit ------------------------------------------------------------- test_that("plot_fit dispatches to correct plot method", { skip_if_not_installed("ggplot2") m <- fit_linear(dat, "yield ~ nitrogen") p <- plot_fit(m) expect_s3_class(p, "gg") })