Memvisualisasikan arah migrasi yang paling mungkin diberikan poin dengan usia menggunakan R?

8

Saya punya pertanyaan tentang cara terbaik untuk memvisualisasikan arah migrasi yang diprediksi mengingat serangkaian poin dengan perkiraan usia.

Bayangkan saya memiliki satu set koordinat geografis, yang mewakili komunitas. Untuk setiap poin, saya memiliki perkiraan umur komunitas itu. Saya ingin menggambar panah pada peta yang menunjukkan arah migrasi umum yang paling mungkin dari waktu ke waktu. Saya juga ingin besarnya panah untuk mewakili seberapa konsisten gradien / seberapa percaya diri kita bahwa ada keselarasan yang bermakna antara waktu dan ruang. Saya tidak bertanya tentang teori proses migrasi, hanya tentang bagaimana Anda akan memutuskan sudut, posisi dan besarnya panah.

Misalnya, di bawah titik merah lebih tua dari titik hijau. Di kotak pertama, sepertinya kesimpulan yang masuk akal bahwa migrasi adalah Tenggara. Di kotak kedua, tidak ada pola yang jelas, jadi panahnya lebih kecil.

Contoh

Apakah ada cara standar dan berprinsip untuk melakukan ini? Salah satu cara yang saya pikirkan adalah menggambar vektor antara titik tertua dan tertua ke-2, lalu antara tertua ke-2 dan ke-3, dan seterusnya. Kemudian jumlah vektor (tetapi bagaimana menentukan lokasi awal?). Atau mungkin Anda perlu mengambil vektor antara semua pasang titik dan menimbangnya pada usia relatif? Atau mungkin saya perlu mengerjakan kontur, lalu menggambar jalur yang dimulai pada titik tertinggi dan menuju ke bawah bukit?

Solusi berbasis R akan ideal.

Sean Roberts
sumber
itu mengingatkan saya pada model regresi atau permukaan, menghitung arah aliran.
Andreas Müller
1
Ya, pas z~x+yke titik data memberikan persamaan bidang yang cocok dengan titik, lalu gambar panah dengan arah yang ditentukan oleh koefisien dan ukuran berdasarkan signifikansi. Tengahkan tanda panah pada titik tengah titik.
Spacedman
Ini adalah pertanyaan yang sangat bagus (+1). Saya akan merekomendasikan untuk menambahkan hasil edit Anda sebagai jawaban. Menekan sunting ke pertanyaan membuat pertanyaan Anda sedikit tidak fokus. Cara terbaik adalah membuka pertanyaan baru yang menanyakan cara meningkatkan fitur kode Anda.
Aaron

Jawaban:

2

Inilah solusi saya saat ini, berdasarkan saran di atas agar sesuai dengan permukaan. Solusi ini tidak mengatasi penskalaan dengan benar, sehingga nilai koordinat dan z harus kecil (misalnya antara -1 dan 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)

Keluaran

Namun, saya pikir saya melakukan penskalaan yang salah - jika saya meningkatkan rentang x dan y, maka panah tidak menskala dengan benar:

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

Panjang panah tidak scaling dengan benar

Jadi untuk saat ini Anda dapat skala koordinat geografis dan nilai z.

Sean Roberts
sumber