This commit is contained in:
weygoldt 2023-01-25 20:47:02 +01:00
parent bbff7fd80c
commit 1de3e944c5
6 changed files with 168 additions and 126 deletions

View File

@ -18,47 +18,62 @@ logger = makeLogger(__name__)
ps = PlotStyle()
def jackknife(data, nresamples, subsetsize, kde_time, kernel_width):
def bootstrap(data, nresamples, kde_time, kernel_width, event_times, time_before, time_after):
if len(data) == 0:
return []
bootstrapped_kdes = []
data = data[data <= 3*60*60] # only night time
jackknifed_kdes = []
data = np.sort(data)
subsetsize = int(np.round(len(data)*subsetsize))
# diff_data = np.diff(np.sort(data), prepend=0)
# if len(data) != 0:
# mean_chirprate = (len(data) - 1) / (data[-1] - data[0])
for n in range(nresamples):
for i in tqdm(range(nresamples)):
subset = np.random.choice(data, subsetsize, replace=False)
subset_kde = acausal_kde1d(subset, time=kde_time, width=kernel_width)
jackknifed_kdes.append(subset_kde)
# np.random.shuffle(diff_data)
return jackknifed_kdes
# bootstrapped_data = np.cumsum(diff_data)
bootstrapped_data = data + np.random.randn(len(data)) * 10
bootstrap_data_centered = center_chirps(
bootstrapped_data, event_times, time_before, time_after)
def bootstrap(data, nresamples, kde_time, kernel_width, event_times, time_before, time_after):
bootstrapped_kde = acausal_kde1d(
bootstrap_data_centered, time=kde_time, width=kernel_width)
bootstrapped_kdes = []
data = data[data <= 3*60*60] # only night time
# bootstrapped_kdes = list(np.asarray(
# bootstrapped_kdes) / len(event_times))
bootstrapped_kdes.append(bootstrapped_kde)
return bootstrapped_kdes
if len(data) == 0:
logger.info('No data for bootstrap, added zeros')
return [np.zeros_like(kde_time) for i in range(nresamples)]
diff_data = np.diff(np.sort(data), prepend=np.sort(data)[0])
def jackknife(data, nresamples, subsetsize, kde_time, kernel_width, event_times, time_before, time_after):
jackknife_kdes = []
data = data[data <= 3*60*60] # only night time
subsetsize = int(len(data) * subsetsize)
diff_data = np.diff(np.sort(data), prepend=0)
for i in tqdm(range(nresamples)):
np.random.shuffle(diff_data)
bootstrapped_data = np.random.sample(data, subsetsize, replace=False)
bootstrapped_data = np.cumsum(diff_data)
bootstrap_data_centered = center_chirps(
bootstrapped_data, event_times, time_before, time_after)
bootstrapped_kde = acausal_kde1d(
bootstrap_data_centered, time=kde_time, width=kernel_width)
bootstrapped_kdes.append(bootstrapped_kde)
# bootstrapped_kdes = list(np.asarray(
# bootstrapped_kdes) / len(event_times))
return bootstrapped_kdes
jackknife_kdes.append(bootstrapped_kde)
return jackknife_kdes
def get_chirp_winner_loser(folder_name, Behavior, order_meta_df):
@ -88,7 +103,7 @@ def get_chirp_winner_loser(folder_name, Behavior, order_meta_df):
def main(dataroot):
foldernames, _ = get_valid_datasets(dataroot)
plot_all = False
plot_all = True
time_before = 60
time_after = 60
dt = 0.001
@ -134,6 +149,9 @@ def main(dataroot):
bh = Behavior(folder)
category, timestamps = correct_chasing_events(bh.behavior, bh.start_s)
category = category[timestamps < 3*60*60] # only night time
timestamps = timestamps[timestamps < 3*60*60] # only night time
winner, loser = get_chirp_winner_loser(folder, bh, meta)
if winner is None:
@ -162,6 +180,8 @@ def main(dataroot):
loser, physicals, time_before, time_after))
# bootstrap
# chirps = [winner, winner, winner, loser, loser, loser]
winner_onsets_boot.append(bootstrap(
winner,
nresamples=nbootstraps,
@ -240,80 +260,80 @@ def main(dataroot):
ax[1, 2].plot(kde_time, loser_physicals_conv/len(physicals))
# # plot bootstrap lines
# for kde in winner_onsets_boot[-1]:
# ax[0, 0].plot(kde_time, kde/len(offsets),
# color='gray')
# for kde in winner_offsets_boot[-1]:
# ax[0, 1].plot(kde_time, kde/len(offsets),
# color='gray')
# for kde in winner_physicals_boot[-1]:
# ax[0, 2].plot(kde_time, kde/len(offsets),
# color='gray')
# for kde in loser_onsets_boot[-1]:
# ax[1, 0].plot(kde_time, kde/len(offsets),
# color='gray')
# for kde in loser_offsets_boot[-1]:
# ax[1, 1].plot(kde_time, kde/len(offsets),
# color='gray')
# for kde in loser_physicals_boot[-1]:
# ax[1, 2].plot(kde_time, kde/len(offsets),
# color='gray')
for kde in winner_onsets_boot[-1]:
ax[0, 0].plot(kde_time, kde/len(onsets),
color='gray')
for kde in winner_offsets_boot[-1]:
ax[0, 1].plot(kde_time, kde/len(offsets),
color='gray')
for kde in winner_physicals_boot[-1]:
ax[0, 2].plot(kde_time, kde/len(physicals),
color='gray')
for kde in loser_onsets_boot[-1]:
ax[1, 0].plot(kde_time, kde/len(onsets),
color='gray')
for kde in loser_offsets_boot[-1]:
ax[1, 1].plot(kde_time, kde/len(offsets),
color='gray')
for kde in loser_physicals_boot[-1]:
ax[1, 2].plot(kde_time, kde/len(physicals),
color='gray')
# plot bootstrap percentiles
ax[0, 0].fill_between(
kde_time,
np.percentile(winner_onsets_boot[-1], 5, axis=0)/len(onsets),
np.percentile(winner_onsets_boot[-1], 95, axis=0)/len(onsets),
color='gray',
alpha=0.5)
ax[0, 1].fill_between(
kde_time,
np.percentile(winner_offsets_boot[-1], 5, axis=0)/len(offsets),
np.percentile(
winner_offsets_boot[-1], 95, axis=0)/len(offsets),
color='gray',
alpha=0.5)
ax[0, 2].fill_between(
kde_time,
np.percentile(
winner_physicals_boot[-1], 5, axis=0)/len(physicals),
np.percentile(
winner_physicals_boot[-1], 95, axis=0)/len(physicals),
color='gray',
alpha=0.5)
ax[1, 0].fill_between(
kde_time,
np.percentile(loser_onsets_boot[-1], 5, axis=0)/len(onsets),
np.percentile(loser_onsets_boot[-1], 95, axis=0)/len(onsets),
color='gray',
alpha=0.5)
ax[1, 1].fill_between(
kde_time,
np.percentile(loser_offsets_boot[-1], 5, axis=0)/len(offsets),
np.percentile(loser_offsets_boot[-1], 95, axis=0)/len(offsets),
color='gray',
alpha=0.5)
ax[1, 2].fill_between(
kde_time,
np.percentile(
loser_physicals_boot[-1], 5, axis=0)/len(physicals),
np.percentile(
loser_physicals_boot[-1], 95, axis=0)/len(physicals),
color='gray',
alpha=0.5)
ax[0, 0].plot(kde_time, np.median(winner_onsets_boot[-1], axis=0)/len(onsets),
color='black', linewidth=2)
ax[0, 1].plot(kde_time, np.median(winner_offsets_boot[-1], axis=0)/len(offsets),
color='black', linewidth=2)
ax[0, 2].plot(kde_time, np.median(winner_physicals_boot[-1], axis=0)/len(physicals),
color='black', linewidth=2)
ax[1, 0].plot(kde_time, np.median(loser_onsets_boot[-1], axis=0)/len(onsets),
color='black', linewidth=2)
ax[1, 1].plot(kde_time, np.median(loser_offsets_boot[-1], axis=0)/len(offsets),
color='black', linewidth=2)
ax[1, 2].plot(kde_time, np.median(loser_physicals_boot[-1], axis=0)/len(physicals),
color='black', linewidth=2)
# ax[0, 0].fill_between(
# kde_time,
# np.percentile(winner_onsets_boot[-1], 5, axis=0),
# np.percentile(winner_onsets_boot[-1], 95, axis=0),
# color='gray',
# alpha=0.5)
# ax[0, 1].fill_between(
# kde_time,
# np.percentile(winner_offsets_boot[-1], 5, axis=0),
# np.percentile(
# winner_offsets_boot[-1], 95, axis=0),
# color='gray',
# alpha=0.5)
# ax[0, 2].fill_between(
# kde_time,
# np.percentile(
# winner_physicals_boot[-1], 5, axis=0),
# np.percentile(
# winner_physicals_boot[-1], 95, axis=0),
# color='gray',
# alpha=0.5)
# ax[1, 0].fill_between(
# kde_time,
# np.percentile(loser_onsets_boot[-1], 5, axis=0),
# np.percentile(loser_onsets_boot[-1], 95, axis=0),
# color='gray',
# alpha=0.5)
# ax[1, 1].fill_between(
# kde_time,
# np.percentile(loser_offsets_boot[-1], 5, axis=0),
# np.percentile(loser_offsets_boot[-1], 95, axis=0),
# color='gray',
# alpha=0.5)
# ax[1, 2].fill_between(
# kde_time,
# np.percentile(
# loser_physicals_boot[-1], 5, axis=0),
# np.percentile(
# loser_physicals_boot[-1], 95, axis=0),
# color='gray',
# alpha=0.5)
# ax[0, 0].plot(kde_time, np.median(winner_onsets_boot[-1], axis=0),
# color='black', linewidth=2)
# ax[0, 1].plot(kde_time, np.median(winner_offsets_boot[-1], axis=0),
# color='black', linewidth=2)
# ax[0, 2].plot(kde_time, np.median(winner_physicals_boot[-1], axis=0),
# color='black', linewidth=2)
# ax[1, 0].plot(kde_time, np.median(loser_onsets_boot[-1], axis=0),
# color='black', linewidth=2)
# ax[1, 1].plot(kde_time, np.median(loser_offsets_boot[-1], axis=0),
# color='black', linewidth=2)
# ax[1, 2].plot(kde_time, np.median(loser_physicals_boot[-1], axis=0),
# color='black', linewidth=2)
ax[0, 0].set_xlim(-30, 30)
plt.show()
@ -345,20 +365,18 @@ def main(dataroot):
loser_offsets_conv = loser_offsets_conv / offset_count
loser_physicals_conv = loser_physicals_conv / physical_count
embed()
winner_onsets_boot = np.concatenate(
winner_onsets_boot) / onset_count
winner_onsets_boot)
winner_offsets_boot = np.concatenate(
winner_offsets_boot) / offset_count
winner_offsets_boot)
winner_physicals_boot = np.concatenate(
winner_physicals_boot) / physical_count
winner_physicals_boot)
loser_onsets_boot = np.concatenate(
loser_onsets_boot) / onset_count
loser_onsets_boot)
loser_offsets_boot = np.concatenate(
loser_offsets_boot) / offset_count
loser_offsets_boot)
loser_physicals_boot = np.concatenate(
loser_physicals_boot) / physical_count
loser_physicals_boot)
percs = [5, 50, 95]
winner_onsets_boot_quarts = np.percentile(
@ -378,52 +396,73 @@ def main(dataroot):
21*ps.cm, 10*ps.cm), sharey=True, sharex=True)
ax[0, 0].plot(kde_time, winner_onsets_conv)
ax[0, 1].plot(kde_time, winner_offsets_conv)
ax[0, 2].plot(kde_time, winner_physicals_conv)
ax[1, 0].plot(kde_time, loser_onsets_conv)
ax[1, 1].plot(kde_time, loser_offsets_conv)
ax[1, 2].plot(kde_time, loser_physicals_conv)
ax[0, 0].plot(kde_time, winner_onsets_boot_quarts[1], c=ps.black)
ax[0, 1].plot(kde_time, winner_offsets_boot_quarts[1], c=ps.black)
ax[0, 2].plot(kde_time, winner_physicals_boot_quarts[1], c=ps.black)
ax[1, 0].plot(kde_time, loser_onsets_boot_quarts[1], c=ps.black)
ax[1, 1].plot(kde_time, loser_offsets_boot_quarts[1], c=ps.black)
ax[1, 2].plot(kde_time, loser_physicals_boot_quarts[1], c=ps.black)
# for kde in winner_onsets_boot:
# ax[0, 0].plot(kde_time, kde,
# color='gray')
# for kde in winner_offsets_boot:
# ax[0, 1].plot(kde_time, kde,
# color='gray')
# for kde in winner_physicals_boot:
# ax[0, 2].plot(kde_time, kde,
# color='gray')
# for kde in loser_onsets_boot:
# ax[1, 0].plot(kde_time, kde,
# color='gray')
# for kde in loser_offsets_boot:
# ax[1, 1].plot(kde_time, kde,
# color='gray')
# for kde in loser_physicals_boot:
# ax[1, 2].plot(kde_time, kde,
# color='gray')
ax[0, 0].fill_between(kde_time,
winner_onsets_boot_quarts[0],
winner_onsets_boot_quarts[2],
color=ps.gray,
alpha=0.5)
ax[0, 0].plot(kde_time, winner_onsets_boot_quarts[1], c=ps.black)
ax[0, 1].plot(kde_time, winner_offsets_conv)
ax[0, 1].fill_between(kde_time,
winner_offsets_boot_quarts[0],
winner_offsets_boot_quarts[2],
color=ps.gray,
alpha=0.5)
ax[0, 1].plot(kde_time, winner_offsets_boot_quarts[1], c=ps.black)
ax[0, 2].plot(kde_time, winner_physicals_conv)
ax[0, 2].fill_between(kde_time,
loser_physicals_boot_quarts[0],
loser_physicals_boot_quarts[2],
color=ps.gray,
alpha=0.5)
ax[0, 2].plot(kde_time, winner_physicals_boot_quarts[1], c=ps.black)
ax[1, 0].plot(kde_time, loser_onsets_conv)
ax[1, 0].fill_between(kde_time,
loser_onsets_boot_quarts[0],
loser_onsets_boot_quarts[2],
color=ps.gray,
alpha=0.5)
ax[1, 0].plot(kde_time, loser_onsets_boot_quarts[1], c=ps.black)
ax[1, 1].plot(kde_time, loser_offsets_conv)
ax[1, 1].fill_between(kde_time,
loser_offsets_boot_quarts[0],
loser_offsets_boot_quarts[2],
color=ps.gray,
alpha=0.5)
ax[1, 1].plot(kde_time, loser_offsets_boot_quarts[1], c=ps.black)
ax[1, 2].plot(kde_time, loser_physicals_conv)
ax[1, 2].fill_between(kde_time,
loser_physicals_boot_quarts[0],
loser_physicals_boot_quarts[2],
color=ps.gray,
alpha=0.5)
ax[1, 2].plot(kde_time, loser_physicals_boot_quarts[1], c=ps.black)
plt.show()

