Introduction
The PREDICTS database (Hudson et al. 2017) is a fully open-access database containing spatial comparisons of biodiversity in different land uses worldwide.
You can get started quickly by downloading the PREDICTS database from my website, but if you intend to use the database in your research, I would ask you please to download the database (freely) from the Natural History Museum data portal, so that appropriate credit is given.
webFile <- url("https://timnewbold.github.io/predicts_database.rds?dl=1")
predicts <- readRDS(webFile)
To work with the database, you should install a package that contains some basic data-manipulation functions:
remotes::install_github("timnewbold/predicts-demo",subdir="predictsFunctions")
library(predictsFunctions)
Database Structure
The PREDICTS database has a hierarchical structure.
At the highest level, data are drawn from 480 published papers (Sources) comparing biodiversity in different land uses.
Each data Source consists of one or more Studies. Sometimes, a published paper will contain biodiversity samples collected using more than one fundamental approach. For example, a paper may contain data for different taxonomic groups that would not appropriately have been sampled using the same methods. In such cases, because data are not directly comparable if collected using different methods, data Sources were split into multiple Studies. Otherwise, each Source contained a single Study.
Each Study consists of data sampled in one or more spatial Blocks. A Study was divided into more than one Block if the sampling showed spatial structuring, to allow us to delimit spatial aggregations of Sites, and thus to account for spatial structuring later when modelling the data.
Each Block contains two or more Sites, which are the specific locations at which biodiversity was sampled.
Within each Site, there are a series of Measurements - of species abundance (2,692,493 records), species occurrence (557,616 records), or species richness (295 records) - for each of the sampled taxa.
Field | Description |
---|---|
Source_ID | The published paper (Source) from which data were derived |
Study_number | Within each Source, the Study identifier |
Study_name | A text description to identify the Study |
SS | An amalgamation of Source and Study IDs, so that each Study in the database is uniquely identifiable |
Block | A text description of distinct spatial Blocks, blank where sites were not spatially clustered |
SSB | An almagamation of the unique Study identifier, SS, and Block, so that each Block is uniquely identifiable |
Site_number | Within each Study, the Site identifier |
Site_name | A text description to identify the Site |
SSBS | An almagamation of the unique Block identifier, SSB, and the Site number, so that each Site is uniquely identifiable |
SSS | As for SSBS, but excluding the block identifier - not recommended, but can be used if you don’t want to account for spatial structure |
Measurement | The recorded Measurement of species abundance, species occurrence, or species richness (see next section) |
Key Sampling Information
Measurements in PREDICTS consist of three broad types: species abundance, species occurrence (i.e., presence or absence), or species richness (the number of species sampled). Within these categories, there are lots of different specific metrics. Some measures of diversity are inherently sensitive to sampling effort, which has important implications for processing the data (see below).
The different underlying Studies in PREDICTS consist of data sampled using a whole host of different methods, and with widely differing levels of sampling effort. When analysing the PREDICTS data, it is important that diversity Measurements are comparable within Studies, whereas differences among Studies are handled by the hierarchical design of the models (see below). Therefore, it is a requirement of the PREDICTS database that sampling methods are constant within studies. Nevertheless, for 18% of studies, sampling effort differs among the sampled sites.
Most of the original biodiversity sampling in the studies contained within the PREDICTS database took place between 2000 and 2013.
Distribution of mid-point sampling dates for the PREDICTS sites
Sampling at the sites in PREDICTS can span a range of different spatial extents. The maximum linear span of sampling for three-quarters of sites in the PREDICTS database falls between 3 and 502 metres.
Distribution of maximum linear spans sampled at the PREDICTS sites
Field | Description |
---|---|
Measurement | The recorded Measurement of species abundance, species occurrence, or species richness |
Diversity_metric_type | Whether the recorded Measurement is of species abundance, species occurrence or species richness |
Diversity_metric | The specific metric used for the taxon Measurement |
Diversity_metric_unit | The units of the diversity metric |
Diversity_metric_is_effort_sensitive | Whether the diversity metric is sensitive to sampling effort |
Sampling_method | The method used to sample taxa |
Sampling_effort | The sampling effort applied at the site |
Rescaled_sampling_effort | Rescaled sampling effort, where the maximum within a study becomes 1, and everything else a fraction of the maximum |
Sampling_effort_unit | The units of the sampling effort |
Sample_start_earliest | The earliest date at which sampling may have begun |
Sample_end_latest | The latest date at which sampling may have ended |
Sample_date_resolution | The resolution of the sampling start and end dates (day, month or year) |
Sample_midpoint | The mid-point between earliest sampling start and latest sampling end |
Max_linear_extent_metres | The maximum linear span sampled at a given site |
Spatial Information
The vast majority of sampled sites in the PREDICTS database (99.4%) are associated with geographical coordinates (longitude and latitude).
These geographical coordinates are then used to assign the site within various geographic schemes: biogeographic realms (Ladle and Whittaker 2011; Olson et al. 2001), biomes (Olson et al. 2001), ecoregions (Olson et al. 2001), UN regions and sub-regions (United Nations, 1999), biodiversity hotspots (Myers et al. 2000) and high-biodiversity wilderness areas (Brooks et al. 2006).
Field | Description |
---|---|
Longitude | The longitude of the site at which sampling was undertaken |
Latitude | The latitude of the site at which sampling was undertaken |
Realm | Based on the coordinates, the location of the site within…biogeographic realms |
Biome | …biomes |
Ecoregion | …ecoregions |
UN_region | …UN regions |
UN_subregion | …UN sub-regions |
Hotspot | …Biodiversity hotspots |
Wilderness_area | …High-biodiversity wilderness areas |
Human Pressure Information
The only information on human pressures that is endogenous to the PREDICTS database describes the land-use conditions at the sampled site, with the key variables representing land-use type and intensity of human land use.
In the majority of cases (at least 91.8%), land-use variables in the PREDICTS database were encoded using information given in the original source publications. Occasionally, the data entrant used Google Maps to infer the land-use type.
Land-use type is classified as one of: primary vegetation (apparently pristine habitat, with no record of prior destruction); secondary vegetation (habitat previously destroyed by human actions or extreme natural events, but now recovering towards its natural state); plantation forest (area used for growing woody crops); cropland (area used for growing herbaceous crops); pasture (area used for grazing livestock); urban (human settlements or areas of civic amenity). Secondary vegetation is also divided according to the stage of recovery toward its natural state: young, intermediate or mature. For full definitions, see (Hudson et al. 2017).
Land-use intensity is classified at one of three levels (minimal, light or intense), with the criteria for classification depending on land-use type (see (Hudson et al. 2017) for more details)
Field | Description |
---|---|
Habitat_as_described | The description of the habitat from the original source publication |
Predominant_land_use | The land-use type, as classified by the data entrant |
Source_for_predominant_land_use | Whether land-use type was classified based on information given in the original source publication or Google Maps |
Use_intensity | Intensity of human land use, as classified by the data entrant |
Taxonomic Information
The names of the sampled taxa, as given in the original source publications, are entered directly into the database. These names were passed through a taxonomic names resolver to attempt to correct any typographical errors from the original papers. Parsed names were then compared to the Catalogue of Life or manually checked, to try to find the accepted name for the species (successfully in the vast majority - 97.4 - of cases).
Field | Description |
---|---|
Taxon_name_entered | The name of the sampled taxon, as given in the original source publication |
Parsed_name | The name of the sampled taxon, after resolving any typos |
Taxon | The accepted or provisionally accepted name for the species |
Name_status | Whether the taxon name is accepted or provisionally accepted |
Rank | The taxonomic rank of the accepted/provisionally accepted taxon name |
Kingdom | For the accepted/provisionally accepted taxon name, the name of the …Kingdom |
Phylum | …Phylum |
Class | …Class |
Order | …Order |
Family | …Family |
Genus | …Genus |
Species | …Species |
Best_guess_binomial | For as many sampled taxa as possible, the best guess of the Latin binomial name |
Study_common_taxon | The taxonomic group within which all taxa sampled in a particular study belong |
Data Pre-processing
Before modelling with the PREDICTS data, there are a few basic pre-processing steps that must be carried out. First, for the 1% of records that are of an effort-sensitive metric, and where sampling effort differs among sampled sites within the study, we need to correct sampling effort. This is done by rescaling sampling effort within each study, such that the most-sampled site gets a relative effort value of 1, and the sampling effort for all other sites is scaled linearly relative to this maximum value. The CorrectSamplingEffort function in the predictsFunctions package carries out these operations:
# Correct effort-sensitive abundance measures (assumes linear relationship between effort and recorded abundance)
predicts <- predictsFunctions::CorrectSamplingEffort(diversity = predicts)
## Correcting 8546 missing sampling effort values
## Rescaling sampling effort
## Correcting 2225047 values for sensitivity to sampling effort
Next, some samples in PREDICTS were entered such that a sampled ‘Site’ consisted of very finely divided samples. For example, samples may have been entered as individual traps. This is not in keeping with the strict definition of a ‘Site’ in the PREDICTS database. To get around this issue, we combine sites with identical coordinates, belonging to the same study and spatial block of sites, sampled on the same dates, sampled with the same methods and recorded using the same diversity metric, and situated within the same land-use type and human land-use intensity. This merging of sites is carried out by the MergeSites function in the predictsFunctions package (warning, this operation can take a few minutes to run, so you might want to go and make a cup of tea!):
predicts <- predictsFunctions::MergeSites(diversity = predicts,silent = TRUE)
There are two main ways that you can now analyze the PREDICTS data:
- Using the raw species-level data, modelling the presence/absence or abundance of individual species; or
- Using site-level biodiversity summaries, such as species richness, total community abundance or other aggregate biodiversity measures
We are now ready to build some simple models using the PREDICTS database. For the modelling, we will use my StatisticalModels package, and we will use the DHARMa package for model diagnostics:
library(StatisticalModels)
library(DHARMa)
Basic Species-level Models
One way we can use the PREDICTS data is to build models based on the raw data for individual species.
So that the models run in a reasonably short amount of time, we will focus here on data for reptiles:
reptiles <- droplevels(predicts[(predicts$Class=="Reptilia"),])
We will create a variable called “Occur” that represents the presence or absence of reptile species:
# First, make sure that all records are of abundance or occurrence
reptiles <- reptiles[(reptiles$Diversity_metric_type %in% c("Abundance","Occurrence")),]
# Now, create the occurrence variable, where all values > 0 are treated as
# presence records
reptiles$Occur <- ifelse(reptiles$Measurement>0,1,0)
Before we build a model, we need to rearrange the land-use classification a bit. Any sites where the land-use type was entered as ‘Cannot decide’ need to be set as NA values. We will also group together secondary vegetation sites at all stages of recovery, since there are a relatively limited number of sites for reptiles.
reptiles$LandUse <- dplyr::recode(reptiles$Predominant_land_use,
'Primary vegetation' = 'Primary',
'Young secondary vegetation' = 'Secondary',
'Intermediate secondary vegetation' = 'Secondary',
'Mature secondary vegetation' = 'Secondary',
'Secondary vegetation (indeterminate age)' = "Secondary",
'Plantation forest' = 'Plantation',
'Cropland' = 'Cropland',
'Pasture' = 'Pasture',
'Urban' = 'Urban',
'Cannot decide' = NA_character_)
Let’s try a very simple model fitting just land use. We will also build a null model for comparison.
occMod1 <- StatisticalModels::GLMER(modelData = reptiles,responseVar = "Occur",
fitFamily = "binomial",fixedStruct = "LandUse",
randomStruct = "(1|SS)+(1|SSB)+(1|SSBS)+(1|Taxon_name_entered)",
saveVars = c("Longitude","Latitude"))
# To compare the models, they need to be fit to the same dataset
# Therefore, we first need to drop records with unknown land-use type
reptiles.with.lu <- reptiles[(!is.na(reptiles$LandUse)),]
occModNull <- StatisticalModels::GLMER(modelData = reptiles.with.lu,responseVar = "Occur",
fitFamily = "binomial",fixedStruct = "1",
randomStruct = "(1|SS)+(1|SSB)+(1|SSBS)+(1|Taxon_name_entered)",
saveVars = c("Longitude","Latitude"))
print.LM(occMod1)
## A generalized linear model of family binomial
## Final call: Occur~LandUse+(1|SS)+(1|SSB)+(1|SSBS)+(1|Taxon_name_entered)
summary.LM(occMod1)
## $family
## [1] "binomial"
##
## $call
## [1] "Occur~LandUse+(1|SS)+(1|SSB)+(1|SSBS)+(1|Taxon_name_entered)"
##
## $stats
## data frame with 0 columns and 0 rows
AIC(occMod1$model,occModNull$model)
## df AIC
## occMod1$model 9 16946.40
## occModNull$model 5 17007.73
anova(occMod1$model,occModNull$model)
## Data: modelData
## Models:
## occModNull$model: Occur ~ 1 + (1 | SS) + (1 | SSB) + (1 | SSBS) + (1 | Taxon_name_entered)
## occMod1$model: Occur ~ LandUse + (1 | SS) + (1 | SSB) + (1 | SSBS) + (1 | Taxon_name_entered)
## npar AIC BIC logLik -2*log(L) Chisq Df Pr(>Chisq)
## occModNull$model 5 17008 17050 -8498.9 16998
## occMod1$model 9 16946 17022 -8464.2 16928 69.326 4 3.149e-14 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
If we look at the pseudo R2 values of the model, we can see that the random effects explain most of the variation in reptile species presence/absence, while land use explains 1.4%.
StatisticalModels::R2GLMER(occMod1$model)
## $conditional
## [1] 0.7842631
##
## $marginal
## [1] 0.01386905
Plotting this model shows significant declines in the probability of occurrence of reptile species in secondary vegetation, plantation forests and pastures.
PlotGLMERFactor(model = occMod1$model,data = occMod1$data,responseVar = "Prob. occurrence",logLink = "b",catEffects = "LandUse")
Basic Assemblage-Level Models
To use the site-level approach, you need to use the SiteMetrics function to create a site-level data-frame. You can use the extra.cols argument to include non-standard columns from the original PREDICTS database into the site-level data-frame. For now, we will save the land-use type, the block and site-within-block unique identifiers, SSB and SSBS (which aren’t saved by default, and will be important in the modelling), and the Longitude and Latitude fields (as you will see, these will come in handy later for model checking):
sites <- predictsFunctions::SiteMetrics(diversity = predicts,
extra.cols = c("Longitude","Latitude",
"Predominant_land_use",
"SSB","SSBS"),
srEstimators = NULL)
## Computing site metrics for 2906994 measurements
## The data contain 480 sources, 666 studies and 22678 sites
## Computing site-level values
## Computing total abundance
## Computing species richness
## Computing Simpson's diversity
## Assembling site-level values
As when we ran the species-level models, we need to rearrange the land-use classification. This time we have a lot of data available, so we will treat the secondary vegetation classes separately:
sites$LandUse <- dplyr::recode(sites$Predominant_land_use,
'Primary vegetation'='Primary',
'Mature secondary vegetation'='Secondary_Mature',
'Intermediate secondary vegetation'='Secondary_Intermediate',
'Young secondary vegetation'='Secondary_Young',
'Plantation forest'='Plantation',
'Cropland'='Cropland',
'Pasture'='Pasture',
'Urban'='Urban',
'Secondary vegetation (indeterminate age)'=NA_character_,
'Cannot decide'=NA_character_)
We will start by running a very simple model of species richness as a function just of land use.
richMod1 <- StatisticalModels::GLMER(modelData = sites,
responseVar = "Species_richness",
fitFamily = "poisson",
fixedStruct = "LandUse",
randomStruct = "(1|SS)+(1|SSB)",
saveVars = c("Longitude","Latitude"))
If our species richness estimates conform to a true Poisson distribution, then the mean and variance of the values should be equal. Ecological count data are often over-dispersed, whereby the variance of the values is much greater than the mean. This seems very likely to be the case here:
mean(sites$Species_richness)
## [1] 16.17568
var(sites$Species_richness)
## [1] 575.4508
We can use the GLMEROverdispersion function to test the model, revealing substantial over-dispersion:
StatisticalModels::GLMEROverdispersion(model = richMod1$model)
## $residDev
## [1] 42731.91
##
## $residDF
## [1] 20410
##
## $ratio
## [1] 2.093675
##
## $P.ChiSq
## [1] 0
One way to deal with the issue of over-dispersion in Poisson mixed-effects models is to include an observation-level random effect (i.e., a random effect with one group per data point). Here, this mean fitting site identity as a random effect:
richMod2 <- StatisticalModels::GLMER(modelData = sites,
responseVar = "Species_richness",
fitFamily = "poisson",
fixedStruct = "LandUse",
randomStruct = "(1|SS)+(1|SSB)+(1|SSBS)",
saveVars = c("Longitude","Latitude"))
print.LM(richMod2)
## A generalized linear model of family poisson
## Final call: Species_richness~LandUse+(1|SS)+(1|SSB)+(1|SSBS)
summary.LM(richMod2)
## $family
## [1] "poisson"
##
## $call
## [1] "Species_richness~LandUse+(1|SS)+(1|SSB)+(1|SSBS)"
##
## $stats
## data frame with 0 columns and 0 rows
Testing for over-dispersion in the new model shows that we have dealt with the issue successfully:
StatisticalModels::GLMEROverdispersion(model = richMod2$model)
## $residDev
## [1] 9972.64
##
## $residDF
## [1] 20409
##
## $ratio
## [1] 0.4886393
##
## $P.ChiSq
## [1] 1
Now that we have settled on a random-effects structure, we will create a null, intercept-only model with which to compare our model of the effect of land use:
# To compare the models, they need to be fit to the same dataset
# Therefore, we first need to drop records with unknown land-use type
sites.with.lu <- sites[!is.na(sites$LandUse),]
richModNull <- StatisticalModels::GLMER(modelData = sites.with.lu,
responseVar = "Species_richness",
fitFamily = "poisson",
fixedStruct = "1",
randomStruct = "(1|SS)+(1|SSB)+(1|SSBS)",
saveVars = c("Longitude","Latitude"))
Comparing the land-use and null models shows that land use has a strong association with species richness at the PREDICTS sites:
AIC(richMod2$model,richModNull$model)
## df AIC
## richMod2$model 11 118989.1
## richModNull$model 4 119572.6
anova(richMod2$model,richModNull$model)
## Data: modelData
## Models:
## richModNull$model: Species_richness ~ 1 + (1 | SS) + (1 | SSB) + (1 | SSBS)
## richMod2$model: Species_richness ~ LandUse + (1 | SS) + (1 | SSB) + (1 | SSBS)
## npar AIC BIC logLik -2*log(L) Chisq Df Pr(>Chisq)
## richModNull$model 4 119573 119604 -59782 119565
## richMod2$model 11 118989 119076 -59484 118967 597.46 7 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Calculating the pseudo-R2 values for the land-use model shows that land use alone only explains 0.5% of the variation in species richness, but that is unsurprising in such a heterogeneous database.
R2GLMER(richMod2$model)
## $conditional
## [1] 0.6204898
##
## $marginal
## [1] 0.005113024
Plotting the modelled effects of land use on species richness shows a substantial reduction in species richness in more disturbed land uses:
PlotGLMERFactor(model = richMod2$model,data = richMod2$data,
responseVar = "Species richness",logLink = "e",
catEffects = "LandUse",xtext.srt = 45,
order = c(1,4,3,2,5,7,6,8),
params = list(mar = c(1.2, 3.5, 0.2, 0.2)))
With any analysis of spatial data, there is the possibility for spatial autocorrelation, meaning that data points cannot be assumed to be independent. Because of the hierarchical structure of the PREDICTS analyses, we tend to investigate spatial autocorrelation in the residuals associated with individual Studies in the original dataset. This can be done using the SpatialAutocorrelationTest function:
sat <- StatisticalModels::SpatialAutocorrelationTest(richMod2,ranefGrouping = "SS")
## CAUTION: function will only behave sensibly if data points each represent a unique spatial location
## Processing group 1 of 641Processing group 2 of 641Processing group 3 of 641Processing group 4 of 641Processing group 5 of 641Processing group 6 of 641Processing group 7 of 641Processing group 8 of 641Processing group 9 of 641Processing group 10 of 641Processing group 11 of 641Processing group 12 of 641Processing group 13 of 641Processing group 14 of 641Processing group 15 of 641Processing group 16 of 641Processing group 17 of 641Processing group 18 of 641Processing group 19 of 641Processing group 20 of 641Processing group 21 of 641Processing group 22 of 641Processing group 23 of 641Processing group 24 of 641Processing group 25 of 641Processing group 26 of 641Processing group 27 of 641Processing group 28 of 641Processing group 29 of 641Processing group 30 of 641Processing group 31 of 641Processing group 32 of 641Processing group 33 of 641Processing group 34 of 641Processing group 35 of 641Processing group 36 of 641Processing group 37 of 641Processing group 38 of 641Processing group 39 of 641Processing group 40 of 641Processing group 41 of 641Processing group 42 of 641Processing group 43 of 641Processing group 44 of 641Processing group 45 of 641Processing group 46 of 641Processing group 47 of 641Processing group 48 of 641Processing group 49 of 641Processing group 50 of 641Processing group 51 of 641Processing group 52 of 641Processing group 53 of 641Processing group 54 of 641Processing group 55 of 641Processing group 56 of 641
## Warning in dnearneigh(cbind(data.sub$Longitude, data.sub$Latitude), d1 = 1e-08,
## : neighbour object has 2 sub-graphs
## Processing group 57 of 641Processing group 58 of 641Processing group 59 of 641Processing group 60 of 641Processing group 61 of 641Processing group 62 of 641Processing group 63 of 641Processing group 64 of 641Processing group 65 of 641Processing group 66 of 641Processing group 67 of 641Processing group 68 of 641Processing group 69 of 641Processing group 70 of 641Processing group 71 of 641Processing group 72 of 641Processing group 73 of 641Processing group 74 of 641Processing group 75 of 641Processing group 76 of 641Processing group 77 of 641Processing group 78 of 641Processing group 79 of 641Processing group 80 of 641Processing group 81 of 641Processing group 82 of 641Processing group 83 of 641Processing group 84 of 641Processing group 85 of 641Processing group 86 of 641Processing group 87 of 641Processing group 88 of 641Processing group 89 of 641Processing group 90 of 641Processing group 91 of 641Processing group 92 of 641Processing group 93 of 641Processing group 94 of 641Processing group 95 of 641Processing group 96 of 641Processing group 97 of 641Processing group 98 of 641Processing group 99 of 641Processing group 100 of 641Processing group 101 of 641Processing group 102 of 641Processing group 103 of 641Processing group 104 of 641Processing group 105 of 641Processing group 106 of 641Processing group 107 of 641Processing group 108 of 641Processing group 109 of 641Processing group 110 of 641Processing group 111 of 641
## Warning in dnearneigh(cbind(data.sub$Longitude, data.sub$Latitude), d1 = 1e-08,
## : neighbour object has 3 sub-graphs
## Processing group 112 of 641
## Warning in dnearneigh(cbind(data.sub$Longitude, data.sub$Latitude), d1 = 1e-08,
## : neighbour object has 4 sub-graphs
## Processing group 113 of 641
## Warning in dnearneigh(cbind(data.sub$Longitude, data.sub$Latitude), d1 = 1e-08,
## : neighbour object has 3 sub-graphs
## Processing group 114 of 641Processing group 115 of 641Processing group 116 of 641Processing group 117 of 641Processing group 118 of 641Processing group 119 of 641Processing group 120 of 641Processing group 121 of 641Processing group 122 of 641Processing group 123 of 641Processing group 124 of 641
## Warning in dnearneigh(cbind(data.sub$Longitude, data.sub$Latitude), d1 = 1e-08,
## : neighbour object has 60 sub-graphs
## Processing group 125 of 641Processing group 126 of 641Processing group 127 of 641
## Warning in dnearneigh(cbind(data.sub$Longitude, data.sub$Latitude), d1 = 1e-08,
## : neighbour object has 4 sub-graphs
## Processing group 128 of 641Processing group 129 of 641Processing group 130 of 641Processing group 131 of 641Processing group 132 of 641Processing group 133 of 641Processing group 134 of 641Processing group 135 of 641Processing group 136 of 641Processing group 137 of 641Processing group 138 of 641Processing group 139 of 641Processing group 140 of 641Processing group 141 of 641Processing group 142 of 641Processing group 143 of 641Processing group 144 of 641Processing group 145 of 641Processing group 146 of 641Processing group 147 of 641Processing group 148 of 641Processing group 149 of 641Processing group 150 of 641Processing group 151 of 641Processing group 152 of 641Processing group 153 of 641Processing group 154 of 641Processing group 155 of 641Processing group 156 of 641Processing group 157 of 641Processing group 158 of 641Processing group 159 of 641Processing group 160 of 641Processing group 161 of 641Processing group 162 of 641Processing group 163 of 641Processing group 164 of 641Processing group 165 of 641Processing group 166 of 641Processing group 167 of 641Processing group 168 of 641Processing group 169 of 641Processing group 170 of 641Processing group 171 of 641Processing group 172 of 641Processing group 173 of 641Processing group 174 of 641Processing group 175 of 641Processing group 176 of 641Processing group 177 of 641Processing group 178 of 641Processing group 179 of 641Processing group 180 of 641Processing group 181 of 641Processing group 182 of 641Processing group 183 of 641Processing group 184 of 641Processing group 185 of 641Processing group 186 of 641Processing group 187 of 641Processing group 188 of 641Processing group 189 of 641Processing group 190 of 641
## Warning in dnearneigh(cbind(data.sub$Longitude, data.sub$Latitude), d1 = 1e-08,
## : neighbour object has 3 sub-graphs
## Processing group 191 of 641Processing group 192 of 641Processing group 193 of 641Processing group 194 of 641Processing group 195 of 641Processing group 196 of 641Processing group 197 of 641Processing group 198 of 641Processing group 199 of 641
## Warning in dnearneigh(cbind(data.sub$Longitude, data.sub$Latitude), d1 = 1e-08,
## : neighbour object has 3 sub-graphs
## Processing group 200 of 641
## Warning in dnearneigh(cbind(data.sub$Longitude, data.sub$Latitude), d1 = 1e-08,
## : neighbour object has 3 sub-graphs
## Processing group 201 of 641
## Warning in dnearneigh(cbind(data.sub$Longitude, data.sub$Latitude), d1 = 1e-08,
## : neighbour object has 3 sub-graphs
## Processing group 202 of 641Processing group 203 of 641
## Warning in dnearneigh(cbind(data.sub$Longitude, data.sub$Latitude), d1 = 1e-08,
## : neighbour object has 4 sub-graphs
## Processing group 204 of 641Processing group 205 of 641Processing group 206 of 641Processing group 207 of 641Processing group 208 of 641Processing group 209 of 641Processing group 210 of 641
## Warning in dnearneigh(cbind(data.sub$Longitude, data.sub$Latitude), d1 = 1e-08,
## : neighbour object has 3 sub-graphs
## Processing group 211 of 641Processing group 212 of 641Processing group 213 of 641Processing group 214 of 641
## Warning in dnearneigh(cbind(data.sub$Longitude, data.sub$Latitude), d1 = 1e-08,
## : neighbour object has 6 sub-graphs
## Processing group 215 of 641Processing group 216 of 641Processing group 217 of 641Processing group 218 of 641Processing group 219 of 641Processing group 220 of 641Processing group 221 of 641Processing group 222 of 641Processing group 223 of 641Processing group 224 of 641Processing group 225 of 641Processing group 226 of 641Processing group 227 of 641Processing group 228 of 641Processing group 229 of 641Processing group 230 of 641Processing group 231 of 641Processing group 232 of 641Processing group 233 of 641Processing group 234 of 641Processing group 235 of 641Processing group 236 of 641Processing group 237 of 641Processing group 238 of 641Processing group 239 of 641Processing group 240 of 641Processing group 241 of 641Processing group 242 of 641Processing group 243 of 641Processing group 244 of 641Processing group 245 of 641Processing group 246 of 641Processing group 247 of 641Processing group 248 of 641Processing group 249 of 641Processing group 250 of 641Processing group 251 of 641Processing group 252 of 641Processing group 253 of 641Processing group 254 of 641Processing group 255 of 641Processing group 256 of 641
## Warning in dnearneigh(cbind(data.sub$Longitude, data.sub$Latitude), d1 = 1e-08,
## : neighbour object has 6 sub-graphs
## Processing group 257 of 641
## Warning in dnearneigh(cbind(data.sub$Longitude, data.sub$Latitude), d1 = 1e-08,
## : neighbour object has 6 sub-graphs
## Processing group 258 of 641
## Warning in dnearneigh(cbind(data.sub$Longitude, data.sub$Latitude), d1 = 1e-08,
## : neighbour object has 2 sub-graphs
## Processing group 259 of 641Processing group 260 of 641Processing group 261 of 641Processing group 262 of 641Processing group 263 of 641Processing group 264 of 641Processing group 265 of 641
## Warning in dnearneigh(cbind(data.sub$Longitude, data.sub$Latitude), d1 = 1e-08,
## : neighbour object has 3 sub-graphs
## Processing group 266 of 641Processing group 267 of 641Processing group 268 of 641Processing group 269 of 641Processing group 270 of 641
## Warning in dnearneigh(cbind(data.sub$Longitude, data.sub$Latitude), d1 = 1e-08,
## : neighbour object has 4 sub-graphs
## Processing group 271 of 641Processing group 272 of 641Processing group 273 of 641Processing group 274 of 641Processing group 275 of 641Processing group 276 of 641Processing group 277 of 641Processing group 278 of 641Processing group 279 of 641Processing group 280 of 641Processing group 281 of 641Processing group 282 of 641Processing group 283 of 641Processing group 284 of 641Processing group 285 of 641Processing group 286 of 641Processing group 287 of 641Processing group 288 of 641Processing group 289 of 641Processing group 290 of 641Processing group 291 of 641Processing group 292 of 641Processing group 293 of 641Processing group 294 of 641Processing group 295 of 641Processing group 296 of 641Processing group 297 of 641Processing group 298 of 641Processing group 299 of 641Processing group 300 of 641Processing group 301 of 641Processing group 302 of 641Processing group 303 of 641Processing group 304 of 641Processing group 305 of 641Processing group 306 of 641Processing group 307 of 641Processing group 308 of 641Processing group 309 of 641Processing group 310 of 641Processing group 311 of 641Processing group 312 of 641
## Warning in dnearneigh(cbind(data.sub$Longitude, data.sub$Latitude), d1 = 1e-08,
## : neighbour object has 2 sub-graphs
## Processing group 313 of 641Processing group 314 of 641Processing group 315 of 641Processing group 316 of 641Processing group 317 of 641Processing group 318 of 641Processing group 319 of 641Processing group 320 of 641Processing group 321 of 641Processing group 322 of 641Processing group 323 of 641Processing group 324 of 641Processing group 325 of 641Processing group 326 of 641Processing group 327 of 641Processing group 328 of 641Processing group 329 of 641Processing group 330 of 641Processing group 331 of 641Processing group 332 of 641Processing group 333 of 641Processing group 334 of 641Processing group 335 of 641Processing group 336 of 641Processing group 337 of 641Processing group 338 of 641Processing group 339 of 641Processing group 340 of 641Processing group 341 of 641Processing group 342 of 641Processing group 343 of 641Processing group 344 of 641Processing group 345 of 641Processing group 346 of 641Processing group 347 of 641Processing group 348 of 641Processing group 349 of 641Processing group 350 of 641Processing group 351 of 641Processing group 352 of 641Processing group 353 of 641Processing group 354 of 641Processing group 355 of 641Processing group 356 of 641Processing group 357 of 641Processing group 358 of 641Processing group 359 of 641Processing group 360 of 641Processing group 361 of 641Processing group 362 of 641Processing group 363 of 641Processing group 364 of 641Processing group 365 of 641Processing group 366 of 641Processing group 367 of 641Processing group 368 of 641Processing group 369 of 641Processing group 370 of 641Processing group 371 of 641Processing group 372 of 641Processing group 373 of 641Processing group 374 of 641Processing group 375 of 641Processing group 376 of 641Processing group 377 of 641Processing group 378 of 641Processing group 379 of 641
## Warning in dnearneigh(cbind(data.sub$Longitude, data.sub$Latitude), d1 = 1e-08,
## : neighbour object has 2 sub-graphs
## Processing group 380 of 641Processing group 381 of 641Processing group 382 of 641Processing group 383 of 641Processing group 384 of 641Processing group 385 of 641Processing group 386 of 641
## Warning in dnearneigh(cbind(data.sub$Longitude, data.sub$Latitude), d1 = 1e-08,
## : neighbour object has 6 sub-graphs
## Processing group 387 of 641Processing group 388 of 641Processing group 389 of 641
## Warning in dnearneigh(cbind(data.sub$Longitude, data.sub$Latitude), d1 = 1e-08,
## : neighbour object has 9 sub-graphs
## Processing group 390 of 641Processing group 391 of 641Processing group 392 of 641Processing group 393 of 641Processing group 394 of 641Processing group 395 of 641Processing group 396 of 641Processing group 397 of 641Processing group 398 of 641Processing group 399 of 641Processing group 400 of 641Processing group 401 of 641Processing group 402 of 641Processing group 403 of 641Processing group 404 of 641Processing group 405 of 641Processing group 406 of 641Processing group 407 of 641Processing group 408 of 641Processing group 409 of 641Processing group 410 of 641Processing group 411 of 641Processing group 412 of 641Processing group 413 of 641Processing group 414 of 641Processing group 415 of 641Processing group 416 of 641Processing group 417 of 641Processing group 418 of 641Processing group 419 of 641Processing group 420 of 641Processing group 421 of 641Processing group 422 of 641Processing group 423 of 641Processing group 424 of 641Processing group 425 of 641Processing group 426 of 641Processing group 427 of 641Processing group 428 of 641Processing group 429 of 641Processing group 430 of 641Processing group 431 of 641Processing group 432 of 641Processing group 433 of 641Processing group 434 of 641Processing group 435 of 641Processing group 436 of 641Processing group 437 of 641Processing group 438 of 641Processing group 439 of 641Processing group 440 of 641Processing group 441 of 641Processing group 442 of 641Processing group 443 of 641Processing group 444 of 641Processing group 445 of 641Processing group 446 of 641Processing group 447 of 641Processing group 448 of 641Processing group 449 of 641Processing group 450 of 641Processing group 451 of 641Processing group 452 of 641Processing group 453 of 641Processing group 454 of 641Processing group 455 of 641Processing group 456 of 641
## Warning in dnearneigh(cbind(data.sub$Longitude, data.sub$Latitude), d1 = 1e-08,
## : neighbour object has 2 sub-graphs
## Processing group 457 of 641Processing group 458 of 641
## Warning in dnearneigh(cbind(data.sub$Longitude, data.sub$Latitude), d1 = 1e-08,
## : neighbour object has 3 sub-graphs
## Processing group 459 of 641Processing group 460 of 641Processing group 461 of 641Processing group 462 of 641Processing group 463 of 641Processing group 464 of 641Processing group 465 of 641Processing group 466 of 641Processing group 467 of 641Processing group 468 of 641Processing group 469 of 641Processing group 470 of 641Processing group 471 of 641Processing group 472 of 641Processing group 473 of 641Processing group 474 of 641Processing group 475 of 641Processing group 476 of 641Processing group 477 of 641Processing group 478 of 641Processing group 479 of 641Processing group 480 of 641Processing group 481 of 641Processing group 482 of 641Processing group 483 of 641Processing group 484 of 641Processing group 485 of 641Processing group 486 of 641Processing group 487 of 641Processing group 488 of 641Processing group 489 of 641Processing group 490 of 641Processing group 491 of 641Processing group 492 of 641Processing group 493 of 641Processing group 494 of 641Processing group 495 of 641Processing group 496 of 641Processing group 497 of 641Processing group 498 of 641Processing group 499 of 641Processing group 500 of 641Processing group 501 of 641Processing group 502 of 641Processing group 503 of 641Processing group 504 of 641Processing group 505 of 641Processing group 506 of 641Processing group 507 of 641Processing group 508 of 641Processing group 509 of 641Processing group 510 of 641Processing group 511 of 641Processing group 512 of 641Processing group 513 of 641Processing group 514 of 641Processing group 515 of 641Processing group 516 of 641Processing group 517 of 641Processing group 518 of 641Processing group 519 of 641Processing group 520 of 641Processing group 521 of 641Processing group 522 of 641Processing group 523 of 641Processing group 524 of 641Processing group 525 of 641Processing group 526 of 641Processing group 527 of 641Processing group 528 of 641Processing group 529 of 641Processing group 530 of 641Processing group 531 of 641Processing group 532 of 641Processing group 533 of 641Processing group 534 of 641Processing group 535 of 641Processing group 536 of 641Processing group 537 of 641Processing group 538 of 641Processing group 539 of 641Processing group 540 of 641Processing group 541 of 641Processing group 542 of 641Processing group 543 of 641Processing group 544 of 641Processing group 545 of 641Processing group 546 of 641Processing group 547 of 641Processing group 548 of 641Processing group 549 of 641Processing group 550 of 641Processing group 551 of 641Processing group 552 of 641Processing group 553 of 641Processing group 554 of 641Processing group 555 of 641Processing group 556 of 641Processing group 557 of 641Processing group 558 of 641Processing group 559 of 641Processing group 560 of 641Processing group 561 of 641Processing group 562 of 641Processing group 563 of 641Processing group 564 of 641Processing group 565 of 641Processing group 566 of 641Processing group 567 of 641Processing group 568 of 641Processing group 569 of 641Processing group 570 of 641Processing group 571 of 641Processing group 572 of 641Processing group 573 of 641Processing group 574 of 641Processing group 575 of 641Processing group 576 of 641Processing group 577 of 641Processing group 578 of 641Processing group 579 of 641Processing group 580 of 641Processing group 581 of 641Processing group 582 of 641Processing group 583 of 641Processing group 584 of 641Processing group 585 of 641Processing group 586 of 641Processing group 587 of 641Processing group 588 of 641
## Warning in dnearneigh(cbind(data.sub$Longitude, data.sub$Latitude), d1 = 1e-08,
## : neighbour object has 6 sub-graphs
## Processing group 589 of 641
## Warning in dnearneigh(cbind(data.sub$Longitude, data.sub$Latitude), d1 = 1e-08,
## : neighbour object has 3 sub-graphs
## Processing group 590 of 641
## Warning in dnearneigh(cbind(data.sub$Longitude, data.sub$Latitude), d1 = 1e-08,
## : neighbour object has 2 sub-graphs
## Processing group 591 of 641
## Warning in dnearneigh(cbind(data.sub$Longitude, data.sub$Latitude), d1 = 1e-08,
## : neighbour object has 2 sub-graphs
## Processing group 592 of 641Processing group 593 of 641Processing group 594 of 641Processing group 595 of 641Processing group 596 of 641Processing group 597 of 641Processing group 598 of 641Processing group 599 of 641Processing group 600 of 641Processing group 601 of 641Processing group 602 of 641Processing group 603 of 641Processing group 604 of 641Processing group 605 of 641Processing group 606 of 641Processing group 607 of 641Processing group 608 of 641Processing group 609 of 641Processing group 610 of 641Processing group 611 of 641Processing group 612 of 641Processing group 613 of 641Processing group 614 of 641Processing group 615 of 641Processing group 616 of 641Processing group 617 of 641Processing group 618 of 641Processing group 619 of 641Processing group 620 of 641Processing group 621 of 641Processing group 622 of 641Processing group 623 of 641Processing group 624 of 641
## Warning in dnearneigh(cbind(data.sub$Longitude, data.sub$Latitude), d1 = 1e-08,
## : neighbour object has 3 sub-graphs
## Processing group 625 of 641Processing group 626 of 641Processing group 627 of 641Processing group 628 of 641Processing group 629 of 641Processing group 630 of 641Processing group 631 of 641Processing group 632 of 641Processing group 633 of 641Processing group 634 of 641Processing group 635 of 641Processing group 636 of 641Processing group 637 of 641
## Warning in dnearneigh(cbind(data.sub$Longitude, data.sub$Latitude), d1 = 1e-08,
## : neighbour object has 20 sub-graphs
## Processing group 638 of 641
## Warning in dnearneigh(cbind(data.sub$Longitude, data.sub$Latitude), d1 = 1e-08,
## : neighbour object has 12 sub-graphs
## Processing group 639 of 641
## Warning in dnearneigh(cbind(data.sub$Longitude, data.sub$Latitude), d1 = 1e-08,
## : neighbour object has 10 sub-graphs
## Processing group 640 of 641Processing group 641 of 641
hist(sat$P,breaks=c(0,0.05,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1),freq=FALSE)
abline(v=0.05,lwd=2,col="#ff0000")
Distribution of P values from a series of tests for spatial autocorrelation in the residuals associated with underlying Study. P values < 0.05 indicate significant spatial autocorrelation
By chance, we would expect to see significant spatial autocorrelation in 5% of cases. Here the residuals associated with 5.5% of studies return a significant spatial autocorrelation test.