Species Matrix Function

create_matrix_by_rarity <- function(rarity_threshold,
                                    tree_data_raw,
                                    veg_cover_raw,
                                    shrub_data_raw,
                                    ground_cover_raw,
                                    cogon_sites_raw,
                                    quadrat_counts_df) {

  total_sites <- nrow(cogon_sites_raw)

  # --- Pre-filter by growth form ---
  tree_data_raw  <- tree_data_raw %>%
    filter(Growth == "Tree")

  veg_cover_raw  <- veg_cover_raw %>%
    filter(Growth != "Shrub" & Growth != "Tree")

  shrub_data_raw <- shrub_data_raw %>%
    filter(Growth == "Shrub" | Growth == "Tree")

  # --- Filter ground cover (remove stumps) ---
  ground_cover_raw <- ground_cover_raw %>%
    filter(Ground_Cover_Type != "Stump")

  # --- Filter by frequency ---
  filter_by_frequency <- function(df, threshold) {
    freq <- df %>%
      group_by(Species) %>%
      summarise(Frequency = n_distinct(Plot) / total_sites * 100) %>%
      filter(Frequency >= threshold)

    df %>%
      filter(Species %in% freq$Species)
  }

  tree_data_filtered  <- filter_by_frequency(tree_data_raw, rarity_threshold)
  veg_cover_filtered  <- filter_by_frequency(veg_cover_raw, rarity_threshold)
  shrub_data_filtered <- filter_by_frequency(shrub_data_raw, rarity_threshold)

  # --- Shrub Cover Conversion ---
  shrub_cover <- shrub_data_filtered %>%
    mutate(Cover = Line_End - Line_Start) %>%
    group_by(Species_Name, Plot) %>%
    summarise(Total_Cover = sum(Cover, na.rm = TRUE), .groups = "drop") %>%
    mutate(Percent_Cover = Total_Cover / 3000 * 100)

  # --- Herbaceous Cover Conversion ---
  ground_cover_renamed <- ground_cover_raw %>%
    rename(Species_Name = Ground_Cover_Type)

  veg_cover_combined <- ground_cover_renamed %>%
    full_join(veg_cover_filtered,
              by = c("Date", "Observer", "Weather", "Plot", "Site",
                     "Quadrat", "Canopy_Cover", "Species_Name", "Cover", "Cover_Per")) %>%
    left_join(cogon_sites_raw, by = "Plot")

  veg_cover_summed <- veg_cover_combined %>%
    group_by(Plot, Species_Name) %>%
    summarize(total_cover = sum(Cover_Per, na.rm = TRUE), .groups = "drop")

  avg_species_cover <- veg_cover_summed %>%
    left_join(quadrat_counts_df, by = "Plot") %>%
    mutate(avg_cover = total_cover / total_quadrats)

  # --- Merge Herb and Shrub Cover ---
  combined_cover <- avg_species_cover %>%
    full_join(
      shrub_cover %>% select(Plot, Species_Name, Percent_Cover),
      by = c("Plot", "Species_Name")
    ) %>%
    mutate(
      overlap_flag = ifelse(!is.na(avg_cover) & !is.na(Percent_Cover), TRUE, FALSE),
      final_cover = case_when(
        !is.na(avg_cover) & is.na(Percent_Cover) ~ avg_cover,
        is.na(avg_cover) & !is.na(Percent_Cover) ~ Percent_Cover,
        TRUE ~ NA_real_
      )
    )

  # --- Species Matrix ---
  species_matrix <- combined_cover %>%
    select(Plot, Species_Name, final_cover) %>%
    filter(!is.na(Species_Name)) %>%
    pivot_wider(
      names_from  = Species_Name,
      values_from = final_cover,
      values_fill = 0
    )

  return(species_matrix)
}

Invasion Clustering: PERMANOVA + NMDS

species_matrix <- create_matrix_by_rarity(
  rarity_threshold = 0,
  tree_data,
  Veg_Cover,
  shrub_data,
  ground_cover,
  CogonSites,
  quadrat_count
)

species_mat <- species_matrix %>%
  column_to_rownames("Plot")

species_by_plot <- t(species_mat)

non_species <- c("BG", "CWD", "FWD", "L", "PC")

species_by_plot <- species_by_plot[
  !rownames(species_by_plot) %in% non_species,
]

all_combined_data <- bind_rows(
  Veg_Cover %>% select(Species_Name, InvStatus),
  shrub_data %>% select(Species_Name, InvStatus)
)

all_unique_species <- all_combined_data %>%
  distinct(Species_Name, .keep_all = TRUE)

species_metadata <- data.frame(
  Species_Name = rownames(species_by_plot)
) %>%
  left_join(all_unique_species, by = "Species_Name")


species_metadata <- species_metadata %>%
  mutate(
    InvStatus2 = ifelse(InvStatus == "Non_Native",
                        "Non-Native",
                        "Native")
  )

table(species_metadata$InvStatus2)
## 
##     Native Non-Native 
##        502         42
species_dist <- vegdist(species_by_plot, method = "bray")

set.seed(123)
species_permanova2 <- adonis2(
  species_dist ~ InvStatus2,
  data = species_metadata,
  permutations = 999
)

species_permanova2
## Permutation test for adonis under reduced model
## Permutation: free
## Number of permutations: 999
## 
## adonis2(formula = species_dist ~ InvStatus2, data = species_metadata, permutations = 999)
##           Df SumOfSqs      R2      F Pr(>F)    
## Model      1     0.83 0.00314 1.7046  0.001 ***
## Residual 542   264.01 0.99686                  
## Total    543   264.84 1.00000                  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Species Level-NMDS Function