BIN
poster/figs/algorithm1.pdf Normal file

Binary file not shown.

BIN
poster/figs/efishlogo.pdf Normal file

Binary file not shown.

Binary file not shown.

View File

@ -7,7 +7,7 @@ blockverticalspace=2mm, colspace=20mm, subcolspace=0mm]{tikzposter} %Default val
\begin{document}
\renewcommand{\baselinestretch}{1}
\title{\parbox{1500pt}{Detection of transient communication signals in weakly electric fish}}
\title{\parbox{1500pt}{Bypassing time-frequency uncertainty in the detection of transient communication signals in weakly electric fish}}
\author{Sina Prause, Alexander Wendt, and Patrick Weygoldt}
\institute{Supervised by Till Raab \& Jan Benda, Neuroethology Lab, University of Tuebingen}
\usetitlestyle[]{sampletitle}
@ -16,22 +16,25 @@ blockverticalspace=2mm, colspace=20mm, subcolspace=0mm]{tikzposter} %Default val
\begin{columns}
\column{0.4}
\myblock[TranspBlock]{Introduction}{
\myblock[GrayBlock]{Introduction}{
The time-frequency tradeoff makes reliable signal detecion and simultaneous
sender identification of freely interacting individuals impossible.
This profoundly limits our current understanding of chirps to experiments
sender identification by simple Fourier decomposition in freely interacting
weakly electric fish impossible. This profoundly limits our current
understanding of chirps to experiments
with single - or physically separated - individuals.
\begin{tikzfigure}[]
\label{griddrawing}
<<<<<<< HEAD
=======
\includegraphics[width=0.8\linewidth]{figs/introplot}
>>>>>>> cdcf9564df07914cf57225de5a8bdaa642fbad0e
\end{tikzfigure}
% \begin{tikzfigure}[]
% \label{griddrawing}
% \includegraphics[width=0.8\linewidth]{figs/introplot}
% \end{tikzfigure}
}
\myblock[TranspBlock]{Chirp detection}{
\begin{tikzfigure}[]
\label{fig:example_a}
\label{fig:alg1}
\includegraphics[width=0.9\linewidth]{figs/algorithm1}
\end{tikzfigure}
\vspace{2cm}
\begin{tikzfigure}[]
\label{fig:alg2}
\includegraphics[width=1\linewidth]{figs/algorithm}
\end{tikzfigure}
\vspace{0cm}

View File

@ -34,7 +34,7 @@
\centering
% \vspace{1cm}
\hspace{-10cm}
\includegraphics[width=\linewidth]{example-image-a}
\includegraphics[width=0.8\linewidth]{figs/efishlogo.pdf}
\end{minipage}}
% \begin{minipage}[c]{0.2\paperwidth}
% \vspace{1cm}\hspace{1cm}