BFAST分析MODIS時間序列數據

2021-12-17 走天涯徐小洋地理數據科學
BFAST分析MODIS時間序列數據

前面分享了一篇論文,打算復現研究一下,查了查用到的方法,在這裡分享Jan Verbeselt寫的教程。教程原文請大家點擊文末 閱讀原文 跳轉。

經過測試代碼能夠運行通過。由於需要下載MODIS數據,運行時間比較長,我是代碼跑起來之後出去吃了個晚飯才運行完的。

【文獻閱讀】長江流域植被變化監測與潛在驅動力1982-2015基於R的MODIS數據下載和分析

我們使用R語言從Loobos Site下載MODIS數據。在此之前你需要下載安裝R和Rstudio。

安裝和加載MODIS數據分析所需的R包

在加載包之前,需要先安裝R包,使用下面的代碼可以把所需的R包都安好。

# pkgTest is a helper function to load packages and install packages only when they are not installed yet.
pkgTest <- function(x)
{
  if (x %in% rownames(installed.packages()) == FALSE) {
    install.packages(x, dependencies= TRUE)
  }
  library(x, character.only = TRUE)
}
neededPackages <- c("strucchange","zoo", "bfast", "raster", "leaflet", "MODISTools")
for (package in neededPackages){pkgTest(package)}

定義了一個timeser函數用於創建時間序列。

# Function to create time series object
# val_array: data array for one single pixel (length is number of time steps)
# time_array: array with dates at which raster data is recorded (same length as val_array)
timeser <- function(val_array, time_array) {
    z <- zoo(val_array, time_array) # create zoo object
    yr <- as.numeric(format(time(z), "%Y")) # extract the year numbers
    jul <- as.numeric(format(time(z), "%j")) # extract the day numbers (1-365)
    delta <- min(unlist(tapply(jul, yr, diff))) # calculate minimum time difference (days) between observations
    zz <- aggregate(z, yr + (jul - 1) / delta / 23) # aggregate into decimal year timestamps
    (tso <- as.ts(zz)) # convert into timeseries object
    return(tso)
  }

使用MODISTools包下載MODIS數據
# Downloading the NDVI data, starting from 2000-01-01
VI <- mt_subset(product = "MOD13Q1",
                site_id = "nl_gelderland_loobos",
                band = "250m_16_days_NDVI",
                start = "2000-01-01",
                km_lr = 2,
                km_ab = 2,
                site_name = "testsite",
                internal = TRUE,
                progress = FALSE)

# Downloading the pixel reliability data, starting from 2000-01-01
QA <- mt_subset(product = "MOD13Q1",
                site_id = "nl_gelderland_loobos",
                band = "250m_16_days_pixel_reliability",
                start = "2000-01-01",
                km_lr = 2,
                km_ab = 2,
                site_name = "testsite",
                internal = TRUE,
                progress = FALSE)

創建柵格磚(Raster Brick)清洗MODIS數據

使用mt_to_raster函數(MODISTools包中)創建柵格磚。

# convert df to raster
VI_r <- mt_to_raster(df = VI)
QA_r <- mt_to_raster(df = QA)

使用像元可靠性信息清洗MODIS NDVI數據

## clean the data
# create mask on pixel reliability flag set all values <0 or >1 NA
m <- QA_r
m[(QA_r < 0 | QA_r > 1)] <- NA # continue working with QA 0 (good data), and 1 (marginal data)

# apply the mask to the NDVI raster
VI_m <- mask(VI_r, m, maskvalue=NA, updatevalue=NA)

# plot the first image
plot(m,1) # plot mask

plot(VI_m,1) # plot cleaned NDVI raster

使用BFAST監測

下面將數據從柵格中取出,作為一個向量,使用timeser函數生成一個時間序列。

## check VI data at a certain pixel e.g. 1 row, complete left hand site:
## the dimensions of the raster are: 33x33

px <- 78 # pixel number so adjust this number to select the center pixel
tspx <- timeser(as.vector(VI_m[px]),as.Date(names(VI_m), "X%Y.%m.%d")) # convert pixel 1 to a time series
plot(tspx, main = 'NDVI') # NDVI time series cleaned using the "reliability information"

使用bfastmonitor函數,利用trend + harmon模型,order 3作為諧波(季節模型)

bfm1 <- bfastmonitor(tspx, response ~ trend + harmon, order = 3, start = c(2019,1)) # Note: the first observation in 2019 marks the transition from 'history' to 'monitoring'
plot(bfm1)