run_species_nmds <- function(plot_subset, species_mat, species_metadata) {
  
  region_mat <- species_mat[rownames(species_mat) %in% plot_subset, ]
  
  species_by_plot <- t(region_mat)
  
  species_by_plot <- species_by_plot[rowSums(species_by_plot) > 0, ]
  
  set.seed(123)
  nmds <- metaMDS(species_by_plot,
                  distance = "bray",
                  k = 4,
                  trymax = 200)
  
  # IMPORTANT FIX HERE
  scores_df <- as.data.frame(scores(nmds, display = "sites"))
  scores_df$Species_Name <- rownames(species_by_plot)
  
  scores_df <- left_join(scores_df,
                         species_metadata %>%
                           select(Species_Name, InvStatus2),
                         by = "Species_Name")
  
  return(list(nmds = nmds,
              scores = scores_df))
}

Regions

central_fl <- c("ONF", "WSF")
north_fl   <- c("BRSF", "Escambia", "Jay", "Howell", "Hooper")
south_ms   <- c("CNF", "DSNF", "BCNWR")

Region Species Matrix

plot_lookup <- CogonSites %>%
  select(Plot, Site)

central_plots <- plot_lookup %>%
  filter(Site %in% central_fl) %>%
  pull(Plot)

north_plots <- plot_lookup %>%
  filter(Site %in% north_fl) %>%
  pull(Plot)

south_plots <- plot_lookup %>%
  filter(Site %in% south_ms) %>%
  pull(Plot)

Run NMDS for Each Region

All Sites

all_species_nmds <- run_species_nmds(
  rownames(species_mat),
  species_mat,
  species_metadata
)
## Square root transformation
## Wisconsin double standardization
## Run 0 stress 0.07934098 
## Run 1 stress 0.08029574 
## Run 2 stress 0.0808541 
## Run 3 stress 0.08040134 
## Run 4 stress 0.08049416 
## Run 5 stress 0.08021941 
## Run 6 stress 0.08119209 
## Run 7 stress 0.08032576 
## Run 8 stress 0.08166027 
## Run 9 stress 0.0815899 
## Run 10 stress 0.08116679 
## Run 11 stress 0.08047774 
## Run 12 stress 0.07996345 
## Run 13 stress 0.08105386 
## Run 14 stress 0.08005426 
## Run 15 stress 0.08096181 
## Run 16 stress 0.08036359 
## Run 17 stress 0.08045566 
## Run 18 stress 0.0809607 
## Run 19 stress 0.08053886 
## Run 20 stress 0.08076719 
## Run 21 stress 0.08137975 
## Run 22 stress 0.08079947 
## Run 23 stress 0.07980284 
## ... Procrustes: rmse 0.02309435  max resid 0.07993979 
## Run 24 stress 0.08169276 
## Run 25 stress 0.08016446 
## Run 26 stress 0.08122536 
## Run 27 stress 0.079902 
## Run 28 stress 0.08025435 
## Run 29 stress 0.0805529 
## Run 30 stress 0.08085742 
## Run 31 stress 0.07938437 
## ... Procrustes: rmse 0.01984452  max resid 0.08941646 
## Run 32 stress 0.08181832 
## Run 33 stress 0.07966873 
## ... Procrustes: rmse 0.02305383  max resid 0.06591168 
## Run 34 stress 0.08103684 
## Run 35 stress 0.08024691 
## Run 36 stress 0.07944709 
## ... Procrustes: rmse 0.02003272  max resid 0.06576558 
## Run 37 stress 0.08027778 
## Run 38 stress 0.08082354 
## Run 39 stress 0.08045578 
## Run 40 stress 0.08004238 
## Run 41 stress 0.08043035 
## Run 42 stress 0.07966591 
## ... Procrustes: rmse 0.02248006  max resid 0.07835742 
## Run 43 stress 0.08134719 
## Run 44 stress 0.08112163 
## Run 45 stress 0.08073344 
## Run 46 stress 0.08120057 
## Run 47 stress 0.08004796 
## Run 48 stress 0.07984046 
## ... Procrustes: rmse 0.02256507  max resid 0.09734414 
## Run 49 stress 0.0800452 
## Run 50 stress 0.08122862 
## Run 51 stress 0.08002299 
## Run 52 stress 0.0800094 
## Run 53 stress 0.08056339 
## Run 54 stress 0.08041905 
## Run 55 stress 0.07900819 
## ... New best solution
## ... Procrustes: rmse 0.01876781  max resid 0.06912523 
## Run 56 stress 0.08102461 
## Run 57 stress 0.07986647 
## Run 58 stress 0.08088471 
## Run 59 stress 0.08042955 
## Run 60 stress 0.0813519 
## Run 61 stress 0.07940482 
## ... Procrustes: rmse 0.01861775  max resid 0.071239 
## Run 62 stress 0.08148289 
## Run 63 stress 0.07993754 
## Run 64 stress 0.08092474 
## Run 65 stress 0.08265672 
## Run 66 stress 0.08008231 
## Run 67 stress 0.08135561 
## Run 68 stress 0.07946926 
## ... Procrustes: rmse 0.01866838  max resid 0.06450914 
## Run 69 stress 0.08097323 
## Run 70 stress 0.07945358 
## ... Procrustes: rmse 0.02023045  max resid 0.07523241 
## Run 71 stress 0.07998332 
## Run 72 stress 0.08167429 
## Run 73 stress 0.07938059 
## ... Procrustes: rmse 0.02013189  max resid 0.08100328 
## Run 74 stress 0.08035314 
## Run 75 stress 0.08075695 
## Run 76 stress 0.08069836 
## Run 77 stress 0.08048655 
## Run 78 stress 0.0811444 
## Run 79 stress 0.07968011 
## Run 80 stress 0.07971214 
## Run 81 stress 0.0800918 
## Run 82 stress 0.08164932 
## Run 83 stress 0.08001745 
## Run 84 stress 0.08158016 
## Run 85 stress 0.08112754 
## Run 86 stress 0.07953878 
## Run 87 stress 0.08005752 
## Run 88 stress 0.0800171 
## Run 89 stress 0.08107175 
## Run 90 stress 0.0817424 
## Run 91 stress 0.07972171 
## Run 92 stress 0.07968877 
## Run 93 stress 0.08153247 
## Run 94 stress 0.08115168 
## Run 95 stress 0.08013658 
## Run 96 stress 0.08069886 
## Run 97 stress 0.07980844 
## Run 98 stress 0.07945755 
## ... Procrustes: rmse 0.01997056  max resid 0.07564367 
## Run 99 stress 0.08052764 
## Run 100 stress 0.08002535 
## Run 101 stress 0.08104213 
## Run 102 stress 0.08040633 
## Run 103 stress 0.07926435 
## ... Procrustes: rmse 0.01814409  max resid 0.0768556 
## Run 104 stress 0.08223935 
## Run 105 stress 0.08005766 
## Run 106 stress 0.08058202 
## Run 107 stress 0.08093715 
## Run 108 stress 0.08083701 
## Run 109 stress 0.08048469 
## Run 110 stress 0.08086714 
## Run 111 stress 0.07986827 
## Run 112 stress 0.08102316 
## Run 113 stress 0.08033603 
## Run 114 stress 0.08078528 
## Run 115 stress 0.08118316 
## Run 116 stress 0.08109434 
## Run 117 stress 0.0820823 
## Run 118 stress 0.08134514 
## Run 119 stress 0.07968602 
## Run 120 stress 0.08033129 
## Run 121 stress 0.07989543 
## Run 122 stress 0.08107459 
## Run 123 stress 0.07981447 
## Run 124 stress 0.08100624 
## Run 125 stress 0.08081028 
## Run 126 stress 0.07966708 
## Run 127 stress 0.0809807 
## Run 128 stress 0.08167427 
## Run 129 stress 0.08088907 
## Run 130 stress 0.08019644 
## Run 131 stress 0.07980196 
## Run 132 stress 0.08127498 
## Run 133 stress 0.08054299 
## Run 134 stress 0.08135886 
## Run 135 stress 0.0795003 
## ... Procrustes: rmse 0.02188964  max resid 0.0823039 
## Run 136 stress 0.07991396 
## Run 137 stress 0.08169462 
## Run 138 stress 0.0800088 
## Run 139 stress 0.07986881 
## Run 140 stress 0.0797726 
## Run 141 stress 0.08161637 
## Run 142 stress 0.08098354 
## Run 143 stress 0.08085217 
## Run 144 stress 0.08103254 
## Run 145 stress 0.08003741 
## Run 146 stress 0.08013074 
## Run 147 stress 0.0806873 
## Run 148 stress 0.08025636 
## Run 149 stress 0.07968757 
## Run 150 stress 0.08011332 
## Run 151 stress 0.07925802 
## ... Procrustes: rmse 0.0176016  max resid 0.06915522 
## Run 152 stress 0.07975279 
## Run 153 stress 0.08121644 
## Run 154 stress 0.08070041 
## Run 155 stress 0.08137452 
## Run 156 stress 0.08183268 
## Run 157 stress 0.07944293 
## ... Procrustes: rmse 0.02024413  max resid 0.06748629 
## Run 158 stress 0.08010603 
## Run 159 stress 0.07928858 
## ... Procrustes: rmse 0.019018  max resid 0.08071532 
## Run 160 stress 0.07989325 
## Run 161 stress 0.08049649 
## Run 162 stress 0.08017636 
## Run 163 stress 0.07986131 
## Run 164 stress 0.08103451 
## Run 165 stress 0.0805889 
## Run 166 stress 0.08195393 
## Run 167 stress 0.0812432 
## Run 168 stress 0.07981635 
## Run 169 stress 0.08066838 
## Run 170 stress 0.07972713 
## Run 171 stress 0.08039688 
## Run 172 stress 0.07982104 
## Run 173 stress 0.08057397 
## Run 174 stress 0.07966062 
## Run 175 stress 0.08039938 
## Run 176 stress 0.08085265 
## Run 177 stress 0.07994945 
## Run 178 stress 0.08014495 
## Run 179 stress 0.0810204 
## Run 180 stress 0.08085948 
## Run 181 stress 0.0795784 
## Run 182 stress 0.08004591 
## Run 183 stress 0.08157702 
## Run 184 stress 0.08055388 
## Run 185 stress 0.08134529 
## Run 186 stress 0.08076847 
## Run 187 stress 0.07945282 
## ... Procrustes: rmse 0.01850433  max resid 0.07946547 
## Run 188 stress 0.08111998 
## Run 189 stress 0.08097639 
## Run 190 stress 0.08003375 
## Run 191 stress 0.08023102 
## Run 192 stress 0.08016385 
## Run 193 stress 0.08130682 
## Run 194 stress 0.08037738 
## Run 195 stress 0.07960386 
## Run 196 stress 0.08002236 
## Run 197 stress 0.07992307 
## Run 198 stress 0.07972185 
## Run 199 stress 0.08022403 
## Run 200 stress 0.08306487 
## *** Best solution was not repeated -- monoMDS stopping criteria:
##    200: no. of iterations >= maxit

