Wie Histogramme sinnvoll vergleichen

Hallo zusammen,

ich habe ein kleines Statistik-Problem, bei dem ihr mir hoffentlich helfen könnt.

Ich habe X Datensätze. Für jeden Datensatz weiss ich, wie sich die Datenpunkte auf N Eigenschaften verteilen. Damit kann ich jeden Datensatz durch ein Histogramm charakterisieren, in dem ich auftrage, zu wieviel Prozent die Daten aus Datensatz xi auf Eigenschaft nj fallen. Für jeden Datensatz summieren sich die Prozentsätze der Eigenschaften zu 100% auf.

Jetzt die Frage: Wie kann ich anhand der Histogramme die Datensätze mit einander vergleichen?

  • RMSE kann man natürlich berechnen, aber ab welchem Wert wäre hier ein Unterschied signifikant?

  • Bei der Pearson Korrelation kann man die Signifikanz des Ergebnisses berechnen, aber ist das Maß an sich in diesem Zusammenhang sinnvoll?

  • Mit dem KS-Test habe ich momentan etwas Probleme. Egal welches Paar ich reinstecke, sowohl R als auch Matlab geben für alle Paare die gleichen Werte aus.

  • Hier im Forum habe ich dazu die Antwort gefunden, Chi^2 oder Fischers exakter Test wären dazu geeignet. Aber die werden ja eigentlich auf Integer angewendet. Soll ich runden und die benutzen?

Ich freue mich über jede hilfreiche Antwort.

Gruß
Schorsch

Hallo,

mit dieser Frage beschäftige ich mich auch zur Zeit, bin aber noch zu keinem Ergebnis gekommen (glücklicherweise spielt es auch im Moment noch keine elementare Rolle).

Allerdings habe ich den Exakten Test nach Fisher so verstanden, dass die Spaltensummen nicht gleich sein müssen, also sollte es in Deinem Fall möglich sein, die echten Anzahlen zu verwenden, statt auf Prozentangaben ausweichen zu müssen.

Viele Grüsse
d.

Hi,

Ich habe X Datensätze. Für jeden Datensatz weiss ich, wie sich
die Datenpunkte auf N Eigenschaften verteilen. Damit kann ich
jeden Datensatz durch ein Histogramm charakterisieren, in dem
ich auftrage, zu wieviel Prozent die Daten aus Datensatz xi
auf Eigenschaft nj fallen. Für jeden Datensatz summieren sich
die Prozentsätze der Eigenschaften zu 100% auf.

Jetzt die Frage: Wie kann ich anhand der Histogramme die
Datensätze mit einander vergleichen?

Histogramme dienen in erster Linie zur Visualisierung mehr oder minder unabhängig von der Skala der Daten.
Direkt vergleichen kann man daher Histogramme nicht, aber über ein „umwege“:

  1. KS-Test. Hierbei ist zu beachten, dass es zwei Arten gibt: Test auf Normalverteilung oder Test auf gleich Verteilung. Im ersten Fall - hier uninteressant - wird der datensatz auf eine Normalverteilung geprüft, im zweiten Fall kann man die empirischen Vrteilungsfunktionen zweier datensätze miteinander vergleichen.

set.seed(2); x=rnorm(n=20); y=rnorm(n=22, sd=2, mean=1.3)
plot(ecdf(x), verticals = TRUE, col.01line = „white“)
plot(ecdf(y), verticals = TRUE, add=TRUE, col.01line = „white“, col=„red“)

ks.test(x=x, y=y)

eine leichte Verbesserung gibt es im Matching package:
hier wird die Verteilung der Teststatistik durch bootstrap ermittelt, und ties sind zugelassen, was den Test wesentlich flexibler macht

library(Matching)
ks.boot(Tr=x, Co=y, nboots=1000, alternative = c(„two.sided“), print.level=0)

