Visualisierung der wahrscheinlichsten Migrationsrichtung bei Punkten mit Alter mit R?

8

Ich habe eine Frage, wie die vorhergesagte Migrationsrichtung bei einer Reihe von Punkten mit geschätztem Alter am besten visualisiert werden kann.

Stellen Sie sich vor, ich habe eine Reihe von Geokoordinaten, die Gemeinschaften repräsentieren. Für jeden Punkt habe ich eine Schätzung des Alters dieser Gemeinde. Ich möchte einen Pfeil auf die Karte zeichnen, der die wahrscheinlichste Richtung der allgemeinen Migration im Laufe der Zeit angibt. Ich möchte auch, dass die Größe des Pfeils angibt, wie konsistent der Gradient ist / wie sicher wir sind, dass es eine sinnvolle Ausrichtung zwischen Zeit und Raum gibt. Ich frage nicht nach der Theorie des Migrationsprozesses, sondern nur danach, wie Sie sich für den Winkel, die Position und die Größe des Pfeils entscheiden würden.

Beispielsweise sind rote Punkte älter als grüne Punkte. In der ersten Box scheint es eine vernünftige Schlussfolgerung zu sein, dass die Migration nach Südosten erfolgte. Im zweiten Feld gibt es kein klares Muster, daher ist der Pfeil kleiner.

Beispiel

Gibt es eine standardmäßige, prinzipielle Methode, um dies zu tun? Eine Möglichkeit, an die ich dachte, bestand darin, einen Vektor zwischen dem ältesten und dem zweitältesten Punkt, dann zwischen dem zweitältesten und dem drittältesten zu zeichnen und so weiter. Summieren Sie dann die Vektoren (aber wie bestimmen Sie den Startort?). Oder müssen Sie die Vektoren zwischen allen Punktpaaren nehmen und sie nach dem relativen Alter gewichten? Oder muss ich vielleicht die Konturen herausarbeiten und dann einen Pfad zeichnen, der am höchsten Punkt beginnt und bergab geht?

Eine R-basierte Lösung wäre ideal.

Sean Roberts
quelle
es erinnert mich an Regressionsmodelle oder an Oberflächen, die die Strömungsrichtung berechnen.
Andreas Müller
1
Ja, die Anpassung z~x+yan die Datenpunkte ergibt die Gleichung einer Ebene, die zu den Punkten passt, und zeichnet dann einen Pfeil mit einer Richtung, die durch die Koeffizienten und die Größe basierend auf der Signifikanz definiert ist. Zentrieren Sie den Pfeil auf den Schwerpunkt der Punkte.
Spacedman
Dies ist eine ausgezeichnete Frage (+1). Ich würde empfehlen, Ihre Bearbeitung als Antwort hinzuzufügen. Wenn Sie die Frage bearbeiten, bleibt Ihre Frage etwas unkonzentriert. Es ist am besten, eine neue Frage zu stellen, in der Sie gefragt werden, wie Sie die Funktionen Ihres Codes verbessern können.
Aaron

Antworten:

2

Hier ist meine aktuelle Lösung, basierend auf dem obigen Vorschlag, eine Oberfläche anzupassen. Diese Lösung behandelt die Skalierung nicht richtig, daher müssen die Koordinaten und z-Werte klein sein (z. B. zwischen -1 und 1).

drawDirection = function(x,y,z){
  # use linear model to fit surface
  m = lm(z ~ x+y)

  # Treat coefficeints like vectors and 
  # define arrow start and end points
  arrow = c(0,0,
            m$coefficients["x"],
            m$coefficients['y'])
  # Move arrow to centroid
  adj.x = mean(x)- (m$coefficients["x"]/2)
  adj.y = mean(y)- (m$coefficients["y"]/2)
  arrow = arrow + c(adj.x,adj.y,adj.x,adj.y)

  # colours for points
  # Yellow = higher = more recent
  z.col = heat.colors(10)[as.numeric(cut(z,breaks=10))]
  # Plot points with some extra space around
  plot(x,y, col=z.col, pch=16,
       xlim=c(min(x)-sd(x)*2,max(x)+sd(x)*2),
       ylim=c(min(y)-sd(y)*2,max(y)+sd(y)*2))
  # Plot arrow
  # (scale width by 10 x the R squared)
  arrows(arrow[1],arrow[2],arrow[3],arrow[4],
         lwd = 1+(10*summary(m)$adj.r.squared))
}

par(mfrow=c(1,2))

# Simulate some data
n = 30
# Correlated North-East
x = runif(n,0,1)
y = jitter(x,amount=1)
z = jitter(x+y,amount=1)
x = x
y = y
drawDirection(x,y,z)

# Uncorrelated
x2 = runif(n,0,1)
y2 = runif(n,0,1)
z2 = runif(n,0,1)

drawDirection(x2,y2,z2)

Ausgabe

Ich glaube jedoch, dass ich die Skalierung falsch mache. Wenn ich den Bereich von x und y vergrößere, skaliert der Pfeil nicht richtig:

# Correlated North-East, 
#  with x and y variables between 0 and 360
x = runif(n,0,1)
y = jitter(x,amount=1)
z = jitter(x+y,amount=1)
x = x*360
y = y*360
drawDirection(x,y,z)

Die Pfeilänge wird nicht richtig skaliert

Im Moment können Sie also die Geokoordinaten und den z-Wert skalieren.

Sean Roberts
quelle