From 6ca78567c4b16076e4194f429e9adca5cd4b3bdb Mon Sep 17 00:00:00 2001 From: Loic-Lenof <loic.lenof@gmail.com> Date: Mon, 19 Sep 2022 14:09:09 +0200 Subject: [PATCH] Correction of errors + added unit for "Mean whistling time per dolphin per min" + removed factor 2 that was left by mistake --- Stats/.Rhistory | 148 +++++++++--------- Stats/BBP-click-whistles_3models.R | 49 +++--- Stats/Rplot.pdf | Bin 0 -> 14079 bytes Whistles/1-Identification_of_whistles.py | 2 +- .../__pycache__/WhistleUtils.cpython-39.pyc | Bin 0 -> 12247 bytes 5 files changed, 100 insertions(+), 99 deletions(-) create mode 100644 Stats/Rplot.pdf create mode 100644 Whistles/__pycache__/WhistleUtils.cpython-39.pyc diff --git a/Stats/.Rhistory b/Stats/.Rhistory index 0557ac4..eaeec58 100644 --- a/Stats/.Rhistory +++ b/Stats/.Rhistory @@ -1,29 +1,3 @@ -library(multcompView) # "multcompLetters" function -library(ggplot2) -library(pgirmess) -library(postHoc) -#library(tidyquant) # geom_ma() if rolling average needed -################# DATASET IMPORTS ##################################### -folder <- './../' -whistles.dta <-read.table(file=paste0(folder, -'Whistles/Evaluation/whistles_durations.csv'), -sep = ',', header=TRUE) -whistles.dta <- whistles.dta[order(whistles.dta$audio_names),] -bbp.dta <-read.table(file=paste0(folder, -'BBPs/Results/16-06-22_14h00_number_of_BBP.csv'), -sep = ',', header=TRUE) -bbp.dta <- bbp.dta[order(bbp.dta$audio_names),] -clicks.dta <-read.table(file=paste0(folder, -'Clicks/Results/projection_updated_number_of_clicks_02052022.csv'), #number_of_clicks_02052022.csv -sep = ',', header=TRUE) -clicks.dta <- clicks.dta[order(clicks.dta$audio_names),] -# Merge files into 1 dataset -acoustic.dta <- clicks.dta -acoustic.dta$number_of_bbp <- bbp.dta$number_of_BBP -acoustic.dta$total_whistles_duration <- whistles.dta$total_whistles_duration -rm(whistles.dta, bbp.dta, clicks.dta) -# add group IDs -id2020 <- read.table(file=paste0(folder, 'CSV_data/Audio_Data_2020.csv'), sep = ',', header=TRUE)[1:396,] id2021 <- read.table(file=paste0(folder, 'CSV_data/Audio_Data_2021.csv'), sep = ',', header=TRUE)[1:96,] @@ -93,7 +67,7 @@ shapiro.test(acoustic.dta$total_whistles_duration) shapiro.test(acoustic.dta$number_of_bbp) shapiro.test(acoustic.dta$number_of_clicks) # p-values are significant => they do not follow normal distributions -# will need a transformation or the use of a glm model +# will need a transformation or the use of a glim model # X Number of individuals per level summary(factor(acoustic.dta$acoustic)) summary(factor(acoustic.dta$fishing_net)) @@ -110,11 +84,11 @@ ftable(factor(acoustic.dta$fishing_net), factor(acoustic.dta$behavior), factor(a # => They will be treated apart from the rest as they are likely to be biased ##################### STATISTICAL MODELLING ########################### ### Model tested -# LM: Linear model (residual hypothesis: normality, homoscedasticity, independant) -# GLM: Generalized linear model (residual hypothesis: homoscedasticity, independant) -# NB : Negative Binomial model (usually, when overdispersion with GLM) -# ZINB: Zero inflated negative binomial model (residual hypothesis: homoscedasticity, independant -# using number as an offset (more dolphins => more signals) +# GLM: General linear model (residual hypothesis: normality, homoscedasticity, independant) +# GLIM: Generalized linear model (residual hypothesis: uncorrelated residuals) +# NB : Negative Binomial model (residual hypothesis: independantM) +# ZINB: Zero inflated negative binomial model (residual hypothesis: independant) +# We are using number as an offset (more dolphins => more signals) # beacon and net explanatory variables could not be tested in models # as they contain information already present in "fishing_net" which is more # interesting to keep for our study. They will be treated after @@ -123,8 +97,8 @@ ftable(factor(acoustic.dta$fishing_net), factor(acoustic.dta$behavior), factor(a # If a variable is it in a model, it is because it had no significant effect. par(mfrow=c(1,1)) ### Model for whistles -# Residual hypotheses not verified for LM -# Overdipsersion when using GLM (negative binomial) +# Residual hypotheses not verified for GLM +# Overdipsersion when using GLIM (negative binomial) # Using ZINB: zero.whi <- zeroinfl(total_whistles_duration ~ acoustic + fishing_net + behavior + offset(log(number)), @@ -138,11 +112,12 @@ mod.whi <- zero.whi # => zeroinflated model is indeed better suited car::Anova(mod.whi, type=3) dwtest(mod.whi) # H0 -> independent if p>0.05 (autocorrelation if p<0.05) bptest(mod.whi) # H0 -> homoscedasticity if p<0.05 -# No normality but we do not need it +mod.whi$df.null/mod.whi$df.residual +# no dispersion, perfect ### Model for BBP -# No normality of residuals for LM -# overdispersion with GLM quasipoisson -#try with glm NB: +# No normality of residuals for GLM +# overdispersion with GLIM quasipoisson +#try with glim NB: mod.bbp <- glm.nb(number_of_bbp ~ acoustic + fishing_net + behavior + offset(log(number)), data=acoustic.dta) @@ -156,7 +131,6 @@ mod.bbp$deviance/mod.bbp$df.residual mod.cli <- glm.nb(number_of_clicks ~ acoustic + fishing_net + acoustic:fishing_net + offset(log(number)), data=acoustic.dta) car::Anova(mod.cli, type=3) -shapiro.test(residuals(mod.cli)) # H0 : normality -> cannot be rejected if p > 0.05 dwtest(mod.cli) # H0 -> independent if p>0.05 (autocorrelation if p<0.05) bptest(mod.cli) # H0 -> homoscedasticity if p<0.05 mod.cli$deviance/mod.cli$df.residual @@ -216,11 +190,11 @@ acoustic.dta$clicks_per_dolphin <- acoustic.dta$number_of_clicks/acoustic.dta$nu table <- cld(emmeans(mod.whi, pairwise~fishing_net, adjust="tukey"), Letters = letters) myletters_df <- data.frame(fishing_net=table$fishing_net, letter = trimws(table$.group)) -barPlot(computeStats(acoustic.dta, fishing_net, whistling_time_per_dolphin/375), # 375 bins = 1 sec +barPlot(computeStats(acoustic.dta, fishing_net, whistling_time_per_dolphin/n_bins), myletters_df, fishing_net, old_names = c("SSF","F"), new_names = c("Absent", "Present"), xname="Presence/Asence of fishing net", height=.5, -ytitle="Mean whistling time per dolphin per min") +ytitle="Mean whistling time per dolphin per min (in sec)") # BBP table <- cld(emmeans(mod.bbp, pairwise~fishing_net, adjust="tukey"), Letters = letters) myletters_df <- data.frame(fishing_net=table$fishing_net, @@ -243,8 +217,8 @@ ytitle="Mean number of clicks per dolphin per min") # Whistles table <- cld(emmeans(mod.whi, pairwise~acoustic, adjust="tukey"), Letters = letters) myletters_df <- data.frame(acoustic=table$acoustic,letter = trimws(table$.group)) -barPlot(computeStats(acoustic.dta, acoustic, whistling_time_per_dolphin/375), -myletters_df, acoustic, height=0.65, ytitle="Mean whistling time per dolphin per min", +barPlot(computeStats(acoustic.dta, acoustic, whistling_time_per_dolphin/n_bins), +myletters_df, acoustic, height=0.65, ytitle="Mean whistling time per dolphin per min (in sec)", old_names = c("AV","AV+D","D","D+AP","AP"), new_names = c("BEF","BEF+DUR","DUR", "DUR+AFT", "AFT"), xname="Activation sequence") @@ -272,9 +246,9 @@ letters_df$acoustic <- computeLetters(emmeans(mod.whi, pairwise~fishing_net:acou "acoustic")$acoustic letters_df <- letters_df[, c("acoustic","fishing_net","letter")] letters_df$letter <- gsub(" ", "", letters_df$letter) -barPlot(computeStats(acoustic.dta, fishing_net, whistling_time_per_dolphin/375, two=acoustic), +barPlot(computeStats(acoustic.dta, fishing_net, whistling_time_per_dolphin/n_bins, two=acoustic), NULL, acoustic, fill=fishing_net, -old_names = c("AV","AV+D","D","D+AP","AP"), ytitle="Mean whistling time per dolphin per min", +old_names = c("AV","AV+D","D","D+AP","AP"), ytitle="Mean whistling time per dolphin per min (in sec)", new_names = c("BEF","BEF+DUR","DUR", "DUR+AFT", "AFT"), xname="Activation sequence", height=c(.95,.95,.95,1,.95,1,.95,1,1,1), colours=c("#E69F00","#999999"), size=5, @@ -311,8 +285,8 @@ legend_title="Fishing net", legend_labs=c("Present", "Absent")) # Whistles table <- cld(emmeans(mod.whi, pairwise~behavior, adjust="tukey"), Letters = letters) myletters_df <- data.frame(behavior=table$behavior,letter = trimws(table$.group)) -barPlot(computeStats(acoustic.dta, behavior, whistling_time_per_dolphin/375), -myletters_df, behavior, height=0.75, ytitle="Mean whistling time per dolphin per min", +barPlot(computeStats(acoustic.dta, behavior, whistling_time_per_dolphin/n_bins), +myletters_df, behavior, height=0.75, ytitle="Mean whistling time per dolphin per min (in sec)", old_names = c("CHAS", "DEPL", "SOCI"), new_names = c("Foraging", "Travelling", "Socialising"), xname="Behaviours of dolphins") @@ -344,12 +318,12 @@ kruskalmc(acoustic.dta$whistling_time_per_dolphin, acoustic.dta$net) # DIY : letters myletters_df <- data.frame(net=c("SSF", "chalut_blanc", "chalut_vert", "tremail", "grand_filet"), letter = c("a","ad","bd","cd","a")) -barPlot(computeStats(acoustic.dta, net, whistling_time_per_dolphin/375), +barPlot(computeStats(acoustic.dta, net, whistling_time_per_dolphin/n_bins), NULL, net, old_names = c("SSF", "chalut_blanc", "chalut_vert", "tremail", "grand_filet"), new_names = c("Absent", "Nylon trawl net", "PE trawl net", "Nylon gill net", "Long nylon gill net"), xname="Fishing nets", height=.6, -ytitle="Mean whistling time per dolphin per min")+ +ytitle="Mean whistling time per dolphin per min (in sec)")+ theme(axis.text.x=element_text(size=8.5)) # BBPs #KW test @@ -385,19 +359,19 @@ theme(axis.text.x=element_text(size=8.5)) # Whistles #KW test kruskal.test(acoustic.dta$whistling_time_per_dolphin ~ acoustic.dta$beacon) -names = computeStats(acoustic.dta, beacon, whistling_time_per_dolphin/375)["beacon"] -barPlot(computeStats(acoustic.dta, beacon, whistling_time_per_dolphin/375), +names = computeStats(acoustic.dta, beacon, whistling_time_per_dolphin/n_bins)["beacon"] +barPlot(computeStats(acoustic.dta, beacon, whistling_time_per_dolphin/n_bins), NULL, beacon, old_names = unlist(names), new_names = unlist(names), xname="Signals from bio-inspired beacon", height=0.9, size=3, -ytitle="Mean whistling time per dolphin per min")+ +ytitle="Mean whistling time per dolphin per min (in sec)")+ theme(axis.text.x=element_text(size=8))+ scale_x_discrete(guide=guide_axis(n.dodge = 2)) # NC stands for "Unknown". Corresponding to categories where the beacon was not turned on yet ('BEF') # BBPs #KW test kruskal.test(acoustic.dta$BBPs_per_dolphin ~ acoustic.dta$beacon) -names = computeStats(acoustic.dta, beacon, whistling_time_per_dolphin/375)["beacon"] +names = computeStats(acoustic.dta, beacon, BBPs_per_dolphin)["beacon"] barPlot(computeStats(acoustic.dta, beacon, BBPs_per_dolphin), NULL, beacon, old_names = unlist(names), new_names = unlist(names), @@ -409,7 +383,7 @@ scale_x_discrete(guide=guide_axis(n.dodge = 2)) # Clicks #KW test kruskal.test(acoustic.dta$clicks_per_dolphin ~ acoustic.dta$beacon) -names = computeStats(acoustic.dta, beacon, whistling_time_per_dolphin/375)["beacon"] +names = computeStats(acoustic.dta, beacon, clicks_per_dolphin)["beacon"] barPlot(computeStats(acoustic.dta, beacon, clicks_per_dolphin), NULL, beacon, old_names = unlist(names), unlist(names), @@ -420,7 +394,7 @@ scale_x_discrete(guide=guide_axis(n.dodge = 2)) # NC stands for "Unknown". Corresponding to categories where the beacon was not turned on yet ('BEF') #### Plots by number of dolphins #### # Whistles -numb_stats_w <- computeStats(acoustic.dta, number, total_whistles_duration/375) +numb_stats_w <- computeStats(acoustic.dta, number, total_whistles_duration/n_bins) numb_stats_w[is.na(numb_stats_w)] <- 0 numb_stats_w$number <- as.factor(numb_stats_w$number) numb_stats_w %>% @@ -429,7 +403,7 @@ geom_errorbar(aes(x=number, ymin=mean-ic, ymax=mean+ic), color="red", width=.1, show.legend = FALSE)+ geom_point() + geom_line() + theme_classic() + theme(text=element_text(size=12)) + -ylab("Mean whistling time per min")+ +ylab("Mean whistling time per dolphin per min (in sec)")+ xlab("Number of dolphins in group") # BBPs numb_stats_b <- computeStats(acoustic.dta, number, number_of_bbp) @@ -441,7 +415,7 @@ geom_errorbar(aes(x=number, ymin=mean-ic, ymax=mean+ic), color="red", width=.1, show.legend = FALSE)+ geom_point() + geom_line() + theme_classic() + theme(text=element_text(size=12)) + -ylab("Number of BBPs per min")+ +ylab("Number of BBPs per dolphin per min")+ xlab("Number of dolphins in group") # Clicks numb_stats_c <- computeStats(acoustic.dta, number, number_of_clicks) @@ -453,11 +427,11 @@ geom_errorbar(aes(x=number, ymin=mean-ic, ymax=mean+ic), color="red", width=.1)+ geom_point() + geom_line() + theme_classic() + theme(text=element_text(size=12)) + -ylab("Mean number of clicks per min")+ +ylab("Mean number of clicks per dolphin per min")+ xlab("Number of echolocation clicks in group") #### Plots by Group ID #### # Whistles -numb_stats_w <- computeStats(acoustic.dta, ID, whistling_time_per_dolphin/375) +numb_stats_w <- computeStats(acoustic.dta, ID, whistling_time_per_dolphin/n_bins) numb_stats_w[is.na(numb_stats_w)] <- 0 numb_stats_w$ID <- as.factor(numb_stats_w$ID) numb_stats_w %>% @@ -466,7 +440,7 @@ geom_errorbar(aes(x=ID, ymin=mean-sd, ymax=mean+sd), color="red", width=.1, show.legend = FALSE)+ geom_point() + scale_x_discrete(guide = guide_axis(n.dodge = 2))+ theme_light() + theme(text=element_text(size=12)) + -ylab("Mean whistling time per min")+ +ylab("Mean whistling time per dolphin per min (in sec)")+ xlab("ID of dolphins group") # BBPs numb_stats_b <- computeStats(acoustic.dta, ID, BBPs_per_dolphin) @@ -478,7 +452,7 @@ geom_errorbar(aes(x=ID, ymin=mean-sd, ymax=mean+sd), color="red", width=.1, show.legend = FALSE)+ geom_point() + scale_x_discrete(guide = guide_axis(n.dodge = 2))+ theme_light() + theme(text=element_text(size=12)) + -ylab("Number of BBPs per min")+ +ylab("Number of BBPs per dolphin per min")+ xlab("ID of dolphins group") # Clicks numb_stats_c <- computeStats(acoustic.dta, ID, clicks_per_dolphin) @@ -490,7 +464,7 @@ geom_errorbar(aes(x=ID, ymin=mean-sd, ymax=mean+sd), color="red", width=.1)+ geom_point() + scale_x_discrete(guide = guide_axis(n.dodge = 2))+ theme_light() + theme(text=element_text(size=12)) + -ylab("Mean number of clicks per min")+ +ylab("Mean number of clicks per dolphin per min")+ xlab("ID of dolphin group") # KW test on IDs # whistles (excluding groups "2" because 1 sample and groups because no whistles recorded ) @@ -498,15 +472,41 @@ data_test <- acoustic.dta[acoustic.dta$ID!="2",] print( posthocKW(data_test$whistling_time_per_dolphin, data_test$ID)) print( posthocKW(data_test$BBPs_per_dolphin, data_test$ID)) print( posthocKW(data_test$clicks_per_dolphin, data_test$ID)) -mod.cli$deviance/mod.cli$df.residual -mod.bbp$deviance/mod.bbp$df.residual -mod.whi$deviance/mod.whi$df.residual -mod.whi$deviance/mod.whi$df.residual -mod.whi$deviance -mod.whi -mod.whi$fitted.values -mod.whi$df.null -mod.whi$df.residual -mod.whi$df.null/mod.whi$df.residual -mod.bbp$deviance/mod.bbp$df.residual -mod.cli$deviance/mod.cli$df.residual +#### Fishing net #### +# whistles +table <- cld(emmeans(mod.whi, pairwise~fishing_net, adjust="tukey"), Letters = letters) +myletters_df <- data.frame(fishing_net=table$fishing_net, +letter = trimws(table$.group)) +barPlot(computeStats(acoustic.dta, fishing_net, whistling_time_per_dolphin/n_bins), +myletters_df, fishing_net, +old_names = c("SSF","F"), new_names = c("Absent", "Present"), +xname="Presence/Asence of fishing net", height=1, +ytitle="Mean whistling time per dolphin per min (in sec)") +#### Acoustic plots #### +# Whistles +table <- cld(emmeans(mod.whi, pairwise~acoustic, adjust="tukey"), Letters = letters) +myletters_df <- data.frame(acoustic=table$acoustic,letter = trimws(table$.group)) +barPlot(computeStats(acoustic.dta, acoustic, whistling_time_per_dolphin/n_bins), +myletters_df, acoustic, height=1.2, ytitle="Mean whistling time per dolphin per min (in sec)", +old_names = c("AV","AV+D","D","D+AP","AP"), +new_names = c("BEF","BEF+DUR","DUR", "DUR+AFT", "AFT"), +xname="Activation sequence") +barPlot(computeStats(acoustic.dta, acoustic, whistling_time_per_dolphin/n_bins), +myletters_df, acoustic, height=1.3, ytitle="Mean whistling time per dolphin per min (in sec)", +old_names = c("AV","AV+D","D","D+AP","AP"), +new_names = c("BEF","BEF+DUR","DUR", "DUR+AFT", "AFT"), +xname="Activation sequence") +#### Behaviour plots #### +# Whistles +table <- cld(emmeans(mod.whi, pairwise~behavior, adjust="tukey"), Letters = letters) +myletters_df <- data.frame(behavior=table$behavior,letter = trimws(table$.group)) +barPlot(computeStats(acoustic.dta, behavior, whistling_time_per_dolphin/n_bins), +myletters_df, behavior, height=1.5, ytitle="Mean whistling time per dolphin per min (in sec)", +old_names = c("CHAS", "DEPL", "SOCI"), +new_names = c("Foraging", "Travelling", "Socialising"), +xname="Behaviours of dolphins") +25.8/19.1 +5.65/(25.8/19.1) +25.15/20.9 +5.65/(25.15/20.9) +5.65/(25.8/23.4) diff --git a/Stats/BBP-click-whistles_3models.R b/Stats/BBP-click-whistles_3models.R index d00efb1..17d7dcd 100644 --- a/Stats/BBP-click-whistles_3models.R +++ b/Stats/BBP-click-whistles_3models.R @@ -19,6 +19,7 @@ library(pgirmess) library(postHoc) #library(tidyquant) # geom_ma() if rolling average needed +n_bins = 187.5 # number of bins per sec for spectrograms (whistles) ################# DATASET IMPORTS ##################################### folder <- './../' @@ -268,11 +269,11 @@ acoustic.dta$clicks_per_dolphin <- acoustic.dta$number_of_clicks/acoustic.dta$nu table <- cld(emmeans(mod.whi, pairwise~fishing_net, adjust="tukey"), Letters = letters) myletters_df <- data.frame(fishing_net=table$fishing_net, letter = trimws(table$.group)) -barPlot(computeStats(acoustic.dta, fishing_net, whistling_time_per_dolphin/375), # 375 bins = 1 sec +barPlot(computeStats(acoustic.dta, fishing_net, whistling_time_per_dolphin/n_bins), myletters_df, fishing_net, old_names = c("SSF","F"), new_names = c("Absent", "Present"), - xname="Presence/Asence of fishing net", height=.5, - ytitle="Mean whistling time per dolphin per min") + xname="Presence/Asence of fishing net", height=1, + ytitle="Mean whistling time per dolphin per min (in sec)") # BBP table <- cld(emmeans(mod.bbp, pairwise~fishing_net, adjust="tukey"), Letters = letters) @@ -299,8 +300,8 @@ barPlot(computeStats(acoustic.dta, fishing_net, clicks_per_dolphin), # Whistles table <- cld(emmeans(mod.whi, pairwise~acoustic, adjust="tukey"), Letters = letters) myletters_df <- data.frame(acoustic=table$acoustic,letter = trimws(table$.group)) -barPlot(computeStats(acoustic.dta, acoustic, whistling_time_per_dolphin/375), - myletters_df, acoustic, height=0.65, ytitle="Mean whistling time per dolphin per min", +barPlot(computeStats(acoustic.dta, acoustic, whistling_time_per_dolphin/n_bins), + myletters_df, acoustic, height=1.3, ytitle="Mean whistling time per dolphin per min (in sec)", old_names = c("AV","AV+D","D","D+AP","AP"), new_names = c("BEF","BEF+DUR","DUR", "DUR+AFT", "AFT"), xname="Activation sequence") @@ -332,9 +333,9 @@ letters_df$acoustic <- computeLetters(emmeans(mod.whi, pairwise~fishing_net:acou "acoustic")$acoustic letters_df <- letters_df[, c("acoustic","fishing_net","letter")] letters_df$letter <- gsub(" ", "", letters_df$letter) -barPlot(computeStats(acoustic.dta, fishing_net, whistling_time_per_dolphin/375, two=acoustic), +barPlot(computeStats(acoustic.dta, fishing_net, whistling_time_per_dolphin/n_bins, two=acoustic), NULL, acoustic, fill=fishing_net, - old_names = c("AV","AV+D","D","D+AP","AP"), ytitle="Mean whistling time per dolphin per min", + old_names = c("AV","AV+D","D","D+AP","AP"), ytitle="Mean whistling time per dolphin per min (in sec)", new_names = c("BEF","BEF+DUR","DUR", "DUR+AFT", "AFT"), xname="Activation sequence", height=c(.95,.95,.95,1,.95,1,.95,1,1,1), colours=c("#E69F00","#999999"), size=5, @@ -374,8 +375,8 @@ barPlot(computeStats(acoustic.dta, fishing_net, clicks_per_dolphin, two=acoustic # Whistles table <- cld(emmeans(mod.whi, pairwise~behavior, adjust="tukey"), Letters = letters) myletters_df <- data.frame(behavior=table$behavior,letter = trimws(table$.group)) -barPlot(computeStats(acoustic.dta, behavior, whistling_time_per_dolphin/375), - myletters_df, behavior, height=0.75, ytitle="Mean whistling time per dolphin per min", +barPlot(computeStats(acoustic.dta, behavior, whistling_time_per_dolphin/n_bins), + myletters_df, behavior, height=1.5, ytitle="Mean whistling time per dolphin per min (in sec)", old_names = c("CHAS", "DEPL", "SOCI"), new_names = c("Foraging", "Travelling", "Socialising"), xname="Behaviours of dolphins") @@ -410,12 +411,12 @@ kruskalmc(acoustic.dta$whistling_time_per_dolphin, acoustic.dta$net) # DIY : letters myletters_df <- data.frame(net=c("SSF", "chalut_blanc", "chalut_vert", "tremail", "grand_filet"), letter = c("a","ad","bd","cd","a")) -barPlot(computeStats(acoustic.dta, net, whistling_time_per_dolphin/375), +barPlot(computeStats(acoustic.dta, net, whistling_time_per_dolphin/n_bins), NULL, net, old_names = c("SSF", "chalut_blanc", "chalut_vert", "tremail", "grand_filet"), new_names = c("Absent", "Nylon trawl net", "PE trawl net", "Nylon gill net", "Long nylon gill net"), xname="Fishing nets", height=.6, - ytitle="Mean whistling time per dolphin per min")+ + ytitle="Mean whistling time per dolphin per min (in sec)")+ theme(axis.text.x=element_text(size=8.5)) # BBPs @@ -455,12 +456,12 @@ barPlot(computeStats(acoustic.dta, net, clicks_per_dolphin), # Whistles #KW test kruskal.test(acoustic.dta$whistling_time_per_dolphin ~ acoustic.dta$beacon) -names = computeStats(acoustic.dta, beacon, whistling_time_per_dolphin/375)["beacon"] -barPlot(computeStats(acoustic.dta, beacon, whistling_time_per_dolphin/375), +names = computeStats(acoustic.dta, beacon, whistling_time_per_dolphin/n_bins)["beacon"] +barPlot(computeStats(acoustic.dta, beacon, whistling_time_per_dolphin/n_bins), NULL, beacon, old_names = unlist(names), new_names = unlist(names), xname="Signals from bio-inspired beacon", height=0.9, size=3, - ytitle="Mean whistling time per dolphin per min")+ + ytitle="Mean whistling time per dolphin per min (in sec)")+ theme(axis.text.x=element_text(size=8))+ scale_x_discrete(guide=guide_axis(n.dodge = 2)) # NC stands for "Unknown". Corresponding to categories where the beacon was not turned on yet ('BEF') @@ -468,7 +469,7 @@ barPlot(computeStats(acoustic.dta, beacon, whistling_time_per_dolphin/375), # BBPs #KW test kruskal.test(acoustic.dta$BBPs_per_dolphin ~ acoustic.dta$beacon) -names = computeStats(acoustic.dta, beacon, whistling_time_per_dolphin/375)["beacon"] +names = computeStats(acoustic.dta, beacon, BBPs_per_dolphin)["beacon"] barPlot(computeStats(acoustic.dta, beacon, BBPs_per_dolphin), NULL, beacon, old_names = unlist(names), new_names = unlist(names), @@ -481,7 +482,7 @@ barPlot(computeStats(acoustic.dta, beacon, BBPs_per_dolphin), # Clicks #KW test kruskal.test(acoustic.dta$clicks_per_dolphin ~ acoustic.dta$beacon) -names = computeStats(acoustic.dta, beacon, whistling_time_per_dolphin/375)["beacon"] +names = computeStats(acoustic.dta, beacon, clicks_per_dolphin)["beacon"] barPlot(computeStats(acoustic.dta, beacon, clicks_per_dolphin), NULL, beacon, old_names = unlist(names), unlist(names), @@ -494,7 +495,7 @@ barPlot(computeStats(acoustic.dta, beacon, clicks_per_dolphin), #### Plots by number of dolphins #### # Whistles -numb_stats_w <- computeStats(acoustic.dta, number, total_whistles_duration/375) +numb_stats_w <- computeStats(acoustic.dta, number, total_whistles_duration/n_bins) numb_stats_w[is.na(numb_stats_w)] <- 0 numb_stats_w$number <- as.factor(numb_stats_w$number) @@ -504,7 +505,7 @@ numb_stats_w %>% color="red", width=.1, show.legend = FALSE)+ geom_point() + geom_line() + theme_classic() + theme(text=element_text(size=12)) + - ylab("Mean whistling time per min")+ + ylab("Mean whistling time per dolphin per min (in sec)")+ xlab("Number of dolphins in group") # BBPs @@ -518,7 +519,7 @@ numb_stats_b %>% color="red", width=.1, show.legend = FALSE)+ geom_point() + geom_line() + theme_classic() + theme(text=element_text(size=12)) + - ylab("Number of BBPs per min")+ + ylab("Number of BBPs per dolphin per min")+ xlab("Number of dolphins in group") # Clicks @@ -532,13 +533,13 @@ numb_stats_c %>% color="red", width=.1)+ geom_point() + geom_line() + theme_classic() + theme(text=element_text(size=12)) + - ylab("Mean number of clicks per min")+ + ylab("Mean number of clicks per dolphin per min")+ xlab("Number of echolocation clicks in group") #### Plots by Group ID #### # Whistles -numb_stats_w <- computeStats(acoustic.dta, ID, whistling_time_per_dolphin/375) +numb_stats_w <- computeStats(acoustic.dta, ID, whistling_time_per_dolphin/n_bins) numb_stats_w[is.na(numb_stats_w)] <- 0 numb_stats_w$ID <- as.factor(numb_stats_w$ID) numb_stats_w %>% @@ -547,7 +548,7 @@ numb_stats_w %>% color="red", width=.1, show.legend = FALSE)+ geom_point() + scale_x_discrete(guide = guide_axis(n.dodge = 2))+ theme_light() + theme(text=element_text(size=12)) + - ylab("Mean whistling time per min")+ + ylab("Mean whistling time per dolphin per min (in sec)")+ xlab("ID of dolphins group") # BBPs @@ -561,7 +562,7 @@ numb_stats_b %>% color="red", width=.1, show.legend = FALSE)+ geom_point() + scale_x_discrete(guide = guide_axis(n.dodge = 2))+ theme_light() + theme(text=element_text(size=12)) + - ylab("Number of BBPs per min")+ + ylab("Number of BBPs per dolphin per min")+ xlab("ID of dolphins group") # Clicks @@ -575,7 +576,7 @@ numb_stats_c %>% color="red", width=.1)+ geom_point() + scale_x_discrete(guide = guide_axis(n.dodge = 2))+ theme_light() + theme(text=element_text(size=12)) + - ylab("Mean number of clicks per min")+ + ylab("Mean number of clicks per dolphin per min")+ xlab("ID of dolphin group") # KW test on IDs diff --git a/Stats/Rplot.pdf b/Stats/Rplot.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c0a784b09ff71619a9a38531c657c12fea02ae3c GIT binary patch literal 14079 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%0AmA)Js>u+ON@*_Nzp(7M1#x)$-}S#*bk-#25=vm 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 az{$F}B(bOj9MguzrshUms;aL3Zd?FK1&(L{ literal 0 HcmV?d00001 diff --git a/Whistles/1-Identification_of_whistles.py b/Whistles/1-Identification_of_whistles.py index 82cb471..ec49c2d 100644 --- a/Whistles/1-Identification_of_whistles.py +++ b/Whistles/1-Identification_of_whistles.py @@ -55,7 +55,7 @@ print("Parameters ready to use!") #%% Importation of data and functions print("\rImportation of csv data...", end="\r") -from WhistleUtils import get_csv, plot_spectrums, get_local_maxima, get_trajectories, \ +from WhistleUtils import get_csv, get_local_maxima, get_trajectories, \ select_trajectories, sparsity_ridoff, harmonize_trajectories data_20_21, audio_paths = get_csv(csv_f, slash="/") print("Importation of csv data complete!\n") diff --git a/Whistles/__pycache__/WhistleUtils.cpython-39.pyc b/Whistles/__pycache__/WhistleUtils.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..74433f17a2ffe316c18bfcba11f488fd62e37294 GIT binary patch literal 12247 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 A-v9sr literal 0 HcmV?d00001 -- GitLab