Dataset -

# Fitting and projection datasets
fit_data <- raster::stack("../data/env/cropped_proj.tif")

Test 1: estrutura da função antiga

A função tem que funcionar se a pessoa indicar o filename - o qual entra por um loop diferente do que apenas criar o objeto e deixá-lo no disco. nesse caso ela deve aceitar overwrite = T

args(euclidean)
## function (predictors, occurrences, env_dist = "centroid", filename = "", 
##     ...) 
## NULL
centroide1 <- modleR::euclidean(predictors = fit_data,
                                occurrences = train_set[,c(2,3)],
                                env_dist = "centroid")
plot(centroide1)

#a unica diferença é o filename - que guarda diretamente no HD
centroide1hd <- modleR::euclidean(predictors = fit_data,
                                occurrences = train_set[,c(2,3)],
                                env_dist = "centroid", 
                                filename = "./eucl/test_centroide.tif",
                                overwrite = T)
plot(centroide1hd)

compareRaster(centroide1, centroide1hd)#são iguais em efeito
## [1] TRUE
mindist1 <- modleR::euclidean(predictors = fit_data,
                                occurrences = train_set[,c(2,3)],
                                env_dist = "mindist")
mindist1hd <- modleR::euclidean(predictors = fit_data,
                                occurrences = train_set[,c(2,3)],
                                env_dist = "mindist", 
                                filename = "./eucl/test_mindist.tif",
                                overwrite = T)
plot(mindist1)

#plot(mindist1hd)
compareRaster(mindist1, mindist1hd)
## [1] TRUE

dentro do pacote (setup e do_any) deve ser igual

##19Nov2019: isto nao deve rodar mais porque nao é mais algoritmo

setup <- setup_sdmdata(species_name = especies[1],
                       occurrences = coord1sp[, -1],
                       predictors = fit_data,
                       models_dir = "./eucl")
centroid_do_any <- do_any(species_name = especies[1],
                          predictors = fit_data,
                          write_png = T,
                          env_dist = "centroid",
                          models_dir = "./eucl")
mindist_do_any <- do_any(species_name = especies[1],
                         predictors = fit_data,
                         write_png = T,
                         env_dist = "mindist",
                         models_dir = "./eucl")
C <- raster("./eucl/Abarema_langsdorffii/present/partitions/centroid_cont_Abarema_langsdorffii_1_1.tif")
M <- raster("./eucl/Abarema_langsdorffii/present/partitions/mindist_cont_Abarema_langsdorffii_1_1.tif")
compareRaster(C, centroide1hd)
compareRaster(M, mindist1hd)

(blz tá fazendo bem dentro das funções do pacote)

Mas não dá pra projetar. Projetar seria:

  • guardar o valor do centroide ambiental e calcular de novo para o novo set de variáveis
  • guardar os valores ambientais nos pontos de origem na projeção de origem e calcular de novo mindist para cada pixel das novas camadas.

[daí é que eu vou separar a função como domain e mahal e um dos slots vai ser o centroide e outro dos slots vai ser o resultado do extract #wishmeluck podendo separar acho que isto já é papitas –se nãõ der para fazer isso a função euclidean tem que devolver em return esses valores e projetar a partir daí - seria a solução S3 capenga - rodar duas vezes a função euclidean msa a segunda vc entra com centroide e com os valores do extract]

Outro tema: tem que ter uma distância máxima + como diferem de mahalanobis?

A lógica da distância ambiental (nos modelos e no buffer) é que deveria ter uma distância máxima para cortar o raster, ou nada do que varia do lado de maior adequabilidade (menor distância) vai poder ser observado. Isto porque a distribuição dos valores pode ser particular. Aqui vou usar centroid e mindist junto com mahal de dismo como um padrão do que já está estabelecido.

Faço esses três modelos e vejo

  1. como os valores de distância se distribuem
  2. onde ficariam os LPT (lower presence training point)
  3. o que acontece se eu cortar por esse LPT ou por qualquer outro quantil

1. como diferem os três algoritmos

Centroide varia menos abruptamente, depois vem mindist e depois mahal (Mahal tem a distribuição de valores mais asimétrica), mas o maior problema é a visualização dos valores, os valores negativos fazem com que a adequabilidade alta fique invisível. Por isso Mahalanobis é a mais diferente mas também a menos interessante em termos de padrão geográfico (sem cortar)

2. em que quantil fica o LPT de cada um destes modelos?

Basicamente fitar uma função empirica da distribuição, extrair o ponto com menor adequabilidade e ver onde esse valor se encontra entre os valores. Estou usando LPT porque uma primeira alternativa era cortar pelo LPT = fazer com que esse valor fosse automaticamente a distância máxima - isso era um pouco arbitrário mas buscava obter uma distância máxima que ainda tivesse algum significado biológico para a espécie.

Fn_cen <- ecdf(df$cen) #fita a função
excen <- extract(centroide_original, coord1sp[,c(2,3)])
(LPT_cen <- min(excen))
## [1] -2.820854
Fn_cen(LPT_cen)#vê onde fica o mínimo 
## [1] 0.4074534
Fn_min <- ecdf(df$min)
exmin <- extract(mindist_original, coord1sp[,c(2,3)])
(LPT_min <- min(exmin))
## [1] 0.02335842
Fn_min(LPT_min)
## [1] 0.7594015
Fn_mah <- ecdf(df$mah)
exmah <- extract(mahal_original, coord1sp[,c(2,3)])
(LPT_mah <- min(exmah))
## [1] -3.933855
Fn_mah(LPT_mah)
## [1] 0.7233202

graficamente:

par(mfrow = c(1, 3))
plot(sort(df$cen), main = "centroid")
abline(v = sum(!is.na(df$cen)) * Fn_cen(LPT_cen), col = "red")

plot(sort(df$min), , main = "mindist")
abline(v = sum(!is.na(df$min)) * Fn_min(LPT_min), col = "red")

plot(sort(df$mah), , main = "mahal")
abline(v = sum(!is.na(df$mah)) * Fn_mah(LPT_mah), col = "red")

Cortando por esse LPT dá para ver a variação no intervalo que importa (e mesmo assim mahal não sabe distinguir muitas coisas)

Cortando pela mediana ou por qualquer outro quantil igual

  • Uma pergunta é se corto dentro de euclidean (uma vez só, parâmetro na função) ou por fora (um corte em buffer e outro em do_any())

Incluí este filtro ambiental na função buffer:

buf_env <- create_buffer(species_name = especies,
                         occurrences = coord1sp[, -1],
                         predictors = fit_data,
                         buffer_type = "none",
                         env_distance = "centroid",
                         max_env_dist = 0.7,
                         write_buffer = T)
plot(fit_data[[1]])
plot(buf_env, alpha = 0.8, add = T)

plot(buf_env)