接下來就是柵格斷點計算:

dates <- as.Date(names(VI_m), "X%Y.%m.%d")

# here we define the function that we will apply across the brick using the calc function:
bfmRaster = function(pixels)
{
    tspx <- timeser(pixels, dates) # create a timeseries of all pixels
    bfm <- bfastmonitor(tspx, response ~ trend + harmon, order = 3, start = c(2019,1)) # run bfast on all pixels
    return(c(bfm$breakpoint, bfm$magnitude)) 
}

# calc function 
bfmR <- calc(VI_m, bfmRaster)
names(bfmR) <- c('time of break', 'magnitude of change')
plot(bfmR) # resulting time and magnitude of change

使用click函數選擇像元,並對像元進行BFAST分析:

plot(bfmR,1)
click(VI_m, id=FALSE, xy=FALSE, cell=TRUE, n=1)

plot(bfmR,1)
click(VI_m, id=FALSE, xy=FALSE, cell=TRUE, n=1)

tspx[tspx < 0] <- NA
bfm <- bfastmonitor(tspx, response ~ trend + harmon, order = 3, start = c(2019,1))
plot(bfm)

參考文獻https://verbe039.github.io/BFASTforAEO/https://vip.arizona.edu/documents/MODIS/MODIS_VI_UsersGuide_June_2015_C6.pdfhttps://bfast2.github.io/

