knitr::opts_chunk$set(echo = FALSE,fig.height = 6, fig.width = 11, fig.align = "center")
library(dplyr)
library(knitr)
library(plotly)
library (sf)
library(caret)
library(corrplot)
library(ggplot2)
library(kableExtra)
setwd("C:/Users/user/OneDrive/ABMI/R_scripts")Study Area: Boreal Pilot Area, 3.7 million hectares in northern Alberta north of Athabasca, east of Slave Lake, and south of Fort McMurray
Training Data: 12,672 random points from interpreted photo 3 by 7 km photo-plots distributed across study area Spectral Data: - Sentinel-1 Summer 2021 and Winter 2020-2021 mean composites and derived indices - Sentinel-2 Summer 2019-2021 and Autumn 2019-2021 mean composites and derived indices - Compiled in Google Earth Engine
Objected Based Sampling Means and standard deviations of clusters created at 5m scale in Google Earth Engine. The clusters (objects) average 2 hectares in size, with a minimum of 25 sq.m and a maximum of 9.8 ha.
d <- read.csv("trainPoints_pilot_2.csv")
d <- as.data.frame(d)
## Summary of the number of points of each class
summary <- d %>% group_by(Class2) %>% summarize(n())
kable(summary) %>% kable_styling(bootstrap_options = "striped", font_size = 14)| Class2 | n() |
|---|---|
| ag | 251 |
| conifer | 5441 |
| decid | 4969 |
| grass | 701 |
| imperv | 10 |
| mixedwood | 1356 |
| shrub | 428 |
| water | 413 |
#head (d)
dd <- subset (d, select = -c(system.index,
OBJECTID, .geo))
d <- na.omit(dd)#Create a data frame to store the mean spectral reflectance
msr <-aggregate (d, list(d$Class2), mean, na.rm = TRUE)
#remove the first column in order to use the actual land cover names
rownames(msr)<-msr[,1]
msr<-msr[,-1]### Spectral Profile function
specProfile <-function(varsList, titleVar, ylimits){
msrSub<-msr %>% select(all_of(varsList))
num <-length(varsList)
#create a matrix
msrSub <-as.matrix((msrSub))
#Create a land cover color palette
mycolor <- c("red", "darkgreen", "orange", "yellow", "grey", "green", "purple", "blue")
#Create an empty plot
plot(1, ylim = ylimits, xlim = c(1,num), xlab = "SAR Deriviatives", ylab = "Backscatter", xaxt= 'n')
#custom x-axis
axis(1, at=1: num, lab=colnames(msrSub))
#add spectral reflectance
for (i in 1: nrow(msrSub)){
lines(msrSub[i,], type = "o", lwd = 3, lty = 1, col = mycolor[i])
}
title(main = paste(titleVar), font.main = 2)
legend("bottom", rownames(msr), cex=0.8, col= mycolor, lty= 1, lwd=3, bty = "n", ncol = 3)
}
SARmeans <- c("VH_Summer_mean", "VH_Winter_mean",
"VV_Summer_mean", "VV_Winter_mean",
"DPOL_Summer_mean","DPOL_Winter_mean",
"DPSVI_Summer_mean", "DPSVI_Winter_mean"
)
varsList <-SARmeans
titleVar <- "Sentinel-1 SAR Cluster Means"
ylimits <- c(-35,0)
specProfile(varsList, titleVar, ylimits)SARsd <- c("VH_Summer_stdDev", "VH_Winter_stdDev",
"VV_Summer_stdDev", "VV_Winter_stdDev",
"DPOL_Summer_stdDev","DPOL_Winter_stdDev",
"DPSVI_Summer_stdDev", "DPSVI_Winter_stdDev"
)
varsList <-SARsd
titleVar <- "Sentinel-1 SAR Cluster Standard Deviations"
ylimits <-c(0,3.5)
specProfile(varsList, titleVar, ylimits)#function densplot
densPlot <-function(varsList){
t <-d %>% select("Class2", (all_of(varsList)))
num <-length(varsList)+1
featurePlot(x = t[,2:num],
y= as.factor(t$Class2),
plot = "density",
labels = c("Backscatter / Standard Deviation", "Density Distribution"),
scales = list(x=list(relation="free"), y = list(relation= "free")),
layout = c(2,1),
auto.key = list(columns = 3),
#par.settings = list(superpose.line = list(col = c("red", "orange", "yellow", "purple", "Blue", "grey", "darkgreen", "green "))),
par.settings = list(superpose.line = list(col = c("red", "darkgreen", "orange", "yellow", "grey", "green", "purple", "blue"))),
)
}
SARvars <- c("VH_Summer_mean", "VH_Summer_stdDev", "VH_Winter_mean","VH_Winter_stdDev", "deltaVH_mean", "deltaVH_stdDev",
"VV_Summer_mean","VV_Summer_stdDev", "VV_Winter_mean","VV_Winter_stdDev", "deltaVV_mean", "deltaVV_stdDev",
"DPOL_Summer_mean","DPOL_Summer_stdDev","DPOL_Winter_mean","DPOL_Winter_stdDev","deltaDPOL_mean", "deltaDPOL_stdDev",
"DPSVI_Summer_mean","DPSVI_Summer_stdDev", "DPSVI_Winter_mean","DPSVI_Winter_stdDev", "deltaDPSVI_mean", "deltaDPSVI_stdDev"
)
varsList <-SARvars
densPlot (varsList)#function boxy
boxy <-function(varsList){
t <-d %>% select("Class2", (all_of(varsList)))
num <-length(varsList)+1
featurePlot(x = t[,2:num],
y= as.factor(t$Class2),
plot = "box",
scales = list( y = list(relation= "free"), x=list(rot=90)),
layout = c(4,1),
)
}
SARvars <- c("VH_Summer_mean", "VH_Summer_stdDev", "VH_Winter_mean","VH_Winter_stdDev", "deltaVH_mean", "deltaVH_stdDev",
"VV_Summer_mean","VV_Summer_stdDev", "VV_Winter_mean","VV_Winter_stdDev", "deltaVV_mean", "deltaVV_stdDev",
"DPOL_Summer_mean","DPOL_Summer_stdDev","DPOL_Winter_mean","DPOL_Winter_stdDev","deltaDPOL_mean", "deltaDPOL_stdDev",
"DPSVI_Summer_mean","DPSVI_Summer_stdDev", "DPSVI_Winter_mean","DPSVI_Winter_stdDev", "deltaDPSVI_mean", "deltaDPSVI_stdDev"
)
varsList <-SARvars
boxy (varsList)RSvars <-SARvars
for (i in 1:length(RSvars)){
var <- RSvars[i]
print(
ggplot(d, aes_string(x = "Class2", y = var, fill = "Class2")) +
geom_violin() +
scale_fill_manual(name = "", values=c('red', 'darkgreen', 'orange', 'yellow', 'grey', "green", "purple", "blue")) +
xlab("Class2")+
labs(title = (var))
)
}#function Correlate
Correlate <-function(varsList){
t <-d %>% select("Class2", (all_of(varsList)))
num <-length(varsList)+1
bandCorrelationsS1<-cor(t[,2:num])
corrplot.mixed(bandCorrelationsS1, lower="number",tl.pos = 'lt', upper = "color", order="hclust" )
}
varsList <- c(SARmeans, "deltaVV_mean", "deltaVH_mean", "deltaDPOL_mean", "deltaDPSVI_mean")
Correlate (varsList)varsList <- c(SARsd, "deltaVV_stdDev", "deltaVH_stdDev", "deltaDPOL_stdDev", "deltaDPSVI_stdDev")
Correlate (varsList)varsList <-SARvars
t <-d %>% select("Class2", (all_of(varsList)))
num <-length(varsList)+1
bandCorrelationsS1<-cor(t[,2:num])
write.table(bandCorrelationsS1, file = "bandCorS1all.txt", sep = ",")### Spectral Profile function
specProfile <-function(varsList, titleVar, ylimits){
msrSub<-msr %>% select(all_of(varsList))
num <-length(varsList)
#create a matrix
msrSub <-as.matrix((msrSub))
#Create a land cover color palette
mycolor <- c("red", "darkgreen", "orange", "yellow", "grey", "green", "purple", "blue")
#Create an empty plot
plot(1, ylim = ylimits, xlim = c(1,num), xlab = "Bands", ylab = "Reflectance", xaxt= 'n')
#custom x-axis
axis(1, at=1: num, lab=colnames(msrSub))
#add spectral reflectance
for (i in 1: nrow(msrSub)){
lines(msrSub[i,], type = "o", lwd = 3, lty = 1, col = mycolor[i])
}
title(main = paste(titleVar), font.main = 2)
legend("top", rownames(msr), cex=0.8, col= mycolor, lty= 1, lwd=3, bty = "n", ncol = 4)
}
#
## S2 Bands -Summer Mean
RSvars <- c("blue_mean", "green_mean", "red_mean", "re1_mean", "re2_mean", "re3_mean", "nir_mean", "nir2_mean", "swir1_mean", "swir2_mean"
)
varsList <-RSvars
titleVar <-"Sentinel-2 Band Means - Summer"
ylimits <- c(0,0.4)
specProfile(varsList, titleVar, ylimits)## Summer SD
varsList <-c("blue_stdDev", "green_stdDev", "red_stdDev", "re1_stdDev", "re2_stdDev", "re3_stdDev", "nir_stdDev", "nir2_stdDev", "swir1_stdDev", "swir2_stdDev"
)
titleVar <- "Sentinel-2 Summer Bands Within-Cluster Standard Deviations"
ylimits <-c(0,0.05)
specProfile(varsList, titleVar, ylimits)## S2 Bands -Fall
RSvars <- c("blue_1_mean", "green_1_mean", "red_1_mean", "re1_1_mean", "re2_1_mean", "re3_1_mean", "nir_1_mean", "nir2_1_mean", "swir1_1_mean", "swir2_1_mean"
)
varsList <-RSvars
ylimits <- c(0,0.4)
titleVar <-"Sentinel-2 Band Means - Autumn"
specProfile(varsList, titleVar, ylimits)## Autumn SD
varsList <-c("blue_1_stdDev", "green_1_stdDev", "red_1_stdDev", "re1_1_stdDev", "re2_1_stdDev", "re3_1_stdDev",
"nir_1_stdDev", "nir2_1_stdDev", "swir1_1_stdDev", "swir2_1_stdDev"
)
titleVar <- "Sentinel-2 Autumn Bands Within-Cluster Standard Deviations"
ylimits <-c(0,0.05)
specProfile(varsList, titleVar, ylimits)### Spectral Profile function
specProfile <-function(varsList, titleVar, ylimits){
msrSub<-msr %>% select(all_of(varsList))
num <-length(varsList)
#create a matrix
msrSub <-as.matrix((msrSub))
#Create a land cover color palette
mycolor <- c("red", "darkgreen", "orange", "yellow", "grey", "green", "purple", "blue")
#Create an empty plot
plot(1, ylim = ylimits, xlim = c(1,num), xlab = "Indices", ylab = "DN", xaxt= 'n')
#custom x-axis
axis(1, at=1: num, lab=colnames(msrSub))
#add spectral reflectance
for (i in 1: nrow(msrSub)){
lines(msrSub[i,], type = "o", lwd = 3, lty = 1, col = mycolor[i])
}
title(main = paste(titleVar), font.main = 2)
legend("top", rownames(msr), cex=0.8, col= mycolor, lty= 1, lwd=3, bty = "n", ncol = 4)
}
## Optical indices - Summer
RSvars <- c("NDVI_mean","NDVI705_mean", "EVI_mean", "NDWI_mean", "NDWI2_mean", "NBR_mean", "nARI_mean", "IRECI_mean"
)
varsList <-RSvars
titleVar <-"Sentinel-2 Optical Indexes - Summer"
ylimits <- c(-1.0,1.0)
specProfile(varsList, titleVar, ylimits)## Summer SD
varsList <-c("NDVI_stdDev","NDVI705_stdDev", "EVI_stdDev", "NDWI_stdDev", "NDWI2_stdDev", "NBR_stdDev", "nARI_stdDev", "IRECI_stdDev"
)
titleVar <- "Summer Indices Within-Cluster Standard Deviations"
ylimits <-c(0,0.1)
specProfile(varsList, titleVar, ylimits)## Optical indices - Autumn
RSvars <- c("NDVI_1_mean","NDVI705_1_mean", "EVI_1_mean", "NDWI_1_mean", "NDWI2_1_mean", "NBR_1_mean", "nARI_1_mean", "IRECI_1_mean"
)
varsList <-RSvars
ylimits <- c(-1.0,1.0)
titleVar <-"Sentinel-2 Optical Indexes - Autumn"
specProfile(varsList, titleVar, ylimits)## Autumn SD
varsList <-c("NDVI_1_stdDev","NDVI705_1_stdDev", "EVI_1_stdDev", "NDWI_1_stdDev", "NDWI2_1_stdDev", "NBR_1_stdDev", "nARI_1_stdDev", "IRECI_1_stdDev"
)
titleVar <- "Autumn Indices Within-Cluster Standard Deviations"
ylimits <-c(0,0.1)
specProfile(varsList, titleVar, ylimits)#function densplot
densPlot <-function(varsList){
t <-d %>% select("Class2", (all_of(varsList)))
num <-length(varsList)+1
featurePlot(x = t[,2:num],
y= as.factor(t$Class2),
plot = "density",
labels = c("Reflectance / Standard Deviation", "Density Distribution"),
scales = list(x=list(relation="free"), y = list(relation= "free")),
layout = c(2,1),
auto.key = list(columns = 3),
lwd = 2,
#par.settings = list(superpose.line = list(col = c("red", "orange", "yellow", "purple", "Blue", "grey", "darkgreen", "green "))),
par.settings = list(superpose.line = list(col = c("red", "darkgreen", "orange", "yellow", "grey", "green", "purple", "blue"))),
)
}
S2varsSum <- c("blue_mean", "blue_stdDev","green_mean", "green_stdDev","red_mean", "red_stdDev",
"re1_mean", "re1_stdDev","re2_mean", "re2_stdDev","re3_mean", "re3_stdDev",
"nir_mean", "nir_stdDev","nir2_mean", "nir2_stdDev",
"swir1_mean", "swir1_stdDev","swir2_mean", "swir2_stdDev"
)
varsList <-S2varsSum
densPlot (varsList)S2varsFall <- c(
"blue_1_mean", "blue_1_stdDev","green_1_mean", "green_1_stdDev","red_1_mean", "red_1_stdDev",
"re1_1_mean", "re1_1_stdDev","re2_1_mean", "re2_1_stdDev","re3_1_mean", "re3_1_stdDev",
"nir_1_mean", "nir_1_stdDev","nir2_1_mean", "nir2_1_stdDev",
"swir1_1_mean", "swir1_1_stdDev","swir2_1_mean", "swir2_1_stdDev"
)
varsList <-S2varsFall
densPlot (varsList)IndvarsSum <- c("NDVI_mean","NDVI_stdDev", "NDVI705_mean", "NDVI705_stdDev","EVI_mean", "EVI_stdDev",
"NDWI_mean","NDWI_stdDev", "NDWI2_mean", "NDWI2_stdDev","NBR_mean", "NBR_stdDev","nARI_mean","nARI_stdDev","REIP_mean", "REIP_stdDev","IRECI_mean","IRECI_stdDev"
)
varsList <-IndvarsSum
densPlot (varsList)IndvarsFall <- c("NDVI_1_mean","NDVI_1_stdDev","NDVI705_1_mean","NDVI705_1_stdDev", "EVI_1_mean","EVI_1_stdDev",
"NDWI_1_mean", "NDWI_1_stdDev","NDWI2_1_mean","NDWI2_1_stdDev", "NBR_1_mean", "NBR_1_stdDev","nARI_1_mean","nARI_1_stdDev", "REIP_1_mean", "REIP_1_stdDev", "IRECI_1_mean","IRECI_1_stdDev"
)
varsList <-IndvarsFall
densPlot (varsList)#function boxy
boxy <-function(varsList){
t <-d %>% select("Class2", (all_of(varsList)))
num <-length(varsList)+1
featurePlot(x = t[,2:num],
y= as.factor(t$Class2),
plot = "box",
scales = list( y = list(relation= "free"), x=list(rot=90)),
layout = c(4,1),
)
}
varsList <-S2varsSum
boxy (varsList)varsList <-S2varsFall
boxy (varsList)bands <- list ("blue", "green", "red", "re1", "re2", "re3", "nir", "nir2","swir1", "swir2")
for (b in bands) {
d[,paste0("diff", b, sep = "")]<- d[,paste0(b,"_mean", sep = "")]-d[,paste0( b, "_1_mean", sep = "")]
}
Diffvars <- c("diffblue", "diffgreen", "diffred", "diffre1", "diffre2",
"diffre3", "diffnir", "diffnir2", "diffswir1", "diffswir2")
varsList <-Diffvars
boxy (varsList)varsList <- c(IndvarsSum, IndvarsFall)
boxy (varsList)bands <- list ("NDVI", "NDVI705", "EVI", "NDWI", "NDWI2", "NBR", "nARI",
"REIP", "IRECI")
for (b in bands) {
d[,paste0("diff", b, sep = "")]<- d[,paste0(b,"_mean", sep = "")]-d[,paste0( b, "_1_mean", sep = "")]
}
Inddiff <- c("diffNDVI", "diffNDVI705", "diffEVI", "diffNDWI", "diffNDWI2", "diffNBR", "diffnARI",
"diffREIP", "diffIRECI"
)
varsList <-Inddiff
boxy (varsList)RSvars <-S2varsSum
for (i in 1:length(RSvars)){
var <- RSvars[i]
print(
ggplot(d, aes_string(x = "Class2", y = var, fill = "Class2")) +
geom_violin() +
scale_fill_manual(name = "", values=c('red', 'darkgreen', 'orange', 'yellow', 'grey', "green", "purple", "blue")) +
xlab("Class2")+
labs(title = (var))
)
}RSvars <-S2varsFall
for (i in 1:length(RSvars)){
var <- RSvars[i]
print(
ggplot(d, aes_string(x = "Class2", y = var, fill = "Class2")) +
geom_violin() +
scale_fill_manual(name = "", values=c('red', 'darkgreen', 'orange', 'yellow', 'grey', "green", "purple", "blue")) +
xlab("Class2")+
labs(title = (var))
)
}RSvars <-Diffvars
for (i in 1:length(RSvars)){
var <- RSvars[i]
print(
ggplot(d, aes_string(x = "Class2", y = var, fill = "Class2")) +
geom_violin() +
xlab("Class2")+
scale_fill_manual(name = "", values=c('red', 'darkgreen', 'orange', 'yellow', 'grey', "green", "purple", "blue")) +
labs(title = paste("Seasonal Difference ", toupper(substring(var,first = 5))))
)
}RSvars <-IndvarsSum
for (i in 1:length(RSvars)){
var <- RSvars[i]
print(
ggplot(d, aes_string(x = "Class2", y = var, fill = "Class2")) +
geom_violin() +
scale_fill_manual(name = "", values=c('red', 'darkgreen', 'orange', 'yellow', 'grey', "green", "purple", "blue")) +
xlab("Class2")+
labs(title = (var))
)
}RSvars <-IndvarsFall
for (i in 1:length(RSvars)){
var <- RSvars[i]
print(
ggplot(d, aes_string(x = "Class2", y = var, fill = "Class2")) +
geom_violin() +
scale_fill_manual(name = "", values=c('red', 'darkgreen', 'orange', 'yellow', 'grey', "green", "purple", "blue")) +
xlab("Class2")+
labs(title = (var))
)
}RSvars <-Inddiff
for (i in 1:length(RSvars)){
var <- RSvars[i]
print(
ggplot(d, aes_string(x = "Class2", y = var, fill = "Class2")) +
geom_violin() +
xlab("Class2")+
scale_fill_manual(name = "", values=c('red', 'darkgreen', 'orange', 'yellow', 'grey', "green", "purple", "blue")) +
labs(title = paste("Seasonal Difference ", substring(var,first = 5)))
)
}#function Correlate
Correlate2 <-function(varsList){
t <-d %>% select("Class2", (all_of(varsList)))
num <-length(varsList)+1
bandCorrelationsS2<-cor(t[,2:num])
corrplot.mixed(bandCorrelationsS2, lower="number",tl.pos = 'lt', upper = "color" )
}
# S2 band means summer
S2meansSumm <- c("blue_mean", "green_mean", "red_mean", "re1_mean", "re2_mean", "re3_mean", "nir_mean", "nir2_mean", "swir1_mean", "swir2_mean")
Correlate2 (S2meansSumm )# S2 band means autumn
S2meansFall <- c("blue_1_mean", "green_1_mean", "red_1_mean", "re1_1_mean", "re2_1_mean", "re3_1_mean", "nir_1_mean", "nir2_1_mean", "swir1_1_mean", "swir2_1_mean")
Correlate2 (S2meansFall)# Difference variables
varsList <- Diffvars
Correlate2 (varsList)#Indices
IndMeansSum <- c("NDVI_mean","NDVI705_mean", "EVI_mean", "NDWI_mean", "NDWI2_mean", "NBR_mean", "nARI_mean", "IRECI_mean"
)
Correlate (IndMeansSum)IndMeanFall <- c("NDVI_1_mean","NDVI705_1_mean", "EVI_1_mean", "NDWI_1_mean", "NDWI2_1_mean", "NBR_1_mean", "nARI_1_mean", "IRECI_1_mean")
Correlate (IndMeanFall)varsList <- Inddiff
Correlate2 (varsList) # varsList <- c(Indvars, Inddiff)
# Correlate2 (varsList)
# varsList <-c(S2vars, Indvars, Diffvars, Inddiff)
# t <-d %>% select("Class2", (all_of(varsList)))
# num <-length(varsList)+1
# bandCorrelationsS2all<-cor(t[,2:num])
# write.table(bandCorrelationsS2all, file = "bandCorS2all.txt", sep = ",")#function densplot
densPlot <-function(varsList){
t <-d %>% select("Class2", (all_of(varsList)))
num <-length(varsList)+1
featurePlot(x = t[,2:num],
y= as.factor(t$Class2),
plot = "density",
labels = c("", "Density Distribution"),
scales = list(x=list(relation="free"), y = list(relation= "free")),
layout = c(2,1),
auto.key = list(columns = 3),
#par.settings = list(superpose.line = list(col = c("red", "orange", "yellow", "purple", "Blue", "grey", "darkgreen", "green "))),
par.settings = list(superpose.line = list(col = c("red", "darkgreen", "orange", "yellow", "grey", "green", "purple", "blue"))),
)
}
htvars <- c("SWI_mean", "SWI_stdDev", "TPI250_mean", "TPI250_stdDev", "TPI500_mean", "TPI500_stdDev","TPI750_mean", "TPI750_stdDev",
"TRI_mean", "TRI_stdDev", "VBF_mean", "VBF_stdDev", "CanHt_mean", "CanHt_stdDev")
varsList <-htvars
densPlot (varsList)varsList <-htvars
boxy (varsList)RSvars <-htvars
for (i in 1:length(RSvars)){
var <- RSvars[i]
print(
ggplot(d, aes_string(x = "Class2", y = var, fill = "Class2")) +
geom_violin() +
scale_fill_manual(name = "", values=c('red', 'darkgreen', 'orange', 'yellow', 'grey', "green", "purple", "blue")) +
xlab("Class2")+
labs(title = (var))
)
}varsList <- htvars
Correlate (varsList)# varsList <-htvars
# t <-d %>% select("Class2", (all_of(varsList)))
# num <-length(varsList)+1
# bandCorrelations<-cor(t[,2:num])
# write.table(bandCorrelations, file = "bandCorHtall.txt", sep = ",")