spatstats:有没有办法将 GPS 精度误差纳入分析?

spatstats: Is there a way to incorporate the GPS accuracy error into the analysis?

我正在处理点模式数据库。我使用 R 上 Spatstats 包的 Linhom 函数创建了空间分析,它运行良好。

但是,这些点存在相关的 GPS 精度误差。所以我想在包络线中绘制这个误差来比较我的观察线、精度误差区间和完全空间随机模式.

的包络线

这是我的数据框的一个子集

structure(list(Plant_ID = c("PA0106", "PA0107", "PA0108", "PA0109", PA0110", "PA0111", "PA0112", "PA0113", "PA0114", "PA0115", "PA0116", "PA0117", "PA0118", "PA0119", "PA0120", "PA0121", "PA0122", "PA0123", "PA0124", "PA0125"), error = c(5.7, 3.9, 3, 6.1, 3.6, 6.2, 2.2, 2.3, 2.3, 3.1, 5, 4.2, 6.2, 8.1, 5.7, 3.4, 13.9, 2.4, 3, 2.3), lat = c(4686388.965, 4686405.157, 4686221.337, 4686232.379, 4686373.99, 4686252.22, 4686256.133, 4686373.655, 4686253.222, 4686388.336, 4686387.455, 4686241.46, 4686247.678, 4686387.284, 4686252.61, 4686226.408, 4686254.703, 4686380.872, 4686203.882, 4686215.308), lon = c(423855.312, 423861.0414, 423682.7503, 423725.7385, 423847.7298, 423755.796, 423762.6737, 423847.555, 423773.638, 423854.4161, 423856.1724, 423738.4987, 423747.9986, 423856.7708, 423756.9294, 423717.1068, 423731.609, 423851.6071, 423682.8414, 423711.3172)), row.names = c(NA, 20L), class = "data.frame")

我尝试首先创建具有多个 simulations 与 GPS 精度误差相关的高斯随机模拟点。

for (i in 1:simulations) {
  
  error_gaussian <- rnorm(nrow(df), 0, df$error/2)
  
  df[, paste0("sim_lat_",i)] <- df$lat + error_gaussian 
  
  error_gaussian <- rnorm(nrow(df), 0, df$error/2)
  
  df[, paste0("sim_lon_",i)] <- df$lon + error_gaussian
  
}

然后我用生成的模拟创建一个 random list

random_points_list <- vector(mode = "list", length = simulations)

for (i in 1:simulations) {
  
  x <- df[, paste0("sim_lon_", i)]
  y <- df[, paste0("sim_lat_", i)]
  
  points <- ppp(x, y, window=w)
  random_points_list[[i]] <- rescale(points, 1, unitname = "m")
  
}


random_points_list <- as.solist(random_points_list)

最后将它与我的真实坐标 latlon 进行比较。

real_points <- ppp(df$lon_reproj, df$lat_reproj, window=w)
real_points <- rescale(real_points, 1, unitname = "m")

但是,当我绘制函数 envelope(real_points, Linhom, nsim=simulations, nrank=nrank_alfa, simulate=random_points_list, sigma=bw, eps=1, global=F) 时,它没有显示模拟点的实际行为,因为增加 radius 时包络间隔应该变小,但不是它?例如,第一个点有 5.7 m 的误差,因此在小于 5.7 m 的半径处,包络应该更宽,因为很多模拟点距离很远。但是,当半径为 200 m 时,包络应该非常窄,因为精度误差是不可察觉的。

这里我附上一张结果图的图片:

Plot spatstats Lfunction 先感谢您。非常感谢您的帮助,因为我深陷其中。

这是 envelope 函数的非常规用法,但我认为它是有效的。通常,模拟函数的包络是检验(例如)完全空间随机性的零假设的显着性带。但是在您的示例中,模拟是对试图重现 GPS 不确定性的原始数据的扰动,因此模拟函数的包络实际上是非齐次 L 函数真实值的 bootstrap 置信区间。所以,代码没问题。

结果图对我来说看起来不错。我认为您对结果的期望不正确。包络线的宽度与估计值的变异量有关,以绝对值表示,与真实值无关。 L 函数涉及一个平方根,它通常可以稳定方差,所以我希望波段具有大致恒定的宽度。在这种情况下有点复杂,因为您使用 Linhom 和强度函数的核密度估计,固定带宽 bw 这可能是一个好的选择或一个糟糕的选择,所以很难给出准确的预测。

底线:结果很好。