Випадково змінюється растрова карта типів середовища проживання?


12

У мене є растр типів середовища проживання для конкретного району Шотландії. Мені потрібно створити майбутні сценарії проживання із змінами середовища проживання для оцінки життєздатності популяції виду птахів.

Наприклад, у майбутньому може бути на 10% більше лісового господарства. Я хотів би змінити поточну карту шляхом випадкового додавання лісового масиву в блоки певного розміру. Я поки що розмірковую, як вибирати випадкові точки з растру, які визначають ділянки, де могло б відбуватися лісове господарство, та вирощування блоків правильного розміру за допомогою якихось стільникових автоматів.

Чи здається це найкращим способом вирішити це? Чи є кращий метод?

Якщо це найкращий доступний спосіб, як я можу це зробити в, бажано, R? (Я зараз переглядаю функцію точок в "spatstat" разом з пакетом CellularAutomata)

У мене також є доступ до GRASS, QGis та ArcMap 10, якщо в будь-якому з них є більш прості способи.


Ви ще подивилися rasterпакет? У ньому багато інструментів для роботи з растровими (noo, rly?) Даними.
Роман Луштрик

Спасибі, Романе. Так, це має дати мені інструменти для читання та маніпулювання моєю базовою картою.
Метт Гірі

Відповіді:


18

Чи думали ви використовувати ланцюжок Маркова ? Це фактично "ймовірнісний стільниковий автомат", забезпечуючи тим самим бажану випадковість. Замість того, щоб прописати нове покоління з точки зору місцевих сусідів існуючого покоління, він визначає розподіл ймовірностей для нового покоління. Такий розподіл можна оцінити з, скажімо, часових послідовностей зображень одного і того ж або подібних областей.

Інтуїтивно ця модель говорить про те, що клітина не обов’язково здійснюватиме перехід від лісового до нелісового (або навпаки ), але шанси на те, що вона зробить перехід, залежать від земельного покриву безпосередньо навколо неї. Він може працювати з декількома класами покриття, складною конфігурацією мікрорайонів і навіть бути узагальненим, щоб "запам'ятати" недавню історію розвитку земельного покриву.

Переходи можуть бути реалізовані за допомогою операторів Map Algebra, що робить цей метод практичним у будь-яких растрових GIS, навіть у тих, що не мають прямого або швидкого доступу до даних рівня клітин. Використання R робить це ще простіше.

Наприклад, розглянемо цю початкову конфігурацію лише з двох класів, білого та чорного:

Сітка наземного покриву

Щоб проілюструвати, що може статися, я створив параметризовану модель (не засновану на будь-яких даних), в якій перехід до чорного кольору відбувається з вірогідністю 1 - q ^ k, де k - середня кількість чорних комірок у межах 3 на 3 (k = 0, 1/9, 2/9, ..., 1). Коли або q малий, або більша частина мікрорайону вже чорна, нова комірка буде чорною. Ось чотири незалежних моделювання десятого покоління для п’яти значень q, що варіюються від 0,25 до 0,05:

Таблиця результатів

Очевидно, що ця модель має багато характеристик КА, але вона також включає випадковий ефект, корисний для дослідження альтернативних результатів.


Код

Далі реалізується моделювання в R.

#
# Make a transition from state `x` using a kernel having `k.ft` as
# its Fourier transform.
#
transition <- function(x, k.ft, q=0.1) {
  k <- zapsmall(Re(fft(k.ft * fft(x), inverse=TRUE))) / length(x)
  matrix(runif(length(k)) > q^k, nrow=nrow(k))
}
#
# Create the zeroth generation and the fft of a transition kernel.
#
n.row <- 2^7 # FFT is best with powers of 2
n.col <- 2^7
kernel <- matrix(0, nrow=n.row, ncol=n.col)
kernel[1:3, 1:3] <- 1/9
kernel.f <- fft(kernel)

set.seed(17)
x <- matrix(sample(c(0,1), n.row*n.col, replace=TRUE, prob=c(599, 1)), n.row)
#
# Prepare to run multiple simulations.
#
y.list <- list()
parameters <- c(.25, .2, .15, .1, .05)
#
# Perform and benchmark the simulations.
#
i <- 0
system.time({
  for (q in parameters) {
    y <- x
    for (generation in 1:10) {
      y <- transition(y, kernel.f, q)
    }
    y.list[[i <- i+1]] <- y
  }
})
#
# Display the results.
#    
par(mfrow=c(1,length(parameters)))
invisible(sapply(1:length(parameters), 
       function(i) image(y.list[[i]], 
                         col=c("White", "Black"),
                         main=parameters[i])))

+1 Дуже цікаво. Якби у вас були історичні дані про обкладинку для певної місцевості, чи можна було б отримати q та / або k?
Кірк Куйкендалл

2
@Kirk Так, але я б не рекомендував це: модель, яку я використовував для ілюстрації, занадто спрощена. Але ви можете отримати щось краще: переглянувши емпіричні частоти переходів із кожної конфігурації сусідства, що відбулася, ви можете створити моделі майбутньої еволюції, переходи яких статистично імітують минулу еволюцію. Якщо частоти переходу просторово однорідні і якщо майбутнє продовжує діяти як попереднє, то запуск декількох з цих симуляцій може дати чітке уявлення про те, що може бути майбутнє.
whuber

Дякую, це, здається, робить саме те, що мені потрібно. Чи можна було б встановити обмеження на частку площі, яка змінюється?
Метт Гірі

@Matt Так, принаймні у ймовірнісному сенсі. Теорія описує, як ланцюги Маркова досягають асимптотично стійкої суміші пропорцій кожного стану. Це динамічна рівновага: у кожного покоління багато клітин може змінюватися, але чистий результат полягає в тому, щоб зберегти їх пропорції всередині сітки однаковими (до невеликих відхилень від випадкових випадків).
whuber

1
Я жахливий програміст R. Я можу поділитися використаним кодом Mathematica ; з функціями застосування R, він повинен добре портувати. Вам потрібно ядро, правило переходу та процедура їх застосування до масиву 2D 0/1. Таким чином: kernel = ConstantArray[1/3^2, {3,3}]для ядра; transitionRule [k_] := With[{q = 0.1}, Boole[RandomReal[{0, 1}] > q^k]]за правило; і next[a_, kernel_, f_] := Map[f, ListConvolve[kernel, a, {1, 1}, 0], {2}]застосувати їх до масиву a . Наприклад, для побудови чотирьох поколінь від початку , використання ArrayPlot /@ NestList[next[#, kernel, transitionRule] &, start, 3].
whuber
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.