Все еще некоторая случайность с sp :: spsample (..., ..., type = 'normal') - PullRequest
0 голосов
/ 20 февраля 2019

Я строю sp::SpatialLines, используя spsample.В документе это написано для spsample(x, n, type, ...):

тип: символ;«случайный» для полностью пространственного случайного;«регулярный» для регулярного (систематически выровненного) отбора проб;[...]

Тем не менее, я только что понял, что последовательно созданные линии с 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"

Я усердно боролся в своем коде, чтобы понять, почему измерения расстояний между (какими должны быть) двумя одинаковыми точками и (какими должны быть) двумя одинаковыми линиями не дали строго идентичных результатов.

Любая идея, почему это так, и как обеспечить последовательные результаты между последовательными прогонами?(или: любая альтернатива для построения двух одинаковых линий в том же духе, что и выше?)

1 Ответ

0 голосов
/ 20 февраля 2019

Это странное поведение.Хотя, если вы положите семена перед обоими образцами, они не будут иметь различий.Следовательно, это, вероятно, связано с тем, что происхождение регулярной выборки незначительно меняется в разных сериях.

....
  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
...