8 votos

Para visualizar más probable es que la dirección de la migración puntos dados con edades con R?

Tengo una pregunta sobre la mejor manera de visualizar la predicción de la dirección de migración, dado un conjunto de puntos con una estimación de las edades.

Imagine que tiene un conjunto de coordenadas geo, que representan a las comunidades. Para cada punto, tengo una estimación de la edad de esa comunidad. Quiero dibujar una flecha en el mapa que indica la más probable de la dirección general de migración a lo largo del tiempo. También quiero que la magnitud de la flecha para representar a la coherencia de la gradiente es / ¿qué tan seguro estamos de que hay una significativa la alineación entre el tiempo y el espacio. No estoy preguntando acerca de la teoría del proceso de migración, sólo se trata de cómo se iba a decidir en el ángulo, la posición y la magnitud de la flecha.

Por ejemplo, debajo de los puntos rojos son mayores que los puntos verdes. En el primer cuadro, se parece a una conclusión razonable de que la migración Sur-Oriente. En el segundo cuadro, no hay ningún patrón claro, de forma que la flecha es menor.

Example

Hay un estándar, en forma de principios de hacerlo? Una manera en que yo pensaba era dibujar un vector entre el más antiguo punto y la 2ª más antigua, a continuación, entre la 2ª más antigua y la 3ª mayor, y así sucesivamente. Entonces la suma de los vectores (pero, ¿cómo decidir la ubicación de inicio?). O tal vez usted necesita para tomar los vectores entre todos los pares de puntos y el peso de ellos por la edad relativa? O tal vez lo que necesita para trabajar los contornos, a continuación, dibuje un camino que se inicia en el punto más alto y jefes de descenso?

Un R-basado en la solución sería ideal.

2voto

Albert Puntos 31

Aquí está mi solución actual, basada en la propuesta anterior para adaptarse a una superficie. Esta solución no resuelve el escalado correctamente, por lo que las coordenadas y los valores z debe ser pequeño (por ejemplo, entre -1 y 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)

Output

Sin embargo, creo que me estoy haciendo la escala de malo - si puedo aumentar el rango de x y de y, a continuación, la flecha no se ajusta correctamente:

# 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)

Arrow length is not scaling properly

Así que por ahora podría escala de la geo-coordenadas y el valor de z.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X