【问题标题】:Geographic clustering of randomly selected sample points随机选择的样本点的地理聚类
【发布时间】:2016-01-04 23:40:37
【问题描述】:

我有一个可用采样站表,其中包含唯一标识符 GRID_ID 以及每个站的纬度和经度(和 UTM)。我想随机选择这些电台的一个子集,我可以使用sample() 轻松完成。

但是,为了最大限度地提高效率,我还想通过指定任何随机选择的采样站必须在至少 y 其他站的 x 距离内来采用一些聚类。

基本原理是长途旅行以采样一组y 电台是有意义的,但长途旅行以采样< y 电台则没有意义。

这有意义吗?在 R 中是否有一种直接的方法来处理这个问题?

【问题讨论】:

  • 这个article 可能会为您指明正确的方向。
  • 我认为“聚类分析”在这里并不合适。相反,请考虑一个两阶段的抽样过程:首先对旅行目的地(

标签: r spatial random-sample spatial-query


【解决方案1】:

这个怎么样:

# some random data
set.seed(1) 
df <- data.frame(x=runif(10), y=runif(10))

# e.g. select obs that have >= 1 neighbour closer than .3 (euclidean)
mat <- as.matrix(dist(df))
sel <- rowSums(mat < .3) >= 2 
plot(y~x, df, col = sel + 1L) # viz

# e.g. select obs that have >= 2 neighbours closer than 40000 (great circle/lon,lat)
library(geosphere)
mat <- distm(as.matrix(df))
sel <- rowSums(mat < 40000) >= 3 
plot(y~x, df, col = sel + 1L) # viz

# Take 2 random obs from those who meet the criteria
df[sample(which(sel), size = 2), ] 

好的,计算约 31000 个数据点之间的距离矩阵可能会使普通计算机窒息。另一种方法可能是使用基于密度的聚类,如 DBSCAN。它可能看起来像这样:

# load your data
set.seed(1)
download.file("https://dl.dropboxusercontent.com/u/17339799/MHI_BF_Survey_Domain_PSU.txt", tf <- tempfile(fileext = ".csv"))
fullds <- read.csv(tf)
df <- fullds[, c("lon_deg", "lat_deg")]

library(dbscan)
kNNdistplot(as.matrix(df), k=4) # determine eps value...

res <- dbscan(as.matrix(df), eps = .005, minPts = 4, borderPoints=F)
# DBSCAN clustering for 31083 objects.
# Parameters: eps = 0.005, minPts = 4
# The clustering contains 134 cluster(s).
# Available fields: cluster, eps, minPts

noise <- res$cluster == 0
sum(noise)
# [1] 2499

# interactive plot with zoom 
# (draw rectangle with right mouse, 
# CTRL to reset)
library(iplot)
iplot(df$lon_deg, df$lat_deg, col=noise + 1L) 

您可能需要对其进行调整以满足您的需求。但是

idx <- sample(which(!noise), 250)
fullds[idx, ]

然后会给你样品。

【讨论】:

  • 这看起来是个不错的方法,尽管我最初的可用采样站集是一个网格(渔网),所以在随机选择之前,任何给定的采样站都会有多个相邻的邻居。
  • 我已将采样站网格示例上传至:dl.dropboxusercontent.com/u/17339799/…
  • 对不起,我不知道数据集是关于什么的。我看到一些岛屿周围的地理坐标,但仅此而已。也许您可以用“我需要一个按 x 分组的 n lat_deg/lon_deg 行的样本”之类的方式重新表述您的问题。总而言之,最好发布一个新问题 - 包括数据以及您尝试过的可重复示例。
  • 谢谢卢克A。这只是一个覆盖夏威夷主要群岛的约 31000 个等距点的网格。我需要随机选择大约 250 个这些点进行采样,但我需要以某种方式限制随机采样,以便结果排除远离任何其他点的单个点或小组(
  • DropBox 完全没问题。要获得问题的答案,始终建议包含数据的(相关部分)或数据样本,以便用户通过复制/粘贴轻松重现您的问题。我编辑了帖子以展示另一种方法。 (尽管我必须承认我在基于密度的聚类方面没有太多经验)另外请注意 download.fileread.csv,如果您计划的话,您应该将其包含在另一篇文章中。
猜你喜欢
  • 1970-01-01
  • 2016-07-23
  • 1970-01-01
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-02
  • 1970-01-01
相关资源
最近更新 更多