\documentclass{beamer} %%%%% title %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \title[]{Scientific Computing --- Reproduzierbarkeit} \author[]{Jan Grewe} \institute[]{Neuroethology} \date[]{WS 14/15} \titlegraphic{\includegraphics[width=0.3\textwidth]{UT_WBMW_Rot_RGB}} %%%%% beamer %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \mode { \usetheme{Singapore} \setbeamercovered{opaque} \usecolortheme{tuebingen} \setbeamertemplate{navigation symbols}{} \usefonttheme{default} \useoutertheme{infolines} % \useoutertheme{miniframes} } %\AtBeginSection[] %{ % \begin{frame} % \begin{center} % \Huge \insertsectionhead % \end{center} % \end{frame} %} \setbeamertemplate{blocks}[rounded][shadow=true] \setcounter{tocdepth}{1} %%%%% packages %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \usepackage[english]{babel} \usepackage{amsmath} \usepackage{bm} \usepackage{pslatex} % nice font for pdf file %\usepackage{multimedia} \usepackage{wasysym} \usepackage{tikz} \newcommand{\naZ}{\mathds{N}} \newcommand{\gaZ}{\mathds{Z}} \newcommand{\raZ}{\mathds{Q}} \newcommand{\reZ}{\mathds{R}} \newcommand{\reZp}{\mathds{R^+}} \newcommand{\reZpN}{\mathds{R^+_0}} \newcommand{\koZ}{\mathds{C}} %%%% graphics %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \usepackage{graphicx} %%%%% listings %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \usepackage{listings} \lstset{ basicstyle=\ttfamily, numbers=left, showstringspaces=false, language=Matlab, commentstyle=\itshape\color{darkgray}, keywordstyle=\color{blue}, stringstyle=\color{green}, backgroundcolor=\color{blue!10}, breaklines=true, breakautoindent=true, columns=flexible, frame=single, captionpos=b, xleftmargin=1em, xrightmargin=1em, aboveskip=10pt } \graphicspath{{figures/}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{document} \begin{frame}[plain] \frametitle{} \vspace{-1cm} \titlepage % erzeugt Titelseite \end{frame} \subsection{Reproduzierbarkeit von wisschenschaftlichen Ergebnissen} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{frame} \frametitle{Reproduzierbarkeit wissenschaftlicher Daten} \framesubtitle{Problem --- Fehlende Informationen} \only<1>{ \begin{figure} \includegraphics[width=0.9\columnwidth]{./images/rung_brazma_2013} \end{figure} } \only<2>{ \begin{tikzpicture} \node[anchor=south west,inner sep=0] (image) at (0,0) { \includegraphics[width=0.8\columnwidth]{images/rung_brazma_2013_grey}}; \node[align=center,red,font={\normalsize\bfseries}] at (image.center) {``The authors replicated two studies ‘in principle’\\ and six ‘partially’, whereas ten were not reproduced,\\ ...\\ The main reason for the lack of reproducibility \\ was the unavailability of all relevant data or metadata:''}; \end{tikzpicture} } \only<3>{ \begin{figure} \includegraphics[width=0.8\columnwidth]{./images/hines_etal_2014} \end{figure} } \only<4> { \begin{tikzpicture} \node[anchor=south west,inner sep=0] (image) at (0,0) { \includegraphics[width=0.8\columnwidth]{images/hines_etal_2014_grey}}; \node[align=center,red,font={\normalsize\bfseries}] at (image.center) {``... our two laboratories quite reproducibly were unable\\ to replicate each other’s fluorescence-activated cell sorting \\ (FACS) profiles of primary breast cells.``}; \end{tikzpicture} } \end{frame} \begin{frame} \frametitle{Reproduzierbarkeit wissenschaftlicher Daten} \framesubtitle{Problem --- Gro{\ss}er Aufwand} \only<1>{ \begin{figure} \includegraphics[width=0.9\columnwidth]{./images/savage_vickers_2009_title} \end{figure} } \only<2> { \begin{figure} \includegraphics[width=0.9\columnwidth]{./images/savage_vickers_2009}\\ \tiny{Savage and Vickers, 2009, PLoSOne} \end{figure} } \end{frame} \begin{frame} \frametitle{Reproduzierbarkeit wissenschaftlicher Daten} \framesubtitle{Auch auf im Labor --- Das ``Dead\footnote[frame]{Im Sinne von ''nicht mehr im Labor''} PhD - student'' Problem} \begin{columns} \begin{column}{2cm} \begin{figure} \includegraphics[width=0.9\columnwidth]{./images/project_start}\\ \end{figure} \end{column} \pause \begin{column}{4cm} \begin{figure} \includegraphics[width=0.9\columnwidth]{./images/project_middle}\\ \end{figure} \end{column}\pause \begin{column}{5cm} \begin{figure} \includegraphics[width=0.9\columnwidth]{./images/project_end}\\ \end{figure} \end{column} \end{columns} \end{frame} \begin{frame} \frametitle{Reproduzierbarkeit wissenschaftlicher Daten} \framesubtitle{Ist eine Herausforderung} \begin{itemize} \item Auf \textbf{lokaler} wie auch \textbf{globaler} Ebene. \item Fehlende Annotation von Daten. \item Information is h\"aufig weit verteilt (Laborbuch, Protokollbl\"atter, Programmcode, ...). \item Meist in nicht-maschinenlesbarer Form. \item Manuelle Datenannotation ist ein gro{\ss}er Aufwand. \item Implizites Wissen (Labortaditionen, Standardprotokolle) sind nicht explizit verf\"ugbar.\pause \vspace{1em} \item Ist nicht nur ein Problem in den Neurowissenschaften.\pause \item Ist nicht nur ein Problem einer anderen Person sondern etwas, was einen sehr schnell pers\"onlich in Schwierigkeiten bringen kann. \end{itemize} \end{frame} \begin{frame} \frametitle{Reproduzierbarkeit wissenschaftlicher Daten} \framesubtitle{DFG: ``Gute wissenschaftliche Praxis''} \begin{itemize} \item Daten, auf denen Publikationen basieren m\"ussen f\"ur den Zeitlraum von 10 Jahren archiviert und Verf\"ugbar gehalten werden. \item Auf Verlangen m\"ussen die Daten herausgegeben werden. \item Daten m\"ussen verst\"andlich annotiert sein. \item \url{http://www.dfg.de/foerderung/grundlagen_rahmenbedingungen/gwp/} \end{itemize} \end{frame} \section{Annotationen} \begin{frame}[plain] \huge{1. Annotation von Daten und Code} \end{frame} \begin{frame} \frametitle{Reproduzierbarkeit wissenschaftlicher Daten} \framesubtitle{Annotation} Probleme, die jeder kennt (oder kennenlernen wird): \begin{enumerate} \item Wie habe ich die Analyse nochmal gestartet? \item Welche Parameter hatte ich f\"ur den Fit benutzt?\pause \end{enumerate} L\"osungsans\"atze: \begin{enumerate} \item Annotation der Ergebnisse. Zu jeder Abbildung/Analyse eine Datei, die beschreibt, wie sie erstellt wurde. \item Kommentare im Code. \item Automatisches sammeln von Metadaten z.B. in Matlab Strukturen.\pause \item \textbf{Provenance Tracking} \end{enumerate} \end{frame} \begin{frame} \frametitle{Reproduzierbarkeit wissenschaftlicher Daten} \framesubtitle{Automatische Annotation} Wenn man sich nicht auf ein gro{\ss}es Provenance Tracking System einlassen will, z.B. weil es nicht der Labortradition entspricht, dann stellt sicher, dass\footnote[frame]{Auch f\"ur euch selbst!}: \begin{itemize} \item Annotationen ``bei'' den Daten, bzw. den Resultaten gefunden werden. \item Annotationen lesbar sind! \item Der Code lesbar ist! \item Die Daten und Resultate in nachvollziehbarer und einheitlicher Form organisiert sind. \item Klar ist, welche \textbf{Version} der Analyse zu den Resultaten z.B. der Masterarbeit gef\"uhrt hat. \end{itemize} \end{frame} \section{Versionskontrolle} \begin{frame}[plain] \huge{2. Versionskontrolle} \end{frame} \begin{frame} \frametitle{Reproduzierbarkeit wissenschaftlicher Daten} \frametitle{Versionskontrolle} Jeder kennt es: \begin{enumerate} \item Ich versuche das gleiche Programm nach ein paar Tagen wieder auszuf\"uhren...\pause \item Verdammt, ... eine Fehlermeldung, die vorher nicht da war (glaube ich). \item Wann habe ich was an dem code ge\"andert?!?\pause \end{enumerate} \vspace{0.5cm} \Large{L\"osung: \textbf{Versionskontrolle}} \end{frame} \begin{frame} \frametitle{Reproduzierbarkeit wissenschaftlicher Daten} \framesubtitle{Versionskontrolle} Es gibt verschiedene Systeme, die einen im Hintergrund unterst\"utzen \"Anderungen zu verfolgen. \begin{enumerate} \item Subversion. \item Mercurial. \item Git. \item ... und viele andere.\pause \end{enumerate} Hier als Beispiel \textbf{Git}! \url{http://www.git-scm.git} \end{frame} \begin{frame} \frametitle{Reproduzierbarkeit wissenschaftlicher Daten} \framesubtitle{Versionskontrolle --- Git ---} \begin{itemize} \item Aktuell das beliebteste VCS. \item Ist open-source! \item F\"ur alle Platformen verf\"ugbar. \item Sehr gute Unterst\"utzung durch die Community. \item Viele Web-Services, die auf Git basieren. \item Viele Entwicklungsumgebungen (auch Matlab ab 2015b) unterst\"utzen die Versionskontrolle mit Git. \end{itemize} \begin{columns} \begin{column}{5cm} \begin{figure} \includegraphics[width=0.6\columnwidth]{images/git_logo} \end{figure} \end{column} \begin{column}{5cm} \begin{figure} \includegraphics[width=0.5\columnwidth]{images/github_logo} \end{figure} \end{column} \end{columns} \end{frame} \begin{frame} \frametitle{Reproduzierbarkeit wissenschaftlicher Daten} \framesubtitle{Versionskontrolle --- Git ---} Vereinfacht die Zusammenarbeit: \begin{figure} \includegraphics[width=0.45\columnwidth]{images/git_pro_distributed} \end{figure} \end{frame} \begin{frame} \frametitle{Reproduzierbarkeit wissenschaftlicher Daten} \framesubtitle{Versionskontrolle --- Git ---} Aber auch nur auf dem eigenen Rechner \begin{figure} \includegraphics[width=0.5\columnwidth]{images/git_pro_local} \end{figure} \end{frame} \begin{frame} \frametitle{Reproduzierbarkeit wissenschaftlicher Daten} \framesubtitle{Versionskontrolle --- Git ---} Typischer Arbeitsablauf --- lokales Repository: \only<1-2> { \begin{enumerate} \item \"Anderungen an einer oder mehreren Dateien. \item Bekanntgabe der \"Anderung im VCS (\textit{commit}). \item Unter Umst\"anden Synchronisation mit dem Repository auf einem Server (\textit{pull} und \textit{push}). \end{enumerate} } \only<1> { \begin{figure} \includegraphics[width=0.75\columnwidth]{images/git_pro_lifecycle} \end{figure} } \only<2> { \begin{figure} \includegraphics[width=0.75\columnwidth]{images/pro_git_commits} \end{figure} } \end{frame} \begin{frame} \frametitle{Reproduzierbarkeit wissenschaftlicher Daten} \framesubtitle{Versionskontrolle --- Git ---} Vorteile von Versionskontrolle: \begin{enumerate} \item Nachverfolgung von \"Anderungen. Wer hat was gemacht und wann? \item Ver\"anderungen ungeschehen machen. \item Jeder Zustand hat eine UUID, die ihn eindeutig identifizieren (weltweit, f\"ur alle Zeit). \item Es gibt Sicherheit! Wenn ich etwas kaputt mache, dann kann ich es wiederherstellen. \item Meist m\"uhelose Synchronisation mit anderen Rechnern oder Servern. \item Wenn mit einem Server synchronisiert, dann ist das Backup eingebaut. \item Nicht nur f\"ur Programmcode sondern auch f\"ur Textdateien (Bachelor-, Master-, Doktorarbeiten!!) \end{enumerate}\pause Mehr Information im Web (kostenloses Buch: \url{www.git-scm.com/book}. Oder fragt uns, wenn ihr vor dem Problem steht. \end{frame} \begin{frame} \frametitle{Reproduzierbearkeit wissenschaftlicher Daten} \framesubtitle{Versionskontrolle --- Git ---} Wir verwalten die Materialien f\"ur diesen Kurs in einem Git Repository. \begin{figure} \includegraphics[width=0.9\columnwidth]{images/course_git} \end{figure} \end{frame} \section{Publikation von Daten und Code} \begin{frame}[plain] \huge{3. Publikation von Daten und Code} \end{frame} \begin{frame} \frametitle{Reproduzierbarkeit wissenschaftlicher Daten} \framesubtitle{Publikation von Daten und Programmcode} \begin{itemize} \item Es gibt mehr und mehr Bestrebungen Daten und Code zu teilen. \item Mehrere Gr\"unde daf\"ur: \begin{enumerate} \item Zusammenarbeit von Experimentatoren und Theoretikern. \item Gew\"ahrleistung von Datenverf\"ugbarkeit. \item Reproduzierbarkeit von Ergebnissen. \item Experimentelle Daten (z.B. \textit{in vivo} Elektrophysiology Daten von Affen etc.) werden zunehmend wertvoller, weil die Experimente politisch nicht mehr opportun sind. \item Forderung von Geldgebern und Journalen. \end{enumerate} \end{itemize} \end{frame} \begin{frame} \frametitle{Reproduzierbarkeit wissenschaftlicher Daten} \framesubtitle{Publikation von Daten und Programmcode} Es gibt verschiedene Platformen, die Data Sharing anbieten zum Beispiel. \begin{enumerate} \item \url{Incf.org} \item \url{www.crcns.org} \item \url{www.g-node.org}\pause \end{enumerate} Sie alle kranken daran, dass es keine Standards gibt, in welcher From Daten und Metadaten abgelegt werden. \end{frame} \begin{frame} \frametitle{Reproduzierbarkeit wissenschaftlicher Daten} \framesubtitle{Publikation von Daten und Programmcode} Daten zu publizieren ist ein Problem. Zum einen sind die Datenmengen h\"aufig nicht unerheblich, zum anderen gibt es rechtliche Bedenken? \begin{enumerate} \item Wem geh\"oren ``meine'' Daten eigentlich?\\ \pause Dem Institut oder sogar dem Drittmittelgeber \item Wer darf mit meinen Daten was machen?\\ Hierf\"ur gibt es verschiedene Lizenzmodelle. Generell kann man festlegen, dass Daten nur nach Absprache und/oder unter Zitation des Urhebers benutzt werden d\"urfen. \end{enumerate} \end{frame} \begin{frame} \frametitle{Reproduzierbarkeit wissenschaftlicher Daten} \framesubtitle{Publikation von Daten und Programmcode} Warum sollte ich meinen Programmcode oder meine Daten ver\"offentlichen? \begin{itemize} \item Es geht um Wissenschaft! \item Sie muss reproduzierbar sein, dass hei{\ss}t, dass andere in der Lage sein m\"ussen Deine Ergebnisse nachzuvollziehen und zu \"uberpr\"ufen. \end{itemize} Es sollte eher eine Verpflichtung sein als eine Option.\\\pause \vspace{1em} Wenn man seinen Code in einem GitHub Repository hat, dann ist es m\"oglich ihn zu archivieren und eine zitierbare DOI zu erhalten\footnote[frame]{\url{https://guides.github.com/activities/citable-code/}}. \end{frame} \subsection{Unit Tests} \begin{frame}[plain] \huge{4. Unit Tests} \end{frame} \begin{frame} \frametitle{Reproduzierbarkeit wissenschaftlicher Daten} \framesubtitle{Unit Tests} \begin{itemize} \item[] Woher weiss ich eigentlich, dass mein Programm das tut, was es soll? \vspace{0.5cm} \item[] Wie stelle ich sicher, dass es auch nach \"Anderung noch all das richtig macht, was es vorher tat? \vspace{0.5cm} \item[] Wie kann ich meinen Programmcode jemandem weitergeben ohne ein schlechtes Gewissen zu haben? \vspace{0.5cm} \end{itemize} \pause \large{Unit tests!} \end{frame} \begin{frame} \frametitle{Reproduzierbarkeit wissenschaftlicher Daten} \framesubtitle{Unit Tests} \begin{itemize} \item Unit tests sind kleine Programme, die testen, ob sich eine Funktion oder ein Programm so verh\"alt, wie es gedacht ist. \item Normalerweise entwickelt man die Tests parallel zur eigentlichen Implementierung. \end{itemize} \textbf{Vorteile:} \begin{itemize} \item Findet Probleme sehr fr\"uh.. \item Formalisiert unsere Erwartungen an das Programm. \item Macht es sicher, das Programm zu \"uberarbeiten. \item Ist eine Art Dokumentation, die zeigt wie das Programm eingesetzt werden soll. \end{itemize}\pause \textbf{Limitationen:} \begin{itemize} \item Der Test kann nur f\"ur die F\"alle Sicherheit geben, die explizit getestet werden. \item Ist nur so gut, wie der Programierer sich M\"uhe gibt. \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{Reproduzierbarkeit wissenschaftlicher Daten} \framesubtitle{Unit Tests} Seit R2013b unterst\"utzt MATLAB Unit Tests und bietet ein Testing Framework. Angenommen man hat eine Funktion, die die Winkel in einem Dreieck berechnen soll: \begin{lstlisting} % Copyright 2015 The MathWorks, Inc. function angles = rightTri(sides) A = atand(sides(1)/sides(2)); B = atand(sides(2)/sides(1)); hypotenuse = sides(1)/sind(A); C = asind(hypotenuse*sind(A)/sides(1)); angles = [A B C]; end \end{lstlisting} \end{frame} \begin{frame}[fragile] \frametitle{Reproduzierbarkeit wissenschaftlicher Daten} \framesubtitle{Unit Tests} Ein Testskript fuer diese Funktion k\"onnte so aussehen: \footnotesize \begin{lstlisting} % Copyright 2015 The MathWorks, Inc. tri = [7 9]; triIso = [4 4]; tri306090 = [2 2*sqrt(3)]; % preconditions angles = rightTri(tri); assert(angles(3) == 90,'Fundamental problem: rightTri not producing right triangle') %% Test 1: sum of angles angles = rightTri(tri); assert(sum(angles) == 180) angles = rightTri(triIso); assert(sum(angles) == 180) angles = rightTri(tri306090); assert(sum(angles) == 180) \end{lstlisting} \end{frame} \begin{frame}[fragile] \frametitle{Reproduzierbarkeit wissenschaftlicher Daten} \framesubtitle{Unit Tests} Ein Testskript fuer diese Funktion k\"onnte so aussehen: \footnotesize \begin{lstlisting} %% Test 2: isosceles triangles angles = rightTri(triIso); assert(angles(1) == 45) assert(angles(1) == angles(2)) %% Test 3: 30-60-90 triangle angles = rightTri(tri306090); assert(angles(1) == 30) assert(angles(2) == 60) assert(angles(3) == 90) \end{lstlisting} \end{frame} \begin{frame}[fragile] \frametitle{Reproduzierbarkeit wissenschaftlicher Daten} \framesubtitle{Unit Tests} Um den Test auszuf\"uhren: \begin{lstlisting} result = runtests('rightTriTest'); \end{lstlisting} \end{frame} \begin{frame}[fragile] \frametitle{Reproduzierbarkeit wissenschaftlicher Daten} \framesubtitle{Unit Tests} Das Testresultat k\"onnte so aussehen: \tiny \begin{lstlisting} Running rightTriTest .. ================================================================================ Error occurred in rightTriTest/Test3_30_60_90Triangle and it did not run to completion. -------------- Error Details: -------------- Assertion failed. ================================================================================ . Done rightTriTest __________ Failure Summary: Name Failed Incomplete Reason(s) =========================================================================== rightTriTest/Test3_30_60_90Triangle X X Errored. \end{lstlisting} \end{frame} \begin{frame} \frametitle{Reproduzierbarkeit wissenschaftlicher Daten} \framesubtitle{Unit Tests} \Large{Summary} \begin{enumerate} \item Unit Tests sind ein m\"achtiges Tool um die Korrektheit des eigenen Codes zu testen. \item In der Regel geben sie Sicherheit. \item Machen das \"Andern einfacher und sicherer. \item Sind eine Art Dokumentation. \item Tests sind immer so gut, wie sie programmiert werden. \end{enumerate} Ein Aufwand der sich lohnen kann. Er formalisiert, was wir uns eh denken... \end{frame} \begin{frame} \frametitle{Reproduzierbarkeit wissenschaftlicher Daten} \framesubtitle{Fazit} \begin{itemize} \item Reproduzierbarkeit wissenschaftlicher Resultate ist schwer zu erreichen. \item Wir m\"ussen es trotzdem versuchen. Dazu braucht es: \item Vollst\"andige Annotation der Daten mit Metadaten. \item Provenance Tracking oder zumindest Versionskontrolle. \item Ver\"offentlichung von Daten und Programmen. \item Ein gewisses Ma{\ss} an Code Qualit\"at. \item Jeder Wissenschaftler ist daf\"ur pers\"onlich verantwortlich! \end{itemize} \end{frame} \end{document}