Create spatial point dataframe for sPlot data to intersect with spatial layers. Include the fiels `Location uncertainty` to allow for fuzzy matching. Each plot was intersected with the corresponding layer of environmental (soil, climate) attributes accounting for their location uncertainty (minimum set to 250m). For computing reasons, the maximum location uncertainty was set to 10km. The user should therefore be aware that the variability in climate and soil features estimations may be underestimated for plots with very high location uncertainty.
Create spatial point dataframe for sPlot data to intersect with spatial layers. Include the fiels `Location uncertainty` to allow for fuzzy matching. Each plot was intersected with the corresponding layer of environmental (soil, climate) attributes accounting for their location uncertainty (minimum set to 250m). For computing reasons, the maximum location uncertainty was set to 10km. The user should therefore be aware that the variability in climate and soil features estimations may be underestimated for plots with very high location uncertainty.
...
@@ -162,7 +162,7 @@ Show summaries
...
@@ -162,7 +162,7 @@ Show summaries
tmp.sum <- get.summary(chelsa.out)
tmp.sum <- get.summary(chelsa.out)
knitr::kable(tmp.sum,
knitr::kable(tmp.sum,
caption="Summary statistics for chelsa mean statistics") %>%
caption="Summary statistics for chelsa mean statistics", digits = 3) %>%
Fix some errors. There are some plots where only p\\a information is available (`Cover code`=="x"), but have zeros in the field `Cover %`. Consider this as presence\\absence and transform `Cover %` to 1.
Fix some errors. There are some plots where only p\\a information is available (`Cover code=="x"`), but have all zeros in the field `Cover %`. Consider this as presence\\absence and transform `Cover %` to 1.
```{r}
```{r}
DT1 <- DT1 %>%
DT1 <- DT1 %>%
mutate(`Cover %`=replace(`Cover %`,
mutate(`Cover %`=replace(`Cover %`,
...
@@ -333,7 +330,7 @@ DT1 <- DT1 %>%
...
@@ -333,7 +330,7 @@ DT1 <- DT1 %>%
pull(PlotObservationID))),
pull(PlotObservationID))),
values=1))
values=1))
```
```
For all plot-layer combinations where only p\\a information is available (`Cover code`=="x"), and all the entries of the field `Cover % == 1`. Consider this as presence\\absence and transform `Ab_scale` to "pa". This is done to avoid confusion with plots where `Cover code=="x"` but "x" has to be intended as a class in the cover scale used. For p\\a plots, replace the field `Cover %` with 0, and assign the value 1 to the field `x_`.
Consider all plot-layer combinations where `Cover code=="x"`, and all the entries of the field `Cover % == 1` as presence\\absence data, and transform `Ab_scale` to "pa". This is done to avoid confusion with plots where `Cover code=="x"` but "x" has to be intended as a class in the cover scale used. For p\\a plots, replace the field `Cover %` with NA, and assign the value 1 to the field `x_`.
```{r}
```{r}
#plots with at least one entry in Cover code=="x"
#plots with at least one entry in Cover code=="x"
sel <- DT1 %>%
sel <- DT1 %>%
...
@@ -389,7 +386,7 @@ DT1 <- DT1 %>%
...
@@ -389,7 +386,7 @@ DT1 <- DT1 %>%
Double check and summarize `abundance_scales`
Double check and summarize `Ab_scales`
```{r}
```{r}
scale_check <- DT1 %>%
scale_check <- DT1 %>%
distinct(PlotObservationID, Layer, Ab_scale) %>%
distinct(PlotObservationID, Layer, Ab_scale) %>%
...
@@ -414,11 +411,13 @@ DT1 <- DT1 %>%
...
@@ -414,11 +411,13 @@ DT1 <- DT1 %>%
by=c("PlotObservationID")) %>%
by=c("PlotObservationID")) %>%
mutate(Relative.cover=Abundance/tot.abundance)
mutate(Relative.cover=Abundance/tot.abundance)
# check: there should be no plot where the sum of all relative covers !=0
# 3 Classify plots in `is.forest` or `is.non.forest` based on species traits
# 3 Classify plots in `is.forest` or `is.non.forest` based on species traits
sPlot has two independent systems for classifying plots to vegetation types. The first, classifies plots into forest and non-forest, based on the share of trees, and the layering of vegetation. The second system classifies plots into broad habitat types and relies on the expert opinion of data contributors. This is, unfortunately, not consistently available across all plots, being the large majority of classified plots only available for Europe. These broad habitat types are coded using 5, non-mutually exclusive dummy variables:
sPlot has two independent systems for classifying plots to vegetation types. The first relies on the expert opinion of data contributors and classifies plots into broad habitat types. These broad habitat types are coded using 5, non-mutually exclusive dummy variables:
1) Forest - F
1) Forest
2) Grassland - G
2) Grassland
3) Shrubland - S
3) Shrubland
4) Sparse vegetation - B (Bare)
4) Sparse vegetation
5) Wetland - W
5) Wetland
A plot may belong to more than one formation, e.g. a Savannah is categorized as Forest + Grassland (FG).
A plot may belong to more than one formation, e.g. a Savannah is categorized as Forest + Grassland (FG). This system is, unfortunately, not consistently available across all plots, being the large majority of classified plots only available for Europe.
\newline\newline
There is therefore the need to give at least some indication to the remaining unclassified plots. To achieve this, already from v2.1, sPlot started using a classification into forest and non-forest, based on the share of trees, and the layering of vegetation. Here, we derived the (mutually exclusive) `is.forest` and `is.non.forest` classification of plots.
Derive the `if.forest` and `is.non.forest` classification of plots.
## 3.1 Derive species level information on Growth Forms
## 3.1 Derive species level information on Growth Forms.
We used different sources of information:
We used different sources of information:
1) Data from the gap-filled trait matrix
1) Data from the gap-filled trait matrix
2) Manual cleaning of the most common species for which growth trait info is not available
2) Manual cleaning of the most common species for which growth trait info is not available
...
@@ -547,7 +563,7 @@ write_csv(top.gf.nas %>%
...
@@ -547,7 +563,7 @@ write_csv(top.gf.nas %>%
filter(n>1000),
filter(n>1000),
path="../_derived/Species_missingGF.csv")
path="../_derived/Species_missingGF.csv")
```
```
The first `r nrow(top.gf.nas)` species account for `r sum(top.gf.nas %>% filter(n>1000) %>% pull(n))/sum(top.gf.nas$n)*100`% of the missing records. Assign growth forms manually, reimport and coalesce into `DT.gf`
The first `r nrow(top.gf.nas)` species account for `r round(sum(top.gf.nas %>% filter(n>1000) %>% pull(n))/sum(top.gf.nas$n)*100,2)`% of the missing records. Assign growth forms manually, reimport and coalesce into `DT.gf`