https://doi.org/10.5281/zenodo.15690037
owt_calc.r
## Owt appplication
### Apply SAM to Rrs
require(data.table)
require(openxlsx)
require(hsdar)
require(dplyr)
require(data.table)
hyp = read.xlsx('Data/rrs.xlsx', detectDates = T)
references = fread('Data/OWTs/OWT_allwaters_mean_standardised.csv')
references = references[is.na(references$`Pahlevan et. al. 2021`)==F, -2]
# Remove colunas não utilizadas
# Transpõe a tabela de referências (exceto primeira coluna)
ref_names <- references[[1]]
references.t <- as.data.frame(t(references[,-1]))
colnames(references.t) <- ref_names
rownames(references.t) <- 400:800
# Prepara a tabela de saída
point <- data.frame(id = hyp$BR_ID)
# Renomeia colunas do dataframe de reflectância
names(hyp)[-c(1)] <- paste0("X", 400:900)
# Função para calcular o SAM
calc_sam <- function(target, refs) {
apply(refs, 2, function(ref) {
numerador <- sum(target * ref)
denominador <- sqrt(sum(target^2)) * sqrt(sum(ref^2))
theta <- acos(numerador / denominador)
return(theta)
})
}
# Loop sobre as amostras
for (i in 1:nrow(hyp)) {
pt <- hyp[i, ] %>%
dplyr::select(starts_with("X")) %>%
dplyr::select(paste0("X", 400:750)) %>%
t() %>% data.frame() %>% na.omit()
pt <- as.numeric(as.character(pt[,1]))
pt <- pt / sum(pt)
if (length(pt) == 351) {
distance <- calc_sam(pt[1:350], references.t[1:350,])
point[i, 2:(1 + length(distance))] <- distance
} else {
point[i, 2:(1 + ncol(references.t))] <- NA
}
print(i)
}
# Nomeia as colunas de distância
names(point)[2:(1 + length(ref_names))] <- ref_names
# Classificação com base no menor ângulo
point$Class <- apply(point[,-1], 1, function(row) {
if (all(is.na(row))) return(NA)
return(which.min(row))
})
write.csv(point, 'Outputs/SAM_OWT_rrs.csv', row.names = FALSE)