Rを使用して、年齢とともにポイントが与えられた場合の最も可能性の高い移行方向を視覚化しますか?


8

推定年齢のポイントのセットが与えられた場合、予測される移動の方向を視覚化するための最良の方法について質問があります。

コミュニティを表す一連の地理座標があるとします。それぞれの点について、そのコミュニティの年齢の推定値があります。時間の経過に伴う一般的な移動の最も可能性の高い方向を示す矢印をマップに描画したいと思います。また、矢印の大きさによって、グラデーションの一貫性や、時間と空間の間に意味のある整合があることをどの程度確信しているかを示します。移動のプロセスの理論については質問していません。矢印の角度、位置、大きさをどのように決定するかについてです。

たとえば、以下の赤い点は緑の点より古いです。最初のボックスでは、移行が南東であったという賢明な結論のように見えます。2番目のボックスには明確なパターンがないため、矢印は小さくなっています。

例

これを行うための標準的で原則的な方法はありますか?私が考えた方法の1つは、最も古い点と2番目に古い点の間、次に2番目に古い点と3番目に古い点の間にベクトルを描画することでした。次に、ベクトルを合計します(ただし、開始位置を決定する方法は?)。それとも、すべてのポイントのペアの間のベクトルを取り、それらを相対年齢で重み付けする必要がありますか?または、コンターを計算してから、最高点から始まり下り坂に向かう経路を描く必要がありますか?

Rベースのソリューションが理想的です。


流れの方向を計算する回帰モデルまたはサーフェスを思い出させます。
アンドレアス・ミュラー

1
はい、z~x+yデータポイントにフィットすると、ポイントにフィットする平面の方程式が得られます。次に、有意性に基づいて係数とサイズで定義された方向を持つ矢印を描画します。矢印を点の重心に合わせます。
Spacedman、2018

これはすばらしい質問です(+1)。あなたの編集を回答として追加することをお勧めします。質問に編集を加えることは、あなたの質問を少し焦点を絞っていません。コードの機能を改善する方法を尋ねる新しい質問を開くのが最善です。
アーロン

回答:


2

これは、上記の表面にフィットするための提案に基づく私の現在の解決策です。このソリューションはスケーリングを適切に処理しないため、座標とz値は小さくなければなりません(例:-1と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)

出力

ただし、スケーリングが間違っていると思います。xとyの範囲を大きくすると、矢印が適切にスケーリングされません。

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

矢印の長さが正しくスケーリングされていません

したがって、今のところ、地理座標とz値をスケーリングできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.