diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5b6a065 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.Rproj.user +.Rhistory +.RData +.Ruserdata diff --git a/src/000_set_environment.R b/src/000_set_environment.R new file mode 100644 index 0000000..015ddd4 --- /dev/null +++ b/src/000_set_environment.R @@ -0,0 +1,80 @@ +# Set path --------------------------------------------------------------------- +if(Sys.info()["sysname"] == "Windows"){ + filepath_base = "D:/plygrnd/hySpecVisKili/" +} else { + filepath_base = "/mnt/sd19006/data/users/tnauss/KI-Hyperspec/" +} + +filepath_source = paste0(filepath_base, "hySpecVisKili/src/functions/001_functions.R") +path_data = paste0(filepath_base, "/data/") +path_biodiv = paste0(path_data, "/biodiv/") + +path_hyp_org = paste0(path_data, "/020_hypspec_org/") +path_hyp_aio = paste0(path_data, "/025_hypspec_aio/") +path_hyp_nrm = paste0(path_data, "/030_hypspec_nrm/") +path_hyp_vegidcs = paste0(path_data, "/040_hypspec_vegidcs/") +path_hyp_kmdc = paste0(path_data, "/050_hypspec_kmdc/") +path_hyp_raoq = paste0(path_data, "/060_hypspec_raoq/") +path_hyp_glcm = paste0(path_data, "/070_hypspec_glcm/") +path_hyp_pred = paste0(path_data, "/090_hypspec_pred/") +path_ldr_pred = paste0(path_data, "/095_lidar_pred/") +path_comb_gpm_sr = paste0(path_data, "/100_comb_gpm_sr/") +path_model_gpm_sr = paste0(path_data, "/110_model_gpm_sr/") +path_compile_analysis_sr = paste0(path_data, "/120_compile_analysis_sr/") +path_comb_gpm_sr_res = paste0(path_data, "/200_comb_gpm_sr_res/") +path_model_gpm_sr_res = paste0(path_data, "/210_model_gpm_sr_res/") +path_compile_analysis_sr_elev_res = paste0(path_data, "/220_compile_analysis_sr_elev_res/") +path_model_gpm_sr_indp = paste0(path_data, "/300_model_gpm_sr_indp/") +path_comb_gpm_sr_elev_res_indp = paste0(path_data, "/310_comb_gpm_sr_elev_res_indp/") +path_model_gpm_sr_elev_res_indp = paste0(path_data, "/320_model_gpm_sr_elev_res_indp/") +path_analysis_sr = paste0(path_data, "/500_analysis_sr/") +path_analysis_sr_elev_res = paste0(path_data, "/510_analysis_sr_elev_res/") + +path_plots = paste0(path_data, "/plots/") +path_rdata = paste0(path_data, "/rdata/") +path_meta = paste0(path_data, "/meta/") +path_temp = paste0(path_data, "/temp/") +path_output = paste0(path_data, "/output/") +path_vis = paste0(path_data, "/vis/") + + +# Set libraries ---------------------------------------------------------------- +library(biodivTools) # devtools::install_github("environmentalinformatics-marburg/biodivTools") +library(CAST) +library(corrplot) +library(doParallel) +library(grid) +library(gridExtra) +library(gpm) # devtools::install_github("environmentalinformatics-marburg/gpm") +library(ggplot2) +# library(ggbiplot) +library(hsdar) +# library(lavaan) +# library(rPointDB) +library(rgeos) +library(ggplot2) +library(mapview) +# library(metTools) # devtools::install_github("environmentalinformatics-marburg/metTools") +library(raster) +library(RStoolbox) +library(reshape2) +library(rgdal) +# library(satellite) +library(satelliteTools) # devtools::install_github("environmentalinformatics-marburg/satelliteTools") +# library(semPlot) +library(sp) +library(spacetime) +library(vegan) +# library(yaml) + + +# Other settings --------------------------------------------------------------- +source(filepath_source) + +rasterOptions(tmpdir = path_temp) + +saga_cmd = "C:/OSGeo4W64/apps/saga-ltr/saga_cmd.exe" +# initOTB("C:/OSGeo4W64/bin/") +# initOTB("C:/OSGeo4W64/OTB-6.2.0-Win64/bin/") + + diff --git a/src/000_set_environment_linux.R b/src/000_set_environment_linux.R new file mode 100644 index 0000000..3c06631 --- /dev/null +++ b/src/000_set_environment_linux.R @@ -0,0 +1,77 @@ +# Set path --------------------------------------------------------------------- +if(Sys.info()["sysname"] == "Windows"){ + filepath_base = "D:/plygrnd/hySpecVisKili/" +} else { + filepath_base = "/mnt/sd19006/data/users/tnauss/KI-Hyperspec/" +} + +filepath_source = paste0(filepath_base, "hySpecVisKili/src/functions/001_functions.R") +path_data = paste0(filepath_base, "/data/") +path_biodiv = paste0(path_data, "/biodiv/") + +path_hyp_org = paste0(path_data, "/020_hypspec_org/") +path_hyp_aio = paste0(path_data, "/025_hypspec_aio/") +path_hyp_nrm = paste0(path_data, "/030_hypspec_nrm/") +path_hyp_vegidcs = paste0(path_data, "/040_hypspec_vegidcs/") +path_hyp_kmdc = paste0(path_data, "/050_hypspec_kmdc/") +path_hyp_raoq = paste0(path_data, "/060_hypspec_raoq/") +path_hyp_glcm = paste0(path_data, "/070_hypspec_glcm/") +path_hyp_pred = paste0(path_data, "/090_hypspec_pred/") +path_ldr_pred = paste0(path_data, "/095_lidar_pred/") +path_comb_gpm_sr = paste0(path_data, "/100_comb_gpm_sr/") +path_model_gpm_sr = paste0(path_data, "/110_model_gpm_sr/") +path_compile_analysis_sr = paste0(path_data, "/120_compile_analysis_sr/") +path_comb_gpm_sr_res = paste0(path_data, "/200_comb_gpm_sr_res/") +path_model_gpm_sr_res = paste0(path_data, "/210_model_gpm_sr_res/") +path_compile_analysis_sr_elev_res = paste0(path_data, "/220_compile_analysis_sr_elev_res/") +path_model_gpm_sr_indp = paste0(path_data, "/300_model_gpm_sr_indp/") +path_comb_gpm_sr_elev_res_indp = paste0(path_data, "/310_comb_gpm_sr_elev_res_indp/") +path_model_gpm_sr_elev_res_indp = paste0(path_data, "/320_model_gpm_sr_elev_res_indp/") +path_analysis_sr = paste0(path_data, "/500_analysis_sr/") +path_analysis_sr_elev_res = paste0(path_data, "/510_analysis_sr_elev_res/") + +path_plots = paste0(path_data, "/plots/") +path_rdata = paste0(path_data, "/rdata/") +path_meta = paste0(path_data, "/meta/") +path_temp = paste0(path_data, "/temp/") +path_output = paste0(path_data, "/output/") +path_vis = paste0(path_data, "/vis/") + + +# Set libraries ---------------------------------------------------------------- +#library(biodivTools) # devtools::install_github("environmentalinformatics-marburg/biodivTools") +library(CAST) +# library(corrplot) +library(doParallel) +library(grid) +library(gridExtra) +library(gpm) # devtools::install_github("environmentalinformatics-marburg/gpm") +# library(hsdar) +# library(lavaan) +# library(rPointDB) +# library(rgeos) +# library(ggplot2) +# library(mapview) +# library(metTools) # devtools::install_github("environmentalinformatics-marburg/metTools") +library(raster) +# library(RStoolbox) +library(reshape2) +# library(rgdal) +# library(satellite) +# library(satelliteTools) # devtools::install_github("environmentalinformatics-marburg/satelliteTools") +# library(semPlot) +# library(sp) +# library(spacetime) +# library(vegan) +# library(yaml) + +# Other settings --------------------------------------------------------------- +source(filepath_source) + +rasterOptions(tmpdir = path_temp) + +# saga_cmd = "C:/OSGeo4W64/apps/saga-ltr/saga_cmd.exe" +# initOTB("C:/OSGeo4W64/bin/") +# initOTB("C:/OSGeo4W64/OTB-6.2.0-Win64/bin/") + + diff --git a/src/000_setup_windows.R b/src/000_setup_windows.R new file mode 100644 index 0000000..f89a830 --- /dev/null +++ b/src/000_setup_windows.R @@ -0,0 +1,54 @@ +# Set environment for environmental information systems analysis +require(envimaR) + +root_folder = path.expand("~/plygrnd/hySpecVisKili/") +fcts_folder = file.path(root_folder, "hySpecVisKili/src/functions/") + +project_folders = c("data/", + "data/biodiv", + "data/020_hypspec_org/", + "data/025_hypspec_aio/", + "data/030_hypspec_nrm/", + "data/040_hypspec_vegidcs/", + "data/050_hypspec_kmdc/", + "data/060_hypspec_raoq/", + "data/070_hypspec_glcm/", + "data/090_hypspec_pred/", + "data/100_comb_gpm_sr/", + "data/110_model_gpm_sr/", + "data/120_compile_analysis_sr/", + "data/200_comb_gpm_sr_res/", + "data/210_model_gpm_sr_res/", + "data/220_compile_analysis_sr_elev_res/", + "data/300_model_gpm_sr_indp/", + "data/310_comb_gpm_sr_elev_res_indp/", + "data/320_model_gpm_sr_elev_res_indp/", + "data/500_analysis_sr/", + "data/510_analysis_sr_elev_res/", + "data/plots/", + "data/rdata/", + "data/meta/", + "data/output/", + "data/vis/", + "data/temp/") + +libs = c("biodivTools", "CAST", "corrplot", "doParallel", "grid", "gridExtra", + "gpm", "ggplot2", "hsdar", "rgeos", "ggplot2", "mapview", + "raster", "RStoolbox", "reshape2", "rgdal", "satelliteTools", "sp", + "spacetime", "vegan") + +envrmt = createEnvi(root_folder = root_folder, + fcts_folder = fcts_folder, + folders = project_folders, + path_prefix = "path_", libs = libs, + alt_env_id = "COMPUTERNAME", alt_env_value = "PCRZP", + alt_env_root_folder = "F:\\BEN\\edu") + +# More settings +rasterOptions(tmpdir = envrmt$path_temp) +mapviewOptions(basemaps = mapviewGetOption("basemaps")[c(3, 1:2, 4:5)]) +saga_cmd = "C:/OSGeo4W64/apps/saga-ltr/saga_cmd.exe" +# initOTB("C:/OSGeo4W64/bin/") +initOTB("C:/OSGeo4W64/OTB-6.2.0-Win64/bin/") + + diff --git a/src/010_biodiv_preprocessing.R b/src/010_biodiv_preprocessing.R new file mode 100644 index 0000000..38c8dd9 --- /dev/null +++ b/src/010_biodiv_preprocessing.R @@ -0,0 +1,179 @@ +# Preprocess biodiversity observations. + +source("D:/plygrnd/hySpecVisKili/hySpecVisKili/src/000_set_environment.R") + + +# Read species richness dataset (Peters et al. 2016) +bd = read.table(paste0(path_biodiv, "Biodiversity_Data_Marcel.csv"), + header = TRUE, sep = ";", dec = ",") + +saveRDS(as.character(bd$plotID), file = paste0(path_biodiv, "biodiv_plots.rds")) +saveRDS(bd, file = paste0(path_biodiv, "biodiv.rds")) + +# Read animal species dataset +ad = read.table(paste0(path_biodiv, "animals_plotIDcomplete_Syn1.csv"), + header = TRUE, sep = ";", dec = ",") + +ad_diet = lapply(unique(ad$taxon), function(t){ + data.frame(taxon = t, + ad$diet) +}) + + + +# Set species number to 0/1 and reduce to complete cases +ad[, 14:73][!is.na(ad[, 14:73]) & ad[, 14:73]>1] = 1 +adc = ad[complete.cases(ad[, 14:73]),] + +# Split into taxon groups +adc_taxl = lapply(unique(adc$taxon), function(t){ + act_level = adc[adc$taxon == t, ] + act_grp = act_level[, 14:73] + rownames(act_grp) = act_level$species + return(t(act_grp)) +}) + +adc_taxl_all = adc[, 14:73] +rownames(adc_all) = adc$species + +adc_taxl = c(list(t(adc_taxl_all)), adc_taxl) +names(adc_taxl) = c("Animals", as.character(unique(adc$taxon))) + +saveRDS(adc_taxl, file = paste0(path_biodiv, "adc_taxl.rds")) + + + +# Split into trophic levels +adc_tlevels = lapply(unique(adc$diet), function(d){ + act_level = adc[adc$diet == d, ] + act_grp = act_level[, 14:73] + rownames(act_grp) = act_level$species + return(t(act_grp)) +}) + +adc_all =adc[, 14:73] +rownames(adc_all) = adc$species + +adc_tlevels = c(list(t(adc_all)), adc_tlevels) +names(adc_tlevels) = c("Animals", as.character(unique(adc$diet))) + +saveRDS(adc_tlevels, file = paste0(path_biodiv, "adc_tlevels.rds")) + + + +# Compute species richness from taxon groups and tropich levels +adc_taxl_sr = data.frame(plotID = rownames(adc_taxl[[1]])) +for(i in seq(length(adc_taxl))){ + adc_taxl_sr[, i+1] = rowSums(adc_taxl[[i]]) + names(adc_taxl_sr)[i+1] = paste0("SR", tolower(names(adc_taxl[i]))) +} + +adc_tlevels_sr = data.frame(plotID = rownames(adc_tlevels[[1]])) +for(i in seq(length(adc_tlevels))){ + adc_tlevels_sr[, i+1] = rowSums(adc_tlevels[[i]]) + names(adc_tlevels_sr)[i+1] = paste0("SR", tolower(names(adc_tlevels[i]))) +} + +adc_sr = merge(adc_tlevels_sr, + adc_taxl_sr[, -grep("SRanimals", colnames(adc_taxl_sr))], + by = "plotID") + +saveRDS(adc_sr, file = paste0(path_biodiv, "adc_sr.rds")) + + + +# Merge species richness data +s_adc_sr = colnames(adc_sr[-grep("plotID", colnames(adc_sr))]) + +colnames(bd)[which("SRsyrphids" == colnames(bd))] = "SRsyrphid_flies" +colnames(bd)[which("SRbats" == colnames(bd))] = "SRinsectivorous_bats" +colnames(bd)[which("SRmammals" == colnames(bd))] = "SRlarge_mammals" +colnames(bd)[which("SRparasitoids" == colnames(bd))] = "SRparasitoid_wasps" +colnames(bd)[which("SRotheraculeata" == colnames(bd))] = "SRaculeate_wasps" +colnames(bd)[which("SRmillipedes" == colnames(bd))] = "SRmilipeds" +colnames(bd)[which("SRsnails" == colnames(bd))] = "SRgastropods" + +s_bd = colnames(bd[, grep("SR", colnames(bd))]) +# which(tolower(s_adc_taxl_sr) %in% tolower(s_bd)) + +species_richness = merge(bd, adc_sr, by = "plotID") +species_richness = species_richness[, -grep("\\.x", colnames(species_richness))] +colnames(species_richness)[grep("\\.y", colnames(species_richness))] = + substr(colnames(species_richness)[grep("\\.y", colnames(species_richness))], 1, + (nchar(colnames(species_richness)[grep("\\.y", colnames(species_richness))])-2)) + +saveRDS(species_richness, file = paste0(path_biodiv, "species_richness.rds")) + + + +# Compute community composition using detrended correspondence analysis +species_composition_dcor = lapply(adc_tlevels, function(l){ + l = l[rowSums(l) > 0, ] + decorana(l) +}) +names(species_composition_dcor) = names(adc_tlevels) +# for(i in seq(5)) plot(species_composition_dcor[[i]], display = "sites") + +saveRDS(species_composition_dcor, file = paste0(path_biodiv, "species_composition_dcor.rds")) + + + +# Compute relative network using PCA +tlevels = colnames(species_richness)[ + seq(grep("SRanimals", colnames(species_richness)), + grep("SRanimals", colnames(species_richness))+4)] + +adn_matrix = matrix(ncol = 5, nrow = 60) +for(i in seq(5)){ + adn_matrix[, i] = species_richness[, tlevels[i]] +} +rownames(adn_matrix) <- species_richness$plotID +colnames(adn_matrix ) <- tlevels + +species_network_pca <- princomp(adn_matrix[,-1], cor=T) + +# biplot(species_network_pca, choices = 2:3) +# summary(species_network_pca) + +saveRDS(species_network_pca, file = paste0(path_biodiv, "species_network_pca.rds")) + + +# comb_grigusovaine diversity for Grigusova et al. 2019 +comb_grigusova = data.frame(species_network_pca$scores) +colnames(comb_grigusova) = paste0("sn_pca", seq(4)) +comb_grigusova$plotID = rownames(species_network_pca$scores) + +comb_grigusova = merge(adc_sr, comb_grigusova, by = c("plotID"), all.x = TRUE, all.y = TRUE) + +for(i in seq(length(species_composition_dcor))){ + act = data.frame(species_composition_dcor[[i]]$rproj) + colnames(act) = paste0("sn_dca", seq(4), "_", names(species_composition_dcor[i])) + act$plotID = rownames(act) + comb_grigusova = merge(comb_grigusova, act, by = c("plotID"), all.x = TRUE, all.y = TRUE) +} + +comb_grigusova = droplevels(comb_grigusova) + +saveRDS(comb_grigusova, file = paste0(path_biodiv, "comb_grigusova.rds")) + +# Cross check +# sort(colnames(adc_taxl_sr)) +# sort(colnames(bd[, c(1, grep("SR", colnames(bd)))])) +# +# test = merge(adc_taxl_sr, bd, by = "plotID", all = TRUE) +# +# test_df = lapply(grep("\\.x", colnames(test)), function(t){ +# x = colnames(test)[t] +# y = paste0(substr(x, 1, (nchar(x)-1)), "y") +# act_df = data.frame(plotID = test$plotID, test[, x], test[, y]) +# colnames(act_df) = c("plotId", x, y) +# return(act_df) +# }) +# test_df + + + + + + + diff --git a/src/020_rasterdb_hyperspectral_processing.R b/src/020_rasterdb_hyperspectral_processing.R new file mode 100644 index 0000000..33a044a --- /dev/null +++ b/src/020_rasterdb_hyperspectral_processing.R @@ -0,0 +1,79 @@ +# Extract hyperspectral data from database using a buffer of 100 m in diameter +# arround the center of each observation plot. + +source("C:/Users/tnauss/permanent/plygrnd/KI-Hyperspec/HySpec_KiLi/src/000_set_environment.R") + +# Set account +userpwd <- "thomas.nauss:cd7dLfgm" # use this account (if not loaded from file) + +# Open remote sensing database +remotesensing <- RemoteSensing$new("http://137.248.191.215:8081", userpwd) # remote server + +# Get rasterdb +dbs = c("kili_campaign1_hyperspectral_lvl3_2015", "kili_campaign2_hyperspectral_lvl3_2016") +for(db in dbs){ + dir.create(paste0(path_hyp_org, db), + showWarnings = FALSE) + rasterdb <- remotesensing$rasterdb(db) + bands = rasterdb$bands + saveRDS(bands, + file = paste0(path_hyp_org, db, "/bands_", db, ".rds")) + + # Get data + rg = "kili_poi_plots" + pois = remotesensing$poi_group(rg) + for(n in pois$name){ + radius = 100 + if(n == "fer3"){ + radius = 150 + } + poi <- remotesensing$poi(group_name=rg, poi_name=n) + ext <- extent_diameter(poi$x, poi$y, radius) + r <- rasterdb$raster(ext, product="gap_filling(full_spectrum)") + saveRDS(r, file = paste0(path_hyp_org, db, "/", n, ".rds")) + } +} + +# Combine from first and second flight based on filesize +# (non-observed areas have considerably smaller file sizes) +# Use foc1 and foc6 from second flight. +bd_plots = readRDS(paste0(path_biodiv, "biodiv_plots.rds")) +hd_files = list.files(path_hyp_org, recursive = TRUE, full.names = TRUE) +hd_files = hd_files[nchar(basename(hd_files)) == 8] +hd_size = lapply(hd_files, function(f){ + c = if(grepl(dbs[[1]], f)){ + c = dbs[[1]] + } else { + c = dbs[[2]] + } + data.frame(f = f, + s = file.size(f), + c = c, + plotID = substr(basename(f), 1, 4)) +}) +hd_size = do.call("rbind", hd_size) +hd_size_valid = hd_size[hd_size$s > 300000, ] +hd_size_valid$f = as.character(hd_size_valid$f) + +hd_size_valid = hd_size_valid[-grep(paste0(dbs[[1]], "_fill/foc1.rds"), hd_size_valid$f),] +hd_size_valid = hd_size_valid[-grep(paste0(dbs[[1]], "_fill/foc6.rds"), hd_size_valid$f),] + +hd_size_valid = hd_size_valid[substr(basename(hd_size_valid$f), 1, 4) %in% bd_plots,] + +for(f in hd_size_valid$f){ + file.copy(f, paste0(path_hyp_org, "/", basename(f))) +} + + +# Save metadata +# Combine metadata +meta = list(data.frame(hd_size_valid[, c("c", "plotID")], list = 1)) +meta[[1]]$list[meta[[1]]$c == dbs[[2]]] = 2 +meta[[2]] = list(meta_01 = readRDS(paste0(path_hyp_org, dbs[[1]], "_fill/bands_", dbs[[1]], ".rds")), + meta_02 = readRDS(paste0(path_hyp_org, dbs[[2]], "_fill/bands_", dbs[[2]], ".rds"))) +dir.create(path_meta, showWarnings = FALSE) +saveRDS(meta, file = paste0(path_meta, "hyp_meta.rds")) + + +# Visually check data +visCheck(datapath = path_hyp_org, polygonfile = paste0(path_plots, "BPolygon.shp")) diff --git a/src/025_extract_aoi.R b/src/025_extract_aoi.R new file mode 100644 index 0000000..fe4eb7f --- /dev/null +++ b/src/025_extract_aoi.R @@ -0,0 +1,28 @@ +# Extract plot area (50 x 50 m) from hyperspectral data ans mask all NAs + +source("C:/Users/tnauss/permanent/plygrnd/KI-Hyperspec/HySpec_KiLi/src/000_set_environment.R") + +hd_files = list.files(path_hyp_org, recursive = FALSE, full.names = TRUE) +hd_files = hd_files[-grep("kili_campaign", hd_files)] +pb = shapefile(paste0(path_plots, "BPolygon.shp")) + +dir.create(paste0(path_hyp_aio), showWarnings = FALSE) + +reproj = TRUE +for(f in hd_files){ + r = readRDS(f) + if(reproj){ + pb = spTransform(pb, projection(r)) + reproj = FALSE + } + pid = substr(basename(f), 1, 4) + aoi = pb[grep(pid, pb$PlotID),] + r = raster::mask(crop(r, aoi), aoi) + # r = raster::mask(r, calc(r, fun=sum)) # We will do that later in the workflow + names(r) = paste0(pid, "_", seq(nlayers(r))) + saveRDS(r, file = paste0(path_hyp_aio, pid, ".rds")) +} + + +# Visually check data +visCheck(datapath = path_hyp_aio, polygonfile = paste0(path_plots, "BPolygon.shp")) diff --git a/src/030_noise_removal.R b/src/030_noise_removal.R new file mode 100644 index 0000000..0e35f78 --- /dev/null +++ b/src/030_noise_removal.R @@ -0,0 +1,93 @@ +# Compute noise removal on a per plot basis + +source("C:/Users/tnauss/permanent/plygrnd/KI-Hyperspec/HySpec_KiLi/src/000_set_environment.R") +if(length(showConnections()) == 0){ + cores = 3 + cl = parallel::makeCluster(cores) + doParallel::registerDoParallel(cl) +} + +hd_files = list.files(path_hyp_aio, recursive = FALSE, full.names = TRUE) +h_meta = readRDS(paste0(path_meta, "hyp_meta.rds")) + +pb = shapefile(paste0(path_plots, "BPolygon.shp")) + +dir.create(paste0(path_hyp_nrm), showWarnings = FALSE) + +# for(f in hd_files){ +# r = readRDS(f) +# +# m = mnf(as(r, "SpatialGridDataFrame"), use = "complete.obs") +# +# # thv = 1-m$values +# # set_mean = which(thv < -0.10) +# use = seq(2, length(m$values)) +# mi = as.matrix(m$x@data[, use]) %*% solve(m$rotation)[use, ] +# +# tmp = r[[1]] +# mir = stack(lapply(seq(ncol(mi)), function(i){ +# setValues(tmp, mi[, i]) +# })) +# +# saveRDS(mir, file = paste0(path_hyp_nrm, substr(basename(f), 1, 4), "_mnfi.rds")) +# } + + +log = foreach (i = seq(length(hd_files)), .packages = c("raster", "RStoolbox")) %dopar% { + f = hd_files[i] + plotid = substr(basename(f), 1, 4) + r = readRDS(f) + nl = nlayers(r) + + all_na = grep(ncell(r), summary(r)[6,]) + if(length(all_na) > 0){ + r = r[[-all_na]] + } else { + all_na = -1 + } + + pca = rasterPCA(r) + v = pca$model$sdev**2 + + # Continuous Significant Dimensionality + csd = round(sum(sapply(v, function(x){min(x,1)})), 0) + use = seq(csd) + + log = list(file = basename(f), all_na = all_na, csd = csd) + + pcai = t(t(as.matrix(pca$map)[, use] %*% t(pca$model$loadings)[use, ]) + pca$model$center) + + tmp = r[[1]] + pcair = stack(lapply(seq(ncol(pcai)), function(i){ + setValues(tmp, pcai[, i]) + })) + + if(all_na == 1){ + pcair = stack(setValues(tmp, rep(NA, ncell(tmp))), pcair) + } else if(all_na > 1){ + pcair = stack(pcair[[1:(all_na-1)]], + setValues(tmp, rep(NA, ncell(tmp))), + pcair[[(all_na):nlayers(pcair)]]) + } + names(pcair) = paste0(plotid, "_pcai_", seq(nl)) + + saveRDS(pcair, file = paste0(path_hyp_nrm, plotid, "_pcai.rds")) + + return(log) +} + +saveRDS(log, file = paste0(path_meta, "030_noise_removal_log.rds")) + +stopCluster(cl) + + +# Cross check +log = readRDS(file = paste0(path_meta, "030_noise_removal_log.rds")) + +csd_stat = sapply(log, function(l){l$csd}) +summary(csd_stat) + +all_na_stat = sapply(log, function(l){l$all_na}) +summary(all_na_stat) + + \ No newline at end of file diff --git a/src/040_comp_vegidcs.R b/src/040_comp_vegidcs.R new file mode 100644 index 0000000..ca23930 --- /dev/null +++ b/src/040_comp_vegidcs.R @@ -0,0 +1,59 @@ +# Compute vegetation indicies + +source("C:/Users/tnauss/permanent/plygrnd/KI-Hyperspec/HySpec_KiLi/src/000_set_environment.R") +if(length(showConnections()) == 0){ + cores = 3 + cl = parallel::makeCluster(cores) + doParallel::registerDoParallel(cl) +} + +hd_files = list.files(path_hyp_nrm, recursive = FALSE, full.names = TRUE) +h_meta = readRDS(paste0(path_meta, "hyp_meta.rds")) + +dir.create(paste0(path_hyp_vegidcs), showWarnings = FALSE) + +vis = c("CARI", + "Carter", "Carter2", "Carter3", "Carter4", "Carter5", "Carter6", + "CI", "CI2", "ClAInt", + "CRI1", "CRI2", "CRI3", "CRI4", + "Datt", "Datt2", "Datt4", "Datt5", "Datt6", + "DD", "DDn", "DWSI4", + "EVI", "GDVI_2", "GDVI_3", "GDVI_4", "GI", "Gitelson", "Gitelson2", + "GMI1", "GMI2", "Maccioni", + "MCARI", "MCARI/OSAVI", "MCARI2", "MCARI2/OSAVI2", + "mND705", "mNDVI", "MPRI", "MSAVI", "mSR", "mSR2", "mSR705", + "MTCI", "MTVI", "NDVI", "NDVI2", "NDVI3", "NPCI", + "OSAVI", "OSAVI2", "PARS", "PRI", "PRI*CI2", "PRI_norm", "PSND", + "PSRI", "PSSR", "PWI", "RDVI", "REP_Li", "SAVI", "SIPI", "SPVI", + "SR", "SR1", "SR2", "SR3", "SR4", "SR5", "SR6", "SR7", "SR8", + "SRPI", "TCARI", "TCARI/OSAVI", "TCARI2", "TCARI2/OSAVI2", + "TGI", "TVI", "Vogelmann", "Vogelmann2", "Vogelmann4") + +foreach(i = seq(length(hd_files)), .packages = c("hsdar", "raster")) %do% { + plotid = substr(basename(hd_files[[i]]), 1, 4) + m = h_meta[[2]][[h_meta[[1]]$list[grep(plotid, h_meta[[1]]$plotID)]]] + r = hsdar::speclib(brick(readRDS(hd_files[[i]])), + wavelength = m$wavelength, + fwhm = m$fwhm, + continuousdata = "auto") + v = vegindex(r, index = vis) + vr = readAll(v@spectra@spectra_ra) + names(vr) = paste0(plotid, "_", vis) + saveRDS(vr, file = paste0(path_hyp_vegidcs, plotid, "_vegidcs.rds")) +} + +stopCluster(cl) + + +# Visually check data +visCheck(datapath = path_hyp_vegidcs, polygonfile = paste0(path_plots, "BPolygon.shp"), band = 47) + +files = list.files(path_hyp_vegidcs, full.names = TRUE) +nacheck = do.call("rbind", lapply(files, function(f){ + df = readRDS(f) + nasum = lapply(seq(nlayers(df)), function(i){ + sum(is.na(getValues(df[[i]]))) + }) + return(data.frame(f = basename(f), nacheck = min(unlist(nasum)) == max(unlist(nasum)))) +})) +nacheck diff --git a/src/050_comp_kmdc.R b/src/050_comp_kmdc.R new file mode 100644 index 0000000..6551cab --- /dev/null +++ b/src/050_comp_kmdc.R @@ -0,0 +1,60 @@ +# Compute mean distance from centroid on original band stack and +# scaled vegetation inidces stack + +source("C:/Users/tnauss/permanent/plygrnd/KI-Hyperspec/HySpec_KiLi/src/000_set_environment.R") + +if(length(showConnections()) == 0){ + cores = 3 + cl = parallel::makeCluster(cores) + doParallel::registerDoParallel(cl) +} + + +dir.create(paste0(path_hyp_kmdc), showWarnings = FALSE) + + +hd_files = c(list.files(path_hyp_nrm, recursive = FALSE, full.names = TRUE), + list.files(path_hyp_vegidcs, recursive = FALSE, full.names = TRUE)) + +h_meta = readRDS(paste0(path_meta, "hyp_meta.rds")) + +foreach (i = seq(length(hd_files)), .packages = c("raster")) %dopar% { + filename = basename(hd_files[i]) + productid = paste0(substr(filename, 1, nchar(filename)-4), "_kmdc") + + r = readRDS(hd_files[[i]]) + rds = getValues(r) + + all_na = grep(nrow(rds), colSums(is.na(rds))) + if(length(all_na) > 0){ + rds = rds[,-all_na] + } else { + all_na = -1 + } + + cc = which(complete.cases(rds)) + rds_cc = rds[cc, ] + + # Scale vegetation indicies + if(grepl("vegidcs", filename)){ + rds_cc = scale(rds_cc, center = TRUE, scale = TRUE) + } + + km = kmeans(rds_cc, center = 1) + kmd = sqrt(rowSums(rds_cc - fitted(km))**2) + + rds_kmd = rds[, 1] + rds_kmd[cc] = kmd + rds_kmd = setValues(r[[1]], rds_kmd) + + names(rds_kmd) = productid + + saveRDS(rds_kmd, file=paste0(path_hyp_kmdc, productid, ".rds")) +} + +stopCluster(cl) + + +# Visually check data +visCheck(datapath = path_hyp_kmdc, polygonfile = paste0(path_plots, "BPolygon.shp"), band = 1) + diff --git a/src/060_comp_raoq.R b/src/060_comp_raoq.R new file mode 100644 index 0000000..9ff31f8 --- /dev/null +++ b/src/060_comp_raoq.R @@ -0,0 +1,52 @@ +# Compute Rao's Q on original bands stack, scaled vegetation indices stack, +# and mean distance from centroid band and vegetation index data. + +source("C:/Users/tnauss/permanent/plygrnd/KI-Hyperspec/HySpec_KiLi/src/000_set_environment.R") +# if(length(showConnections()) == 0){ +# cores = 2 +# cl = parallel::makeCluster(cores) +# doParallel::registerDoParallel(cl) +# } + +dir.create(paste0(path_hyp_raoq), showWarnings = FALSE) +windows = c(3) + +hd_files = c(list.files(path_hyp_nrm, recursive = FALSE, full.names = TRUE), + list.files(path_hyp_vegidcs, recursive = FALSE, full.names = TRUE), + list.files(path_hyp_kmdc, recursive = FALSE, full.names = TRUE)) + +h_meta = readRDS(paste0(path_meta, "hyp_meta.rds")) + +foreach (i = seq(length(hd_files))) %do% { + filename = basename(hd_files[i]) + productid = paste0(substr(filename, 1, nchar(filename)-4), "_raoq") + + r = readRDS(hd_files[[i]]) + + # Scale vegetation indicies + if(grepl("vegidcs", filename)){ + r = scale(r, center = TRUE, scale = TRUE) + } + + # ra = aggregate(r, fact=2, fun=mean) + for(w in windows){ + raomatrix <- spectralrao(as.list(r), + mode="multidimension", + distance_m="euclidean", + window=w, + shannon=FALSE, + debugging=TRUE, + simplify=3) + raor = setValues(r[[1]], raomatrix[[1]]) + names(raor) = productid + saveRDS(raor, file = paste0(path_hyp_raoq, + productid, "_", w, ".rds")) + } +} + + +# stopCluster(cl) + +# Visually check data +visCheck(datapath = path_hyp_raoq, polygonfile = paste0(path_plots, "BPolygon.shp"), band = 1) + diff --git a/src/070_comp_txtr.R b/src/070_comp_txtr.R new file mode 100644 index 0000000..1ffe0b6 --- /dev/null +++ b/src/070_comp_txtr.R @@ -0,0 +1,37 @@ +# Compute texture metrics on mean distance from centroid datasets. + +source("C:/Users/tnauss/permanent/plygrnd/KI-Hyperspec/HySpec_KiLi/src/000_set_environment.R") + +dir.create(paste0(path_hyp_glcm), showWarnings = FALSE) + +hd_files = c(list.files(path_hyp_kmdc, recursive = FALSE, full.names = TRUE)) + +h_meta = readRDS(paste0(path_meta, "hyp_meta.rds")) + + +windows = c(3, 11, 31) +n_grey = c(32) + +foreach (i = seq(length(hd_files))) %do% { + filename = basename(hd_files[i]) + productid = substr(filename, 1, nchar(filename)-4) + + r = readRDS(hd_files[[i]]) + + txtr_wg = lapply(windows, function(w){ + txtr_g = lapply(n_grey, function(g){ + txtr = glcmTextures(r, kernel_size = w, + stats = c("entropy", "homogeneity", "second_moment"), + n_grey = g, parallel = FALSE) + names(txtr[[1]]) = paste0(productid, "_", names(txtr[[1]]), "_w", sprintf("%02d", w), "_g", sprintf("%02d", g)) + return(txtr) + }) + }) + txtr_wg = stack(unlist(txtr_wg, recursive = TRUE)) + + saveRDS(txtr_wg, file = paste0(path_hyp_glcm, productid, "_glcm.rds")) +} + +# Visually check data +visCheck(datapath = path_hyp_glcm, polygonfile = paste0(path_plots, "BPolygon.shp"), band = 1) + diff --git a/src/090_combine_predictors.R b/src/090_combine_predictors.R new file mode 100644 index 0000000..fd8a4e6 --- /dev/null +++ b/src/090_combine_predictors.R @@ -0,0 +1,63 @@ +# Compute mean and sd of final predictor sets. + +source("C:/Users/tnauss/permanent/plygrnd/KI-Hyperspec/HySpec_KiLi/src/000_set_environment.R") +if(length(showConnections()) == 0){ + cores = 3 + cl = parallel::makeCluster(cores) + doParallel::registerDoParallel(cl) +} + +dir.create(paste0(path_hyp_pred), showWarnings = FALSE) + +hd_files = c(list.files(path_hyp_vegidcs, recursive = FALSE, full.names = TRUE), + list.files(path_hyp_kmdc, recursive = FALSE, full.names = TRUE), + list.files(path_hyp_glcm, recursive = FALSE, full.names = TRUE), + list.files(path_hyp_raoq, recursive = FALSE, full.names = TRUE)) + +h_meta = readRDS(paste0(path_meta, "hyp_meta.rds")) + +preds = foreach (i = seq(length(hd_files))) %do% { + + print(i) + + r = readRDS(hd_files[[i]]) + + nms = names(r) + plotid = substr(nms[1], 1, 4) + productid = substr(nms, 6, nchar(nms)) + + l = lapply(seq(nlayers(r)), function(l){ + df = data.frame(mean(getValues(r[[l]]), na.rm = TRUE), sd(getValues(r[[l]]), na.rm = TRUE)) + colnames(df) = c(paste0(productid[l], c("_mean", "_sd"))) + return(df) + }) + df = do.call("cbind", l) + df = data.frame(plotID = plotid, df) + return(df) +} + +grp = list(grep("vegidcs.rds", hd_files), + grep("vegidcs_raoq_3.rds", hd_files), + grep("vegidcs_kmdc.rds", hd_files), + grep("vegidcs_kmdc_glcm.rds", hd_files), + grep("vegidcs_kmdc_raoq_3.rds", hd_files), + grep("pcai_raoq_3.rds", hd_files), + grep("pcai_kmdc.rds", hd_files), + grep("pcai_kmdc_glcm.rds", hd_files), + grep("pcai_kmdc_raoq_3.rds", hd_files)) + +if(length(unlist(grp)) == length(preds)){ + df = lapply(grp, function(g){ + do.call("rbind", preds[g]) + }) + df = do.call("cbind", df) + df = df[, -grep("plotID", colnames(df))[-1]] +} + +saveRDS(df, file = paste0(path_hyp_pred, "hyperspec_preds.rds")) + +stopCluster(cl) + +# Visually check data +corrplot(cor(df[, -1])) + diff --git a/src/100_combine_predictores_biodiv_sr.R b/src/100_combine_predictores_biodiv_sr.R new file mode 100644 index 0000000..832c0c6 --- /dev/null +++ b/src/100_combine_predictores_biodiv_sr.R @@ -0,0 +1,66 @@ +# Combine hyperspectral predictores and biodiversity variables in gpm class. + +source("D:/plygrnd/hySpecVisKili/hySpecVisKili/src/000_set_environment.R") + + +preds_hyspec = readRDS(paste0(path_hyp_pred, "hyperspec_preds.rds")) +preds_lidar = readRDS(file.path(path_ldr_pred, "lidar_preds.rds")) +preds_lidar = preds_lidar[, c(which(colnames(preds_lidar) == "plotID"), + seq(which(colnames(preds_lidar) == "AGB"), + which(colnames(preds_lidar) == "qntl_rng")))] + +# bd = readRDS(paste0(path_biodiv, "biodiv.rds")) +species_richness = readRDS(paste0(path_biodiv, "species_richness.rds")) +species_composition_dcor = readRDS(paste0(path_biodiv, "species_composition_dcor.rds")) +species_network_pca = readRDS(paste0(path_biodiv, "species_network_pca.rds")) + +comb = data.frame(species_network_pca$scores) +colnames(comb) = paste0("sn_pca", seq(4)) +comb$plotID = rownames(species_network_pca$scores) + +comb = merge(species_richness, comb, by = c("plotID"), all.x = TRUE, all.y = TRUE) + +for(i in seq(length(species_composition_dcor))){ + act = data.frame(species_composition_dcor[[i]]$rproj) + colnames(act) = paste0("sn_dca", seq(4), "_", names(species_composition_dcor[i])) + act$plotID = rownames(act) + comb = merge(comb, act, by = c("plotID"), all.x = TRUE, all.y = TRUE) +} + +comb = merge(comb, preds_hyspec, by = c("plotID")) +comb = merge(comb, preds_lidar, by = c("plotID")) + +comb = droplevels(comb) + +comb$SelCat = substr(as.character(comb$plotID), 1, 3) + +selnbr = lapply(table(comb$SelCat), function(c){ + seq(c) +}) +comb$SelNbr = unlist(selnbr) + + +col_selector = which(names(comb) %in% c("SelCat", "SelNbr")) + +col_diversity = seq(which("SRspiders" == colnames(comb)), + which("sn_dca4_Decomposer" == colnames(comb))) + +col_precitors = c(which("elevation" == colnames(comb)), + which("lui" == colnames(comb)), + seq(which("CARI_mean" == colnames(comb)), + which("qntl_rng" == colnames(comb)))) + +col_meta = which(!seq(ncol(comb)) %in% c(col_selector, col_diversity, col_precitors)) + + +meta <- createGPMMeta(comb, type = "input", + selector = col_selector, + response = col_diversity, + predictor = col_precitors, + meta = col_meta) + +comb <- gpm(comb, meta, scale = FALSE) + +dir.create(paste0(path_comb_gpm_sr), showWarnings = FALSE) + +saveRDS(comb, file = paste0(path_comb_gpm_sr, "ki_hyperspec_lidar_biodiv_non_scaled.rds")) diff --git a/src/110_predict_biodiv_sr_rf.R b/src/110_predict_biodiv_sr_rf.R new file mode 100644 index 0000000..8a819b9 --- /dev/null +++ b/src/110_predict_biodiv_sr_rf.R @@ -0,0 +1,88 @@ +# Predict species richness using different models and predictor sets +if(Sys.info()["sysname"] == "Windows"){ + filepath_base = "D:/plygrnd/hySpecVisKili/hySpecVisKili/src/000_set_environment.R" +} else { + filepath_base = "/mnt/sd19006/data/users/tnauss/KI-Hyperspec/hySpecVisKili/src/000_set_environment_linux.R" +} +source(filepath_base) + +if(length(showConnections()) == 0){ + cores = 20 + cl = parallel::makeCluster(cores) + doParallel::registerDoParallel(cl) +} + + +dir.create(paste0(path_model_gpm_sr), showWarnings = FALSE) + +comb = readRDS(paste0(path_comb_gpm_sr, "ki_hyperspec_lidar_biodiv_non_scaled.rds")) + + +# Predict with all elevation and lui information, hyperspectral data only, +# all data, and kmdc and raoq only using gam, pls and rf models. +mtypes = c("gam", "pls", "rf") +mtypes = c("rf") +ptypes = c("*elev*", "*elui*", + "*spec*", "*elsp*", + "*lidr*", "*eldr*", + "*splr*", "*esld*", + "*kmra*") + +mt = mtypes[1] +pt = ptypes[1] + + +elev_cols = seq(which(comb@meta$input$PREDICTOR == "elevation")) + +elui_cols = seq(which(comb@meta$input$PREDICTOR == "elevation"), + which(comb@meta$input$PREDICTOR == "lui")) + +spec_cols = seq(which(comb@meta$input$PREDICTOR == "CARI_mean"), + which(comb@meta$input$PREDICTOR == "pcai_kmdc_raoq_sd")) + +ldr_cols = seq(which(comb@meta$input$PREDICTOR == "AGB"), + which(comb@meta$input$PREDICTOR == "qntl_rng")) + +for(mt in mtypes){ + for(pt in ptypes){ + + if(pt == "*elev*"){ + comb@meta$input$PREDICTOR_FINAL = comb@meta$input$PREDICTOR[elev_cols] + + } else if(pt == "*elui*"){ + comb@meta$input$PREDICTOR_FINAL = comb@meta$input$PREDICTOR[elui_cols] + + } else if(pt == "*spec*"){ + comb@meta$input$PREDICTOR_FINAL = comb@meta$input$PREDICTOR[spec_cols] + + } else if(pt == "*elsp*"){ + comb@meta$input$PREDICTOR_FINAL = comb@meta$input$PREDICTOR[c(elui_cols, + spec_cols)] + + } else if(pt == "*lidr*"){ + comb@meta$input$PREDICTOR_FINAL = comb@meta$input$PREDICTOR[ldr_cols] + + } else if(pt == "*eldr*"){ + comb@meta$input$PREDICTOR_FINAL = comb@meta$input$PREDICTOR[c(elui_cols, + ldr_cols)] + + } else if(pt == "*splr*"){ + comb@meta$input$PREDICTOR_FINAL = comb@meta$input$PREDICTOR[c(spec_cols, + ldr_cols)] + + } else if(pt == "*esld*"){ + comb@meta$input$PREDICTOR_FINAL = comb@meta$input$PREDICTOR[c(elui_cols, + spec_cols, + ldr_cols)] + } else if(pt == "*kmra*"){ + comb@meta$input$PREDICTOR_FINAL = unique(comb@meta$input$PREDICTOR[ + c(grep("kmdc", comb@meta$input$PREDICTOR), + grep("raoq", comb@meta$input$PREDICTOR))]) + } + + compModels(model = comb, pt = pt, mt = mt, outpath = path_model_gpm_sr) + } +} + + +stopCluster(cl) diff --git a/src/120_compile_analyse_biodiv_sr.R b/src/120_compile_analyse_biodiv_sr.R new file mode 100644 index 0000000..f08dcca --- /dev/null +++ b/src/120_compile_analyse_biodiv_sr.R @@ -0,0 +1,44 @@ +# Combine species richness model results in one variable. + +require(envimaR) +root_folder = path.expand("~/plygrnd/hySpecVisKili/") +source(file.path(root_folder, "hySpecVisKili/src/000_setup_windows.R")) +dir.create(envrmt$path_120_compile_analysis_sr, showWarnings = FALSE) + + +# Combine all models into one gpm object +# mtypes = c("gam", "pls", "rf") +mtypes = c("gam", "pls", "rf") + + + +all_models = lapply(mtypes, function(mt){ + ptypes = c("*elui*", + "*spec*", "*elsp*", + "*lidr*", "*eldr*", + "*splr*", "*esld*", + "*kmra*") + if(mt == "gam"){ + ptypes = c("*elev*", ptypes) + } + all_pmodels = lapply(ptypes, function(pt){ + model_files = list.files(envrmt$path_110_model_gpm_sr, full.names = TRUE, + pattern = glob2rx(paste0(pt, mt, "*"))) + + all_models = readRDS(model_files[[1]]) + + for(i in (seq(2, length(model_files)))){ + all_models@model[[1]][[i]] = readRDS(model_files[[i]])@model[[1]][[1]] + } + + return(all_models) + }) + names(all_pmodels) = gsub("[*]", "", ptypes) + return(all_pmodels) +}) +names(all_models) = gsub("[*]", "", gsub("_", "", mtypes)) + +saveRDS(all_models, file = file.path(envrmt$path_120_compile_analysis_sr, + "models_sr.rds")) + + diff --git a/src/200_combine_predictores_biodiv_sr_residuals.R b/src/200_combine_predictores_biodiv_sr_residuals.R new file mode 100644 index 0000000..6a0cf1c --- /dev/null +++ b/src/200_combine_predictores_biodiv_sr_residuals.R @@ -0,0 +1,55 @@ +# Compile species richness dataset containing residuals from some previous modelling +if(Sys.info()["sysname"] == "Windows"){ + filepath_base = "D:/plygrnd/hySpecVisKili/hySpecVisKili/src/000_set_environment.R" +} else { + filepath_base = "/mnt/sd19006/data/users/tnauss/KI-Hyperspec/HySpec_KiLi/src/000_set_environment_linux.R" +} + +source(filepath_base) + + +dir.create(paste0(path_comb_gpm_sr_res), showWarnings = FALSE) + + +# 1st version - not used anymore +# Compile elevation residuals for gam model using eleveation as only predictor +# pt = "*elev*" +# mt = "*gam*" +# +# comb_sr = readRDS(paste0(path_comb_gpm_sr, "ki_hyperspec_biodiv_non_scaled.rds")) +# comb_sr_elev_res = compResData(comb_sr, pt, mt) +# +# saveRDS(comb_sr_elev_res, +# file = file.path(path_comb_gpm_sr_res, +# paste0("ki_hyperspec_biodiv_non_scaled", +# gsub("[*]", "", paste0("_", mt, "_", pt, "_res.rds"))))) + + + +# 1st version - not used anymore +# Compile elevation residuals for pls model using elevation and LUI as only predictor +# pt = "*elui*" +# mt = "*pls*" +# +# comb_sr = readRDS(paste0(path_comb_gpm_sr, "ki_hyperspec_biodiv_non_scaled.rds")) +# comb_sr_elev_res = compResData(comb_sr, pt, mt) +# +# saveRDS(comb_sr_elev_res, +# file = file.path(path_comb_gpm_sr_res, +# paste0("ki_hyperspec_biodiv_non_scaled", +# gsub("[*]", "", paste0("_", mt, "_", pt, "_res.rds"))))) + + + +# Compile elevation residuals for rf model using elevation and LUI as only predictor +pt = "*elui*" +mt = "*rf*" + +comb_sr = readRDS(paste0(path_comb_gpm_sr, "ki_hyperspec_biodiv_non_scaled.rds")) +comb_sr_elev_res = compResData(comb_sr, pt, mt) + +saveRDS(comb_sr_elev_res, + file = file.path(path_comb_gpm_sr_res, + paste0("ki_hyperspec_biodiv_non_scaled", + gsub("[*]", "", paste0("_", mt, "_", pt, "_res.rds"))))) + diff --git a/src/210_predict_biodiv_sr_res_rf.R b/src/210_predict_biodiv_sr_res_rf.R new file mode 100644 index 0000000..ac3a905 --- /dev/null +++ b/src/210_predict_biodiv_sr_res_rf.R @@ -0,0 +1,45 @@ +# comb_elev_resine hyperspectral predictores and biodiversity variables in gpm class. +if(Sys.info()["sysname"] == "Windows"){ + filepath_base = "D:/plygrnd/hySpecVisKili/hySpecVisKili/src/000_set_environment.R" +} else { + filepath_base = "/mnt/sd19006/data/users/tnauss/KI-Hyperspec/HySpec_KiLi/src/000_set_environment_linux.R" +} +source(filepath_base) + +if(length(showConnections()) == 0){ + cores = 30 + cl = parallel::makeCluster(cores) + doParallel::registerDoParallel(cl) +} + +dir.create(paste0(path_model_gpm_sr_res), showWarnings = FALSE) + +# Predict gam, pls and rf elevation and elevation/lui based residuals using +# pls and rf models with hyperspectral data only +# res_suffixes = c("_gam_elev_res", "_pls_elui_res", "_rf_elui_res") +res_suffixes = c("_rf_elui_res") +# mtypes = c("pls", "rf") +mtypes = c("rf") +ptypes = c("*spec*", "*kmra*") + + +for(res_suffix in res_suffixes){ + comb_elev_res = readRDS(paste0(path_comb_gpm_sr_res, "ki_hyperspec_biodiv_non_scaled", + res_suffix, ".rds")) + for(mt in mtypes){ + for(pt in ptypes){ + + if(pt == "*spec*"){ + comb_elev_res@meta$input$PREDICTOR_FINAL = comb_elev_res@meta$input$PREDICTOR[-c(1,2)] + } else if(pt == "*kmra*"){ + comb_elev_res@meta$input$PREDICTOR_FINAL = unique(comb_elev_res@meta$input$PREDICTOR[ + c(grep("kmdc", comb_elev_res@meta$input$PREDICTOR), + grep("raoq", comb_elev_res@meta$input$PREDICTOR))]) + } + + compModels(model = comb_elev_res, pt = pt, mt = mt, outpath = path_model_gpm_sr_res) + } + } +} + +stopCluster(cl) \ No newline at end of file diff --git a/src/220_compile_analyse_biodiv_sr_elev_res.R b/src/220_compile_analyse_biodiv_sr_elev_res.R new file mode 100644 index 0000000..17bed1d --- /dev/null +++ b/src/220_compile_analyse_biodiv_sr_elev_res.R @@ -0,0 +1,45 @@ +# Combine species richness residual model results in one variable. +source("D:/plygrnd/hySpecVisKili/hySpecVisKili/src/000_set_environment.R") + + +dir.create(path_compile_analysis_sr_elev_res, showWarnings = FALSE) + + +# Combine all models into one gpm object +pt = "*spec*" +mtypes = c("*rf*") +rtypes = c("*gam_elev_res*", "*pls_elui_res*", "*rf_elui_res*") +rtypes = c("*pls_elui_res*", "*rf_elui_res*") + +all_models = lapply(mtypes, function(mt){ + all_pmodels = lapply(rtypes, function(rt){ + model_files = list.files(path_model_gpm_sr_res, full.names = TRUE, + pattern = glob2rx(paste0(mt, rt))) + + l = 0 + i = 0 + while(l == 0){ + i = i + 1 + all_models = readRDS(model_files[[i]]) + l = length(all_models@model) + } + + + for(i in (seq(2, length(model_files)))){ + act_model = readRDS(model_files[[i]]) + if(length(act_model@model) > 0){ + all_models@model[[1]][[i]] = act_model@model[[1]][[1]] + } else { + all_models@model[[1]][[i]] = NA + } + } + + return(all_models) + }) + names(all_pmodels) = gsub("[*]", "", rtypes) + return(all_pmodels) +}) +names(all_models) = gsub("[*]", "", gsub("_", "", mtypes)) + +saveRDS(all_models, file = file.path(path_compile_analysis_sr_elev_res, + "models_sr_elev_res.rds")) diff --git a/src/300_predict_biodiv_sr_rf_indp.R b/src/300_predict_biodiv_sr_rf_indp.R new file mode 100644 index 0000000..42abafa --- /dev/null +++ b/src/300_predict_biodiv_sr_rf_indp.R @@ -0,0 +1,38 @@ +# Recompute models using best variable subset and completely independent validation + +# Predict species richness using different models and predictor sets +if(Sys.info()["sysname"] == "Windows"){ + filepath_base = "D:/plygrnd/hySpecVisKili/hySpecVisKili/src/000_set_environment.R" +} else { + filepath_base = "/mnt/sd19006/data/users/tnauss/KI-Hyperspec/HySpec_KiLi/src/000_set_environment_linux.R" +} +source(filepath_base) + +if(length(showConnections()) == 0){ + cores = 3 + cl = parallel::makeCluster(cores) + doParallel::registerDoParallel(cl) +} + +dir.create(path_model_gpm_sr_indp, showWarnings = FALSE) + +all_models = readRDS(file.path(path_compile_analysis_sr, "models_sr.rds")) + +mt = "rf" + +# Predict variables again using best predictors and independent validation. +for(pt in names(all_models[[mt]])){ + comb = all_models[[mt]][[pt]] + var_imp <- compVarImp(comb@model[[1]], scale = FALSE) + + for(rs in seq(length(var_imp))){ + comb@meta$input$RESPONSE = as.character(var_imp[[rs]]$RESPONSE[1]) + comb@meta$input$PREDICTOR_FINAL = as.character(var_imp[[rs]]$VARIABLE) + + compModels(model = comb, pt = pt, mt = mt, rs = rs, outpath = path_model_gpm_sr_indp, nested_cv = TRUE) + } +} + + +stopCluster(cl) + diff --git a/src/310_combine_predictores_biodiv_sr_residuals_indp.R b/src/310_combine_predictores_biodiv_sr_residuals_indp.R new file mode 100644 index 0000000..253e66a --- /dev/null +++ b/src/310_combine_predictores_biodiv_sr_residuals_indp.R @@ -0,0 +1,25 @@ +# Compile species richness dataset containing residuals from some previous modelling +if(Sys.info()["sysname"] == "Windows"){ + filepath_base = "D:/plygrnd/hySpecVisKili/hySpecVisKili/src/000_set_environment.R" +} else { + filepath_base = "/mnt/sd19006/data/users/tnauss/KI-Hyperspec/HySpec_KiLi/src/000_set_environment_linux.R" +} + +source(filepath_base) + + +dir.create(paste0(path_comb_gpm_sr_res), showWarnings = FALSE) + +# Compile elevation residuals for rf model using elevation and LUI as only predictor +pt = "*elui*" +mt = "*rf*" +suf = "_res_indp" + +comb_sr = readRDS(paste0(path_comb_gpm_sr, "ki_hyperspec_biodiv_non_scaled.rds")) +comb_sr_elev_res = compResData(comb_sr, pt, mt, model_path = path_model_gpm_sr_indp, suf = suf) + +saveRDS(comb_sr_elev_res, + file = file.path(path_comb_gpm_sr_elev_res_indp, + paste0("ki_hyperspec_biodiv_non_scaled", + gsub("[*]", "", paste0("_", mt, "_", pt, suf, ".rds"))))) + diff --git a/src/320_predict_biodiv_sr_rf_indp.R b/src/320_predict_biodiv_sr_rf_indp.R new file mode 100644 index 0000000..db24516 --- /dev/null +++ b/src/320_predict_biodiv_sr_rf_indp.R @@ -0,0 +1,41 @@ +# Recompute elevation residual models using best variable subset and completely independent validation + +# Predict species richness using different models and predictor sets +if(Sys.info()["sysname"] == "Windows"){ + filepath_base = "D:/plygrnd/hySpecVisKili/hySpecVisKili/src/000_set_environment.R" +} else { + filepath_base = "/mnt/sd19006/data/users/tnauss/KI-Hyperspec/HySpec_KiLi/src/000_set_environment_linux.R" +} +source(filepath_base) + +if(length(showConnections()) == 0){ + cores = 3 + cl = parallel::makeCluster(cores) + doParallel::registerDoParallel(cl) +} + +dir.create(path_model_gpm_sr_elev_res_indp, showWarnings = FALSE) + +elev_res_indp = readRDS(file.path(path_comb_gpm_sr_elev_res_indp, "ki_hyperspec_biodiv_non_scaled_rf_elui_res_indp.rds")) +all_models_res = readRDS(file.path(path_compile_analysis_sr_elev_res, + "models_sr_elev_res.rds")) + +mt = "rf" + +# Predict variables again using best predictors and independent validation. +for(pt in names(all_models_res[[mt]])){ + comb_res = all_models_res[[mt]][[pt]] + var_imp <- compVarImp(comb_res@model[[1]], scale = FALSE) + com_res_indp = elev_res_indp + + for(rs in seq(length(var_imp))){ + com_res_indp@meta$input$RESPONSE = paste0(as.character(var_imp[[rs]]$RESPONSE[1]), "_indp") + com_res_indp@meta$input$PREDICTOR_FINAL = as.character(var_imp[[rs]]$VARIABLE) + + compModels(model = com_res_indp, pt = pt, mt = mt, rs = rs, outpath = path_model_gpm_sr_elev_res_indp, nested_cv = TRUE) + } +} + + +stopCluster(cl) + diff --git a/src/500_analyse_biodiv_sr.Rmd b/src/500_analyse_biodiv_sr.Rmd new file mode 100644 index 0000000..e72905e --- /dev/null +++ b/src/500_analyse_biodiv_sr.Rmd @@ -0,0 +1,244 @@ +--- +title: "500 Analyse Biodiv-RS" +output: html_notebook +editor_options: + chunk_output_type: console +--- + +```{r, include = FALSE} +# Set up working environment and defaults -------------------------------------- +if(Sys.info()["sysname"] == "Windows"){ + filepath_base = "D:/plygrnd/hySpecVisKili/hySpecVisKili/src/000_set_environment.R" +} else { + filepath_base = "/mnt/sd19006/data/users/tnauss/KI-Hyperspec/hySpecVisKili/src/000_set_environment_linux.R" +} +source(filepath_base) + +all_models = readRDS(file.path(path_compile_analysis_sr, + "models_sr.rds")) + +# Collect model performance +gam_sr = modelPerformance(all_models[["gam"]]) +pls_sr = modelPerformance(all_models[["pls"]]) +rf_sr = modelPerformance(all_models[["rf"]]) + +summary(gam_sr) +summary(pls_sr) +summary(rf_sr) + +# Get trophic levels +tl = read.table(file.path(path_meta, "trophic_levels.csv"), header = TRUE, sep = ";") +gam_sr = merge(gam_sr, tl, by.x = "resp", by.y = "Species") +pls_sr = merge(pls_sr, tl, by.x = "resp", by.y = "Species") +rf_sr = merge(rf_sr, tl, by.x = "resp", by.y = "Species") + +# Arrange levels and species names +gam_sr$Level = factor(gam_sr$Level, levels(gam_sr$Level)[c(1, 5, 4, 3, 6, 2)] ) +gam_sr$resp = as.character(gam_sr$resp) +gam_sr$resp = substr(gam_sr$resp, 3, nchar(gam_sr$resp)) +gam_sr$resp = gsub("(^[[:alpha:]])", "\\U\\1", gam_sr$resp, perl=TRUE) +gam_sr$resp = factor(gam_sr$resp, unique(gam_sr$resp[order(gam_sr$Level, gam_sr$resp)])) + +pls_sr$Level = factor(pls_sr$Level, levels(pls_sr$Level)[c(1, 5, 4, 3, 6, 2)] ) +pls_sr$resp = as.character(pls_sr$resp) +pls_sr$resp = substr(pls_sr$resp, 3, nchar(pls_sr$resp)) +pls_sr$resp = gsub("(^[[:alpha:]])", "\\U\\1", pls_sr$resp, perl=TRUE) +pls_sr$resp = factor(pls_sr$resp, unique(pls_sr$resp[order(pls_sr$Level, pls_sr$resp)])) + + +rf_sr$Level = factor(rf_sr$Level, levels(rf_sr$Level)[c(1, 5, 4, 3, 6, 2)] ) +rf_sr$resp = as.character(rf_sr$resp) +rf_sr$resp = substr(rf_sr$resp, 3, nchar(rf_sr$resp)) +rf_sr$resp = gsub("(^[[:alpha:]])", "\\U\\1", rf_sr$resp, perl=TRUE) +rf_sr$resp = factor(rf_sr$resp, unique(rf_sr$resp[order(rf_sr$Level, rf_sr$resp)])) + +gam_sr$mptype = paste0(gam_sr$mtype, "_", gam_sr$ptype) +pls_sr$mptype = paste0(pls_sr$mtype, "_", pls_sr$ptype) +rf_sr$mptype = paste0(rf_sr$mtype, "_", rf_sr$ptype) + +model_sr_m = rbind(gam_sr[, c("resp", "mtype", "mptype", "Resample", "RMSE", "Rsquared", "RMSE_normSD")], + pls_sr[, c("resp", "mtype", "mptype", "Resample", "RMSE", "Rsquared", "RMSE_normSD")], + rf_sr[, c("resp", "mtype", "mptype", "Resample", "RMSE", "Rsquared", "RMSE_normSD")]) + +model_sr_m = model_sr_m[model_sr_m$Resample != "Mean", ] + +ggplot(data = rbind(model_sr_m[model_sr_m$mptype == "gam_elui" | model_sr_m$mptype == "gam_elev" | model_sr_m$mptype == "pls_spec" | model_sr_m$mptype == "pls_lidr" | model_sr_m$mptype == "pls_elui" | model_sr_m$mptype == "rf_spec" | model_sr_m$mptype == "rf_lidr" | model_sr_m$mptype == "rf_elui", ]), aes(x = resp, y = RMSE_normSD, fill = mptype)) + + geom_boxplot() + + geom_hline(yintercept=c(0.5,1), linetype="dashed", color = "black") + + scale_fill_brewer(palette="Dark2") + + theme_bw() + + theme(axis.text.x = element_text(angle = 45, hjust = 1)) + + labs(list(x = "Species groups", y = "RMSEn", fill = "Model set")) + + + +best_model = lapply(unique(model_sr_m$)) + + + + +label_colors = "black" + + +pls_sr$RMSE_normSD[pls_sr$] + +label_colors <- ifelse(pls_sr$RMSE_normSD == 0, "red", "blue") + +pls_sr_tmp = pls_sr[pls_sr$mtype == "pls" & + (pls_sr$mptype == "pls_spec" | + pls_sr$mptype == "pls_lidr" | + pls_sr$mptype == "pls_elui"),] + +label_colors = rep("black", length(unique(pls_sr_tmp$resp))) +if() + +ggplot(data = pls_sr[pls_sr$mtype == "pls" & + (pls_sr$mptype == "pls_spec" | + pls_sr$mptype == "pls_lidr" | + pls_sr$mptype == "pls_elui"),], + aes(x = resp, y = RMSE_normSD, fill = mptype)) + + geom_boxplot() + + geom_hline(yintercept=c(0.5,1), linetype="dashed", color = "black") + + scale_fill_brewer(palette="Dark2") + + theme_bw() + + theme(axis.text.x = element_text(angle = 45, hjust = 1)) + + labs(list(x = "Species groups", y = "RMSEn", fill = "Model set")) + + +ggplot(data = rf_sr[rf_sr$mtype == "rf" & + (rf_sr$mptype == "rf_spec" | + rf_sr$mptype == "rf_lidr" | + rf_sr$mptype == "rf_elui"),], + aes(x = resp, y = RMSE_normSD, fill = mptype)) + + geom_boxplot() + + geom_hline(yintercept=c(0.5,1), linetype="dashed", color = "black") + + scale_fill_brewer(palette="Dark2") + + theme_bw() + + theme(axis.text.x = element_text(angle = 45, hjust = 1)) + + labs(list(x = "Species groups", y = "RMSEn", fill = "Model set")) + + + + + +``` + +# Compare PLS and RF +```{r, echo=FALSE} +models_sr = rbind(pls_sr[, -4], rf_sr[, -4]) +models_sr$mptype = paste0(models_sr$mtype, "_", models_sr$ptype) +models_sr$mptype = factor(models_sr$mptype, levels = c("pls_elsp", "rf_elsp", + "pls_elui", "rf_elui", + "pls_kmra", "rf_kmra", + "pls_spec", "rf_spec")) + +ggplot(data = models_sr[models_sr$mtype == "pls" & + (models_sr$ptype == "elui" | models_sr$ptype == "spec"),], + aes(x = resp, y = RMSE_normSD, fill = mptype)) + + geom_boxplot() + + geom_hline(yintercept=c(0.5,1), linetype="dashed", color = "black") + + scale_fill_brewer(palette="Dark2") + + theme_bw() + + theme(axis.text.x = element_text(angle = 45, hjust = 1)) + + labs(list(x = "Species groups", y = "RMSEn", fill = "Model set")) + + + +ggplot(data = models_sr[models_sr$mtype == "rf" & + (models_sr$ptype == "elui" | models_sr$ptype == "spec"),], + aes(x = resp, y = RMSE_normSD, fill = mptype)) + + geom_boxplot() + + geom_hline(yintercept=c(0.5,1), linetype="dashed", color = "black") + + scale_fill_brewer(palette="Dark2") + + theme_bw() + + theme(axis.text.x = element_text(angle = 45, hjust = 1)) + + labs(list(x = "Species groups", y = "RMSEn", fill = "Model set")) + + +ggplot(data = models_sr[models_sr$mtype == "rf" & models_sr$ptype == "spec",], + aes(x = resp, y = RMSE_normSD, fill = Level)) + + geom_boxplot() + + geom_hline(yintercept=c(0.5,1), linetype="dashed", color = "black") + + scale_fill_brewer(palette="Dark2") + + theme_bw() + + theme(axis.text.x = element_text(angle = 45, hjust = 1)) + + labs(list(x = "Species richness", y = "RMSEn", fill = "Trophic level")) +``` + +```{r, echo=FALSE} +pls_rf_sr = merge(pls_sr, rf_sr, by = c("ptype", "resp", "Resample"), all.y = TRUE) +colnames(pls_rf_sr)[grep("\\.x", colnames(pls_rf_sr))] = + gsub("\\.x", "_pls", colnames(pls_rf_sr)[grep("\\.x", colnames(pls_rf_sr))]) +colnames(pls_rf_sr)[grep("\\.y", colnames(pls_rf_sr))] = + gsub("\\.y", "_rf", colnames(pls_rf_sr)[grep("\\.y", colnames(pls_rf_sr))]) +# nrow(pls_rf_sr) + +ptypes = c("elui", "kmra", "spec", "elsp") +perf_check = lapply(ptypes, function(pt){ + subdf = pls_rf_sr[!is.na(pls_rf_sr$RMSE_pls) & + pls_rf_sr$ptype == pt & + pls_rf_sr$Resample == "Mean", ] + rownames(subdf[subdf$RMSE_pls < subdf$RMSE_rf, ]) +}) +names(perf_check) = ptypes +``` + +# Check performance of PLS and RF +```{r, echo = FALSE} +for(i in seq(length(perf_check))){ + rmse_perf = sort(round(1-pls_rf_sr[as.numeric(perf_check[[i]]), "RMSE_pls"] / + pls_rf_sr[as.numeric(perf_check[[i]]), "RMSE_rf"],2)) + var_rf_prct = sort(round(pls_rf_sr[as.numeric(perf_check[[i]]), "nvars_rf"] / + pls_rf_sr[as.numeric(perf_check[[i]]), "nvars_pls"],2)) + level_pls = sort(table(pls_rf_sr[as.numeric(perf_check[[i]]), "Level_pls"])) + print(names(perf_check[i])) + print(pls_rf_sr[as.numeric(perf_check[[i]]),]) + cat("RMSE (1 - PLS/RF):", rmse_perf, "\n") + cat("Var number (RF/PLS):", var_rf_prct, "\n") + cat("Levels with PLS is better:", level_pls, "\n") + cat("\n\n") +} +``` + +# Collect variable importance +## Number of variables +```{r} +pls_rf_sr_long = melt(pls_rf_sr[pls_rf_sr$Resample == "Mean", c(1, 2, 6, 13)], id.vars = c("ptype", "resp")) +ggplot(data = pls_rf_sr_long, aes(x = variable, y = value, fill = ptype)) + + geom_boxplot() + + labs(list(x = "Models", y = "Number of variables" , + fill = "Predictor Set")) + + theme_bw() +``` + + +# Variable importance for PLS +```{r, echo=FALSE} +var_imp <- compVarImp(all_models[["pls"]][["spec"]]@model[[1]], scale = FALSE) +# plotVarImp(var_imp) +plotVarImpHeatmap(var_imp, xlab = "Species", ylab = "Band") +``` + +# Variable importance for RF +```{r, echo=FALSE} +var_imp <- compVarImp(all_models[["rf"]][["spec"]]@model[[1]], scale = FALSE) +# plotVarImp(var_imp) +plotVarImpHeatmap(var_imp, xlab = "Species", ylab = "Band") +``` + + +# Trophic levels +```{r} +var_imp_levels = var_imp +for(i in seq(length(var_imp_levels))){ + var_imp_levels[[i]]$RESPONSE = tl$Level[grep(var_imp_levels[[i]]$RESPONSE[1], tl$Species)] +} +plotVarImpHeatmap(var_imp_levels, xlab = "Species", ylab = "Band") +``` + + + + +When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the *Preview* button or press *Ctrl+Shift+K* to preview the HTML file). + +The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike *Knit*, *Preview* does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed. diff --git a/src/500_analyse_biodiv_sr.nb.html b/src/500_analyse_biodiv_sr.nb.html new file mode 100644 index 0000000..1be7136 --- /dev/null +++ b/src/500_analyse_biodiv_sr.nb.html @@ -0,0 +1,1971 @@ + + + + +
+ + + + + + + + +[1] \elui\
+ [1] ptype resp Resample mtype_pls ncomp nvars_pls RMSE_pls
+ [8] Rsquared_pls MAE_pls RMSE_normSD_pls Level_pls mtype_rf mtry nvars_rf
+[15] RMSE_rf Rsquared_rf MAE_rf RMSE_normSD_rf Level_rf
+<0 Zeilen> (oder row.names mit Länge 0)
+RMSE (1 - PLS/RF):
+Var number (RF/PLS):
+Levels with PLS is better: 0 0 0 0 0 0
+
+
+[1] \kmra\
+ ptype resp Resample mtype_pls ncomp nvars_pls RMSE_pls Rsquared_pls MAE_pls RMSE_normSD_pls Level_pls mtype_rf mtry
+241 kmra SRasterids Mean pls 8 14 4.379693 0.5013369 3.558558 0.7824208 Plants rf 6
+305 kmra SRferns Mean pls 11 12 4.701912 0.7137181 3.686251 0.5388445 Plants rf 2
+329 kmra SRmammals Mean pls 5 7 1.676879 0.2334310 1.422120 0.9741508 Generalist rf 2
+345 kmra SRmonocots Mean pls 13 14 4.060297 0.7540859 2.972480 0.5711398 Plants rf 8
+ nvars_rf RMSE_rf Rsquared_rf MAE_rf RMSE_normSD_rf Level_rf
+241 8 4.876534 0.2983567 3.992938 0.8711802 Plants
+305 4 4.973091 0.6784929 4.025896 0.5699220 Plants
+329 3 1.686781 0.3031130 1.388244 0.9799032 Generalist
+345 3 4.378556 0.7194768 3.490220 0.6159075 Plants
+RMSE (1 - PLS/RF): 0.01 0.05 0.07 0.1
+Var number (RF/PLS): 0.21 0.33 0.43 0.57
+Levels with PLS is better: 0 0 0 0 1 3
+
+
+[1] \spec\
+ ptype resp Resample mtype_pls ncomp nvars_pls RMSE_pls Rsquared_pls MAE_pls RMSE_normSD_pls
+433 spec SRallplants Mean pls 10 20 12.1677951 0.6404985 9.8793737 0.6038114
+449 spec SRants Mean pls 16 23 1.1402304 0.8933173 0.9233010 0.3360080
+465 spec SRbats Mean pls 12 22 1.2893364 0.8664830 1.0101511 0.3942589
+473 spec SRbees Mean pls 6 19 2.4459734 0.8413755 2.0174785 0.4138771
+481 spec SRbirds Mean pls 6 14 4.2239376 0.7781512 3.1281718 0.4910325
+489 spec SRcollembola Mean pls 8 24 1.0518208 0.7729542 0.7911845 0.4280729
+513 spec SReudicots Mean pls 11 17 1.4665003 0.5199711 1.1955748 0.6671803
+537 spec SRmagnoliids Mean pls 13 21 0.6450509 0.7977228 0.5350513 0.4503717
+545 spec SRmammals Mean pls 12 19 1.3371388 0.4846824 1.0720648 0.7767851
+593 spec SRothercoleoptera Mean pls 10 17 3.1074301 0.6235629 2.4441677 0.6358466
+609 spec SRrosids Mean pls 10 21 5.1116419 0.7113718 3.9698183 0.5027286
+617 spec SRsnails Mean pls 16 30 2.7158186 0.7472981 1.8932602 0.4878470
+ Level_pls mtype_rf mtry nvars_rf RMSE_rf Rsquared_rf MAE_rf RMSE_normSD_rf Level_rf
+433 Plants rf 7 9 13.0671744 0.6428939 10.7297639 0.6484419 Plants
+449 Generalist rf 8 8 1.7206668 0.7564282 1.1918567 0.5070535 Generalist
+465 Flyingpredatores rf 2 7 1.7621145 0.7801090 1.3642665 0.5388270 Flyingpredatores
+473 Herbivore rf 8 6 2.4714365 0.8242960 1.8320004 0.4181857 Herbivore
+481 Flyingpredatores rf 8 7 4.4892308 0.7962765 3.3893444 0.5218728 Flyingpredatores
+489 Decomposer rf 7 8 1.0924602 0.8015405 0.8882414 0.4446124 Decomposer
+513 Plants rf 4 4 1.5758132 0.4602090 1.2865897 0.7169120 Plants
+537 Plants rf 6 8 0.6691076 0.8298201 0.4836353 0.4671680 Plants
+545 Generalist rf 8 3 1.3750537 0.5186430 1.1302886 0.7988110 Generalist
+593 Predators rf 7 8 3.3653395 0.6095221 2.7642226 0.6886204 Predators
+609 Plants rf 2 5 5.6763627 0.7203280 4.3897044 0.5582687 Plants
+617 Generalist rf 3 3 2.8439540 0.7518932 2.1876421 0.5108641 Generalist
+RMSE (1 - PLS/RF): 0.01 0.03 0.04 0.04 0.05 0.06 0.07 0.07 0.08 0.1 0.27 0.34
+Var number (RF/PLS): 0.1 0.16 0.24 0.24 0.32 0.32 0.33 0.35 0.38 0.45 0.47 0.5
+Levels with PLS is better: 1 1 1 2 3 4
+
+
+[1] \elsp\
+ ptype resp Resample mtype_pls ncomp nvars_pls RMSE_pls Rsquared_pls MAE_pls RMSE_normSD_pls Level_pls
+649 elsp SRallplants Mean pls 12 21 9.762681 0.7556949 7.467871 0.4804236 Plants
+673 elsp SRasterids Mean pls 15 25 3.880332 0.5859014 3.304183 0.6880815 Plants
+809 elsp SRothercoleoptera Mean pls 8 14 3.298003 0.5622939 2.618039 0.6748419 Predators
+849 elsp SRsyrphids Mean pls 7 24 1.939375 0.6371102 1.518929 0.5864162 Generalist
+ mtype_rf mtry nvars_rf RMSE_rf Rsquared_rf MAE_rf RMSE_normSD_rf Level_rf
+649 rf 7 6 13.646908 0.5863973 11.277148 0.6715672 Plants
+673 rf 7 4 4.196627 0.5075030 3.459266 0.7441684 Plants
+809 rf 4 6 3.386110 0.5924158 2.858294 0.6928704 Predators
+849 rf 7 5 2.099933 0.5995575 1.712869 0.6349646 Generalist
+RMSE (1 - PLS/RF): 0.03 0.08 0.08 0.28
+Var number (RF/PLS): 0.16 0.21 0.29 0.43
+Levels with PLS is better: 0 0 0 1 1 2
+
+
+
+```r
+```r
+```r
+```r
+pls_rf_sr_long = melt(pls_rf_sr[pls_rf_sr$Resample == \Mean\, c(1, 2, 6, 13)], id.vars = c(\ptype\, \resp\))
+
+
+
+
+
+Error in melt(pls_rf_sr[pls_rf_sr$Resample == \Mean\, c(1, 2, 6, 13)], :
+ object 'pls_rf_sr' not found
+
+
+
+When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Ctrl+Shift+K to preview the HTML file).
+The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.
+ +rr t = do.call(, var_imp) t = t[t$mean>=0.6,] t\(RESPONSE = gsub(\_rf_elui_res\, \\, t\)RESPONSE) tt = table(t\(VARIABLE, t\)RESPONSE) pca_tt <- prcomp(tt, scale = TRUE, center = TRUE) pca_var <- as.data.frame(pca_tt\(rotation) pca_obs <- as.data.frame(pca_tt\)x) ggplot(pca_var, aes(PC1, PC2))+ geom_point()+ geom_point(data = pca_obs, aes(PC1, PC2), color = ) ggbiplot(pca_tt, labels = rownames(pca_tt$x), choices = 1:2)
biplot(pca_tt)
+
+
+
+When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Ctrl+Shift+K to preview the HTML file).
+The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.
+ +pls_rf_res_long = melt(pls_rf_res[pls_rf_res$Resample == "Mean", c(1, 2, 6, 13)], id.vars = c("ptype", "resp"))
+ggplot(data = pls_rf_res_long, aes(x = variable, y = value, fill = ptype)) +
+ geom_boxplot() +
+ labs(list(x = "Models", y = "Number of variables" ,
+ fill = "Predictor Set")) +
+ theme_bw()
+
+
+
+var_imp_levels = var_imp
+for(i in seq(length(var_imp_levels))){
+ var_imp_levels[[i]]$RESPONSE = tl$Level[grep(var_imp_levels[[i]]$RESPONSE[1], tl$Species)]
+}
+plotVarImpHeatmap(var_imp_levels, xlab = "Species", ylab = "Band")
+
+
+
+When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Ctrl+Shift+K to preview the HTML file).
+The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.
+ +Lable colors in the first tow boxplots have the following meaning: blue = LiDAR is better than hyperspectral observations, green = hyperspectral is better, black = prediction using elevation is better.
+best_model_gam$best_model_table
+##
+## gam_elev gam_elui
+## 10 17
+best_model_pls_incl_gam$best_model_table
+##
+## pls_eldr pls_elsp pls_esld pls_lidr pls_spec pls_splr
+## 2 2 2 1 3 17
+best_model_pls_single$best_model_table
+##
+## pls_kmra pls_lidr pls_spec
+## 1 9 17
+best_model_pls_single_incl_gam$best_model_table
+##
+## gam_elev gam_elui pls_lidr pls_spec
+## 1 3 8 15
+best_model_rf_incl_gam$best_model_table
+##
+## rf_eldr rf_elsp rf_esld rf_spec rf_splr
+## 1 3 7 3 13
+best_model_rf_single$best_model_table
+##
+## rf_lidr rf_spec
+## 9 18
+best_model_rf_single_incl_gam$best_model_table
+##
+## gam_elev gam_elui rf_lidr rf_spec
+## 1 1 8 17
+lbl_color <- best_model_pls_single_incl_gam$best_model[, c("resp", "ptype")]
+lbl_color$color = "black"
+lbl_color$color[lbl_color$ptype == "lidr"] = "blue"
+lbl_color$color[lbl_color$ptype == "spec"] = "darkgreen"
+
+ggplot(
+ data = model_sr_m[model_sr_m$mptype %in% pls_models_single| model_sr_m$mptype %in% gam_models, ],
+ aes(x = resp, y = RMSE_normSD, fill = mptype)
+) +
+ geom_boxplot() +
+ geom_hline(yintercept = c(0.5, 1), linetype = "dashed", color = "black") +
+ scale_fill_brewer(palette = "Dark2") +
+ theme_bw() +
+ theme(axis.text.x = element_text(angle = 45, hjust = 1, colour = lbl_color$color)) +
+ labs(list(x = "Species groups", y = "RMSEn", fill = "Model set"))
+## Warning: Vectorized input to `element_text()` is not officially supported.
+## Results may be unexpected or may change in future versions of ggplot2.
+lbl_color <- best_model_rf_single_incl_gam$best_model[, c("resp", "ptype")]
+lbl_color$color = "black"
+lbl_color$color[lbl_color$ptype == "lidr"] = "blue"
+lbl_color$color[lbl_color$ptype == "spec"] = "darkgreen"
+
+ggplot(
+ data = model_sr_m[model_sr_m$mptype %in% rf_models_single| model_sr_m$mptype %in% gam_models, ],
+ aes(x = resp, y = RMSE_normSD, fill = mptype)
+) +
+ geom_boxplot() +
+ geom_hline(yintercept = c(0.5, 1), linetype = "dashed", color = "black") +
+ scale_fill_brewer(palette = "Dark2") +
+ theme_bw() +
+ theme(axis.text.x = element_text(angle = 45, hjust = 1, colour = lbl_color$color)) +
+ labs(list(x = "Species groups", y = "RMSEn", fill = "Model set"))
+## Warning: Vectorized input to `element_text()` is not officially supported.
+## Results may be unexpected or may change in future versions of ggplot2.
+ggplot(data = rbind(model_sr_m[(model_sr_m$mptype == "gam_elui" | model_sr_m$mptype == "gam_elev" | model_sr_m$mptype == "pls_spec" | model_sr_m$mptype == "pls_lidr" | model_sr_m$mptype == "pls_elui" | model_sr_m$mptype == "rf_spec" | model_sr_m$mptype == "rf_lidr" | model_sr_m$mptype == "rf_elui") & model_sr_m$Resample != "Mean", ]), aes(x = resp, y = RMSE_normSD, fill = mptype)) +
+ geom_boxplot() +
+ geom_hline(yintercept = c(0.5, 1), linetype = "dashed", color = "black") +
+ scale_fill_brewer(palette = "Dark2") +
+ theme_bw() +
+ theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
+ labs(list(x = "Species groups", y = "RMSEn", fill = "Model set"))
+