4

Beyond "Soda, Pop, or Coke"を見たことがある人もいるかもしれません。私は同様の問題に直面しており、そのようなプロットを作成したいと考えています。私の場合、非常に多数のジオコーディングされた観測 (100 万以上) とバイナリ属性xがあります。p(x=1) の 0 から 1 までの範囲のカラー スケールを使用して、地図上にxの分布を表示したいと思います。

私は他のアプローチにもオープンですが、「ソーダ、ポップ、またはコーラ」を超えた Katz のアプローチはここで説明されており、これらのパッケージを使用しています: fields、maps、mapproj、plyr、RANN、RColorBrewer、scales、および zipcode。彼のアプローチは、ガウス カーネルを使用した k 最近傍カーネル平滑化に依存しています。最初に、マップ上の各位置tからすべての観測値までの距離を定義し、次にp(x=1|t) (位置を条件として x が 1 である確率) の距離加重推定を使用します。計算式はこちら

これを正しく理解している場合、R でこのようなマップを作成するには、次の手順が必要です。

  1. シェープファイルの領域全体をカバーするグリッドを作成します (グリッド内のポイントをtと呼びましょう)。を使用してこのアプローチを試みましpolygridたが、これまでのところ失敗しました。コードは以下です。
  2. tごとに、すべての観測値までの距離を計算します (または、k 個の最も近い点を見つけて、このサブセットの距離を計算します)。
  3. ここで定義された式に従ってp(x=1|t)を計算します
  4. 0 から 1 の範囲の適切なカラースケールですべてのtをプロットする

ここにいくつかのサンプルデータと、2 つの具体的な質問があります。まず、ステップ 1 の問題をどのように解決しますか? 下の 2 番目のマップが示すように、私の現在のアプローチは失敗します。これは R の実装に関する明確な質問であり、それが解決されれば、他の手順を完了することができるはずです。第二に、より広く言えば、それは正しいアプローチですか、それとも属性値の分布でヒートマップを作成する別の方法を提案しますか?

ライブラリをロードし、シェープファイルとパッケージを開く

# set path
path = PATH   # CHANGE THIS!!
# load libraries
library("stringr")
library("rgdal")
library("maptools")
library("maps")
library("RANN")
library("fields")
library("plyr")
library("geoR")
library("ggplot2")

# open shapefile
map.proj          = CRS(" +proj=lcc +lat_1=40.66666666666666 +lat_2=41.03333333333333 +lat_0=40.16666666666666 +lon_0=-74 +x_0=300000 +y_0=0 +datum=NAD83 +units=us-ft +no_defs +ellps=GRS80 +towgs84=0,0,0")
proj4.longlat=CRS("+proj=longlat +ellps=GRS80")
shape = readShapeSpatial(str_c(path,"test-shape"),proj4string=map.proj)
shape = spTransform(shape, proj4.longlat)
# open data
df=readRDS(str_c(path,"df.rds"))

プロット データ

# plot shapefile with points
par (mfrow=c(1,1),mar=c(0,0,0,0), cex=0.8, cex.lab=0.8, cex.main=0.8, mgp=c(1.2,0.15,0), cex.axis=0.7, tck=-0.02,bg = "white")
plot(shape@bbox[1,],shape@bbox[2,],type='n',asp=1,axes=FALSE,xlab="",ylab="")
with(subset(df,attr==0),points(lon,lat,pch=20,col="#303030",bg="#303030",cex=0.4))
with(subset(df,attr==1),points(lon,lat,pch=20,col="#E16A3F",bg="#E16A3F",cex=0.4))
plot(shape,add=TRUE,border="black",lwd=0.2)

ここに画像の説明を入力

1) シェープファイルの全領域をカバーするグリッドを構築

# get the bounding box for ROI an convert to a list
bboxROI = apply(bbox(shape), 1, as.list)
# create a sequence from min(x) to max(x) in each dimension
seqs = lapply(bboxROI, function(x) seq(x$min, x$max, by= 0.001))
# rename to xgrid and ygrid
names(seqs) <- c('xgrid','ygrid')
# get borders of entire SpatialPolygonsDataFrame
borders = rbind.fill.matrix(llply(shape@polygons,function(p1) {
    rbind.fill.matrix(llply(p1@Polygons,function(p2) p2@coords))
    }))
# create grid
thegrid = do.call(polygrid,c(seqs, borders = list(borders)))
# add grid points to previous plot
points(thegrid[,1],thegrid[,2],pch=20,col="#33333333",bg="#33333333",cex=0.4)

ここに画像の説明を入力

4

0 に答える 0