Central FL

central_nmds <- run_species_nmds(
  central_plots,
  species_mat,
  species_metadata
)
## Square root transformation
## Wisconsin double standardization
## Run 0 stress 0.07618288 
## Run 1 stress 0.07657965 
## ... Procrustes: rmse 0.03068566  max resid 0.1096652 
## Run 2 stress 0.07924802 
## Run 3 stress 0.07989643 
## Run 4 stress 0.0780951 
## Run 5 stress 0.07725143 
## Run 6 stress 0.07786953 
## Run 7 stress 0.07772926 
## Run 8 stress 0.07834651 
## Run 9 stress 0.07754048 
## Run 10 stress 0.07711434 
## Run 11 stress 0.07814642 
## Run 12 stress 0.07740231 
## Run 13 stress 0.07611091 
## ... New best solution
## ... Procrustes: rmse 0.02353641  max resid 0.08013801 
## Run 14 stress 0.07665853 
## Run 15 stress 0.07772014 
## Run 16 stress 0.08119633 
## Run 17 stress 0.07790747 
## Run 18 stress 0.07801277 
## Run 19 stress 0.07755032 
## Run 20 stress 0.07757413 
## Run 21 stress 0.07724985 
## Run 22 stress 0.07838977 
## Run 23 stress 0.07797109 
## Run 24 stress 0.07598332 
## ... New best solution
## ... Procrustes: rmse 0.02689329  max resid 0.09582153 
## Run 25 stress 0.07768007 
## Run 26 stress 0.0772424 
## Run 27 stress 0.0778387 
## Run 28 stress 0.07752827 
## Run 29 stress 0.07841816 
## Run 30 stress 0.07936864 
## Run 31 stress 0.07718072 
## Run 32 stress 0.07610765 
## ... Procrustes: rmse 0.0269198  max resid 0.08828237 
## Run 33 stress 0.07790668 
## Run 34 stress 0.07694995 
## Run 35 stress 0.07799425 
## Run 36 stress 0.07630591 
## ... Procrustes: rmse 0.02356504  max resid 0.09277736 
## Run 37 stress 0.07706337 
## Run 38 stress 0.07843363 
## Run 39 stress 0.07740273 
## Run 40 stress 0.07815843 
## Run 41 stress 0.07666287 
## Run 42 stress 0.07753168 
## Run 43 stress 0.07701367 
## Run 44 stress 0.07699282 
## Run 45 stress 0.07814714 
## Run 46 stress 0.07746323 
## Run 47 stress 0.07833661 
## Run 48 stress 0.07645127 
## ... Procrustes: rmse 0.02999817  max resid 0.1100521 
## Run 49 stress 0.07714152 
## Run 50 stress 0.07781305 
## Run 51 stress 0.07590409 
## ... New best solution
## ... Procrustes: rmse 0.03381482  max resid 0.1030998 
## Run 52 stress 0.07710514 
## Run 53 stress 0.07912908 
## Run 54 stress 0.07743674 
## Run 55 stress 0.07781869 
## Run 56 stress 0.07729696 
## Run 57 stress 0.0776828 
## Run 58 stress 0.07840329 
## Run 59 stress 0.07650362 
## Run 60 stress 0.07717443 
## Run 61 stress 0.07694 
## Run 62 stress 0.07707322 
## Run 63 stress 0.07687193 
## Run 64 stress 0.07781634 
## Run 65 stress 0.07863721 
## Run 66 stress 0.07848047 
## Run 67 stress 0.07729359 
## Run 68 stress 0.07809396 
## Run 69 stress 0.07702369 
## Run 70 stress 0.07797107 
## Run 71 stress 0.07844367 
## Run 72 stress 0.07783141 
## Run 73 stress 0.07855917 
## Run 74 stress 0.07885025 
## Run 75 stress 0.07752716 
## Run 76 stress 0.07956031 
## Run 77 stress 0.07822539 
## Run 78 stress 0.07744582 
## Run 79 stress 0.07980658 
## Run 80 stress 0.07767421 
## Run 81 stress 0.07690956 
## Run 82 stress 0.07817545 
## Run 83 stress 0.07861327 
## Run 84 stress 0.08054197 
## Run 85 stress 0.07878526 
## Run 86 stress 0.07752283 
## Run 87 stress 0.07753522 
## Run 88 stress 0.07640597 
## Run 89 stress 0.07762608 
## Run 90 stress 0.07773358 
## Run 91 stress 0.07896305 
## Run 92 stress 0.07691633 
## Run 93 stress 0.07881135 
## Run 94 stress 0.07783595 
## Run 95 stress 0.07801795 
## Run 96 stress 0.07811892 
## Run 97 stress 0.07623905 
## ... Procrustes: rmse 0.02811611  max resid 0.09436683 
## Run 98 stress 0.07933989 
## Run 99 stress 0.07723329 
## Run 100 stress 0.07832101 
## Run 101 stress 0.07607128 
## ... Procrustes: rmse 0.02892923  max resid 0.07247198 
## Run 102 stress 0.07679536 
## Run 103 stress 0.07676744 
## Run 104 stress 0.07835961 
## Run 105 stress 0.07732572 
## Run 106 stress 0.07787561 
## Run 107 stress 0.07602188 
## ... Procrustes: rmse 0.03205087  max resid 0.1065432 
## Run 108 stress 0.07766535 
## Run 109 stress 0.07772502 
## Run 110 stress 0.07807387 
## Run 111 stress 0.07703665 
## Run 112 stress 0.07685159 
## Run 113 stress 0.07783463 
## Run 114 stress 0.07745777 
## Run 115 stress 0.07662337 
## Run 116 stress 0.0793889 
## Run 117 stress 0.07848714 
## Run 118 stress 0.07827749 
## Run 119 stress 0.0776651 
## Run 120 stress 0.07695084 
## Run 121 stress 0.07771902 
## Run 122 stress 0.07866458 
## Run 123 stress 0.07701535 
## Run 124 stress 0.07730586 
## Run 125 stress 0.0771418 
## Run 126 stress 0.07777205 
## Run 127 stress 0.07754763 
## Run 128 stress 0.07884605 
## Run 129 stress 0.07764113 
## Run 130 stress 0.08120835 
## Run 131 stress 0.07928036 
## Run 132 stress 0.07807571 
## Run 133 stress 0.08010351 
## Run 134 stress 0.07746014 
## Run 135 stress 0.07714212 
## Run 136 stress 0.0795956 
## Run 137 stress 0.07770149 
## Run 138 stress 0.07779669 
## Run 139 stress 0.07715809 
## Run 140 stress 0.0793706 
## Run 141 stress 0.07849363 
## Run 142 stress 0.07783615 
## Run 143 stress 0.07760509 
## Run 144 stress 0.07806619 
## Run 145 stress 0.07724428 
## Run 146 stress 0.07671482 
## Run 147 stress 0.07827531 
## Run 148 stress 0.07593417 
## ... Procrustes: rmse 0.02623317  max resid 0.09731996 
## Run 149 stress 0.0765584 
## Run 150 stress 0.07611825 
## ... Procrustes: rmse 0.03276471  max resid 0.108557 
## Run 151 stress 0.07727748 
## Run 152 stress 0.07943099 
## Run 153 stress 0.07735748 
## Run 154 stress 0.0778095 
## Run 155 stress 0.07782768 
## Run 156 stress 0.07691885 
## Run 157 stress 0.07600287 
## ... Procrustes: rmse 0.02782205  max resid 0.08530563 
## Run 158 stress 0.07661509 
## Run 159 stress 0.07830716 
## Run 160 stress 0.08039323 
## Run 161 stress 0.0767396 
## Run 162 stress 0.07946752 
## Run 163 stress 0.07891622 
## Run 164 stress 0.07951047 
## Run 165 stress 0.07737708 
## Run 166 stress 0.07790162 
## Run 167 stress 0.07593571 
## ... Procrustes: rmse 0.02963955  max resid 0.1045927 
## Run 168 stress 0.07937165 
## Run 169 stress 0.07692018 
## Run 170 stress 0.07840564 
## Run 171 stress 0.07726995 
## Run 172 stress 0.07636011 
## ... Procrustes: rmse 0.0134211  max resid 0.05250202 
## Run 173 stress 0.07907844 
## Run 174 stress 0.07840545 
## Run 175 stress 0.07839771 
## Run 176 stress 0.07695966 
## Run 177 stress 0.07944364 
## Run 178 stress 0.08091021 
## Run 179 stress 0.0783941 
## Run 180 stress 0.07761726 
## Run 181 stress 0.07756284 
## Run 182 stress 0.07633711 
## ... Procrustes: rmse 0.03714797  max resid 0.1077138 
## Run 183 stress 0.07841409 
## Run 184 stress 0.07696812 
## Run 185 stress 0.07693482 
## Run 186 stress 0.07751503 
## Run 187 stress 0.07783778 
## Run 188 stress 0.07788461 
## Run 189 stress 0.07863643 
## Run 190 stress 0.07737201 
## Run 191 stress 0.08029335 
## Run 192 stress 0.07607394 
## ... Procrustes: rmse 0.0312793  max resid 0.1006802 
## Run 193 stress 0.07850449 
## Run 194 stress 0.0786191 
## Run 195 stress 0.07604439 
## ... Procrustes: rmse 0.02378928  max resid 0.08470817 
## Run 196 stress 0.0766049 
## Run 197 stress 0.07770776 
## Run 198 stress 0.07778862 
## Run 199 stress 0.07740006 
## Run 200 stress 0.07761813 
## *** Best solution was not repeated -- monoMDS stopping criteria:
##    200: no. of iterations >= maxit

