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; [...]
然而,我刚刚意识到在相同的两点之间连续创建的带有 spsample
和 type='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
软件包的忠实粉丝,所以我测试了它是否会出现相同的问题。结果不是:
(不要混淆,sf
和 sp
对象之间有一些转换,以便尽可能接近 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
我正在使用 spsample
构建一个 sp::SpatialLines
。在文档中,它是为 spsample(x, n, type, ...)
:
type: character; "random" for completely spatial random; "regular" for regular (systematically aligned) sampling; [...]
然而,我刚刚意识到在相同的两点之间连续创建的带有 spsample
和 type='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
软件包的忠实粉丝,所以我测试了它是否会出现相同的问题。结果不是:
(不要混淆,sf
和 sp
对象之间有一些转换,以便尽可能接近 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