context("jsdgam") # Reconstruct the spider data from mvabund spiderdat <- structure(list(abundance = c(25L, 0L, 15L, 2L, 1L, 0L, 2L, 0L, 1L, 3L, 15L, 16L, 3L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 7L, 17L, 11L, 9L, 3L, 29L, 15L, 10L, 2L, 20L, 6L, 20L, 6L, 7L, 11L, 1L, 0L, 1L, 13L, 43L, 2L, 0L, 3L, 0L, 1L, 1L, 2L, 1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 2L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 2L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 16L, 15L, 20L, 9L, 6L, 11L, 14L, 0L, 0L, 2L, 1L, 2L, 6L, 12L, 0L, 0L, 0L, 0L, 0L, 2L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 4L, 7L, 5L, 0L, 18L, 4L, 1L, 4L, 30L, 9L, 24L, 9L, 6L, 16L, 7L, 0L, 0L, 1L, 0L, 18L, 4L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 2L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 0L, 1L, 55L, 0L, 0L, 0L, 0L, 1L, 3L, 6L, 6L, 2L, 5L, 12L, 13L, 16L, 0L, 2L, 0L, 1L, 0L, 0L, 0L, 60L, 1L, 29L, 7L, 2L, 11L, 30L, 2L, 26L, 22L, 95L, 96L, 24L, 14L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 2L, 6L, 3L, 11L, 0L, 1L, 6L, 12L, 15L, 18L, 29L, 135L, 27L, 89L, 2L, 1L, 0L, 0L, 1L, 53L, 15L, 0L, 2L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 6L, 0L, 0L, 0L, 45L, 37L, 45L, 94L, 76L, 24L, 105L, 1L, 1L, 0L, 1L, 8L, 72L, 72L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 57L, 65L, 66L, 86L, 91L, 63L, 118L, 30L, 2L, 1L, 4L, 13L, 97L, 94L, 25L, 28L, 23L, 25L, 22L, 22L, 18L, 1L, 1L, 0L, 16L, 1L, 0L, 2L, 4L, 9L, 1L, 25L, 17L, 34L, 16L, 3L, 0L, 0L, 0L, 0L, 22L, 32L, 3L, 4L, 2L, 0L, 3L, 2L, 2L, 0L, 0L, 0L, 6L, 0L, 0L, 0L), taxon = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L), levels = c("Alopacce", "Alopcune", "Alopfabr", "Arctlute", "Arctperi", "Auloalbi", "Pardlugu", "Pardmont", "Pardnigr", "Pardpull", "Trocterr", "Zoraspin"), class = "factor"), site = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L), soil.dry = c(2.3321, 3.0493, 2.5572, 2.6741, 3.0155, 3.381, 3.1781, 2.6247, 2.4849, 2.1972, 2.2192, 2.2925, 3.5175, 3.0865, 3.2696, 3.0301, 3.3322, 3.1224, 2.9232, 3.1091, 2.9755, 1.2528, 1.1939, 1.6487, 1.8245, 0.9933, 0.9555, 0.9555, 2.3321, 3.0493, 2.5572, 2.6741, 3.0155, 3.381, 3.1781, 2.6247, 2.4849, 2.1972, 2.2192, 2.2925, 3.5175, 3.0865, 3.2696, 3.0301, 3.3322, 3.1224, 2.9232, 3.1091, 2.9755, 1.2528, 1.1939, 1.6487, 1.8245, 0.9933, 0.9555, 0.9555, 2.3321, 3.0493, 2.5572, 2.6741, 3.0155, 3.381, 3.1781, 2.6247, 2.4849, 2.1972, 2.2192, 2.2925, 3.5175, 3.0865, 3.2696, 3.0301, 3.3322, 3.1224, 2.9232, 3.1091, 2.9755, 1.2528, 1.1939, 1.6487, 1.8245, 0.9933, 0.9555, 0.9555, 2.3321, 3.0493, 2.5572, 2.6741, 3.0155, 3.381, 3.1781, 2.6247, 2.4849, 2.1972, 2.2192, 2.2925, 3.5175, 3.0865, 3.2696, 3.0301, 3.3322, 3.1224, 2.9232, 3.1091, 2.9755, 1.2528, 1.1939, 1.6487, 1.8245, 0.9933, 0.9555, 0.9555, 2.3321, 3.0493, 2.5572, 2.6741, 3.0155, 3.381, 3.1781, 2.6247, 2.4849, 2.1972, 2.2192, 2.2925, 3.5175, 3.0865, 3.2696, 3.0301, 3.3322, 3.1224, 2.9232, 3.1091, 2.9755, 1.2528, 1.1939, 1.6487, 1.8245, 0.9933, 0.9555, 0.9555, 2.3321, 3.0493, 2.5572, 2.6741, 3.0155, 3.381, 3.1781, 2.6247, 2.4849, 2.1972, 2.2192, 2.2925, 3.5175, 3.0865, 3.2696, 3.0301, 3.3322, 3.1224, 2.9232, 3.1091, 2.9755, 1.2528, 1.1939, 1.6487, 1.8245, 0.9933, 0.9555, 0.9555, 2.3321, 3.0493, 2.5572, 2.6741, 3.0155, 3.381, 3.1781, 2.6247, 2.4849, 2.1972, 2.2192, 2.2925, 3.5175, 3.0865, 3.2696, 3.0301, 3.3322, 3.1224, 2.9232, 3.1091, 2.9755, 1.2528, 1.1939, 1.6487, 1.8245, 0.9933, 0.9555, 0.9555, 2.3321, 3.0493, 2.5572, 2.6741, 3.0155, 3.381, 3.1781, 2.6247, 2.4849, 2.1972, 2.2192, 2.2925, 3.5175, 3.0865, 3.2696, 3.0301, 3.3322, 3.1224, 2.9232, 3.1091, 2.9755, 1.2528, 1.1939, 1.6487, 1.8245, 0.9933, 0.9555, 0.9555, 2.3321, 3.0493, 2.5572, 2.6741, 3.0155, 3.381, 3.1781, 2.6247, 2.4849, 2.1972, 2.2192, 2.2925, 3.5175, 3.0865, 3.2696, 3.0301, 3.3322, 3.1224, 2.9232, 3.1091, 2.9755, 1.2528, 1.1939, 1.6487, 1.8245, 0.9933, 0.9555, 0.9555, 2.3321, 3.0493, 2.5572, 2.6741, 3.0155, 3.381, 3.1781, 2.6247, 2.4849, 2.1972, 2.2192, 2.2925, 3.5175, 3.0865, 3.2696, 3.0301, 3.3322, 3.1224, 2.9232, 3.1091, 2.9755, 1.2528, 1.1939, 1.6487, 1.8245, 0.9933, 0.9555, 0.9555, 2.3321, 3.0493, 2.5572, 2.6741, 3.0155, 3.381, 3.1781, 2.6247, 2.4849, 2.1972, 2.2192, 2.2925, 3.5175, 3.0865, 3.2696, 3.0301, 3.3322, 3.1224, 2.9232, 3.1091, 2.9755, 1.2528, 1.1939, 1.6487, 1.8245, 0.9933, 0.9555, 0.9555, 2.3321, 3.0493, 2.5572, 2.6741, 3.0155, 3.381, 3.1781, 2.6247, 2.4849, 2.1972, 2.2192, 2.2925, 3.5175, 3.0865, 3.2696, 3.0301, 3.3322, 3.1224, 2.9232, 3.1091, 2.9755, 1.2528, 1.1939, 1.6487, 1.8245, 0.9933, 0.9555, 0.9555), bare.sand = c(0, 0, 0, 0, 0, 2.3979, 0, 0, 0, 3.9318, 0, 0, 1.7918, 0, 0, 0, 0, 0, 0, 0, 0, 3.2581, 3.0445, 3.2581, 3.5835, 4.5109, 2.3979, 3.434, 0, 0, 0, 0, 0, 2.3979, 0, 0, 0, 3.9318, 0, 0, 1.7918, 0, 0, 0, 0, 0, 0, 0, 0, 3.2581, 3.0445, 3.2581, 3.5835, 4.5109, 2.3979, 3.434, 0, 0, 0, 0, 0, 2.3979, 0, 0, 0, 3.9318, 0, 0, 1.7918, 0, 0, 0, 0, 0, 0, 0, 0, 3.2581, 3.0445, 3.2581, 3.5835, 4.5109, 2.3979, 3.434, 0, 0, 0, 0, 0, 2.3979, 0, 0, 0, 3.9318, 0, 0, 1.7918, 0, 0, 0, 0, 0, 0, 0, 0, 3.2581, 3.0445, 3.2581, 3.5835, 4.5109, 2.3979, 3.434, 0, 0, 0, 0, 0, 2.3979, 0, 0, 0, 3.9318, 0, 0, 1.7918, 0, 0, 0, 0, 0, 0, 0, 0, 3.2581, 3.0445, 3.2581, 3.5835, 4.5109, 2.3979, 3.434, 0, 0, 0, 0, 0, 2.3979, 0, 0, 0, 3.9318, 0, 0, 1.7918, 0, 0, 0, 0, 0, 0, 0, 0, 3.2581, 3.0445, 3.2581, 3.5835, 4.5109, 2.3979, 3.434, 0, 0, 0, 0, 0, 2.3979, 0, 0, 0, 3.9318, 0, 0, 1.7918, 0, 0, 0, 0, 0, 0, 0, 0, 3.2581, 3.0445, 3.2581, 3.5835, 4.5109, 2.3979, 3.434, 0, 0, 0, 0, 0, 2.3979, 0, 0, 0, 3.9318, 0, 0, 1.7918, 0, 0, 0, 0, 0, 0, 0, 0, 3.2581, 3.0445, 3.2581, 3.5835, 4.5109, 2.3979, 3.434, 0, 0, 0, 0, 0, 2.3979, 0, 0, 0, 3.9318, 0, 0, 1.7918, 0, 0, 0, 0, 0, 0, 0, 0, 3.2581, 3.0445, 3.2581, 3.5835, 4.5109, 2.3979, 3.434, 0, 0, 0, 0, 0, 2.3979, 0, 0, 0, 3.9318, 0, 0, 1.7918, 0, 0, 0, 0, 0, 0, 0, 0, 3.2581, 3.0445, 3.2581, 3.5835, 4.5109, 2.3979, 3.434, 0, 0, 0, 0, 0, 2.3979, 0, 0, 0, 3.9318, 0, 0, 1.7918, 0, 0, 0, 0, 0, 0, 0, 0, 3.2581, 3.0445, 3.2581, 3.5835, 4.5109, 2.3979, 3.434, 0, 0, 0, 0, 0, 2.3979, 0, 0, 0, 3.9318, 0, 0, 1.7918, 0, 0, 0, 0, 0, 0, 0, 0, 3.2581, 3.0445, 3.2581, 3.5835, 4.5109, 2.3979, 3.434), fallen.leaves = c(0, 1.7918, 0, 0, 0, 3.434, 0, 4.2627, 0, 0, 0, 0, 1.7918, 0, 4.3944, 4.6052, 4.4543, 4.3944, 4.5109, 4.5951, 4.5643, 0, 0, 0, 0, 0, 0, 0, 0, 1.7918, 0, 0, 0, 3.434, 0, 4.2627, 0, 0, 0, 0, 1.7918, 0, 4.3944, 4.6052, 4.4543, 4.3944, 4.5109, 4.5951, 4.5643, 0, 0, 0, 0, 0, 0, 0, 0, 1.7918, 0, 0, 0, 3.434, 0, 4.2627, 0, 0, 0, 0, 1.7918, 0, 4.3944, 4.6052, 4.4543, 4.3944, 4.5109, 4.5951, 4.5643, 0, 0, 0, 0, 0, 0, 0, 0, 1.7918, 0, 0, 0, 3.434, 0, 4.2627, 0, 0, 0, 0, 1.7918, 0, 4.3944, 4.6052, 4.4543, 4.3944, 4.5109, 4.5951, 4.5643, 0, 0, 0, 0, 0, 0, 0, 0, 1.7918, 0, 0, 0, 3.434, 0, 4.2627, 0, 0, 0, 0, 1.7918, 0, 4.3944, 4.6052, 4.4543, 4.3944, 4.5109, 4.5951, 4.5643, 0, 0, 0, 0, 0, 0, 0, 0, 1.7918, 0, 0, 0, 3.434, 0, 4.2627, 0, 0, 0, 0, 1.7918, 0, 4.3944, 4.6052, 4.4543, 4.3944, 4.5109, 4.5951, 4.5643, 0, 0, 0, 0, 0, 0, 0, 0, 1.7918, 0, 0, 0, 3.434, 0, 4.2627, 0, 0, 0, 0, 1.7918, 0, 4.3944, 4.6052, 4.4543, 4.3944, 4.5109, 4.5951, 4.5643, 0, 0, 0, 0, 0, 0, 0, 0, 1.7918, 0, 0, 0, 3.434, 0, 4.2627, 0, 0, 0, 0, 1.7918, 0, 4.3944, 4.6052, 4.4543, 4.3944, 4.5109, 4.5951, 4.5643, 0, 0, 0, 0, 0, 0, 0, 0, 1.7918, 0, 0, 0, 3.434, 0, 4.2627, 0, 0, 0, 0, 1.7918, 0, 4.3944, 4.6052, 4.4543, 4.3944, 4.5109, 4.5951, 4.5643, 0, 0, 0, 0, 0, 0, 0, 0, 1.7918, 0, 0, 0, 3.434, 0, 4.2627, 0, 0, 0, 0, 1.7918, 0, 4.3944, 4.6052, 4.4543, 4.3944, 4.5109, 4.5951, 4.5643, 0, 0, 0, 0, 0, 0, 0, 0, 1.7918, 0, 0, 0, 3.434, 0, 4.2627, 0, 0, 0, 0, 1.7918, 0, 4.3944, 4.6052, 4.4543, 4.3944, 4.5109, 4.5951, 4.5643, 0, 0, 0, 0, 0, 0, 0, 0, 1.7918, 0, 0, 0, 3.434, 0, 4.2627, 0, 0, 0, 0, 1.7918, 0, 4.3944, 4.6052, 4.4543, 4.3944, 4.5109, 4.5951, 4.5643, 0, 0, 0, 0, 0, 0, 0), moss = c(3.0445, 1.0986, 2.3979, 2.3979, 0, 2.3979, 0.6931, 1.0986, 4.3307, 3.434, 4.1109, 3.8286, 0.6931, 1.7918, 0.6931, 0.6931, 0.6931, 0, 1.6094, 0.6931, 0.6931, 4.3307, 4.0254, 4.0254, 1.0986, 1.7918, 3.8286, 3.7136, 3.0445, 1.0986, 2.3979, 2.3979, 0, 2.3979, 0.6931, 1.0986, 4.3307, 3.434, 4.1109, 3.8286, 0.6931, 1.7918, 0.6931, 0.6931, 0.6931, 0, 1.6094, 0.6931, 0.6931, 4.3307, 4.0254, 4.0254, 1.0986, 1.7918, 3.8286, 3.7136, 3.0445, 1.0986, 2.3979, 2.3979, 0, 2.3979, 0.6931, 1.0986, 4.3307, 3.434, 4.1109, 3.8286, 0.6931, 1.7918, 0.6931, 0.6931, 0.6931, 0, 1.6094, 0.6931, 0.6931, 4.3307, 4.0254, 4.0254, 1.0986, 1.7918, 3.8286, 3.7136, 3.0445, 1.0986, 2.3979, 2.3979, 0, 2.3979, 0.6931, 1.0986, 4.3307, 3.434, 4.1109, 3.8286, 0.6931, 1.7918, 0.6931, 0.6931, 0.6931, 0, 1.6094, 0.6931, 0.6931, 4.3307, 4.0254, 4.0254, 1.0986, 1.7918, 3.8286, 3.7136, 3.0445, 1.0986, 2.3979, 2.3979, 0, 2.3979, 0.6931, 1.0986, 4.3307, 3.434, 4.1109, 3.8286, 0.6931, 1.7918, 0.6931, 0.6931, 0.6931, 0, 1.6094, 0.6931, 0.6931, 4.3307, 4.0254, 4.0254, 1.0986, 1.7918, 3.8286, 3.7136, 3.0445, 1.0986, 2.3979, 2.3979, 0, 2.3979, 0.6931, 1.0986, 4.3307, 3.434, 4.1109, 3.8286, 0.6931, 1.7918, 0.6931, 0.6931, 0.6931, 0, 1.6094, 0.6931, 0.6931, 4.3307, 4.0254, 4.0254, 1.0986, 1.7918, 3.8286, 3.7136, 3.0445, 1.0986, 2.3979, 2.3979, 0, 2.3979, 0.6931, 1.0986, 4.3307, 3.434, 4.1109, 3.8286, 0.6931, 1.7918, 0.6931, 0.6931, 0.6931, 0, 1.6094, 0.6931, 0.6931, 4.3307, 4.0254, 4.0254, 1.0986, 1.7918, 3.8286, 3.7136, 3.0445, 1.0986, 2.3979, 2.3979, 0, 2.3979, 0.6931, 1.0986, 4.3307, 3.434, 4.1109, 3.8286, 0.6931, 1.7918, 0.6931, 0.6931, 0.6931, 0, 1.6094, 0.6931, 0.6931, 4.3307, 4.0254, 4.0254, 1.0986, 1.7918, 3.8286, 3.7136, 3.0445, 1.0986, 2.3979, 2.3979, 0, 2.3979, 0.6931, 1.0986, 4.3307, 3.434, 4.1109, 3.8286, 0.6931, 1.7918, 0.6931, 0.6931, 0.6931, 0, 1.6094, 0.6931, 0.6931, 4.3307, 4.0254, 4.0254, 1.0986, 1.7918, 3.8286, 3.7136, 3.0445, 1.0986, 2.3979, 2.3979, 0, 2.3979, 0.6931, 1.0986, 4.3307, 3.434, 4.1109, 3.8286, 0.6931, 1.7918, 0.6931, 0.6931, 0.6931, 0, 1.6094, 0.6931, 0.6931, 4.3307, 4.0254, 4.0254, 1.0986, 1.7918, 3.8286, 3.7136, 3.0445, 1.0986, 2.3979, 2.3979, 0, 2.3979, 0.6931, 1.0986, 4.3307, 3.434, 4.1109, 3.8286, 0.6931, 1.7918, 0.6931, 0.6931, 0.6931, 0, 1.6094, 0.6931, 0.6931, 4.3307, 4.0254, 4.0254, 1.0986, 1.7918, 3.8286, 3.7136, 3.0445, 1.0986, 2.3979, 2.3979, 0, 2.3979, 0.6931, 1.0986, 4.3307, 3.434, 4.1109, 3.8286, 0.6931, 1.7918, 0.6931, 0.6931, 0.6931, 0, 1.6094, 0.6931, 0.6931, 4.3307, 4.0254, 4.0254, 1.0986, 1.7918, 3.8286, 3.7136), herb.layer = c(4.4543, 4.5643, 4.6052, 4.6151, 4.6151, 3.434, 4.6151, 3.434, 3.2581, 3.0445, 3.7136, 4.0254, 4.5109, 4.5643, 3.0445, 0.6931, 3.0445, 3.0445, 1.6094, 0.6931, 1.7918, 0.6931, 3.2581, 3.0445, 4.1109, 1.7918, 3.434, 3.434, 4.4543, 4.5643, 4.6052, 4.6151, 4.6151, 3.434, 4.6151, 3.434, 3.2581, 3.0445, 3.7136, 4.0254, 4.5109, 4.5643, 3.0445, 0.6931, 3.0445, 3.0445, 1.6094, 0.6931, 1.7918, 0.6931, 3.2581, 3.0445, 4.1109, 1.7918, 3.434, 3.434, 4.4543, 4.5643, 4.6052, 4.6151, 4.6151, 3.434, 4.6151, 3.434, 3.2581, 3.0445, 3.7136, 4.0254, 4.5109, 4.5643, 3.0445, 0.6931, 3.0445, 3.0445, 1.6094, 0.6931, 1.7918, 0.6931, 3.2581, 3.0445, 4.1109, 1.7918, 3.434, 3.434, 4.4543, 4.5643, 4.6052, 4.6151, 4.6151, 3.434, 4.6151, 3.434, 3.2581, 3.0445, 3.7136, 4.0254, 4.5109, 4.5643, 3.0445, 0.6931, 3.0445, 3.0445, 1.6094, 0.6931, 1.7918, 0.6931, 3.2581, 3.0445, 4.1109, 1.7918, 3.434, 3.434, 4.4543, 4.5643, 4.6052, 4.6151, 4.6151, 3.434, 4.6151, 3.434, 3.2581, 3.0445, 3.7136, 4.0254, 4.5109, 4.5643, 3.0445, 0.6931, 3.0445, 3.0445, 1.6094, 0.6931, 1.7918, 0.6931, 3.2581, 3.0445, 4.1109, 1.7918, 3.434, 3.434, 4.4543, 4.5643, 4.6052, 4.6151, 4.6151, 3.434, 4.6151, 3.434, 3.2581, 3.0445, 3.7136, 4.0254, 4.5109, 4.5643, 3.0445, 0.6931, 3.0445, 3.0445, 1.6094, 0.6931, 1.7918, 0.6931, 3.2581, 3.0445, 4.1109, 1.7918, 3.434, 3.434, 4.4543, 4.5643, 4.6052, 4.6151, 4.6151, 3.434, 4.6151, 3.434, 3.2581, 3.0445, 3.7136, 4.0254, 4.5109, 4.5643, 3.0445, 0.6931, 3.0445, 3.0445, 1.6094, 0.6931, 1.7918, 0.6931, 3.2581, 3.0445, 4.1109, 1.7918, 3.434, 3.434, 4.4543, 4.5643, 4.6052, 4.6151, 4.6151, 3.434, 4.6151, 3.434, 3.2581, 3.0445, 3.7136, 4.0254, 4.5109, 4.5643, 3.0445, 0.6931, 3.0445, 3.0445, 1.6094, 0.6931, 1.7918, 0.6931, 3.2581, 3.0445, 4.1109, 1.7918, 3.434, 3.434, 4.4543, 4.5643, 4.6052, 4.6151, 4.6151, 3.434, 4.6151, 3.434, 3.2581, 3.0445, 3.7136, 4.0254, 4.5109, 4.5643, 3.0445, 0.6931, 3.0445, 3.0445, 1.6094, 0.6931, 1.7918, 0.6931, 3.2581, 3.0445, 4.1109, 1.7918, 3.434, 3.434, 4.4543, 4.5643, 4.6052, 4.6151, 4.6151, 3.434, 4.6151, 3.434, 3.2581, 3.0445, 3.7136, 4.0254, 4.5109, 4.5643, 3.0445, 0.6931, 3.0445, 3.0445, 1.6094, 0.6931, 1.7918, 0.6931, 3.2581, 3.0445, 4.1109, 1.7918, 3.434, 3.434, 4.4543, 4.5643, 4.6052, 4.6151, 4.6151, 3.434, 4.6151, 3.434, 3.2581, 3.0445, 3.7136, 4.0254, 4.5109, 4.5643, 3.0445, 0.6931, 3.0445, 3.0445, 1.6094, 0.6931, 1.7918, 0.6931, 3.2581, 3.0445, 4.1109, 1.7918, 3.434, 3.434, 4.4543, 4.5643, 4.6052, 4.6151, 4.6151, 3.434, 4.6151, 3.434, 3.2581, 3.0445, 3.7136, 4.0254, 4.5109, 4.5643, 3.0445, 0.6931, 3.0445, 3.0445, 1.6094, 0.6931, 1.7918, 0.6931, 3.2581, 3.0445, 4.1109, 1.7918, 3.434, 3.434), reflection = c(3.912, 1.6094, 3.6889, 2.9957, 2.3026, 0.6931, 2.3026, 0.6931, 3.4012, 3.6889, 3.6889, 3.6889, 3.4012, 1.0986, 0.6931, 0, 1.0986, 1.0986, 0, 0, 0, 3.912, 4.0943, 4.0073, 2.3026, 4.382, 3.6889, 3.6889, 3.912, 1.6094, 3.6889, 2.9957, 2.3026, 0.6931, 2.3026, 0.6931, 3.4012, 3.6889, 3.6889, 3.6889, 3.4012, 1.0986, 0.6931, 0, 1.0986, 1.0986, 0, 0, 0, 3.912, 4.0943, 4.0073, 2.3026, 4.382, 3.6889, 3.6889, 3.912, 1.6094, 3.6889, 2.9957, 2.3026, 0.6931, 2.3026, 0.6931, 3.4012, 3.6889, 3.6889, 3.6889, 3.4012, 1.0986, 0.6931, 0, 1.0986, 1.0986, 0, 0, 0, 3.912, 4.0943, 4.0073, 2.3026, 4.382, 3.6889, 3.6889, 3.912, 1.6094, 3.6889, 2.9957, 2.3026, 0.6931, 2.3026, 0.6931, 3.4012, 3.6889, 3.6889, 3.6889, 3.4012, 1.0986, 0.6931, 0, 1.0986, 1.0986, 0, 0, 0, 3.912, 4.0943, 4.0073, 2.3026, 4.382, 3.6889, 3.6889, 3.912, 1.6094, 3.6889, 2.9957, 2.3026, 0.6931, 2.3026, 0.6931, 3.4012, 3.6889, 3.6889, 3.6889, 3.4012, 1.0986, 0.6931, 0, 1.0986, 1.0986, 0, 0, 0, 3.912, 4.0943, 4.0073, 2.3026, 4.382, 3.6889, 3.6889, 3.912, 1.6094, 3.6889, 2.9957, 2.3026, 0.6931, 2.3026, 0.6931, 3.4012, 3.6889, 3.6889, 3.6889, 3.4012, 1.0986, 0.6931, 0, 1.0986, 1.0986, 0, 0, 0, 3.912, 4.0943, 4.0073, 2.3026, 4.382, 3.6889, 3.6889, 3.912, 1.6094, 3.6889, 2.9957, 2.3026, 0.6931, 2.3026, 0.6931, 3.4012, 3.6889, 3.6889, 3.6889, 3.4012, 1.0986, 0.6931, 0, 1.0986, 1.0986, 0, 0, 0, 3.912, 4.0943, 4.0073, 2.3026, 4.382, 3.6889, 3.6889, 3.912, 1.6094, 3.6889, 2.9957, 2.3026, 0.6931, 2.3026, 0.6931, 3.4012, 3.6889, 3.6889, 3.6889, 3.4012, 1.0986, 0.6931, 0, 1.0986, 1.0986, 0, 0, 0, 3.912, 4.0943, 4.0073, 2.3026, 4.382, 3.6889, 3.6889, 3.912, 1.6094, 3.6889, 2.9957, 2.3026, 0.6931, 2.3026, 0.6931, 3.4012, 3.6889, 3.6889, 3.6889, 3.4012, 1.0986, 0.6931, 0, 1.0986, 1.0986, 0, 0, 0, 3.912, 4.0943, 4.0073, 2.3026, 4.382, 3.6889, 3.6889, 3.912, 1.6094, 3.6889, 2.9957, 2.3026, 0.6931, 2.3026, 0.6931, 3.4012, 3.6889, 3.6889, 3.6889, 3.4012, 1.0986, 0.6931, 0, 1.0986, 1.0986, 0, 0, 0, 3.912, 4.0943, 4.0073, 2.3026, 4.382, 3.6889, 3.6889, 3.912, 1.6094, 3.6889, 2.9957, 2.3026, 0.6931, 2.3026, 0.6931, 3.4012, 3.6889, 3.6889, 3.6889, 3.4012, 1.0986, 0.6931, 0, 1.0986, 1.0986, 0, 0, 0, 3.912, 4.0943, 4.0073, 2.3026, 4.382, 3.6889, 3.6889, 3.912, 1.6094, 3.6889, 2.9957, 2.3026, 0.6931, 2.3026, 0.6931, 3.4012, 3.6889, 3.6889, 3.6889, 3.4012, 1.0986, 0.6931, 0, 1.0986, 1.0986, 0, 0, 0, 3.912, 4.0943, 4.0073, 2.3026, 4.382, 3.6889, 3.6889 )), row.names = c(NA, -336L), class = "data.frame") test_that("family must be correctly specified", { expect_error(mod <- jsdgam(formula = abundance ~ # Environmental model includes species-level intercepts # and random slopes for a linear effect of reflection s(taxon, bs = 're') + s(taxon, bs = 're', by = reflection), # Each factor estimates a different, possibly nonlinear effect of soil.dry factor_formula = ~ s(soil.dry, k = 5, by = trend) - 1, data = spiderdat, unit = site, species = taxon, n_lv = 3, family = 'banana'), 'family not recognized') }) test_that("response variable must be specified", { expect_error(jsdgam(formula = ~ # Environmental model includes species-level intercepts # and random slopes for a linear effect of reflection s(taxon, bs = 're') + s(taxon, bs = 're', by = reflection), # Each factor estimates a different, possibly nonlinear effect of soil.dry factor_formula = ~ s(soil.dry, k = 5, by = trend) - 1, data = spiderdat, unit = site, species = taxon, n_lv = 3, family = nb()), 'Not sure how to deal with this response variable specification') }) test_that("unit must exist in data", { expect_error(jsdgam(formula = abundance ~ # Environmental model includes species-level intercepts # and random slopes for a linear effect of reflection s(taxon, bs = 're') + s(taxon, bs = 're', by = reflection), # Each factor estimates a different, possibly nonlinear effect of soil.dry factor_formula = ~ s(soil.dry, k = 5, by = trend) - 1, data = spiderdat, unit = banana, species = taxon, n_lv = 3, family = nb()), 'Variable "banana" not found in data') }) test_that("species must exist in data", { expect_error(jsdgam(formula = abundance ~ # Environmental model includes species-level intercepts # and random slopes for a linear effect of reflection s(taxon, bs = 're') + s(taxon, bs = 're', by = reflection), # Each factor estimates a different, possibly nonlinear effect of soil.dry factor_formula = ~ s(soil.dry, k = 5, by = trend) - 1, data = spiderdat, unit = site, species = banana, n_lv = 3, family = nb()), 'Variable "banana" not found in data') }) test_that("species must be a factor in data", { spiderdat$taxon <- as.numeric(spiderdat$taxon) expect_error(jsdgam(formula = abundance ~ # Environmental model includes species-level intercepts # and random slopes for a linear effect of reflection s(taxon, bs = 're') + s(taxon, bs = 're', by = reflection), # Each factor estimates a different, possibly nonlinear effect of soil.dry factor_formula = ~ s(soil.dry, k = 5, by = trend) - 1, data = spiderdat, unit = site, species = taxon, n_lv = 3, family = nb()), 'Variable "taxon" must be a factor type') }) test_that("unit must be a numeric / integer in data", { spiderdat$site <- as.factor(spiderdat$site) expect_error(jsdgam(formula = abundance ~ # Environmental model includes species-level intercepts # and random slopes for a linear effect of reflection s(taxon, bs = 're') + s(taxon, bs = 're', by = reflection), # Each factor estimates a different, possibly nonlinear effect of soil.dry factor_formula = ~ s(soil.dry, k = 5, by = trend) - 1, data = spiderdat, unit = site, species = taxon, n_lv = 3, family = nb()), 'Variable "site" must be either numeric or integer type') }) test_that("n_lv must be <= number of species", { expect_error(jsdgam(formula = abundance ~ # Environmental model includes species-level intercepts # and random slopes for a linear effect of reflection s(taxon, bs = 're') + s(taxon, bs = 're', by = reflection), # Each factor estimates a different, possibly nonlinear effect of soil.dry factor_formula = ~ s(soil.dry, k = 5, by = trend) - 1, data = spiderdat, unit = site, species = taxon, n_lv = 15, family = nb()), 'Number of factors must be <= number of levels in species') }) test_that("knots must be a list", { expect_error(jsdgam(formula = abundance ~ # Environmental model includes species-level intercepts # and random slopes for a linear effect of reflection s(taxon, bs = 're') + s(taxon, bs = 're', by = reflection), # Each factor estimates a different, possibly nonlinear effect of soil.dry factor_formula = ~ s(soil.dry, k = 5, by = trend) - 1, # supplying knots as a vector should fail factor_knots = seq(min(spiderdat$soil.dry), max(spiderdat$soil.dry), length.out = 4), data = spiderdat, unit = site, species = taxon, n_lv = 3, family = nb(), run_model = FALSE), 'all "knot" arguments must be supplied as lists') }) test_that("errors about knot lengths should be propagated from mgcv", { expect_error(jsdgam(formula = abundance ~ # Environmental model includes species-level intercepts # and random slopes for a linear effect of reflection s(taxon, bs = 're') + s(taxon, bs = 're', by = reflection), # Each factor estimates a different, possibly nonlinear effect of soil.dry factor_formula = ~ s(soil.dry, k = 5, by = trend, bs = 'cr') - 1, # knot length should be 5 for this CR basis factor_knots = list(soil.dry = seq(min(spiderdat$soil.dry), max(spiderdat$soil.dry), length.out = 4)), data = spiderdat, unit = site, species = taxon, n_lv = 3, family = nb(), run_model = FALSE), 'number of supplied knots != k for a cr smooth') }) test_that("get_mvgam_priors accepts factor_formula", { expect_no_error(get_mvgam_priors(formula = abundance ~ # Environmental model includes species-level intercepts # and random slopes for a linear effect of reflection s(taxon, bs = 're') + s(taxon, bs = 're', by = reflection), # Each factor estimates a different, possibly nonlinear effect of soil.dry factor_formula = ~ s(soil.dry, k = 5, by = trend, bs = 'cr') - 1, data = spiderdat, unit = site, species = taxon, n_lv = 3, trend_model = 'None')) }) # Skip the next test as it should actually initiate the model, and may take a few seconds skip_on_cran() test_that("jsdgam should initiate correctly", { mod <- jsdgam(formula = abundance ~ # Environmental model includes species-level intercepts # and random slopes for a linear effect of reflection s(taxon, bs = 're') + s(taxon, bs = 're', by = reflection), # Each factor estimates a different, possibly nonlinear effect of soil.dry factor_formula = ~ s(soil.dry, k = 5, bs = 'cr', by = trend) - 1, # supplying knots should also work if k matches length(knots) factor_knots = list(soil.dry = seq(min(spiderdat$soil.dry), max(spiderdat$soil.dry), length.out = 5)), data = spiderdat, unit = site, species = taxon, n_lv = 3, family = nb(), run_model = FALSE) expect_true(inherits(mod, 'mvgam_prefit')) expect_true(identical(attr(mod$trend_mgcv_model, 'knots'), list(soil.dry = seq(min(spiderdat$soil.dry), max(spiderdat$soil.dry), length.out = 5)))) expect_true(is.null(attr(mod$mgcv_model, 'knots'))) expect_true(any(grepl('// raw latent factors (with linear predictors)', mod$model_file, fixed = TRUE))) expect_true(any(grepl('matrix[n_series, n_lv] lv_coefs = rep_matrix(0, n_series, n_lv);', mod$model_file, fixed = TRUE))) expect_true(attr(mod$model_data, 'trend_model') == 'None') expect_true(inherits(attr(mod$model_data, 'prepped_trend_model'), 'mvgam_trend')) expect_true(attr(mod$model_data, 'prepped_trend_model')$subgr == 'taxon') expect_true(attr(mod$model_data, 'prepped_trend_model')$trend_model == 'ZMVN') }) test_that("jsdgam post-processing works correctly", { # Run a short one to ensure post-processing and update work correctly mod <- SM(jsdgam(formula = abundance ~ # Environmental model includes species-level intercepts # and random slopes for a linear effect of reflection s(taxon, bs = 're') + s(taxon, bs = 're', by = reflection), # Each factor estimates a different, possibly nonlinear effect of soil.dry factor_formula = ~ s(soil.dry, k = 5, bs = 'cr', by = trend) - 1, # supplying knots should also work if k matches length(knots) factor_knots = list(soil.dry = seq(min(spiderdat$soil.dry), max(spiderdat$soil.dry), length.out = 5)), data = spiderdat %>% dplyr::filter(site < 7), unit = site, species = taxon, n_lv = 2, family = nb(), run_model = TRUE, chains = 2, silent = 2)) expect_true(inherits(mod, 'jsdgam')) # Calculate residual correlations to ensure it works post_cors <- residual_cor(mod, summary = FALSE) expect_equal(dim(post_cors$all_cormat)[1], 1000L) expect_equal(dim(post_cors$all_cormat)[2], nlevels(spiderdat$taxon)) expect_true(all(post_cors$all_cormat <= 1)) expect_true(all(post_cors$all_cormat >= -1)) post_cors <- residual_cor(mod, summary = TRUE) expect_equal(dim(post_cors$cor)[1], nlevels(spiderdat$taxon)) })