North FL

north_nmds <- run_species_nmds(
  north_plots,
  species_mat,
  species_metadata
)
## Square root transformation
## Wisconsin double standardization
## Run 0 stress 0.09574465 
## Run 1 stress 0.09538016 
## ... New best solution
## ... Procrustes: rmse 0.04538987  max resid 0.1281838 
## Run 2 stress 0.09618981 
## Run 3 stress 0.09601926 
## Run 4 stress 0.09715563 
## Run 5 stress 0.09741254 
## Run 6 stress 0.09699853 
## Run 7 stress 0.09716777 
## Run 8 stress 0.09544076 
## ... Procrustes: rmse 0.04556325  max resid 0.1250364 
## Run 9 stress 0.09585217 
## ... Procrustes: rmse 0.0442791  max resid 0.1220052 
## Run 10 stress 0.096041 
## Run 11 stress 0.09637675 
## Run 12 stress 0.09663033 
## Run 13 stress 0.09815207 
## Run 14 stress 0.09792344 
## Run 15 stress 0.09763475 
## Run 16 stress 0.09736535 
## Run 17 stress 0.09626851 
## Run 18 stress 0.0969912 
## Run 19 stress 0.09740783 
## Run 20 stress 0.0961271 
## Run 21 stress 0.0963497 
## Run 22 stress 0.09625918 
## Run 23 stress 0.09588915 
## Run 24 stress 0.096709 
## Run 25 stress 0.09834616 
## Run 26 stress 0.09666839 
## Run 27 stress 0.0981693 
## Run 28 stress 0.09651026 
## Run 29 stress 0.09558474 
## ... Procrustes: rmse 0.04616433  max resid 0.1163503 
## Run 30 stress 0.09707729 
## Run 31 stress 0.09818913 
## Run 32 stress 0.09822341 
## Run 33 stress 0.09529407 
## ... New best solution
## ... Procrustes: rmse 0.04583833  max resid 0.1253635 
## Run 34 stress 0.0964983 
## Run 35 stress 0.09814314 
## Run 36 stress 0.09701256 
## Run 37 stress 0.09817333 
## Run 38 stress 0.09700433 
## Run 39 stress 0.09661236 
## Run 40 stress 0.0951252 
## ... New best solution
## ... Procrustes: rmse 0.04051074  max resid 0.1099881 
## Run 41 stress 0.09751647 
## Run 42 stress 0.09716522 
## Run 43 stress 0.09654873 
## Run 44 stress 0.09564138 
## Run 45 stress 0.09658308 
## Run 46 stress 0.0978039 
## Run 47 stress 0.09747274 
## Run 48 stress 0.09729564 
## Run 49 stress 0.09726328 
## Run 50 stress 0.09765789 
## Run 51 stress 0.09611949 
## Run 52 stress 0.09752285 
## Run 53 stress 0.09729105 
## Run 54 stress 0.09754133 
## Run 55 stress 0.09696315 
## Run 56 stress 0.09739484 
## Run 57 stress 0.0963053 
## Run 58 stress 0.09837464 
## Run 59 stress 0.09600321 
## Run 60 stress 0.09767133 
## Run 61 stress 0.09657833 
## Run 62 stress 0.09672562 
## Run 63 stress 0.09691362 
## Run 64 stress 0.0975209 
## Run 65 stress 0.09615705 
## Run 66 stress 0.09892273 
## Run 67 stress 0.09816398 
## Run 68 stress 0.09716079 
## Run 69 stress 0.09692077 
## Run 70 stress 0.09719949 
## Run 71 stress 0.09664856 
## Run 72 stress 0.09536274 
## ... Procrustes: rmse 0.03962006  max resid 0.1110017 
## Run 73 stress 0.09495531 
## ... New best solution
## ... Procrustes: rmse 0.03146871  max resid 0.1216352 
## Run 74 stress 0.09686598 
## Run 75 stress 0.09684011 
## Run 76 stress 0.09673415 
## Run 77 stress 0.09584342 
## Run 78 stress 0.09801807 
## Run 79 stress 0.09724587 
## Run 80 stress 0.09654834 
## Run 81 stress 0.09748698 
## Run 82 stress 0.09648964 
## Run 83 stress 0.09804356 
## Run 84 stress 0.09687672 
## Run 85 stress 0.09756031 
## Run 86 stress 0.09733277 
## Run 87 stress 0.09733692 
## Run 88 stress 0.09591529 
## Run 89 stress 0.09711012 
## Run 90 stress 0.09613411 
## Run 91 stress 0.09512879 
## ... Procrustes: rmse 0.02912714  max resid 0.09516664 
## Run 92 stress 0.0970366 
## Run 93 stress 0.0954308 
## ... Procrustes: rmse 0.0377208  max resid 0.1357736 
## Run 94 stress 0.09755123 
## Run 95 stress 0.09598537 
## Run 96 stress 0.09625912 
## Run 97 stress 0.09789752 
## Run 98 stress 0.09659858 
## Run 99 stress 0.09716527 
## Run 100 stress 0.09598177 
## Run 101 stress 0.09650906 
## Run 102 stress 0.09671008 
## Run 103 stress 0.09647448 
## Run 104 stress 0.0973691 
## Run 105 stress 0.09714067 
## Run 106 stress 0.09593438 
## Run 107 stress 0.0979796 
## Run 108 stress 0.09760448 
## Run 109 stress 0.09660529 
## Run 110 stress 0.09736899 
## Run 111 stress 0.09639604 
## Run 112 stress 0.09738529 
## Run 113 stress 0.09667183 
## Run 114 stress 0.09898635 
## Run 115 stress 0.09657628 
## Run 116 stress 0.09755063 
## Run 117 stress 0.09726498 
## Run 118 stress 0.09662401 
## Run 119 stress 0.09746838 
## Run 120 stress 0.09694552 
## Run 121 stress 0.09802136 
## Run 122 stress 0.09595129 
## Run 123 stress 0.09692237 
## Run 124 stress 0.09711268 
## Run 125 stress 0.09670271 
## Run 126 stress 0.09644809 
## Run 127 stress 0.09655529 
## Run 128 stress 0.09842228 
## Run 129 stress 0.097485 
## Run 130 stress 0.09698923 
## Run 131 stress 0.09692099 
## Run 132 stress 0.09643519 
## Run 133 stress 0.0972417 
## Run 134 stress 0.09731909 
## Run 135 stress 0.0974735 
## Run 136 stress 0.09720203 
## Run 137 stress 0.09630507 
## Run 138 stress 0.09596961 
## Run 139 stress 0.09556407 
## Run 140 stress 0.09683757 
## Run 141 stress 0.09831452 
## Run 142 stress 0.09618323 
## Run 143 stress 0.09653854 
## Run 144 stress 0.09667627 
## Run 145 stress 0.09622494 
## Run 146 stress 0.0961214 
## Run 147 stress 0.09566307 
## Run 148 stress 0.09695309 
## Run 149 stress 0.09605033 
## Run 150 stress 0.09729558 
## Run 151 stress 0.09568245 
## Run 152 stress 0.09669086 
## Run 153 stress 0.09729529 
## Run 154 stress 0.09665356 
## Run 155 stress 0.09686821 
## Run 156 stress 0.09655342 
## Run 157 stress 0.09779595 
## Run 158 stress 0.09772806 
## Run 159 stress 0.09718051 
## Run 160 stress 0.09706559 
## Run 161 stress 0.09833161 
## Run 162 stress 0.09587044 
## Run 163 stress 0.09717068 
## Run 164 stress 0.09598031 
## Run 165 stress 0.0966323 
## Run 166 stress 0.09584119 
## Run 167 stress 0.09705275 
## Run 168 stress 0.09662837 
## Run 169 stress 0.09618579 
## Run 170 stress 0.09669052 
## Run 171 stress 0.09862327 
## Run 172 stress 0.09573029 
## Run 173 stress 0.09789344 
## Run 174 stress 0.09731544 
## Run 175 stress 0.0973567 
## Run 176 stress 0.09604049 
## Run 177 stress 0.09686749 
## Run 178 stress 0.09746932 
## Run 179 stress 0.09641426 
## Run 180 stress 0.09617632 
## Run 181 stress 0.09631236 
## Run 182 stress 0.09635988 
## Run 183 stress 0.09677773 
## Run 184 stress 0.09781272 
## Run 185 stress 0.09733325 
## Run 186 stress 0.09601495 
## Run 187 stress 0.09718859 
## Run 188 stress 0.09728801 
## Run 189 stress 0.09615365 
## Run 190 stress 0.09668322 
## Run 191 stress 0.09659269 
## Run 192 stress 0.09624168 
## Run 193 stress 0.09773826 
## Run 194 stress 0.09950048 
## Run 195 stress 0.09667529 
## Run 196 stress 0.09738936 
## Run 197 stress 0.09656731 
## Run 198 stress 0.09748773 
## Run 199 stress 0.09693308 
## Run 200 stress 0.09809169 
## *** Best solution was not repeated -- monoMDS stopping criteria:
##    200: no. of iterations >= maxit