Man kann auch hier auf Überlegenheit/Unterlegenheit testen, dabei ist aber Vorsicht geboten, weil die richtungen vertauscht sind - paper lesen lohnt da.

  1. Verteilung schätzen und deren Parameter gegeneinander testen. da man nur testen kann, welche Verteilung nicht vorliegt und die meisten sich durch mehrere parameter definieren, testet man sich hier schnell ins Nirvana rein. Das lohnt also nur, wenn du weisst, welche Verteilungen das sein sollen. Bei mehrgipfligen Verteilungen klappt das i.a. nicht mehr.

  2. wilcoxon o.ä.: Testet im Prinzip auch eine Verteilung, zielt aber eher auf Lokationsunterschiede ab. Klappt bei mehrgipfligen Verteilungen auch nicht gut.

  3. Fisher o.ä.: Testet Häufigkeiten in Kategorien und ob es darauf einen einfluss gibt. Der test in R funktioniert nur für gleich große Stichproben und du musst die Kategorien definieren. wenn du eine stetige Variable hast, sind diese eher arbiträr und damit der ganze Test ebenfalls.

  4. andere Masse: Du kannst natürlich immetr auch selber Abweichungsmasse definieren (differenz der Flächen / Quadrat der Differenzen pro Kategorie / …) wirst dazu aber die Verteilung deiner Teststatistik i.a. nicht kennen und sie daher ebenfalls z.B. via bootstrap schätzen müssen.

Ich würde zu 1) tendieren, da hier die größte Flexibilität gegeben ist kombiniert mit relativ wenig Grundannahmen.

Viele Grüße,
JPL

Hallo,

Warum nimmst du nicht die Anzahlen statt der Prozentwerte? Dann kannst du das mit Fishers Exaktem test doch problemlos rechnen.

VG
Jochen

Hallo Jochen,

meine Datensätze sind nicht wirklich gleich groß. Die Anzahl der Datenpunkte schwankt zwischen 8,000 und 9,000,000. Macht das für Fishers Test etwas aus?

Viele Grüße
Schorsch

Hallo JPL,

vielen Dank für Deine ausführliche Antwort.

Kann ich mit dem KS Test nicht viel besser vergleichen, ob die verschiedenen Eigenschaften über die Datensätze ähnlich verteilt sind, als dass ich damit die Datensätze anhand der Häufigkeiten der Eigenschaften vergleichen kann? Beim erstellen der ECDF geht mir doch verloren, welcher Prozentsatz mit welcher Eigenschaft assoziiert ist. Oder nicht?

Viele Grüße
Schorsch

Hi schorsch,

dann hab ich deine Zuordnung zu den eigenschaften vllt nicht ganz verstanden. Ich dachte du hättest Datensätze die je Eigenschaft widerspiegeln und dieser Datensatz wäre metrisch.
ein konkretes Bsp von dir wäre da hilfreich, wenn ich falsch liege.

die ecdf ist nur eine andere Darstellung des Histos. Letzteres zeigt die rel. Häufigkeiten, wenn du diese summierst bekommst du ja schon die ecdf. Also hat diese nut dort Sprungstellen, an denen das Histogramm eine Klasse hat mit > 0%. Im Falle von metrischen Daten ist die ecdf genauer als das Histo, weil die (willkürliche) einteilung in Klassen wegfällt.

Viele Grüße,
JPL

Hallo JPL,

also mal ein konkretes Beispiel: D sind meine Datensätze, E sind die Prozentsätze der Eigenschaften. Jeder Datenpunkt kann nur eine Eigenschaft haben, also summieren sich die Prozentsätze der Eigenschaften zu 100% auf.

D1 D2 D3
E1 4,95 4,84 7,83
E2 1,44 0,49 7,45
E3 19,65 15,53 36,28
E4 1,22 0,48 1,58
E5 24,63 20,83 29,37
E6 1,80 0,34 0,10
E7 1,58 1,69 0,82
E8 41,61 53,08 14,83
E9 3,11 2,71 1,73

Was mich jetzt interessiert ist: Sind die Verteilungen der Datenpunkte auf die unterschiedlichen Eigenschaften von Datensatz zu Datensatz signifikant unterschiedlich? Dass sie nicht absolut identisch sind kann man ja erkennen. Aber sind die erkennbaren Unterschiede denn signifikant?

Vielleicht hätte ich das Beispiel besser direkt am Anfang reingestellt :smile: Leider ist die Tabellenformatierung irgendwie verloren gegangen.

Viele Grüße
Schorsch

Hi,

okay, jetzt hab ichs kapiert. Mit den Daten kannst du - da eigenshaft nominal ist - einen Fisher machen oder die nominalen umkodieren (in wa auch immer) und ks.boot verwenden. Da dieser nur Unterschiede auf der y-Achse verwendet, ist die Kodierung selber egal.

Viele Grüße,
JPL

VG

Naja, indirekt vielleicht schon.

