Случайно меняющаяся растровая карта типов мест обитания?

12

У меня есть растр типов среды обитания для определенной области в Шотландии. Мне нужно создать сценарии будущей среды обитания с изменениями среды обитания, чтобы оценить жизнеспособность популяции видов птиц.

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

Кажется ли это лучшим способом добиться этого? Есть ли лучший метод?

Если это лучший доступный способ, как я могу сделать это, предпочтительно, в R? (В настоящее время я смотрю на функцию rpoints в «spatstat» вместе с пакетом CellularAutomata)

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

Мэтт Гири
источник
Вы уже посмотрели на rasterпакет? У него много инструментов для работы с растровыми (ну, ладно?) Данными.
Роман Луштрик
Спасибо, Роман. Да, это должно дать мне инструменты для чтения и манипулирования моей базовой картой.
Мэтт Гири

Ответы:

18

Вы думали об использовании цепи Маркова ? По сути, это «вероятностный клеточный автомат», обеспечивающий желаемую случайность. Вместо того, чтобы предписывать новое поколение в терминах локальных соседей существующего поколения, оно определяет распределение вероятностей для нового поколения. Это распределение можно оценить, скажем, по временным последовательностям изображений одинаковых или похожих областей.

Интуитивно понятно, что эта модель говорит, что ячейка не обязательно будет осуществлять переход от покрытых лесами к не покрытым лесом (или наоборот ), но шансы, что это сделает переход, зависят от земного покрова, непосредственно окружающего ее. Он может обрабатывать несколько классов укрытий, сложные конфигурации окрестностей и даже обобщаться, чтобы «помнить» недавнюю историю эволюции растительного покрова.

Переходы могут быть реализованы с помощью операторов алгебры карт, что делает этот метод практически применимым в любой растровой ГИС, даже в тех, которые не имеют прямого или быстрого доступа к данным на уровне ячеек. Использование 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])))
Whuber
источник
+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}]применять их к массиву а . Например, чтобы построить четыре поколения от начала , используйте ArrayPlot /@ NestList[next[#, kernel, transitionRule] &, start, 3].
whuber