Visualizando a direção mais provável da migração, dados os pontos com as idades usando R?


8

Eu tenho uma pergunta sobre a melhor forma de visualizar a direção prevista da migração, considerando um conjunto de pontos com idades estimadas.

Imagine que eu tenho um conjunto de coordenadas geográficas, representando comunidades. Para cada ponto, tenho uma estimativa da idade dessa comunidade. Quero desenhar uma seta no mapa que indique a direção mais provável da migração geral ao longo do tempo. Também quero que a magnitude da flecha represente a consistência do gradiente / a confiança que temos de que haja um alinhamento significativo entre tempo e espaço. Não estou perguntando sobre a teoria do processo de migração, apenas sobre como você decidiria o ângulo, posição e magnitude da flecha.

Por exemplo, os pontos vermelhos abaixo são mais antigos que os pontos verdes. Na primeira caixa, parece uma conclusão sensata de que a migração foi para o sudeste. Na segunda caixa, não há um padrão claro; portanto, a seta é menor.

Exemplo

Existe uma maneira padrão e baseada em princípios de fazer isso? Uma maneira que pensei foi desenhar um vetor entre o ponto mais antigo e o 2º mais antigo, depois entre o 2º mais antigo e o 3º mais antigo, e assim por diante. Em seguida, some os vetores (mas como decidir o local de início?). Ou talvez você precise pegar os vetores entre todos os pares de pontos e ponderá-los pelas idades relativas? Ou talvez eu precise trabalhar os contornos, depois traçar um caminho que comece no ponto mais alto e desça?

Uma solução baseada em R seria ideal.


isso me lembra modelos de regressão ou superfícies, calculando a direção do fluxo.
Andreas Müller

1
Sim, o ajuste z~x+yaos pontos de dados fornece a equação de um plano que se ajusta aos pontos e, em seguida, desenhe uma seta com a direção definida pelos coeficientes e tamanho com base na significância. Centralize a seta no centróide dos pontos.
Spacedman

Esta é uma excelente pergunta (+1). Eu recomendaria adicionar sua edição como resposta. Aderir a edição à pergunta deixa a pergunta um pouco fora de foco. É melhor abrir uma nova pergunta perguntando como melhorar os recursos do seu código.
Aaron

Respostas:


2

Aqui está minha solução atual, com base na sugestão acima para ajustar uma superfície. Esta solução não trata da escala adequadamente, portanto, as coordenadas e os valores z devem ser pequenos (por exemplo, entre -1 e 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)

Resultado

No entanto, acho que estou fazendo o dimensionamento errado - se eu aumentar o alcance de x e y, a seta não será dimensionada corretamente:

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

O comprimento da seta não está dimensionado corretamente

Portanto, por enquanto, você pode dimensionar as coordenadas geográficas e o valor z.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.