Chapter 7 Null Models

Purpose: - Assess performance of niche models using null models

Authors: Tyler Radtke and Sebastian Fernandez

7.1 Load Required Packages

library(ENMeval)
library(ggplot2)
library(dplyr)

7.2 A) Load Cleaned Occurrence Data

# Load all occurrence records
alldf <- read.csv("data/02_cleaning/maxent_ready/diapensiaceae_maxentready_2025_06_27.csv")

7.3 B) Load Optimal Model Parameters

# Load optimal feature class (fc) and regularization multiplier (rm)
opt.seq <- read.delim("data/05_ENMs/Galax_urceolata_OptModel.txt")

# Extract parameters
fc <- opt.seq$fc
rm <- opt.seq$rm

7.4 C) Load ENMeval Object

# Load saved ENMeval object for Galax urceolata
load("data/05_ENMs/Galax_urceolata_ENM_eval.RData")

7.5 D) Run Null Model Simulations

# Run ENMnulls with optimal parameters and 100 iterations
spec.mod.null <- ENMnulls(
  eval,
  mod.settings = list(fc = fc, rm = rm),
  no.iter = 100
)

7.6 E) Save Null Model Comparison Results

# Extract comparison results between empirical and null models
null_comparison_results <- null.emp.results(spec.mod.null)

# Save results as CSV
write.csv(
  null_comparison_results,
  file = "data/05_ENMs/Galax_urceolata_null_comparison_results.csv",
  row.names = FALSE
)

7.7 F) Plot Null Model Results

# Generate histogram plots for AUC and OR.10p statistics
spec.null <- evalplot.nulls(
  spec.mod.null,
  stats = c("or.10p", "auc.val"),
  plot.type = "histogram"
)

# Display plot in R console
plot(spec.null)

# Save plot to PNG
ggsave(
  filename = "Galax_urceolata_null_histogram.png",
  plot = spec.null,
  path = "data/05_ENMs/",
  height = 12,
  width = 13
)