我有地理(即未投影的)空间坐标,并且想在每个原始坐标对周围生成一个 n 个随机坐标,以使生成的点遵循双变量正态分布。分布的平均值应为原始坐标的位置,标准偏差为半径 r 度的纬度/经度。
我尝试使用rnorm
函数分别为每个轴(即纬度和经度)随机生成坐标。只是后来才意识到,这在所有方向上产生的分布要比1度的标准偏差宽得多。以下代码说明了这种尝试,并且该图显示了错误的输出(即很大一部分点远远超出了1度的标准偏差)。
library(sp)
library(scales)
library(geosphere)
library(MASS)
## spatial point of interest (i.e. Observed data).
onepnt <- data.frame(longitude=1, latitude=1)
#### First attempt: separately generate longitude and latitude points based on random distributions with mean of 'onepnt' and st.dev. of 1 degree.
rlon <- rnorm(1000, mean=onepnt$longitude, sd=1) # longitudinal degree error adjusted for latitude
rlat <- rnorm(1000, mean=onepnt$latitude, sd=1) # mean and standard deviation in degrees
rcoords1 <- cbind.data.frame(longitude=rlon, latitude=rlat)
####### Second attempt: generate lat/lons from a bivariate normal distribution
# Set parameters for bivariate normal dist.
rho <- 0 # correlation coefficient
mu1 <- onepnt$longitude # data coordinates as mean (center) of distribution
mu2 <- onepnt$latitude
s1 <- 1 # 1 degree = 1 st.dev.
s2 <- 1
mu <- c(mu1,mu2) # vector of means
sigma <- matrix(c(s1^2, s1*s2*rho, s1*s2*rho, s2^2), 2) # Covariance matrix
# mvrnorm
rlatlon <- as.data.frame(mvrnorm(1000, mu=mu, Sigma=sigma))
colnames(rlatlon) <- c('longitude', 'latitude')
## Assess distribution of randomized points
wgs84 <- CRS('+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')
###### 1 - separate univariate #####
rtabsp1 <- SpatialPointsDataFrame(rcoords1, proj4string=wgs84, data = rcoords1)
origcoordssp1 <- SpatialPointsDataFrame(onepnt, proj4string=wgs84, data = onepnt)
###### 2 - Bivariate #####
rtabsp2 <- SpatialPointsDataFrame(rcoords1, proj4string=wgs84, data = rcoords2)
plot(rtabsp1, pch=16, col=alpha('black', 0.5))
plot(origcoordssp, pch=20, col='red', cex=2, add=T)
sdbuff1 <- raster::buffer(origcoordssp, 111*1000) ## generate buffer within which 1SD (68%) of generated points ought to fall
plot(sdbuff1, border=4, add=T)
## Check Great Circle distances from the point-of-interest
dist2center1 <- distHaversine(rtabsp1, origcoordssp)/1000
dist2center2 <- distHaversine(rtabsp2, origcoordssp)/1000
hist(dist2center1) ## most points are not near the center (i.e. few points near '0'
hist(dist2center2)
mean(dist2center1) ## means should
mean(dist2center2)
所以,我看到的问题是,以这两种方式生成的大多数点都不在中心点附近(即,距关注点的距离不接近零)。
据我所知,这是在第一种方法中发生的,因为重新组合分别绘制的经/纬度坐标会从正方形区域而不是圆形区域产生坐标。
任何对此的帮助将不胜感激!简化问题的一种方法(即从半径变化的缓冲区中随机抽取)或理想情况下 一种使二元解决方案有效的方法(我没有发布此操作以避免使水变得浑浊)。
(注意:最终,我将使用一个大型的全局数据集,因此,为了节省计算时间,我希望不必在投影中工作,如果可能的话。也就是说,如果根问题是投影,就这样吧!)