South MS

south_nmds <- run_species_nmds(
  south_plots,
  species_mat,
  species_metadata
)
## Square root transformation
## Wisconsin double standardization
## Run 0 stress 0.09840778 
## Run 1 stress 0.09872853 
## ... Procrustes: rmse 0.0262368  max resid 0.1181572 
## Run 2 stress 0.1001657 
## Run 3 stress 0.1014794 
## Run 4 stress 0.09977403 
## Run 5 stress 0.09971798 
## Run 6 stress 0.09866265 
## ... Procrustes: rmse 0.02637648  max resid 0.09796836 
## Run 7 stress 0.09936006 
## Run 8 stress 0.09993557 
## Run 9 stress 0.09987077 
## Run 10 stress 0.09867628 
## ... Procrustes: rmse 0.0252402  max resid 0.09267926 
## Run 11 stress 0.0990232 
## Run 12 stress 0.1008567 
## Run 13 stress 0.1004226 
## Run 14 stress 0.09878202 
## ... Procrustes: rmse 0.03184882  max resid 0.1057062 
## Run 15 stress 0.1002197 
## Run 16 stress 0.09961989 
## Run 17 stress 0.09863467 
## ... Procrustes: rmse 0.02960627  max resid 0.09946693 
## Run 18 stress 0.09983873 
## Run 19 stress 0.1000104 
## Run 20 stress 0.1000483 
## Run 21 stress 0.100549 
## Run 22 stress 0.1000433 
## Run 23 stress 0.09966646 
## Run 24 stress 0.09937978 
## Run 25 stress 0.09873128 
## ... Procrustes: rmse 0.02590091  max resid 0.1181635 
## Run 26 stress 0.09935261 
## Run 27 stress 0.09875078 
## ... Procrustes: rmse 0.02658216  max resid 0.0839196 
## Run 28 stress 0.0991153 
## Run 29 stress 0.1007009 
## Run 30 stress 0.1006551 
## Run 31 stress 0.1000426 
## Run 32 stress 0.1011899 
## Run 33 stress 0.1007098 
## Run 34 stress 0.09820417 
## ... New best solution
## ... Procrustes: rmse 0.02754724  max resid 0.1115378 
## Run 35 stress 0.1003806 
## Run 36 stress 0.1003381 
## Run 37 stress 0.09916538 
## Run 38 stress 0.09935116 
## Run 39 stress 0.09907145 
## Run 40 stress 0.1002305 
## Run 41 stress 0.09830194 
## ... Procrustes: rmse 0.02495221  max resid 0.06155115 
## Run 42 stress 0.09903098 
## Run 43 stress 0.0994644 
## Run 44 stress 0.0998429 
## Run 45 stress 0.1003625 
## Run 46 stress 0.09931979 
## Run 47 stress 0.09983875 
## Run 48 stress 0.09942213 
## Run 49 stress 0.1002661 
## Run 50 stress 0.1006347 
## Run 51 stress 0.09983322 
## Run 52 stress 0.09864266 
## ... Procrustes: rmse 0.03305424  max resid 0.09819324 
## Run 53 stress 0.1002213 
## Run 54 stress 0.09930153 
## Run 55 stress 0.09889457 
## Run 56 stress 0.09983416 
## Run 57 stress 0.09979488 
## Run 58 stress 0.1005301 
## Run 59 stress 0.09882808 
## Run 60 stress 0.0981011 
## ... New best solution
## ... Procrustes: rmse 0.02173119  max resid 0.09297868 
## Run 61 stress 0.09941179 
## Run 62 stress 0.1002974 
## Run 63 stress 0.09964365 
## Run 64 stress 0.1008907 
## Run 65 stress 0.1008149 
## Run 66 stress 0.09863003 
## Run 67 stress 0.09959618 
## Run 68 stress 0.09984011 
## Run 69 stress 0.1001015 
## Run 70 stress 0.09996611 
## Run 71 stress 0.1001526 
## Run 72 stress 0.09949198 
## Run 73 stress 0.09808991 
## ... New best solution
## ... Procrustes: rmse 0.02436883  max resid 0.1080396 
## Run 74 stress 0.0990484 
## Run 75 stress 0.1019242 
## Run 76 stress 0.1001849 
## Run 77 stress 0.09851044 
## ... Procrustes: rmse 0.02487647  max resid 0.1256996 
## Run 78 stress 0.09931556 
## Run 79 stress 0.09875767 
## Run 80 stress 0.0990214 
## Run 81 stress 0.1000891 
## Run 82 stress 0.1000621 
## Run 83 stress 0.1001589 
## Run 84 stress 0.09876873 
## Run 85 stress 0.09883965 
## Run 86 stress 0.09833324 
## ... Procrustes: rmse 0.02136837  max resid 0.09498353 
## Run 87 stress 0.09818725 
## ... Procrustes: rmse 0.02247622  max resid 0.08223123 
## Run 88 stress 0.09986931 
## Run 89 stress 0.09982939 
## Run 90 stress 0.1013537 
## Run 91 stress 0.1005963 
## Run 92 stress 0.09983695 
## Run 93 stress 0.09850726 
## ... Procrustes: rmse 0.02583827  max resid 0.1126902 
## Run 94 stress 0.09972748 
## Run 95 stress 0.09884901 
## Run 96 stress 0.09998561 
## Run 97 stress 0.1000137 
## Run 98 stress 0.09869921 
## Run 99 stress 0.1008126 
## Run 100 stress 0.1000732 
## Run 101 stress 0.09994594 
## Run 102 stress 0.09990954 
## Run 103 stress 0.09996324 
## Run 104 stress 0.1006575 
## Run 105 stress 0.09891345 
## Run 106 stress 0.1003919 
## Run 107 stress 0.09835479 
## ... Procrustes: rmse 0.01885496  max resid 0.09830373 
## Run 108 stress 0.1004167 
## Run 109 stress 0.09951955 
## Run 110 stress 0.0988132 
## Run 111 stress 0.1016092 
## Run 112 stress 0.1002605 
## Run 113 stress 0.1000117 
## Run 114 stress 0.1006491 
## Run 115 stress 0.1009791 
## Run 116 stress 0.1002857 
## Run 117 stress 0.1000642 
## Run 118 stress 0.09901189 
## Run 119 stress 0.09849171 
## ... Procrustes: rmse 0.02293407  max resid 0.1037807 
## Run 120 stress 0.09914133 
## Run 121 stress 0.1014845 
## Run 122 stress 0.1010433 
## Run 123 stress 0.09868016 
## Run 124 stress 0.1003276 
## Run 125 stress 0.09934036 
## Run 126 stress 0.1014611 
## Run 127 stress 0.1012757 
## Run 128 stress 0.1005619 
## Run 129 stress 0.1004109 
## Run 130 stress 0.1007642 
## Run 131 stress 0.09933345 
## Run 132 stress 0.09945733 
## Run 133 stress 0.09931122 
## Run 134 stress 0.09854993 
## ... Procrustes: rmse 0.02430299  max resid 0.0905104 
## Run 135 stress 0.1008398 
## Run 136 stress 0.1005994 
## Run 137 stress 0.1000358 
## Run 138 stress 0.1007233 
## Run 139 stress 0.1002374 
## Run 140 stress 0.09989501 
## Run 141 stress 0.09935369 
## Run 142 stress 0.1001102 
## Run 143 stress 0.0990654 
## Run 144 stress 0.1002077 
## Run 145 stress 0.09864157 
## Run 146 stress 0.09970348 
## Run 147 stress 0.0984146 
## ... Procrustes: rmse 0.02149019  max resid 0.08418951 
## Run 148 stress 0.09992328 
## Run 149 stress 0.09921246 
## Run 150 stress 0.1008818 
## Run 151 stress 0.1010535 
## Run 152 stress 0.09976953 
## Run 153 stress 0.09898058 
## Run 154 stress 0.09843237 
## ... Procrustes: rmse 0.02429579  max resid 0.1141498 
## Run 155 stress 0.09983832 
## Run 156 stress 0.1006056 
## Run 157 stress 0.09858249 
## ... Procrustes: rmse 0.02173132  max resid 0.1015488 
## Run 158 stress 0.09935585 
## Run 159 stress 0.09821454 
## ... Procrustes: rmse 0.01880274  max resid 0.09921613 
## Run 160 stress 0.09950474 
## Run 161 stress 0.09943845 
## Run 162 stress 0.1008394 
## Run 163 stress 0.1005908 
## Run 164 stress 0.09954704 
## Run 165 stress 0.09913251 
## Run 166 stress 0.09983198 
## Run 167 stress 0.09936345 
## Run 168 stress 0.1009868 
## Run 169 stress 0.09956817 
## Run 170 stress 0.09870193 
## Run 171 stress 0.1013372 
## Run 172 stress 0.09934699 
## Run 173 stress 0.09973087 
## Run 174 stress 0.1002436 
## Run 175 stress 0.1004712 
## Run 176 stress 0.0992857 
## Run 177 stress 0.09925885 
## Run 178 stress 0.09880004 
## Run 179 stress 0.100002 
## Run 180 stress 0.1000055 
## Run 181 stress 0.09954604 
## Run 182 stress 0.0989315 
## Run 183 stress 0.09959917 
## Run 184 stress 0.09807919 
## ... New best solution
## ... Procrustes: rmse 0.02201437  max resid 0.08720544 
## Run 185 stress 0.09956904 
## Run 186 stress 0.09999901 
## Run 187 stress 0.09801555 
## ... New best solution
## ... Procrustes: rmse 0.02090624  max resid 0.09201046 
## Run 188 stress 0.10019 
## Run 189 stress 0.1000106 
## Run 190 stress 0.09866294 
## Run 191 stress 0.1006864 
## Run 192 stress 0.1002969 
## Run 193 stress 0.100186 
## Run 194 stress 0.1003432 
## Run 195 stress 0.09843969 
## ... Procrustes: rmse 0.01952165  max resid 0.09538217 
## Run 196 stress 0.09857167 
## Run 197 stress 0.09939987 
## Run 198 stress 0.09909632 
## Run 199 stress 0.09991192 
## Run 200 stress 0.09926474 
## *** Best solution was not repeated -- monoMDS stopping criteria:
##    200: no. of iterations >= maxit

