This function, included in the fuzzySim package (version 1.6 just released), uses the fuzzyOverlay function in the previous post and then quantifies overall range change (including gain, loss, maintenance/stability and total change) based on the continuous predictions of two species distribution models (see Gutiérrez-Rodríguez et al., in press).
fuzzyRangeChange <- function(pred1, pred2, number = TRUE, prop = TRUE, na.rm = TRUE, round.digits = 2, measures = c("Gain", "Loss", "Stable_presence", "Stable_absence", "Balance"), plot = TRUE, col = colorRampPalette(c("white", "black"))(length(measures)), ...) { # version 1.4 (23 Mar 2016) stopifnot(ncol(pred1) == ncol(pred2), all(pred1[is.finite(pred1)] >= 0 && pred1[is.finite(pred1)] <= 1), all(pred2[is.finite(pred2)] >= 0 && pred2[is.finite(pred2)] <= 1) ) if (!number & !prop) stop ("Nothing to calculate if both 'number' and 'prop' are FALSE.") values <- vector("numeric", length(measures)) names(values) <- measures if ("Gain" %in% measures) values["Gain"] <- sum(fuzzyOverlay(data.frame(pred1, pred2), op = "expansion", na.rm = na.rm), na.rm = na.rm) if ("Loss" %in% measures) values["Loss"] <- sum(fuzzyOverlay(data.frame(pred1, pred2), op = "contraction", na.rm = na.rm), na.rm = na.rm) if ("Stable_presence" %in% measures) values["Stable_presence"] <- sum(fuzzyOverlay(data.frame(pred1, pred2), op = "maintenance", na.rm = na.rm), na.rm = na.rm) if ("Stable_absence" %in% measures) values["Stable_absence"] <- sum(fuzzyOverlay(1 - data.frame(pred1, pred2), op = "maintenance", na.rm = na.rm), na.rm = na.rm) if ("Balance" %in% measures) values["Balance"] <- sum(fuzzyOverlay(data.frame(pred1, pred2), op = "change", na.rm = na.rm), na.rm = na.rm) result <- data.frame(Measure = measures, Number = values) if (prop) { if (na.rm) n <- length(na.omit(pred1)) else n <- length(pred1) range.size <- sum(pred1, na.rm = na.rm) stable.abs <- result[result$Measure == "Stable_absence", "Number"] result$Proportion <- result[ , "Number"] / range.size result[result$Measure == "Stable_absence", "Proportion"] <- stable.abs / (n - range.size) } if (!number) { result <- result[ , - (ncol(result) - 1)] } if (plot) { barplot(result[ , ncol(result)], legend.text = rownames(result), col = col, ...) abline(h = 0) } result[ , "Measure"] <- NULL if (is.finite(round.digits)) result <- round(result, round.digits) result }
The function will produce numeric and (since FuzzySim 1.7.2) also graphical results quantifying the fuzzy overall changes:
You can install and load fuzzySim (>= 1.6) and then check help(fuzzyRangeChange) for further info and reproducible usage examples.
REFERENCES
Gutiérrez-Rodríguez J., Barbosa A.M. & Martínez-Solano I. (in press) Present and past climatic effects on the current distribution and genetic diversity of the Iberian spadefoot toad (Pelobates cultripes): an integrative approach. Journal of Biogeography.