sp::spsample(..., ..., type='regular') 仍然有些随机性

Still some randomness with sp::spsample(..., ..., type='regular')

我正在使用 spsample 构建一个 sp::SpatialLines。在文档中,它是为 spsample(x, n, type, ...):

编写的

type: character; "random" for completely spatial random; "regular" for regular (systematically aligned) sampling; [...]

然而,我刚刚意识到在相同的两点之间连续创建的带有 spsampletype='regular' 的线 相同:

library(sp)
set.seed(12)
for (i in 1:10) {
  p1 = c(400000, 401000)
  p2 = c(5600000, 5601000)
  l1 = as.data.frame(spsample(SpatialLines(list(Lines(Line(cbind(p1, p2)), ID="a"))), 
                              10000, "regular"))
  l2 = as.data.frame(spsample(SpatialLines(list(Lines(Line(cbind(p1, p2)), ID="a"))), 
                              10000, "regular"))
  print(all.equal(l1, l2))
}
# [1] "Component “p1”: Mean relative difference: 1.8687e-07"
# [1] "Component “p1”: Mean relative difference: 1.680998e-07"
# [1] "Component “p1”: Mean relative difference: 3.382085e-08"
# [1] "Component “p1”: Mean relative difference: 1.155756e-07"
# [1] TRUE
# [1] "Component “p1”: Mean relative difference: 1.051644e-07"
# [1] TRUE
# [1] "Component “p1”: Mean relative difference: 4.354955e-08"
# [1] "Component “p1”: Mean relative difference: 2.074916e-08"
# [1] "Component “p1”: Mean relative difference: 1.380726e-07"

我一直在我的代码中努力理解为什么两个相同点(应该是)和(应该是)两条相同线之间的距离测量没有给出完全相同的结果。

知道为什么会这样吗?如何确保连续运行之间的结果一致? (或者:以与上述类似的精神构建两条相同的线路的任何替代方案?)

这是一些奇怪的行为。虽然,如果你把种子放在两个样本之前,它就没有区别。因此,这可能是由于定期抽样的起源在不同的运行中略有不同。

....
  set.seed(12)
  l1 = as.data.frame(spsample(SpatialLines(list(Lines(Line(cbind(p1, p2)), ID="a"))), 
                              10000, "regular"))
  set.seed(12)
  l2 = as.data.frame(spsample(SpatialLines(list(Lines(Line(cbind(p1, p2)), ID="a"))), 
                              10000, "regular"))
....
# [1] TRUE
# [1] TRUE
# [1] TRUE
....

sf 替代 sp

因为我已经成为 sf 软件包的忠实粉丝,所以我测试了它是否会出现相同的问题。结果不是:
(不要混淆,sfsp 对象之间有一些转换,以便尽可能接近 OP 中给出的代码)

library(sf)
library(dplyr)
library(sp)

set.seed(12)
for (i in 1:10) {
  p1 <- c(400000, 401000)
  p2 <- c(5600000, 5601000)
  l1 <- as.data.frame(
    st_as_sf(SpatialLines(list(Lines(Line(cbind(p1, p2)), ID="a"))) %>% 
      st_make_grid(n=100, what = "centers") %>% 
      as("Spatial")
  )
  l2 <- as.data.frame(
    st_as_sf(SpatialLines(list(Lines(Line(cbind(p1, p2)), ID="a"))) %>% 
      st_make_grid(n=100, what = "centers") %>% 
      as("Spatial")
  )
  print(all.equal(l1, l2))
}

# [1] TRUE
# [1] TRUE
# [1] TRUE
# [1] TRUE
# [1] TRUE
# [1] TRUE
# [1] TRUE
# [1] TRUE
# [1] TRUE
# [1] TRUE