相關焦點

  • 基於MODIS的錫林郭勒植被變化監測(附練習數據下載)
    掌握MODIS數據預處理、批處理、基於像元二分法的植被覆蓋度計算以及一元線性回歸分析等內容。1.2實驗數據2. 2000-2012年錫林郭勒盟每年8月MODIS NDVI數據文末有練習數據下載1.3實驗內容1.數據預處理2.植被覆蓋度計算3.植被時間變化分析4
  • 時間序列分析(三):平穩時間序列分析之數據準備
    平穩時間序列是時間序列中一類重要的時間序列,對於該時間序列,有一套非常成熟的平穩序列建模方法,這也是本節中將重點介紹的部分。對於非平穩序列,可以通過差分、提取確定性成分等方法,將轉化成平穩序列,再運用平穩序列建模方法進行建模。在實際操作中,由於樣本數據的匱乏,要根據樣本數據要找到生成樣本的真實隨機過程基本是不太可能的。
  • Modis植被指數說明
    modis標準植被指數包括兩種,網格式的植被指數和帶有統計數據的質量分析(QA)和輸入的反射數據,目前生產了500m和1km兩種解析度的16天間隔數據,以及有限的250m解析度的數據,一個更為粗糙的植被指數氣候模型網格也被建立,但是解析度是為25km的月產品。
  • 時間序列分析入門——數據的類別和不同趨勢
    LIVE #1:  9/24  數據科學讀書會 Book 15 - 時間序列分析 第一講時間序列分析(Time Series Analysis)是數據科學的必備技能之一,無論是數據分析師,商業分析師,還是數據科學家,都需要時間序列分析的知識。
  • 時間序列分析
    Reference:《python數據挖掘分析與實戰》——代碼、數據都來源於這裡,需要可聯繫我ok,開始之前先放個本文小目錄:一.時間序列模型二.時間序列的預處理2.1 平穩性檢驗2.2 純隨機性檢驗【1】.時間序列模型基於菜品歷史銷售數據做好餐飲銷售預測,以便減少菜脫銷,或者避免因備料不夠而導致的生產延誤。
  • 時間序列分析簡介
    Q1:時間序列數據和時間序列分析        時間序列數據是在特定時間內監測或記錄下的有序數據集合.太陽活動、潮汐、股票市場趨勢、疾病傳播等都是時間序列的典型案例。是指將同一統計指標的數值按其發生的時間先後順序排列而成的數列。     時間序列分析的前提是認為這些收集到的數據點在一段時間內的變化可能具有特定的內部結構,比如趨勢季節變化等等。
  • 統計學|時間序列分析
    時間序列分析只是對動態數據建立數學模型,從數量上揭示事物發展變化規律或者從動態的角度刻畫某現象與其他現象之間的內在數量關係。比如,天氣的數據和天氣預報就是典型的時間序列和時間序列分析。2、時間序列的分解時間序列的波動往往呈現一定的特定,通常認為由3種特性組成。
  • Python數據分析實戰:用Pandas 處理時間序列
    ,在數據科學和機器學習的背景下,時間序列分析所包含的內容更加複雜。多元時間序列在表現形式上就是數據包含多列(大於兩列),第一列是時間戳,後面的列都是觀察對象。當時間序列是多元時,很多經典的機器學習模型可以施展拳腳,比如回歸模型,分類模型,這些模型都依賴於多元的特徵。對於我們本文以及後續的分析中,我們不會將時間序列特指為一元時間序列。無論是一元時間序列的分析還是多元時間序列的分析,對於時間相關的預處理格外重要。
  • 時間序列分析方法索引
    此時,可以嘗試使用另一種分析方法,即時間序列分析法。 時間序列分析,不像回歸分析,它是拋開了對事物發展的因果分析,只分析事物的過去和未來的聯繫,即它假定事物的過去趨勢會延伸到未來。 時間序列(Timeseries),指的是按照相等時間間隔的順序而形成的數據序列。
  • 從頭了解時間序列分析
    在接下來的文章中,我們將進行比較寬泛的概述並回答一些問題:什麼是時間序列?什麼時候使用時間序列分析?Python 為時間序列分析提供了哪些選項?那麼,什麼是時間序列?隨著時間的推移,幾乎所有公司都會衡量一些東西——比如銷售額、收入或其他東西。因此,時間序列分析技能是任何數據分析師和科學家的必備技能——即使是初級職位!
  • Python時間序列數據分析--以示例說明
    在閱讀本文之前 ,推薦先閱讀:時間序列預測之--ARIMA模型http://www.cnblogs.com/bradleon/p/6827109.html本文主要分為四個部分:用pandas處理時序數據怎樣檢查時序數據的穩定性怎樣讓時序數據具有穩定性時序數據的預測1.
  • R語言時間序列分析
    鄭連虎,在數學學院取得理學學位的文科生,中國人民大學碩博連讀生在讀,山東大學管理學學士、理學學士個人公眾號
  • 時間序列分析(一)
    本文通過一個例子,講解時間序列,預測男裝銷售額。首先簡單介紹一下什麼是時間序列分析。
  • 課程解析|時間序列分析與預測
    時間序列分析是研究和分析時間序列數據,即在時間上有先後順序的一組或多組數據的方法總稱。大量的經濟學、金融學、營銷學以及管理科學中所常見的數據均為時間序列數據。時間序列分析旨在建立時間序列模型以刻畫數據的內在動態規律,從而對數據的生成機制進行探索和研究,掌握各種數據生成機制所產生數據的特徵。另一方面,基於數據特徵,尋找恰當有效的時間序列模型加以刻畫,通過時間序列分析,可基於過去的觀測對將來做出理性的預測、研究多個序列之間的關係等等。
  • [Memo] 時間序列/多元統計/生存分析/數據挖掘
    下面的內容包含以下幾門課程的若干資料:時間序列分析,多元統計分析,生存分析,數據挖掘。注意:老師課上使用的ppt不能夠提供。主要提供課本、可以參考的習題、其他與本課程相關的資料的下載地址。(均為網絡公開連結)下載可能需要繞牆(比如gen.lib.rus.ec),否則可能無法打開連結/下載成功。
  • R時間序列分析(6)時間序列分解(下)
    季節變化的概念在本質上是有些模稜兩可的:時間變化是否應被視為季節性、趨勢性或殘差,在某種程度上是一個「觀念」問題,要由模型和模型參數的選擇決定。這就為時間序列分解問題帶來了複雜性。1、X11X11方法針對季度和月度時間序列數據進行季節性調整。X11方法由美國人口普查局開發,最早可以追溯到1950年代。
  • 時間序列分析-ARIMA python實現
    時間序列分析是根據系統觀察得到的時間序列數據,通過曲線擬合和參數估計來建立數學模型的理論和方法。
  • 基於python的時間序列分析(excel數據)
    主要問題:文件夾中有大量的excel表格需批量處理;時間序列順序混亂、斷續;
  • 迅速上手的時間序列分析教程
    時間序列是指以固定時間為間隔的、由所觀察的值組成的序列。根據觀測值的不同頻率,可將時間序列分成小時、天、星期、月份、季度和年等時間形式的序列。有時候,你也可以將秒鐘和分鐘作為時間序列的間隔,如每分鐘的點擊次數和訪客數等等。 為什麼我們要對時間序列進行分析呢?因為當你想對一個序列進行預測時,首先要完成分析這個步驟。
  • EXCEL篇—時間序列分析(季節指數法)
    昨天跟大家一起分享了如何用EXCEL進行回歸分析,今天跟大家一起來學習一下如何用EXCEL做時間序列分析。