Expanded bootstrap chapter and improved latex header
This commit is contained in:
@@ -5,32 +5,51 @@
|
||||
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 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]
|
||||
\begin{figure}[tp]
|
||||
\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
|
||||
\caption{\label{statisticalpopulationfig}\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]
|
||||
Zur Erinnerung: In der Statistik interessieren wir uns f\"ur
|
||||
Eigenschaften einer Grundgesamtheit. z.B. die mittlere L\"ange von
|
||||
sauren Gurken (\figref{statisticalpopulationfig}). Aus der
|
||||
Grundgesamtheit wird eine Stichprobe (simple random sample, SRS)
|
||||
gezogen, da niemals die gesamte Grundgesamtheit gemessen werden kann.
|
||||
Dann wird aus dieser einzigen Stichprobe die gew\"unschte Gr\"o{\ss}e
|
||||
berechnet (die mittlere Gr\"o{\ss}e der sauren Gurken) und man hofft,
|
||||
dass die erhaltene Zahl an der entsprechenden unbekannten Gr\"o{\ss}e
|
||||
der Grundgesamtheit (der Populationsparameter) m\"oglichst nah dran
|
||||
ist. Eine Aufgabe der Statistik ist es, herauszubekommen wie gut der
|
||||
Populationsparameter abgesch\"atzt worden ist.
|
||||
|
||||
Wenn wir viele Stichproben ziehen w\"urden, dann k\"onnte man f\"ur
|
||||
jede Stichprobe den gew\"unschten Parameter berechnen, und von diesen
|
||||
die Wahrscheinlichkeitsverteilung \"uber ein Histogramm bestimmen ---
|
||||
die ``Stichprobenverteilung'' (sampling distribution,
|
||||
\subfigref{bootstrapsamplingdistributionfig}{a}).
|
||||
|
||||
\begin{figure}[tp]
|
||||
\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
|
||||
\caption{\label{bootstrapsamplingdistributionfig}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
|
||||
@@ -40,25 +59,138 @@ aus der Stichprobe. Das hat mehrere Vorteile:
|
||||
Permuation Tests}
|
||||
\end{figure}
|
||||
|
||||
\section{Bootstrap des Standardfehlers}
|
||||
In Wirklichkeit haben wir aber nur eine Stichprobe. Wir behelfen uns
|
||||
dann mit Theorien, die meistens bestimmte Annahmen \"uber die Daten
|
||||
machen (z.B. Normalverteilung), und uns erlauben etwas \"uber die
|
||||
Genaugigkeit unserer Sch\"atzung aus der Stichprobe auszusagen
|
||||
(z.B. die Formel $\sigma/\sqrt{n}$ f\"ur den Standardfehler des
|
||||
Mittelwerts, die uns die Standardabweichung angibt, mit dem die
|
||||
Mittelwerte der Stichproben um den Populationsmittelwert streuen
|
||||
\subfigref{bootstrapsamplingdistributionfig}{b}).
|
||||
|
||||
Wir k\"onnen aber auch aus der einen Stichprobe die wir haben durch
|
||||
Resampling viele neue Stichproben generieren (Bootstrap). Von diesen
|
||||
k\"onnen wir jeweils die gew\"unschte Gr\"o{\ss}e berechnen und ihre
|
||||
Verteilung bestimmen (Bootstrap Verteilung,
|
||||
\subfigref{bootstrapsamplingdistributionfig}{c}). Diese Verteilung ist
|
||||
interessanterweise in ihrer Breite und Form der Stichprobenverteilung
|
||||
sehr \"ahnlich. Nur streut sie nicht um den Populationswert sonder um
|
||||
die Sch\"atzung aus der Stichprobe. Wir k\"onnen die
|
||||
Bootstrapverteilung aber benutzen um Aussagen \"uber die Genauigkeit
|
||||
unserer Sch\"atzung zu treffen (z.B. Standardfehler,
|
||||
Konfidenzintervalle).
|
||||
|
||||
Beim Bootstrap erzeugen wir durch Resampling neue Stichproben und
|
||||
benutzen diese um die Stichprobenverteilung einer Statistik zu
|
||||
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.
|
||||
\section{Bootstrap des Standardfehlers}
|
||||
|
||||
Plotte ein Histogramm dieser Mittelwerte, sowie deren Mittelwert und
|
||||
die Standardabweichung.
|
||||
Am besten l\"asst sich die Bootstrap Methode am Beispiel des
|
||||
Standardfehlers des Mittelwertes veranschaulichen. Aus der Stichprobe
|
||||
k\"onnen wir den Mittelwert berechnen. Der Standardfehler des
|
||||
Mittelwerts gibt die Standardabweichung an, mit der wir erwarten, dass
|
||||
der gemessene Mittelwert um den Populationsmittelwert streut.
|
||||
|
||||
Was hat das mit dem Standardfehler zu tun?
|
||||
\begin{figure}[tp]
|
||||
\includegraphics[width=1\textwidth]{bootstrapsem}
|
||||
\caption{\label{bootstrapsemfig}Bootstrap des Standardfehlers des
|
||||
Mittelwertes. Die --- normalerweise unbekannte ---
|
||||
Stichprobenverteilung des Mittelwerts (rot) ist um den
|
||||
Populationsmittelwert bei $\mu=0$ zentriert. Die
|
||||
Bootstrap-Verteilung (blau) die durch Resampling aus einer
|
||||
Stichprobe gewonnen worden ist hat die gleiche Form und Breite wie
|
||||
die Stichprobenverteilung, ist aber um den Mittelwert berechnet
|
||||
aus der Stichprobe zentriert. Die Standardabweichung der
|
||||
Bootstrapverteilung kann also als Sch\"atzer f\"ur den
|
||||
Standardfehler des Mittelwertes verwendet werden.}
|
||||
\end{figure}
|
||||
|
||||
Durch Bootstrap k\"onnen wir unsere Stichprobe resamplen und dadurch
|
||||
eine ganze Verteilung von Mittelwerten generieren
|
||||
(\figref{bootstrapsemfig}). Die Standardabweichung dieser Verteilung
|
||||
ist dann der gesuchte Standardfehler des Mittelwerts.
|
||||
|
||||
\begin{exercise}{bootstrapsem.m}{bootstrapsem.out}
|
||||
Erzeuge die Verteilung der Mittelwerte einer Stichprobe durch Bottstrapping,
|
||||
um daraus den Standardfehler des Mittelwerts zu bestimmen.
|
||||
\begin{enumerate}
|
||||
\item Ziehe 1000 normalverteilte Zufallszahlen und berechne deren
|
||||
Mittelwert, Standardabweichung und Standardfehler
|
||||
($\sigma/\sqrt{n}$).
|
||||
\item Resample die Daten 1000 mal (Ziehen mit Zur\"ucklegen) und
|
||||
berechne jeweils den Mittelwert.
|
||||
\item Plotte ein Histogramm dieser Mittelwerte, berechne deren
|
||||
Mittelwert und Standardabweichung und vergleiche mit den Werten
|
||||
der Grundgesamtheit und der Stichprobe.
|
||||
\end{enumerate}
|
||||
\end{exercise}
|
||||
|
||||
|
||||
\section{Permutationstests}
|
||||
Bei statistischen Tests wird nach der Wahrscheinlichkeit, ob die
|
||||
beobachtete Me{\ss}gr\"o{\ss}e einer Stichprobe aus der Nullhypothese
|
||||
kommt, gefragt. Ist diese Wahrscheinlichkeit kleiner als das
|
||||
Signifikanzniveau, kann die Nullhypothese verworfen werden.
|
||||
|
||||
Traditionell werden diese Wahrscheinlichkeiten \"uber theoretisch
|
||||
hergeleitete Wahrscheinlichkeitsverteilungen berechnet. Dabei gehen
|
||||
immer gewisse Annahmen \"uber die Daten ein und es mu{\ss} der zu den
|
||||
Daten passende Test ausgew\"ahlt werden.
|
||||
|
||||
Alternativ kann die Wahrscheinlichkeits(dichte)verteilung der
|
||||
Nullhypothese aus den Daten selbst gewonnen werden. Dabei m\"ussen die
|
||||
Daten entsprechend der Nullhypothese neu aus der Stichprobe gezogen
|
||||
werden.
|
||||
|
||||
Diese ``Permutationstests'' haben den Vorteil, dass nur die
|
||||
Eigenschaft von Interesse zerst\"ort wird, um die Nullhypothese zu
|
||||
generieren. Alle anderen Eigenschaften der Daten bleiben erhalten.
|
||||
|
||||
\begin{figure}[tp]
|
||||
\includegraphics[width=1\textwidth]{permutecorrelation}
|
||||
\caption{\label{permutecorrelationfig}Permutationstest f\"ur
|
||||
Korrelationen. Der Korrelationskoeffizient eines Datensatzes mit
|
||||
200 Datenpaaren ist $\rho=0.21$. Die Nullhypothesenverteilung der
|
||||
aus den permutierten, unkorrelierten Datens\"atzen berechneten
|
||||
Korrelationskoeffizienten ergibt die gelbe Verteilung, die um Null
|
||||
streut. Der gemessene Korrelationskoeffizient ist deutlich
|
||||
gr\"o{\ss}er als das 95\,\%-Perzentil der
|
||||
Nullhypoothesenverteilung und darum eine signifikante
|
||||
Korrelation.}
|
||||
\end{figure}
|
||||
|
||||
Sehr sch\"on lassen sich Permutationstest am Beispiel von
|
||||
Korrelationen veranschaulichen. Gegeben sind Datenpaare $(x_i, y_i)$.
|
||||
Daraus k\"onnen wir den Korrelationskoeffizienten berechnen. Wir
|
||||
wissen dann aber noch nicht, ob der berechnete Wert tats\"achlich eine
|
||||
Korrelation anzeigt. Die Nullhypothese ist, dass die Daten nicht
|
||||
miteinander korreliert sind. Indem wir die $x$-Werte und die $y$-Werte
|
||||
unabh\"angig voneinander permutieren (ihre Reihenfolge zuf\"allig neu
|
||||
anordnen), werden die Korrelationen der Datenpaare zerst\"ort. Wenn
|
||||
wir das viele Male wiederholen, bekommen wir die Verteilung der
|
||||
Korrelationskoeffizienten f\"ur nichtkorrelierte Daten. Aus dieser
|
||||
Verteilung der Nullhypothese k\"onnen wir dann dann die Signifikanz
|
||||
der tats\"achlich gemessenen Korrelation bestimmen.
|
||||
|
||||
\begin{exercise}{correlationsignificance.m}{correlationsignificance.out}
|
||||
Bestimme die Signifikanz eines Korrelationskoeffizienten.
|
||||
\begin{enumerate}
|
||||
\item Erzeuge korrelierte Daten indem zu zuf\"allig gezogenen
|
||||
$x$-Werten $y$-Werte gem\"a{\ss} $y=0.2 \cdot x$ berechnet werden,
|
||||
zu denen weitere normalverteilte Zufallszahlen addiert werden.
|
||||
\item Berechne den Korrelationskoeffizient dieser Datenpaare.
|
||||
\item Generiere die Verteilung der Nullhypothese ``unkorrelierte
|
||||
Daten'' indem die $x$- und $y$-Daten 1000-mal unabh\"angig
|
||||
permutiert werden \matlabfun{randperm} und jeweils der
|
||||
Korrelationskoeffizient berechnet wird.
|
||||
\item Bestimme aus den Nullhypothesendaten das 95\,\%-Perzentil und
|
||||
vergleiche es mit dem tats\"achlichen Korrelationskoeffizienten.
|
||||
\end{enumerate}
|
||||
\end{exercise}
|
||||
|
||||
|
||||
53
bootstrap/lecture/bootstrapsem.py
Normal file
53
bootstrap/lecture/bootstrapsem.py
Normal file
@@ -0,0 +1,53 @@
|
||||
import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
plt.xkcd()
|
||||
fig = plt.figure( figsize=(6,4) )
|
||||
rng = np.random.RandomState(637281)
|
||||
|
||||
nsamples = 100
|
||||
nresamples = 1000
|
||||
db = 0.05;
|
||||
bins = np.arange(-0.4, 0.41, db)
|
||||
|
||||
# draw a SRS (simple random sample, "Stichprobe") from the population:
|
||||
x = rng.randn(nsamples)
|
||||
|
||||
# bootstrap the mean:
|
||||
mus = []
|
||||
for i in xrange(nresamples) :
|
||||
mus.append(np.mean(x[rng.randint(0, nsamples, nsamples)]))
|
||||
hmus, _ = np.histogram(mus, bins, density=True)
|
||||
|
||||
# many SRS:
|
||||
musrs = []
|
||||
for i in xrange(nresamples) :
|
||||
musrs.append(np.mean(rng.randn(nsamples)))
|
||||
hmusrs, _ = np.histogram(musrs, bins, density=True)
|
||||
|
||||
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('Mean')
|
||||
ax.set_xlim(-0.4, 0.4)
|
||||
ax.set_ylabel('Probability density')
|
||||
ax.set_ylim(0.0, 4.5)
|
||||
ax.set_yticks(np.arange(0.0, 4.5, 1.0))
|
||||
ax.annotate('sampling\ndistribution',
|
||||
xy=(-0.12, 3.1), xycoords='data',
|
||||
xytext=(-0.18, 3.5), textcoords='data', ha='right',
|
||||
arrowprops=dict(arrowstyle="->", relpos=(1.0,0.5),
|
||||
connectionstyle="angle3,angleA=20,angleB=120") )
|
||||
ax.annotate('bootstrap\ndistribution',
|
||||
xy=(0.13, 3.3), xycoords='data',
|
||||
xytext=(0.25, 4), textcoords='data',
|
||||
arrowprops=dict(arrowstyle="->", relpos=(0.0,0.5),
|
||||
connectionstyle="angle3,angleA=20,angleB=60") )
|
||||
ax.bar(bins[:-1]-0.25*db, hmusrs, 0.5*db, color='r')
|
||||
ax.bar(bins[:-1]+0.25*db, hmus, 0.5*db, color='b')
|
||||
|
||||
plt.tight_layout()
|
||||
plt.savefig('bootstrapsem.pdf')
|
||||
#plt.show();
|
||||
60
bootstrap/lecture/permutecorrelation.py
Normal file
60
bootstrap/lecture/permutecorrelation.py
Normal file
@@ -0,0 +1,60 @@
|
||||
import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
plt.xkcd()
|
||||
fig = plt.figure( figsize=(6,4) )
|
||||
rng = np.random.RandomState(637281)
|
||||
|
||||
# generate correlated data:
|
||||
n = 200
|
||||
a = 0.2
|
||||
x = rng.randn(n);
|
||||
y = rng.randn(n) + a*x;
|
||||
|
||||
rd = np.corrcoef(x, y)[0, 1]
|
||||
print rd
|
||||
|
||||
# permutation:
|
||||
nperm = 1000
|
||||
rs = []
|
||||
for i in xrange(nperm) :
|
||||
xr=rng.permutation(x)
|
||||
yr=rng.permutation(y)
|
||||
rs.append( np.corrcoef(xr, yr)[0, 1] )
|
||||
|
||||
# pdf of the correlation coefficients:
|
||||
h, b = np.histogram(rs, 20, density=True)
|
||||
|
||||
# significance:
|
||||
rq = np.percentile(rs, 95.0);
|
||||
|
||||
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.annotate('Measured\ncorrelation\nis significant!',
|
||||
xy=(rd, 1.1), xycoords='data',
|
||||
xytext=(rd, 2.2), textcoords='data', ha='left',
|
||||
arrowprops=dict(arrowstyle="->", relpos=(0.2,0.0),
|
||||
connectionstyle="angle3,angleA=10,angleB=80") )
|
||||
ax.annotate('95% percentile',
|
||||
xy=(0.14, 0.9), xycoords='data',
|
||||
xytext=(0.2, 4.0), textcoords='data', ha='left',
|
||||
arrowprops=dict(arrowstyle="->", relpos=(0.1,0.0),
|
||||
connectionstyle="angle3,angleA=30,angleB=70") )
|
||||
ax.annotate('Distribution of\nuncorrelated\nsamples',
|
||||
xy=(-0.08, 3.6), xycoords='data',
|
||||
xytext=(-0.22, 5.0), textcoords='data', ha='left',
|
||||
arrowprops=dict(arrowstyle="->", relpos=(0.5,0.0),
|
||||
connectionstyle="angle3,angleA=150,angleB=100") )
|
||||
ax.bar(b[:-1], h, width=b[1]-b[0], color='#ffff66')
|
||||
ax.bar(b[:-1][b[:-1]>=rq], h[b[:-1]>=rq], width=b[1]-b[0], color='#ff9900')
|
||||
ax.plot( [rd, rd], [0, 1], 'b', linewidth=4 )
|
||||
ax.set_xlim(-0.25, 0.35)
|
||||
ax.set_xlabel('Correlation coefficient')
|
||||
ax.set_ylabel('Probability density of H0')
|
||||
|
||||
plt.tight_layout()
|
||||
plt.savefig('permutecorrelation.pdf')
|
||||
#plt.show();
|
||||
Reference in New Issue
Block a user