Die Riesige Korrelationsmatrix

In meiner Studentenzeit habe ich Nachhilfe gegeben. Schüler der Mittelstufe bis Studenten waren dabei. Einmal hatte ich zwei Medizinstudenten, die Hilfe bei der statistischen Auswertung ihrer Daten brauchten. Also habe ich mir die Daten zeigen lassen, und versucht eine Auswertung zu machen.

Schnell merkte ich jedoch, dass die Problemstellung mit den gegebenen Daten unmöglich zu lösen war. Sie hatten von 30 Patienten ungefähr 100 Variablen bestimmt. Das waren Laborwerte, Messgrößen aus der Radiologie, und noch mehr. Und dann gab es noch einen weiteren Messwert, der jeweils später aufgenommen worden ist. Die Aufgabe bestand darin diesen späteren Wert aus den jetzigen Daten vorherzusagen. Das war ein interessantes Problem, wollte man aus Laborwerten das Erfolgsversprechen einer Behandlung ableiten. Das Problem war aber die Datenlage.

Sie hatten also mehr Variablen als Patienten gehabt. Das klingt erstmal nicht schlimm, mehr Daten als nötig zu haben kann hilfreich sein. Jedoch hatten sie keine Hypothesen vorbereitet. Sie wollten in die Daten schauen und sich dann post-hoc Hypothesen aussuchen, sich von den Daten leiten lassen. Das ist in der Statistik brandgefährlich. Sie erzählten auch, dass sie schon bei einer Statistikerin waren, und diese hätte das Projekt als unmöglich dargestellt. Daher hielten sie die Dame für inkompetent. Ich nahm sie dann in Schutz, das wollten sie aber nicht hören.

Diese Geschichte möchte ich nochmal erzählen, und das ganze mit künstlichen Daten illustrieren.

Ich habe mir erstmal normalverteilte Daten für die abhängige Variable erzeugt, die ich vorhersagen möchte. Ich nehme hier 10 Patienten und 30 Variablen, sodass es nicht ganz so viel wird. Das hier ist die abhängige Variable:

array([-0.68812852,  1.31235829,  0.28314148,  0.86275549, -0.93083697,
       -0.66163461,  1.92133209, -0.34005784,  1.10002589, -0.55017807])

Dann habe ich noch eine 10 × 30 Matrix mit weiteren normalverteilten Daten für die unabhängigen Variablen.

Die beiden Studenten wollten sich erstmal eine Korrelationsmatrix anschauen, um ein Gefühl für die Daten zu bekommen. Das kann man machen. Da kommt dann etwas buntes raus:

Man muss nur überlegen, dass das gefährlich ist. Betrachtet man eine Pearson-Korrelation, so muss man einen Schwellenwert festlegen. Und wenn man ein Signifikanzniveau von 5 % ist dann nicht mehr alles signifikant. Setzt man diesen Filter an, erhält man nur noch diese Werte hier:

Das sieht doch toll aus! Das sieht so aus, als wäre da eine Korrelation in den Daten. Vorsicht! Bei 5 % Signifikanzniveau haben wir eine Falsch-Positiv-Rate von 5 %. Wir berechnen hier 435 Korrelationen und machen entsprechend viele Tests mit 5 % Fehlerrate. Dann erwarten wir 22 falsch-positive Werte. Ich zähle 18 signifikante Korrelationen. Per Konstruktion der Daten weiß ich, dass es keine intrinsische Korrelation gibt. Alles, was man sieht, ist falsch positiv.

Das hat die aber nicht davon abgehalten sich darauf zu stürzen. Ich habe gesagt, dass man damit super vorsichtig sein muss. Aber die fingen schon an sich post-hoc Hypothesen auszudenken, wie man das rechtfertigen kann.

Schaut man sich mal eine dieser vermeintlichen Korrelationen als Streudiagramm an, so sieht man das hier:

Ja, da kann man eine Gerade durchlegen. Aber das ist eine Punktewolke, bei der zwei Ausreißer eben dazu geführt haben, dass das eine große Korrelation hat. Da steht aber keine Aussage hinter. Würde man mehr Patienten haben, so wäre der Effekt wieder weg.

Wir sind dann auch nicht mehr weitergekommen. Ich habe gesagt, dass man mit 100 Variablen, 30 Patienten und keinen pre-hoc Hypothesen nicht arbeiten kann. Sie erzählten mir, wie schwer es war, 30 Patienten zu finden. Sie sind dann mit den wahrscheinlich falsch-positiven Korrelationen losgezogen und haben ihre Arbeiten damit geschrieben.

Neulich in einer Diskussion auf Twitter zu p-Werten ist mir diese Geschichte wieder eingefallen, daher habe ich sie erzählt. Jetzt ist mir noch etwas richtig fieses eingefallen, das ich damals nicht vorgeschlagen hätte. Es verdeutlicht aber, dass es zu wenige Daten sind.

Da alle Variablen unabhängig voneinander sind, spannen wahrscheinlich 30 Variablen einen Raum mit 30 Dimensionen auf. Das bedeutet, dass ich jeden beliebigen Wert damit zusammensetzen kann. Es ist total unseriös dies mit Rauschen zu tun, ist numerisch aber machbar. Man kann diese Daten einfach als Gleichungssystem auffassen und eine Linearkombination suchen, mit der man die abhängige Variable exakt abbilden kann. Dazu löst man das Gleichungssystem:

np.linalg.solve(indep[:n_pat], dep)

Und dann erhält man eine Lösung mit den nötigen Vorfaktoren:

array([-0.71118576,  0.76633166,  0.79739692,  1.08392142, -0.14174039,
       -0.40431027, -0.10290895, -0.80609016, -0.77495553, -1.46167007]

Der Witz ist, dass das für die vorhandenen Daten perfekt passt. Es ist aber ein Fall von overfitting, das ganze wird nicht auf neue Patienten generalisieren. Da die Studie aber beendet ist, wird das nicht weiter auffallen. Also nicht direkt. Man hätte ein super Ergebnis: Behandlungserfolg ist -0.711 × Körpergröße + 0.766 × Gewicht + 0.797 × Körperfettanteil + ….

Es ist also ein kontinuierliches Spektrum beim Thema »Lügen mit Statistik«, wenn man es unethisch macht.