Ich habe die folgenden drei Datensätze.
data_a=[0.21,0.24,0.36,0.56,0.67,0.72,0.74,0.83,0.84,0.87,0.91,0.94,0.97]
data_b=[0.13,0.21,0.27,0.34,0.36,0.45,0.49,0.65,0.66,0.90]
data_c=[0.14,0.18,0.19,0.33,0.45,0.47,0.55,0.75,0.78,0.82]
data_a sind reale Daten und die anderen beiden sind die simulierten. Hier versuche ich zu überprüfen, welches (data_b oder data_c) dem data_a am nächsten kommt oder ihm sehr ähnlich ist. Derzeit mache ich es visuell und mit ks_2samp Test (Python).
Visuell
Ich habe das cdf von realen Daten gegen das cdf von simulierten Daten grafisch dargestellt und versucht, visuell das zu sehen, welches am nächsten ist.
Oben ist das cdf von data_a vs cdf von data_b
Oben ist das cdf von data_a vs cdf von data_c
Wenn man es also visuell sieht, kann man sagen, dass data_c näher an data_a liegt als data_b, aber es ist immer noch nicht genau.
KS Test
Die zweite Methode ist der KS-Test, bei dem ich data_a mit data_b sowie data_a mit data_c getestet habe.
>>> stats.ks_2samp(data_a,data_b)
Ks_2sampResult(statistic=0.5923076923076923, pvalue=0.02134674813035231)
>>> stats.ks_2samp(data_a,data_c)
Ks_2sampResult(statistic=0.4692307692307692, pvalue=0.11575018162481227)
Von oben können wir sehen, dass die Statistik niedriger ist, wenn wir data_a mit data_c getestet haben, sodass data_c näher an data_a als an data_b liegen sollte. Ich habe den p-Wert nicht berücksichtigt, da es nicht angebracht wäre, ihn als Hypothesentest zu betrachten und den erhaltenen p-Wert zu verwenden, da der Test mit der vorgegebenen Nullhypothese entworfen wurde.
Meine Frage hier ist also, ob ich das richtig mache und ob es auch einen anderen besseren Weg gibt, es zu tun ??? Vielen Dank
quelle
x_points=np.asarray(list(range(0,len(data_a)))) >>> x_points=x_points/len(data_a) >>> plt.plot(x_points,data_a) >>> x_points=np.asarray(list(range(0,len(data_b)))) >>> x_points=np.asarray(list(range(0,len(data_c)))) >>> x_points=x_points/len(data_c) >>> plt.plot(x_points,data_c)
Dies ist der Code. Aber meine Frage ist, wie man die Nähe zwischen den beiden Datensätzen finden kannAntworten:
Sie könnten einen informationstheoretischen Ansatz wählen, indem Sie die geringste Kullback-Leibler-Divergenz zwischen den Verteilungen ermitteln. Innerhalb der Entropiefunktion von SciPy gibt es eine KL-Divergenzoption .
Die zweite simulierte Verteilung ist näher als die erste simulierte Verteilung an der realen Verteilung.
Wenn Sie an Inferenz interessiert sind, können Sie viele Simulationen ausführen und p-Werte berechnen. Dieser Prozess ist eine Variation des Permutationstests .
quelle
Erwägen Sie die Verwendung der Erdbewegungsentfernung (dh der Wasserstein-1- Entfernung), die (ähnlich der KL-Divergenz) verwendet werden kann, um die "Entfernung" zwischen Punktmengen (oder vielmehr die durch sie induzierte empirische Verteilung) zu berechnen. Es gibt eine Methode in scipy dafür sowie diese Bibliothek .
Einige Notizen:
quelle
Da wir keine Daten entfernen sollten ... können wir die Vektornorm vom Ursprung verwenden (l2-Norm)
gegebene Daten_a, Daten_b, Daten_c sind Arrays.
Ausgabe : 2.619885493680974 1.5779100101083077 1.6631897065578538.
da l2_a, l2_c Werte näher sind, sind data_a und data_c nahe beieinander.
quelle