New bootstrap exercises
This commit is contained in:
parent
1e3b02b9a1
commit
2787e55094
23
statistics/code/bootstrapsem.m
Normal file
23
statistics/code/bootstrapsem.m
Normal file
@ -0,0 +1,23 @@
|
||||
nsamples = 1000
|
||||
resample = 500
|
||||
|
||||
x = randn( nsamples, 1 );
|
||||
sem = std(x)/sqrt(nsamples);
|
||||
|
||||
mu = zeros( resample, 1 );
|
||||
for i = 1:resample
|
||||
% resample:
|
||||
xr = x(randi(nsamples, nsamples, 1));
|
||||
% compute statistics on sample:
|
||||
mu(i) = mean(xr);
|
||||
end
|
||||
bootsem = std( mu );
|
||||
|
||||
hold on
|
||||
hist( x, 20 );
|
||||
hist( mu, 20 );
|
||||
hold off
|
||||
|
||||
disp(['bootstrap standard error: ', num2str(bootsem)]);
|
||||
disp(['standard error: ', num2str(sem)]);
|
||||
|
24
statistics/code/bootstraptymus.m
Normal file
24
statistics/code/bootstraptymus.m
Normal file
@ -0,0 +1,24 @@
|
||||
resample = 500
|
||||
|
||||
load( 'thymusglandweights.dat' );
|
||||
x = thymusglandweights;
|
||||
nsamples = length( x );
|
||||
sem = std(x)/sqrt(nsamples);
|
||||
|
||||
mu = zeros( resample, 1 );
|
||||
for i = 1:resample
|
||||
% resample:
|
||||
xr = x(randi(nsamples, nsamples, 1));
|
||||
% compute statistics on sample:
|
||||
mu(i) = mean(xr);
|
||||
end
|
||||
bootsem = std( mu );
|
||||
|
||||
hold on
|
||||
hist( x, 20 );
|
||||
hist( mu, 20 );
|
||||
hold off
|
||||
|
||||
disp(['bootstrap standard error: ', num2str(bootsem)]);
|
||||
disp(['standard error: ', num2str(sem)]);
|
||||
|
3
statistics/code/boxwhisker.m
Normal file
3
statistics/code/boxwhisker.m
Normal file
@ -0,0 +1,3 @@
|
||||
x = randn(40, 10);
|
||||
boxplot(x, 'whisker', 100.0 );
|
||||
|
14
statistics/code/correlations.m
Normal file
14
statistics/code/correlations.m
Normal file
@ -0,0 +1,14 @@
|
||||
n = 1000
|
||||
x = randn( n, 1 );
|
||||
y = randn( n, 1 ) + 0.2*x;
|
||||
r = corr(x,y)
|
||||
|
||||
nsamples = 500;
|
||||
rs = zeros( nsamples, 1 );
|
||||
for i = 1:nsamples
|
||||
xs = x(randi(n,n,1));
|
||||
ys = x(randi(n,n,1));
|
||||
rs(i) = corr(xs,ys);
|
||||
end
|
||||
|
||||
hist( rs, 20 )
|
32
statistics/code/tdistribution.m
Normal file
32
statistics/code/tdistribution.m
Normal file
@ -0,0 +1,32 @@
|
||||
n = 100000
|
||||
x=randn(n, 1);
|
||||
|
||||
nsamples = 3;
|
||||
nmeans = 10000;
|
||||
means = zeros( nmeans, 1 );
|
||||
sdevs = zeros( nmeans, 1 );
|
||||
students = zeros( nmeans, 1 );
|
||||
for i=1:nmeans
|
||||
sample = x(randi(n, nsamples, 1));
|
||||
means(i) = mean(sample);
|
||||
sdevs(i) = std(sample);
|
||||
students(i) = mean(sample)/std(sample)*sqrt(nsamples);
|
||||
end
|
||||
sdev = 1.0
|
||||
msdev = std(means)
|
||||
|
||||
% scatter( means, sdevs )
|
||||
|
||||
hold on;
|
||||
dxg=0.01;
|
||||
xmax = 10.0
|
||||
xmin = -xmax
|
||||
xg = [xmin:dxg:xmax];
|
||||
pg = exp(-0.5*(xg/sdev).^2)/sqrt(2.0*pi)/sdev;
|
||||
hold on
|
||||
plot(xg, pg, 'r', 'linewidth', 4)
|
||||
|
||||
bins = xmin:0.1:xmax;
|
||||
hist(means, bins, 1.0/(bins(2)-bins(1)) );
|
||||
hold off;
|
||||
|
132
statistics/exercises/bootstrap-01.tex
Normal file
132
statistics/exercises/bootstrap-01.tex
Normal file
@ -0,0 +1,132 @@
|
||||
\documentclass[12pt,a4paper,pdftex]{exam}
|
||||
|
||||
\usepackage[german]{babel}
|
||||
\usepackage{natbib}
|
||||
\usepackage{graphicx}
|
||||
\usepackage[small]{caption}
|
||||
\usepackage{sidecap}
|
||||
\usepackage{pslatex}
|
||||
\usepackage{amsmath}
|
||||
\usepackage{amssymb}
|
||||
\setlength{\marginparwidth}{2cm}
|
||||
\usepackage[breaklinks=true,bookmarks=true,bookmarksopen=true,pdfpagemode=UseNone,pdfstartview=FitH,colorlinks=true,citecolor=blue]{hyperref}
|
||||
|
||||
%%%%% text size %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
\usepackage[left=20mm,right=20mm,top=25mm,bottom=25mm]{geometry}
|
||||
\pagestyle{headandfoot}
|
||||
\header{{\bfseries\large \"Ubung 1}}{{\bfseries\large Bootstrap}}{{\bfseries\large 21. Oktober, 2015}}
|
||||
\firstpagefooter{Prof. Dr. Jan Benda}{Phone: 29 74573}{Email:
|
||||
jan.benda@uni-tuebingen.de}
|
||||
\runningfooter{}{\thepage}{}
|
||||
|
||||
\setlength{\baselineskip}{15pt}
|
||||
\setlength{\parindent}{0.0cm}
|
||||
\setlength{\parskip}{0.3cm}
|
||||
\renewcommand{\baselinestretch}{1.15}
|
||||
|
||||
\newcommand{\qt}[1]{\textbf{#1}\\}
|
||||
\newcommand{\pref}[1]{(\ref{#1})}
|
||||
\newcommand{\extra}{--- Zusatzaufgabe ---\ \mbox{}}
|
||||
\newcommand{\code}[1]{\texttt{#1}}
|
||||
|
||||
\newcommand{\continue}{\ifprintanswers%
|
||||
\else
|
||||
\vfill\hspace*{\fill}$\rightarrow$\newpage%
|
||||
\fi}
|
||||
\newcommand{\continuepage}{\ifprintanswers%
|
||||
\newpage
|
||||
\else
|
||||
\vfill\hspace*{\fill}$\rightarrow$\newpage%
|
||||
\fi}
|
||||
\newcommand{\newsolutionpage}{\ifprintanswers%
|
||||
\newpage%
|
||||
\else
|
||||
\fi}
|
||||
|
||||
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
\begin{document}
|
||||
|
||||
\vspace*{-6.5ex}
|
||||
\begin{center}
|
||||
\textbf{\Large Einf\"uhrung in die wissenschaftliche Datenverarbeitung}\\[1ex]
|
||||
{\large Jan Grewe, Jan Benda}\\[-3ex]
|
||||
Abteilung Neuroethologie \hfill --- \hfill Institut f\"ur Neurobiologie \hfill --- \hfill \includegraphics[width=0.28\textwidth]{UT_WBMW_Black_RGB} \\
|
||||
\end{center}
|
||||
|
||||
\begin{itemize}
|
||||
\item \"Uberzeuge dich von jeder einzelnen Zeile deines Codes, dass sie
|
||||
auch wirklich das macht, was sie machen soll! Teste dies mit kleinen
|
||||
Beispielen direkt in der Kommandozeile.
|
||||
\item Versuche die L\"osungen der folgenden Aufgaben m\"oglichst in
|
||||
sinnvolle kleine Funktionen herunterzubrechen.
|
||||
\item Sobald etwas \"ahnliches mehr als einmal berechnet werden soll,
|
||||
lohnt es sich eine Funktion daraus zu schreiben!
|
||||
\item Teste rechenintensive \code{for} Schleifen zuerst mit einer kleinen
|
||||
Anzahl von Wiederholungen, und benutze erst am Ende, wenn alles
|
||||
stimmt, eine gro{\ss}e Anzahl von Wiederholungen, um eine gute
|
||||
Statistik zu bekommen.
|
||||
\item Benutze die Hilfsfunktion von matlab und das Internet, um
|
||||
herauszufinden wie bestimmte \code{matlab} Funktionen zu verwenden
|
||||
sind und was f\"ur M\"oglichkeiten sie bieten.
|
||||
\item Auch zu inhaltlichen Konzepten bietet das Internet oft viele Antworten!
|
||||
\end{itemize}
|
||||
|
||||
|
||||
\begin{questions}
|
||||
|
||||
\question \qt{Bootstrap des Standardfehlers}
|
||||
\begin{parts}
|
||||
\part Lade von Ilias die Datei \code{thymusglandweights.dat} herunter.
|
||||
Darin befindet sich ein Datensatz vom Gewicht der Thymus Dr\"use in 14-Tage alten
|
||||
H\"uhnerembryos in mg.
|
||||
\part Lade diese Daten in Matlab (\code{load} Funktion).
|
||||
\part Bestimme Histogramm, Mittelwert und Standardfehler aus den ersten 80 Datenpunkten.
|
||||
\part Bestimme den Standardfehler aus den ersten 80 Datenpunkten durch 500 Mal Bootstrappen.
|
||||
\part Bestimme das 95\,\% Konfidenzintervall f\"ur den Mittelwert
|
||||
aus der Bootstrap Verteilung (\code{quantile()} Funktion) --- also
|
||||
das Interval innerhalb dessen mit 95\,\% Wahrscheinlichkeit der
|
||||
wahre Mittelwert liegen wird.
|
||||
\part Benutze den ganzen Datensatz und die Bootstrapping Technik, um die Abh\"angigkeit
|
||||
des Standardfehlers von der Stichprobengr\"o{\ss}e zu bestimmen.
|
||||
\part Vergleiche mit der bekannten Formel f\"ur den Standardfehler $\sigma/\sqrt{n}$.
|
||||
\end{parts}
|
||||
|
||||
|
||||
\continue
|
||||
\question \qt{Student t-Verteilung}
|
||||
\begin{parts}
|
||||
\part Erzeuge 100000 normalverteilte Zufallszahlen.
|
||||
\part Ziehe daraus 1000 Stichproben vom Umfang $m$ (3, 5, 10, 50).
|
||||
\part Berechne den Mittelwert $\bar x$ der Stichproben und plotte die Wahrscheinlichkeitsdichte
|
||||
dieser Mittelwerte.
|
||||
\part Vergleiche diese Wahrscheinlichkeitsdichte mit der Gausskurve.
|
||||
\part Berechne ausserdem die Gr\"o{\ss}e $t=\bar x/(\sigma_x/\sqrt{m}$
|
||||
(Standardabweichung $\sigma_x$) und vergleiche diese mit der Normalverteilung mit Standardabweichung Eins. Ist $t$ normalverteilt, bzw. unter welchen Bedingungen ist $t$ Normalverteilt?
|
||||
\end{parts}
|
||||
|
||||
|
||||
\question \qt{Korrelationen}
|
||||
\begin{parts}
|
||||
\part Erzeuge 1000 korrelierte Zufallszahlen $x$, $y$ durch
|
||||
\begin{verbatim}
|
||||
n = 1000
|
||||
a = 0.2;
|
||||
x = randn(n, 1);
|
||||
y = randn(n, 1) + a*x;
|
||||
\end{verbatim}
|
||||
\part Erstelle einen Scatterplot der beiden Variablen.
|
||||
\part Warum ist $y$ mit $x$ korreliert?
|
||||
\part Berechne den Korrelationskoeffizienten zwischen $x$ und $y$.
|
||||
\part Was m\"usste man tun, um die Korrelationen zwischen den $x$-$y$
|
||||
Paaren zu zerst\"oren?
|
||||
\part Mach genau dies 1000 mal und berechne jedes Mal den Korrelationskoeffizienten.
|
||||
\part Bestimme die Wahrscheinlichkeitsdichte dieser Korrelationskoeffizienten.
|
||||
\part Ist die Korrelation der urspr\"unglichen Daten signifikant?
|
||||
\part Variiere den Parameter $a$ und \"uberpr\"ufe auf gleiche Weise die Signifikanz.
|
||||
\end{parts}
|
||||
|
||||
|
||||
\end{questions}
|
||||
|
||||
\end{document}
|
10000
statistics/exercises/thymusglandweights.dat
Normal file
10000
statistics/exercises/thymusglandweights.dat
Normal file
File diff suppressed because it is too large
Load Diff
47
statistics/lecture/boxwhisker.py
Normal file
47
statistics/lecture/boxwhisker.py
Normal file
@ -0,0 +1,47 @@
|
||||
import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
#x = np.random.randn( 40, 10 )
|
||||
#np.save('boxwhiskerdata', x )
|
||||
x = np.load('boxwhiskerdata.npy')
|
||||
|
||||
plt.xkcd()
|
||||
fig = plt.figure( figsize=(6,4) )
|
||||
ax = fig.add_subplot( 1, 1, 1 )
|
||||
ax.spines['right'].set_visible(False)
|
||||
ax.spines['top'].set_visible(False)
|
||||
ax.yaxis.set_ticks_position('left')
|
||||
ax.xaxis.set_ticks_position('bottom')
|
||||
ax.set_xlabel('Experiment')
|
||||
ax.set_ylabel('x')
|
||||
ax.set_ylim( -4.0, 4.0)
|
||||
ax.annotate('Median',
|
||||
xy=(3.9, 0.1), xycoords='data',
|
||||
xytext=(3.5, -2.5), textcoords='data', ha='right',
|
||||
arrowprops=dict(arrowstyle="->", relpos=(0.8,1.0),
|
||||
connectionstyle="angle3,angleA=-110,angleB=60") )
|
||||
ax.annotate('1. quartile',
|
||||
xy=(5.8, -0.7), xycoords='data',
|
||||
xytext=(5.5, -3.5), textcoords='data', ha='right',
|
||||
arrowprops=dict(arrowstyle="->", relpos=(0.5,1.0),
|
||||
connectionstyle="angle3,angleA=30,angleB=70") )
|
||||
ax.annotate('3. quartile',
|
||||
xy=(6.1, 0.6), xycoords='data',
|
||||
xytext=(6.5, 3.0), textcoords='data', ha='left',
|
||||
arrowprops=dict(arrowstyle="->", relpos=(0.0,0.0),
|
||||
connectionstyle="angle3,angleA=30,angleB=70") )
|
||||
ax.annotate('minimum',
|
||||
xy=(6.1, -2.3), xycoords='data',
|
||||
xytext=(7.2, -3.3), textcoords='data', ha='left',
|
||||
arrowprops=dict(arrowstyle="->", relpos=(0.0,0.5),
|
||||
connectionstyle="angle3,angleA=10,angleB=100") )
|
||||
ax.annotate('maximum',
|
||||
xy=(5.9, 2.8), xycoords='data',
|
||||
xytext=(4.9, 3.5), textcoords='data', ha='right',
|
||||
arrowprops=dict(arrowstyle="->", relpos=(1.0,0.5),
|
||||
connectionstyle="angle3,angleA=0,angleB=120") )
|
||||
ax.boxplot( x, whis=100.0 )
|
||||
plt.tight_layout()
|
||||
plt.savefig('boxwhisker.pdf')
|
||||
plt.show()
|
||||
|
BIN
statistics/lecture/boxwhiskerdata.npy
Normal file
BIN
statistics/lecture/boxwhiskerdata.npy
Normal file
Binary file not shown.
@ -82,6 +82,8 @@
|
||||
\arabic{theexercise}:} \stepcounter{theexercise}\newline \newcommand{\exercisesource}{#1}}%
|
||||
{\ifthenelse{\equal{\exercisesource}{}}{}{\ifthenelse{\equal{\showlisting}{yes}}{\medskip\lstinputlisting{\exercisesource}}{}}\medskip}
|
||||
|
||||
\graphicspath{{figures/}}
|
||||
|
||||
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
@ -269,6 +271,24 @@ spricht von einer Wahrscheinlichkeitsdichte.
|
||||
\tr{Why?}{Warum?}
|
||||
\end{exercise}
|
||||
|
||||
\begin{exercise}[boxwhisker.m]
|
||||
\tr{Generate eine $40 \times 10$ matrix of random numbers and
|
||||
illustrate their distribution in a box-whicker plot
|
||||
(\code{boxplot()} function). How to interpret the plot?}
|
||||
{Erzeuge ein $40 \times 10$ Matrix
|
||||
von Zufallszahlen und illustriere ihre Verteilungen in einem
|
||||
Box-Whisker Plot (\code{boxplot()} Funktion, lies die Hilfe!). Wie ist der
|
||||
Box-Whisker Plot zu interpretieren? Was hat es mit den Ausreissern auf sich?
|
||||
Wie kann man erreichen, dass die Whisker den kleinsten und den gr\"o{\ss}ten
|
||||
Datenwert anzeigen? Warum sind die unterschiedlichen Box-Whiskers nicht alle gleich,
|
||||
obwohl sie aus der selben Verteilung gezogen worden sind?}
|
||||
\end{exercise}
|
||||
|
||||
\begin{figure}[t]
|
||||
\includegraphics[width=1\textwidth]{boxwhisker}
|
||||
\caption{\label{boxwhiskerfig} Box-whisker plots illustrate distributions.}
|
||||
\end{figure}
|
||||
|
||||
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
\subsection{Data types}
|
||||
@ -390,6 +410,71 @@ spricht von einer Wahrscheinlichkeitsdichte.
|
||||
\end{itemize}
|
||||
|
||||
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
\chapter{\tr{Bootstrap Methods}{Bootstrap Methoden}}
|
||||
|
||||
Beim Bootstrap erzeugt man sich die Verteilung von Statistiken durch Resampling
|
||||
aus der Stichprobe. Das hat mehrere Vorteile:
|
||||
\begin{itemize}
|
||||
\item Weniger Annahmen (z.B. muss eine Stichprobe nicht Normalverteilt sein).
|
||||
\item H\"ohere Genauigkeit als klassische Methoden.
|
||||
\item Allgemeing\"ultigkeit: Bootstrap Methoden sind sich sehr
|
||||
\"ahnlich f\"ur viele verschiedene Statistiken und ben\"otigen nicht
|
||||
f\"ur jede Statistik eine andere Formel.
|
||||
\end{itemize}
|
||||
|
||||
\begin{figure}[t]
|
||||
\includegraphics[width=0.8\textwidth]{2012-10-29_16-26-05_771}\\[2ex]
|
||||
\includegraphics[width=0.8\textwidth]{2012-10-29_16-41-39_523}\\[2ex]
|
||||
\includegraphics[width=0.8\textwidth]{2012-10-29_16-29-35_312}
|
||||
\caption{\tr{Why can we only measure a sample of the
|
||||
population?}{Warum k\"onnen wir nur eine Stichprobe der
|
||||
Grundgesamtheit messen?}}
|
||||
\end{figure}
|
||||
|
||||
\begin{figure}[t]
|
||||
\includegraphics[height=0.2\textheight]{srs1}\\[2ex]
|
||||
\includegraphics[height=0.2\textheight]{srs2}\\[2ex]
|
||||
\includegraphics[height=0.2\textheight]{srs3}
|
||||
\caption{Bootstrap der Stichprobenvertielung (a) Von der
|
||||
Grundgesamtheit (population) mit unbekanntem Parameter
|
||||
(z.B. Mittelwert $\mu$) zieht man Stichproben (SRS: simple random
|
||||
samples). Die Statistik (hier Bestimmung von $\bar x$) kann f\"ur
|
||||
jede Stichprobe berechnet werden. Die erhaltenen Werte entstammen
|
||||
der Stichprobenverteilung. Meisten wird aber nur eine Stichprobe
|
||||
gezogen! (b) Mit bestimmten Annahmen und Theorien kann man auf
|
||||
die Stichprobenverteilung schlie{\ss}en ohne sie gemessen zu
|
||||
haben. (c) Alternativ k\"onnen aus der einen Stichprobe viele
|
||||
Bootstrap-Stichproben generiert werden (resampling) und so
|
||||
Eigenschaften der Stichprobenverteilung empirisch bestimmt
|
||||
werden. Aus Hesterberg et al. 2003, Bootstrap Methods and
|
||||
Permuation Tests}
|
||||
\end{figure}
|
||||
|
||||
\section{Bootstrap des Standardfehlers}
|
||||
|
||||
Beim Bootstrap erzeugen wir durch resampling neue Stichproben und
|
||||
benutzen diese um die Stichprobenverteilung einer Statistik zu
|
||||
berechnen. Die Bootstrap Stichproben haben jeweils den gleichen Umfang
|
||||
wie die urspr\"unglich gemessene Stichprobe und werden durch Ziehen
|
||||
mit Zur\"ucklegen gewonnen. Jeder Wert der urspr\"unglichen Stichprobe
|
||||
kann also einmal, mehrmals oder gar nicht in einer Bootstrap
|
||||
Stichprobe vorkommen.
|
||||
|
||||
\begin{exercise}[bootstrapsem.m]
|
||||
Ziehe 1000 normalverteilte Zufallszahlen und berechne deren Mittelwert,
|
||||
Standardabweichung und Standardfehler ($\sigma/\sqrt{n}$).
|
||||
|
||||
Resample die Daten 1000 mal (Ziehen mit Zur\"ucklegen) und berechne jeweils
|
||||
den Mittelwert.
|
||||
|
||||
Plotte ein Histogramm dieser Mittelwerte, sowie deren Mittelwert und
|
||||
die Standardabweichung.
|
||||
|
||||
Was hat das mit dem Standardfehler zu tun?
|
||||
\end{exercise}
|
||||
|
||||
\end{document}
|
||||
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
|
BIN
statistics/lecture/figures/2012-10-29_16-26-05_771.jpg
Executable file
BIN
statistics/lecture/figures/2012-10-29_16-26-05_771.jpg
Executable file
Binary file not shown.
After Width: | Height: | Size: 724 KiB |
BIN
statistics/lecture/figures/2012-10-29_16-29-35_312.jpg
Executable file
BIN
statistics/lecture/figures/2012-10-29_16-29-35_312.jpg
Executable file
Binary file not shown.
After Width: | Height: | Size: 386 KiB |
BIN
statistics/lecture/figures/2012-10-29_16-41-39_523.jpg
Executable file
BIN
statistics/lecture/figures/2012-10-29_16-41-39_523.jpg
Executable file
Binary file not shown.
After Width: | Height: | Size: 461 KiB |
BIN
statistics/lecture/figures/srs1.png
Normal file
BIN
statistics/lecture/figures/srs1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 59 KiB |
BIN
statistics/lecture/figures/srs2.png
Normal file
BIN
statistics/lecture/figures/srs2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 55 KiB |
BIN
statistics/lecture/figures/srs3.png
Normal file
BIN
statistics/lecture/figures/srs3.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 73 KiB |
BIN
statistics/material/Hesterberg2003.pdf
Normal file
BIN
statistics/material/Hesterberg2003.pdf
Normal file
Binary file not shown.
Reference in New Issue
Block a user