Habitat türlerinin raster haritasını rastgele değiştiriyor musunuz?


12

İskoçya'da belirli bir alan için raster yaşam alanım var. Bir kuş türünün nüfus yaşayabilirliğini değerlendirmek için habitattaki değişikliklerle gelecekteki habitat senaryoları oluşturmam gerekiyor.

Örneğin, gelecekte bölgede% 10 daha fazla ormancılık olabilir. Ormancılığı belirli bir büyüklükteki bloklara rastgele ekleyerek mevcut haritayı değiştirmek istiyorum. Şimdiye kadar, ormancılığın meydana gelebileceği alanları tanımlayan bir rasterden rastgele noktalar seçme ve bir çeşit hücresel otomata kullanarak doğru büyüklükteki blokları büyütme çizgileri boyunca düşünüyorum.

Bu, bunu yapmanın en iyi yolu gibi mi görünüyor? Daha iyi bir yöntem var mı?

Bu mevcut en iyi yolsa, bunu tercihen R'de nasıl yapabilirim? (Şu anda CellularAutomata paketi ile birlikte "spatstat" da rpoints işlevine bakıyorum)

Bunlardan herhangi birinde daha basit yollar varsa GRASS, QGis ve ArcMap 10'a da erişebiliyorum.


rasterPakete henüz baktınız mı ? Raster (noo, rly?) Verileriyle çalışmak için birçok araç var.
Roman Luštrik

Teşekkürler Roman. Evet, bu bana temel haritamı okumak ve değiştirmek için araçlar vermeli.
Matt Geary

Yanıtlar:


18

Bir Markov zinciri kullanmayı düşündünüz mü ? Bu, etkin bir şekilde "olasılıklı bir hücresel otomat" tır ve böylece arzu edilen rasgeleliği sağlar. Yeni nesli mevcut neslin yerel komşuları olarak reçete etmek yerine, yeni neslin bir olasılık dağılımını belirler. Bu dağılım, örneğin, aynı veya benzer alanların görüntülerinin zaman dizilerinden tahmin edilebilir.

Sezgisel olarak, bu model bir hücrenin ormanlıktan ormansızlığa (veya tam tersi ) geçiş yapması gerekmeyeceğini , ancak geçiş yapma şansının hemen çevresindeki arazi örtüsüne bağlı olduğunu söylüyor. Birden fazla örtü sınıfını, mahallelerin karmaşık konfigürasyonlarını ele alabilir ve hatta son zamanlarda arazi örtüsü evrim tarihini "hatırlamak" için genelleştirilebilir.

Geçişler, bu yöntemi hücre düzeyindeki verilere doğrudan veya hızlı erişimi olmayanlar bile raster tabanlı CBS'lerde uygulanabilir kılan Harita Cebiri ifadeleri kullanılarak uygulanabilir. R kullanmak daha da kolay.

Örneğin, beyaz ve siyah olmak üzere yalnızca iki sınıfla bu başlangıç ​​yapılandırmasını düşünün:

Arazi örtüsü ızgarası

Ne olabileceğini göstermek için, siyaha geçişin 1 - q ^ k olasılığı ile gerçekleştiği parametreli bir model oluşturdum (burada k, 3'e 3 mahalle içindeki ortalama siyah hücre sayısıdır (k = 0, 1/9, 2/9, ..., 1). Q ya küçük olduğunda ya da mahallenin çoğu zaten siyah olduğunda, yeni hücre siyah olacaktır. İşte onuncu kuşağın dört bağımsız simülasyonu, 0.25'ten 0.05'e kadar değişen beş q değeri için:

Sonuç tablosu

Açıkçası bu model bir CA'nın özelliklerinin çoğuna sahiptir, ancak aynı zamanda alternatif sonuçları araştırmak için yararlı olan rastgele bir etki içerir.


kod

Aşağıdakiler simülasyonu uygular 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 Çok ilginç. Belirli bir alan için tarihi toprak örtüsü verilerine sahip olsaydınız, q ve / veya k türetmek mümkün mü?
Kirk Kuykendall

2
@Kirk Evet, ama tavsiye etmem: gösterim için kullandığım model çok basit. Ancak daha iyi bir şey türetebilirsiniz: meydana gelen her mahalle konfigürasyonundan ampirik geçiş frekanslarına bakarak, geçişleri geçmiş evrimi istatistiksel olarak taklit eden gelecekteki evrim modelleri oluşturabilirsiniz. Geçiş frekansları uzamsal olarak homojense ve gelecek geçmiş gibi davranmaya devam ederse, bu simülasyonlardan birkaçının çalıştırılması geleceğin neler tutabileceğinin net bir resmini verebilir.
whuber

Teşekkürler, tam olarak ihtiyacım olanı yapıyor gibi görünüyor. Değişen alanın oranına bir sınır koymak mümkün müdür?
Matt Geary

@Matt Evet, en azından olasılıklı bir anlamda. Teori, Markov zincirlerinin her bir durumun oranlarının asimptotik olarak kararlı bir karışımına nasıl ulaştığını açıklar. Bu dinamik bir dengedir: her nesilde birçok hücre değişebilir, ancak net sonuç ızgara içindeki oranlarını aynı tutmaktır (küçük şans sapmalarına kadar).
whuber

1
Ben korkunç bir R programcısıyım. Kullandığım Mathematica kodunu paylaşabilirim ; R'nin uygulama fonksiyonları ile iyi bir port taşıması gerekir. Bir çekirdeğe, bir geçiş kuralına ve bunları 2D 0/1 dizisine uygulamak için bir prosedüre ihtiyacınız vardır. Böylece: kernel = ConstantArray[1/3^2, {3,3}]çekirdek için; transitionRule [k_] := With[{q = 0.1}, Boole[RandomReal[{0, 1}] > q^k]]kural için; ve next[a_, kernel_, f_] := Map[f, ListConvolve[kernel, a, {1, 1}, 0], {2}]bunları bir diziye uygulamak a . Örneğin, dört nesli baştan başlamak için kullanın ArrayPlot /@ NestList[next[#, kernel, transitionRule] &, start, 3].
whuber
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.