Ich wollte es grade in R machen. Ich muss so lange den Workspace erhöhen, bis er letztlich so gross ist dass R keinen Speicherblock dieser Grösse mehr zuteilen kann.

Viele Grüße
Schorsch

Noch’ne Anmerkung:
Mit derart riesigen Datensätzen kannst Du u.U. affig kleine Unterschiede höchst-signifikant nachweisen. Du solltest auf jeden Fall auf die Effekt-Größen schauen, ob die *relevant* sind.

Und auch: Handelt es sich bei den 9 Mio Werten um unabhängige Daten?

Wo bekommt man denn derart gewaltige Datenmengen her?

VG
Jochen

Hallo Jochen,

bei ca. 10^7 synthetisierten oder identifizierten wirkstoff-artigen Molekülen kommt einiges zusammen. Und es wird nochmal mehr, wenn die im Schnitt 29 interessante Atome haben die man sich anschaut.

Viele Grüße
Schorsch

Aso. Danke!

Schönes Wochenende,
Jochen

Ich kriegs nicht gebacken
Hallo,

ich nochmal. Vielen Dank schonmal für die Hilfe bis hierher.

Aber: Ich versuche das alles in R hinzubekommen, aber renne immer wieder gegen eine Wand.

Fishers Test: Er ist in R implementiert für ganzzahlige Integer. Also habe ich nicht die Prozentsätze meiner Eigenschaften reingesteckt, sondern die absoluten Anzahlen. Der Test verlangt nach immer mehr Speicher, bis er sagt, er kann so viel wie er will gar nicht mehr reservieren. Dann dachte ich mir: Okay, tue ich mal so, als würde ich ihm eine repräsentative Stichprobe geben und rechne die Prozentsätze * 100, danach runden - schon sind es positive Integer, die kleiner sind als die Counts. Gleiches Problem.

Chi^2: Der sollte ja essentiell das gleiche machen die Fishers Test, oder? Aber da stellt sich auch wieder das Problem: was stecke ich denn rein? Implementiert ist er für positive Integer, was sehr für die Anzahlen der Eigenschaften spricht, nicht für die Prozentsätze. Aber die sind schon verdammt groß.

Kann mir jemand bitte noch bei dem letzten kleinen Schritt helfen, wie ich das jetzt konkret berechnen kann? Wenn ich bisher irgendwas grob falsches gemacht habe - ruhig hauen.

Viele Grüße
Schorsch

Hi Schrosch,

Fishers EXAKTER Test rechnet dir alle erumtationen deiens Datensatzes aus. die anzhal der Permutationen ist schon für kleine Fallzahlen bei klassischen 4 Feldern immens, bei mehreren Feldern und 9Mio Datensätzen kannst du das getrost knicken. Das wird niemals klappen und wenn R sich daran nicht verschluckt, wird der Rechner SEHR lange brauchen.

Das Problem ist nicht die Integer selber für die Anzahl der, sondern die Zahl der Datensätze.

wenn du nur drei hast, z.B.

x
ist das alles kein Ding.
hast du also wesentlich mehr Datansätze?

Nebenbei: Es macht einen großen Unterschied, ob du %-werte oder absolute Zahlen auswertest.

Grüße,
JPL

1 Like

Hallo JPL,

insgesamt habe ich 6 Datensätze. Ich nehme an, ich sollte bei meinen absoluten Zahlen bleiben?

Viele Grüße
Schorsch

Hi,

ür den Chi² sowieso - wenn du nur 6 datensätze hast versteh ich allerdings nicht, wieso dir R abschmiert. In meinem Bsp hat jeder datensatz insgesamt auch >1,000,000 Werte.
Im Chi² musst du dann aber bedenken, dass die Unterschiede in der Zahl der Punkte im datensatz dann schon etwas ausmacht bezogen auf die Interpretation.

Grüße,
JPL

Hallo,

jetzt hat JPL schon geantwortet, ich will das aber nochmal bestätigen:

  1. Tatsächlich funktioniert Fishers Test in R nicht, wenn die Häufigkeiten sehr groß sind. Warum R mehr Speicher haben will, weiß ich aber nicht.

  2. Der Chi²-Test ist eine Näherung für Fishers Test. Die Näherung ist sehr gut, wenn du keine Häufigkeiten

1 Like

Dankeschön
Hallo zusammen,

vielen Dank für Eure ausgezeichnete Hilfe. Es gab Sternchen :smile:

Viele Grüße
Schorsch