Viac

Štandardná odchýlka a priemer viac ako 1 000 obrázkov s náhodnými hodnotami null

Štandardná odchýlka a priemer viac ako 1 000 obrázkov s náhodnými hodnotami null


Mám veľkú zbierku rastrových súborov, z ktorých by som chcel vypočítať štandardnú odchýlku. Prvým problémom je, že ArcGIS nedokáže spracovať viac ako 1000 rastrov prostredníctvom štatistiky buniek, a tak som sa rozhodol ísť inou cestou spočítaním štvorcových hodnôt všetkých rastrov a potom získaním rozptylu a štandardnej odchýlky. Problém je v tom, že každý raster môže mať rôzne oblasti s hodnotami a niektoré oblasti s nulou.

Ak by som sa pokúsil skriptovať iteračnú funkciu, ktorá by sumarizovala rastre, výstup by bol úplne nulový, pretože pri veľkom množstve týchto máp by nakoniec mal všade nulové hodnoty.

Potom som skúsil použiť iný program, Spirits (http://spirits.jrc.ec.europa.eu/overview/about/). Aj keď tento softvér dokázal poskytnúť obrázok takto:

Problém s týmto výstupom je, že nulové hodnoty boli prevedené na 0.

Hľadám spôsob, ako spracovať veľké časové rady týchto obrázkov, ktoré pre svoje výpočty ignorujú nulové hodnoty a môžu spracovať viac ako 1 000 obrázkov naraz. Máte nejaké odporúčania?


Môžete to urobiť veľmi jednoducho v R pomocou funkcie prekrytia v rastrovom balíku.

Na demonštračné účely simulujem objekt rastrového zásobníka obsahujúci všetky rastre. V reálnej analýze by tento objekt slúžil ako ukazovateľ na rastre na disku a čítal by ich v blokoch, aby bola bezpečná pamäť problémov.

knižnica (raster) library (rgdal) r <- raster (ncols = 100, nrows = 100) r [] <- runif (ncell (r)) r <- stack (r) for (i in 1: 6) {cat ("vrstva", i, " n") r <- addLayer (r, r) r [[i]] <- runif (ncell (r [[i]]))}}

Môžete vytvoriť zväzok rastrov z rastrov na disku pomocou funkcie list.files a zástupného znaku na prečítanie všetkých rastrov v adresári. V tomto prípade objekt "r" bude predstavovať stoh všetkých rastrov vo formáte "C:/mydir".

r <- stack (list.files ("C:/mydir", "tif $"))

Na výpočet štandardnej odchýlky by ste použili prekrytie a na odstránenie hodnôt uzlov mu odovzdali funkciu sd s argumentom na.rm = TRUE.

r.sd <- prekrytie (r, fun = sd, na.rm = TRUE)

Majte na pamäti, že priemer a štandardná odchýlka predpokladajú gaussovské rozdelenie a šikmé rozdelenia už nie sú relevantné momenty. V prípade súboru priestorových údajov sú tieto veľké, šikmé distribúcie „v pixeloch“ možné a v závislosti od údajov by ste mohli tiež spadnúť do pasce „berúc priemer priemeru“. V prípade, že potrebujete vziať priemer odvodeného priemeru (napr. Priemer mesačných zrážok), použili by ste harmonický priemer, a nie aritmetický priemer.

Na distribúciu nezávislú mieru variácie, podobnú štandardnej odchýlke alebo rozptylu, by ste mohli použiť strednú absolútnu odchýlku od mediánu (MAD) a medián pre centrálnu tendenciu. „Šialená“ funkcia v R upraví koeficient na asymptoticky normálnu konzistenciu.

r.mad <- overlay (r, fun = mad, na.rm = TRUE) r.median <- overlay (r, fun = median, na.rm = TRUE) plot (r.mad)

Ak si prečítate pomocníka funkcií, vyvolaného pomocou prekrytia?, Uvidíte, že jedným z argumentov je „názov súboru“. Ak zadáte tento argument, raster sa zapíše na disk. Formát je možné definovať pomocou ďalších argumentov, zadaním formátu, bitového typu atď ... alebo len príponou súboru (jednoduchý spôsob).

r.mad <- prekrytie (r, fun = mad, na.rm = TRUE, názov súboru = "C: /mydir/raster_means.tif")

Tu je niekoľko možností.

  1. Nastavte počítadlo s nulovou hodnotou (NNC). Toto je ďalší obrázok, ktorý obsahuje počet nenulových hodnôt. Potom môžete použiť iba nulový prístup, ale na rozdelenie / štatistiky atď. Použiť raster NNC.
  2. Problém je inherentne priestorový, takže iné nástroje ako Matlab túto úlohu vykonajú ihneď po vybalení.
  3. V skutočnosti to môžete urobiť aj v gdalcalc.py pomocou metódy NNC.

UPRAVIŤ. Najprv teda vytvorte binárne rastre. V ArcGIS (na všetky vaše rastre by som použil model, v skutočnosti by som použil GDAL ...) zmeňte všetky hodnoty na 1 a všetky uzly na 0. Pozri obrázok nižšie, zmeňte poslednú hodnotu („inputraster“ na 1 v Potom môžete jednoducho urobiť dávky súčtov v štatistike buniek (alebo jednoducho použiť gdal_calc) a konečnou hodnotou v každej bunke bude celkový počet hodnôt, ktoré nie sú nenulové.


Čo by ste mohli urobiť s výstupom z programu Spirits, je previesť hodnoty 0 na hodnotu Null, a to buď pomocou funkcie SetNull, alebo orezať raster na raster pomocou Clip (Správa údajov) a v tomto nástroji môžete nastaviť hodnotu null.


Pozri si video: Statistika - průměr, medián, rozptyl, směrodatná odchylka