NMDS Plots

# Combine all NMDS scores
all_scores_combined <- bind_rows(
  all_species_nmds$scores,
  central_nmds$scores,
  north_nmds$scores,
  south_nmds$scores
)

x_range <- range(all_scores_combined$NMDS1, na.rm = TRUE)
y_range <- range(all_scores_combined$NMDS2, na.rm = TRUE)

plot_species_nmds <- function(scores_df, panel_label, x_range, y_range) {
  
  scores_df <- scores_df %>%
    filter(!is.na(InvStatus2))
  
  ggplot(scores_df,
         aes(x = NMDS1,
             y = NMDS2,
             color = InvStatus2)) +
    geom_point(size = 2, alpha = 0.7) +
    scale_color_manual(
      values = c("Native" = "#56B4E9",
                 "Non-Native" = "#E69F00")
    ) +
    coord_fixed(xlim = x_range, ylim = y_range) +
    theme_classic(base_size = 12) +
    labs(title = panel_label,
         x = NULL,
         y = NULL,
         color = "Status") +
    theme(
      plot.title = element_text(face = "bold")
    )
}

Combined Plot

p1 <- plot_species_nmds(all_species_nmds$scores, "A", x_range, y_range)
p2 <- plot_species_nmds(central_nmds$scores,     "B", x_range, y_range)
p3 <- plot_species_nmds(north_nmds$scores,       "C", x_range, y_range)
p4 <- plot_species_nmds(south_nmds$scores,       "D", x_range, y_range)

final_nmds_plot <- (p1 | p2) /
                   (p3 | p4) +
  plot_layout(guides = "collect") +
  plot_annotation(
    theme = theme(
      plot.margin = margin(10, 10, 10, 10)
    )
  ) &
  theme(legend.position = "right")

# Add shared labels
final_plot <- final_nmds_plot &
  labs(x = "NMDS1", y = "NMDS2")

## Save
ggsave("Species_NMDS_Plots.png",
       plot = final_plot,
       width = 12,
       height = 10,
       dpi = 300)