Mahalanobis-Distanz

Faktorenanalyse, Clusteranalyse, Diskriminanzanalyse und weitere multivariate Verfahren mit R.

Mahalanobis-Distanz

Beitragvon Progressive » Do 16. Nov 2017, 19:56

Hi,

ich glaube, es ist zwar kein Verfahren an sich aber es passt vom Umfeld hier wohl am besten rein:

Ich habe etwa 1000 Vektoren, von denen jeder Vektor vier Komponenten hat.
Nun möchte ich stets zwei Vektoren daraus per Mahalanobis-Distanz vermessen. Allerdings bin ich gerade etwas überfragt, welche bzw. aus welchem package denn in Frage kommt. Ich habe mal die aus dem distances-package ausprobiert, aber da erhalte ich eine 4x4-Matrix zurück.
Ich erwarte eher ein Skalar(?!).

Könnt ihr mir da bitte weiterhelfen?
Progressive
 
Beiträge: 9
Registriert: So 9. Apr 2017, 15:17
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Mahalanobis-Distanz

Beitragvon Zaungast » Fr 17. Nov 2017, 09:10

Diffuse Frage, diffuse Antwort: es ist richtig, dass eine Distanz per Definition eine einzelne (nichtnegative) Zahl ist...
Für die Berechnung der Mahalanobis-Distanz benötigt man die Kovarianzmatrix der Stichprobe (bzw. deren Inverse), und die hätte in Deinem Fall die Dimension 4x4...
Ich könnte mir daher vorstellen, dass Du Dir die (irgendwie!?) berechnen lässt!
Zaungast
 
Beiträge: 169
Registriert: Sa 21. Mai 2016, 17:15
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Mahalanobis-Distanz

Beitragvon Progressive » Fr 17. Nov 2017, 10:24

Danke erstmal!

Mh, ok. Mir stellt sich dann pragmatisch erstmal folgende zwei Fragen:
Konstruiere ich mir die Berechnung selbst (sodass die Kovarianzmatrix der Population berücksichtigt wird, anstelle der Stichprobe?!) oder gibt es das, was ich suche, bereits? :)

Momentan messe ich die Distanzen zwischen zwei Vektoren euklidisch aber da die Dimensionen unterschiedliche Einheiten besitzen kommen da aussagelose Werte heraus. Daher möchte ich die Mahalanobis-Distanz verwenden.
Progressive
 
Beiträge: 9
Registriert: So 9. Apr 2017, 15:17
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Mahalanobis-Distanz

Beitragvon Zaungast » Fr 17. Nov 2017, 10:39

Momentan messe ich die Distanzen zwischen zwei Vektoren euklidisch aber da die Dimensionen unterschiedliche Einheiten besitzen kommen da aussagelose Werte heraus. Daher möchte ich die Mahalanobis-Distanz verwenden.

Ja, dafür ist die auch gedacht...

Vielleicht hilft Dir das weiter (durch googeln gefunden!): https://stats.stackexchange.com/questions/65705/pairwise-mahalanobis-distances
Zaungast
 
Beiträge: 169
Registriert: Sa 21. Mai 2016, 17:15
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Mahalanobis-Distanz

Beitragvon Progressive » Fr 17. Nov 2017, 12:56

Danke, kenne ich aber leider schon.
Habe mich aber jetzt nochmal 1-2h durchgekaut und weiß nicht wirklich, was/ob und wie ich da etwas anwenden kann bzw., wenn ich das richtig verstehe, geht es da nicht wirklich um Lösungen selbst, sondern wie man eine solche Berechnung beschleunigt.
Progressive
 
Beiträge: 9
Registriert: So 9. Apr 2017, 15:17
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Mahalanobis-Distanz

Beitragvon Zaungast » Fr 17. Nov 2017, 13:06

geht es da nicht wirklich um Lösungen selbst, sondern wie man eine solche Berechnung beschleunigt.

Doch, so wie ich das sehe geht es (insbesondere im Post von whuber) um beides!

Wie gesagt - wenn Du bei der Schilderung Deiner Situation konkreter würdest (Daten, Programme) könnten wir auch konkrete Hinweise geben!
Zaungast
 
Beiträge: 169
Registriert: Sa 21. Mai 2016, 17:15
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Mahalanobis-Distanz

Beitragvon Progressive » Fr 17. Nov 2017, 13:08

https://www.rdocumentation.org/packages ... ahalanobis könnte vlt. etwas sein, wobei ich allerdings nicht an der Distanz zwischen zwei Gruppen interessiert bin, sondern quasi an der Distanz zwischen zwei Individuen aus derselben Gruppe.
:?:

edit: Moment, ich füge gleich noch Informationen an.
Die Antwort in dem Link gucke ich mir nochmal an..

So: Bei der Frage nach Programm würde ich R/Rstudio antworten (da es hier aber ja ein R-Forum ist, wundert mich die Frage etwas?)
Daten:

Ich habe z.B.
Code: Alles auswählen
Seriennummer1 Voltage Slope Voltage_irradiated Slope_irradiated    Seriennummer2 Voltage Slope Voltage_irradiated Slope_irradiated
810007993 356.119 6.08423 356.427 6.13945     818008628 356.130 6.01598 356.439 6.14607
818008630 355.249 6.01046 354.124 6.20855    710006246 355.851 6.14004 354.115 6.21253
(...)


Wobei diese Daten als zwei getrennte data frames auftauchen. Die Distanz soll zwischen der Zeile des einen data frames und der Zeile des anderen data frames berechnet werden (Also zwischen zwei Vektoren, die je aus vier Parameter bestehen).
Im Endeffekt habe ich z.B. das Gerät mit der Seriennummer 810007993, das die oben nachstehenden vier Parameter hat und möchte die Distanz zwischen diesem Gerät und dem Gerät 818008628 (aus dem anderen data frame) bestimmen.

Um die Kovarianzmatrix der Gesamtpopulation zu erhalten könnte/müsste ich wohl darüber hinaus noch beide data frames nochmal separat zusammenlegen.
edit: Ich frage mich gerade, ob mich die Kovarianzmatrix der Population überhaupt interessiert? Bzw. wie genau funktioniert Mahalanobis denn.. kalkuliert es die Distanz zwischen zwei Punkten oder kalkuliert es den Abstand jeweils zur Populationsmitte? Letzteres wäre ja eine andere Fragestellung und auch schon in R recht einfach/direkt gelöst und hat m.E.n. mit "paarweise" auch nichts zu tun. Richtig?
Zuletzt geändert von Progressive am Fr 17. Nov 2017, 13:32, insgesamt 2-mal geändert.
Progressive
 
Beiträge: 9
Registriert: So 9. Apr 2017, 15:17
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Mahalanobis-Distanz

Beitragvon Progressive » Fr 17. Nov 2017, 13:22

Zaungast hat geschrieben:
geht es da nicht wirklich um Lösungen selbst, sondern wie man eine solche Berechnung beschleunigt.

Doch, so wie ich das sehe geht es (insbesondere im Post von whuber) um beides!


Meinst du
Code: Alles auswählen
mahal <- function(x, h=solve(var(x))) {
  u <- apply(x, 1, function(y) y %*% h %*% y)
  d <- outer(u, u, `+`) - 2 * x %*% h %*% t(x)
  d[lower.tri(d)]
}


?

Das berechnet die Mahalanobis-Distanz (zwischen zwei Punkten/Vektoren)? :?
Ich kann das kaum lesen.. sollen die zwei Punkte durch x und y gegeben sein?
Progressive
 
Beiträge: 9
Registriert: So 9. Apr 2017, 15:17
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post


Zurück zu Multivariate Verfahren

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron