GIMMS NDVI數據ENVI裁剪和R語言時間序列處理分析

2021-12-22 走天涯徐小洋地理數據科學
GIMMS NDVI數據R語言時間序列處理分析

拿到的GIMMS NDVI數據是ENVI格式(不是NASA的原始數據),要求做時間序列分析,查看變化情況,那麼該怎麼做呢?

ENVI裁剪數據

R語言裁剪數據效率不高,推薦使用ENVI進行數據的預處理,先把數據按照需要進行一些裁剪,方便後續分析。

在ENVI中,裁剪數據之前需要先劃定感興趣區(Region of Interest, ROI),在這我們先使用ROI工具對研究區範圍進行劃定。ROI可以手動劃定,也可以在ROI工具中導入SHP文件。

新建ROI

在這裡我直接畫了一個矩形,需要注意的是,畫完ROI後,需要接受一下,讓區域顏色變成不透明的,這樣就生成了一個ROI

接受ROI

如下所示,ROI區域變成不透明的顏色後,這個ROI就繪製完成了,這個時候就可以使用裁剪工具(Subset Data from ROIs)進行裁減了。

Subset Data from ROIs,先選擇要裁剪的數據

接下來選擇裁剪範圍,要注意的是,Mask pixels outside of ROI這裡要選擇Yes,否則的話裁剪範圍外還會有像元。然後選擇保存位置,即可完成裁剪。

選擇裁剪範圍R語言讀取ENVI數據

R語言的raster包可以讀取ENVI數據的dat文件,兩種常用的函數,一個是brick,一個是stack

#在這裡說明一下代碼中用到的R包
library(raster)
library(tidyverse)
library(tibble)
library(stringr)
#讀取數據,兩種方法
NDVI_br <- brick("GIMMS_NDVI_CMR_1981_2015.dat")
NDVI_stack <- stack("GIMMS_NDVI_CMR_1981_2015.dat")

讀取後查看數據,發現stack是分層的,每一個層裡面都有獨立的名稱等信息,而brick就像它的名字,好像一個磚塊,更像一個整體。

stack和brick對比

仔細查看一下stack,每一層裡面有單獨的數據,數據中有單獨的名稱。

stack詳情查看層數據文件名R語言時間序列計算計算思路

我採用下面文獻5中提到的方法進行計算:

對15d數據採用平均值方法,計算得到月值數據,月值數據採用最大值合成(Maximum Value Composition,MVC)計算得到1982-2015年年值數據。

具體數據處理流程如下:

幾個要點:

逐圖層計算均值

逐stack layer計算NDVI均值,代碼如下:

avgNDVI <- cellStats(NDVI_stack, mean)  #逐圖層計算均值

計算結果為一個向量(vector),帶有圖層的名稱信息,也就是時間信息,但是我們需要進行一些格式轉換,讓R能夠從名稱中提取出時間。

avgNDVI時間序列轉換

要想把時間信息提出來,我們得弄一個數據框,讓數據框中NDVI值和時間對起來。

avgNDVIdf <- as.data.frame(avgNDVI)   #將計算結果轉數據框
avgNDVIdf <- rownames_to_column(avgNDVIdf, "Date")   #將行名轉為一列
avgNDVIdf$Date <- str_remove(avgNDVIdf$Date, "X")   #去除X
avgNDVIdf$Date2 <- as.Date(avgNDVIdf$Date, format = '%Y.%m.%d')

format內部代碼解釋:

%y:兩位數字表示的年份(00-99),不帶世紀,例如,數值是18,格式%y,表示2018年%m:兩位數字的月份,取值範圍是01-12,或1-12%B:英語月份全名(January、February 、March等)%a:縮寫的星期名(Mon、Tue、Wed、Thur、Fri、Sat、Sun)

運行上述代碼後,我們實現了NDVI和時間的對應,下圖的數據框中:

帶時間序列的數據框月度年度NDVI計算

時間序列生成後,我們要根據時間序列計算每月均值和每年的最大值了。

最開始我只是計算了月度均值和年度最大值,數據框中加上了年份和月份,但是由於最後製圖會出問題,所以後來又調整代碼,將月度和年度調整為了完整的月度和年度的時間序列。

以下是完整的NDVI年度和月度值計算和時間序列生成代碼:

#月均NDVI和年度每月最大NDVI計算
avgNDVIdf$Month <- months(avgNDVIdf$Date2)  #提取月信息
#函數強制轉換月份漢語為數字
numMonth<-function(x) 
  c(一月="01",二月="02",三月="03",四月="04",五月="05",六月="06",七月="07",八月="08",九月="09",十月=10,十一月=11,十二月=12)[tolower(x)]
avgNDVIdf$Month <- numMonth(avgNDVIdf$Month)
avgNDVIdf$Year <- format(avgNDVIdf$Date2, format="%Y")  #提取年份信息
Mon_Mean_NDVI <- aggregate(avgNDVI ~ Month+Year, avgNDVIdf, mean)   #計算月度均值
Mon_Mean_NDVI$Date <- as.Date(paste(Mon_Mean_NDVI$Year, Mon_Mean_NDVI$Month,"15", sep = "-"), format = "%Y-%m-%d")  #月度15號
Year_Max_NDVI <- aggregate(avgNDVI ~ Year, Mon_Mean_NDVI, max)
Year_Max_NDVI$Date <- as.Date(paste(Year_Max_NDVI$Year, "07", "01", sep = "-"), format = "%Y-%m-%d")   #每年7月1日

數據計算結果1修改時間序列代碼後,添加Date列R語言時間序列圖

推薦使用ggplot2進行NDVI時間變化曲線的繪製,代碼示例如下:

p2 <- ggplot(data = Year_Max_NDVI, aes(Date, avgNDVI))+
  labs(x="Year", y="NDVI")+
  theme_bw()+
  geom_smooth()+
  geom_point()
p2

ggplot2繪製時間序列變化R語言柵格動圖

R語言可以使用raster包中的anmimate函數生成動圖,但是我不太清楚如何輸出,我是用Screen to GIF軟體截得屏

animate(NDVI_br)

NDVI時間序列圖參考文獻https://www.neonscience.org/dc-raster-time-series-rhttps://www.neonscience.org/julian-day-conversion-rhttps://www.r-graph-gallery.com/279-plotting-time-series-with-ggplot2.htmlhttps://www.neonscience.org/dc-ndvi-calc-raster-time-series王濤,趙元真,王慧,曹亞楠,彭靜,曹亞楠.基於GIMMS NDVI的青藏高原植被指數時空變化及其氣溫降水響應[J].冰川凍土,2020,42(02):641-652.https://www.cnblogs.com/ljhdo/p/4804113.htmlhttps://www.neonscience.org/dc-convert-date-time-POSIX-rhttps://stackoverflow.com/questions/16652199/compute-monthly-averages-from-daily-data

相關焦點

  • GEEer成長日記五:Sentinel-2計算NDVI並逐月時間序列分析
    前幾期我們介紹了MODIS和LANDSAT8遙感影像的MDVI時間序列,其他數據也與此類似,大家根據實際情況修改即可。
  • ENVI學習總結(十二)——基於改進的 CASA 模型反演 NPP
    月總降水量柵格文件,單位為 mm,由氣象數據插值得到,時間範圍與 NDVI 一致。 月太陽總輻射  柵格文件:單位為 MJ/m2,由氣象數據插值得到,時間範圍與 NDVI 一致。NDVI 時間序列數據:柵格文件,由遙感數據計算得到。可以是一個時間序列,如:12 個月的 NDVI 數據。  植被類型圖:柵格文件,確定各植被類型的空間分布。
  • R語言:時間序列ARIMA模型(三)
    題記:本文是個人的讀書筆記,僅用於學習交流使用,本文將深入研究時間序列技術。
  • 時間序列模型分析——ARIMA 模型和SARMIA模型
    ARIMA模型的基本思想是:將預測對象隨時間推移而形成的數據序列視為一個隨機序列,用一定的數學模型來近似描述這個序列。
  • R(語言)做時間序列(ARIMA)的案例
    如何用R做單變量的時間序列?
  • R語言ARIMA集成模型預測時間序列分析
    p=18493 本文我們使用4個時間序列模型對每周的溫度序列建模。第一個是通過auto.arima獲得的,然後兩個是SARIMA模型,最後一個是Buys-Ballot方法。我們使用以下數據k=620n=nrow(elec)futu=(k+1):ny=electricite$Load[1:k]plot(y,type="l")我們開始對溫度序列進行建模(溫度序列對電力負荷的影響很大)
  • 金融時間序列分析入門
    一、與時間序列分析相關的部分基礎知識/概念1.1 什麼是時間序列簡而言之:對某一個或者一組變量 x(t) 進行觀察測量,將在一系列時刻 t1,t2,⋯,tn 所得到的離散數字組成的序列集合循環波動:是時間序列呈現出得非固定長度的周期性變動。循環波動的周期可能會持續一段時間,但與趨勢不同,它不是朝著單一方向的持續變動,而是漲落相同的交替波動。不規則波動:是時間序列中除去趨勢、季節變動和周期波動之後的隨機波動。不規則波動通常總是夾雜在時間序列中,致使時間序列產生一種波浪形或震蕩式的變動。
  • R時間序列分析-9 : ARIMA(中)
    這種模型隱含著在過去值和當前值之間存在相關性,也就是在所有的滯後值上都有一些不為零的自相關(ACF的拖尾性)。有些時間序列數據,只在較短的滯後表現出相關性,對於這樣的數據,AR模型不會給出簡約的模型形式,這時候選擇MA(q)模型可能是恰當的。
  • R時間序列分析(8)ARIMA(上)
    在上一篇,我們介紹了時間序列統計建模的幾個基本概念:平穩性、自相關和白噪聲。時間序列數據的建模是在平穩性的基礎上進行的。
  • R語言時間序列預測模型:ARIMA vs KNN
    1總述要找到一個合適的模型來預測時間序列數據總是很困難。其中一個原因是,使用時間序列數據的模型往往會暴露出序列相關性。在這篇文章中,我們將比較數據集a101991年至2008年澳大利亞每月的抗糖尿病藥物補貼。
  • Python數據分析之時間序列的處理
    DataFrame處理的數據中經常會看到某一列的數據類型是時間類型或者是字符串但是需要轉成時間類型。
  • 時間序列分析
    、模型識別、參數估計、模型診斷、預測、季節模型、時間序列回歸模型、異方差時間序列模型、譜分析入門、譜估計、門限模型.對所有的思想和方法,都用真實數據集和模擬數據集進行了說明.339參考文獻342時間序列分析 哈密爾頓 Hamilton 中文內容簡介     近幾年間,研究者分析時間序列數據的方式發生了顯著的變化。
  • 時間序列ARMA和ARIMA
    y,針對時間變化而發生的改變,這四種模型的運用對象都是平穩的時間序列。AR,MA,ARMA都是運用於原始數據是平穩的時間序列。ARIMA運用於原始數據差分後是平穩的時間序列。'] = False%matplotlib inline# 讀取數據file_path = r'C:\Users\Administrator.DESKTOP-K4H6096\Desktop\RFM分析1.csv'data = pd.read_csv(file_path, engine='python')#查看數據行列data.shape
  • R語言學習筆記之——數據處理神器data.table
    數據處理在數據分析流程中的地位相信大家都有目共睹,也是每一個數據從業者面臨的最為繁重的工作任務。
  • 幾何變換--圖像裁剪
    這些變換一般用於校正圖像處理引起的空間失真,或者通過將圖像配準到一個預定義的坐標系統中用於規範化該圖像(例如,將一幅航拍圖像配準到一個特定的地圖投影中,或者在立體視覺中對兩幅互相配對的圖像進行整形,使得行與外極限)。與點操作和局部濾波器不同,輸出圖像通常來說並不是來自同一個輸入像素位置。這就意味著需要一些形式的緩存來處理由於幾何形狀改變引起的延遲。
  • 時間序列 ARMA 模型實戰!
    ARMA分析的前提,所以輸入序列必須是平穩的。時間序列的平穩性檢驗主要有三種方法:圖形分析方法:繪製時間序列的折線圖,看曲線是否穩定;看自相關圖中自相關係數是否能很快退化到零。缺點是需要主觀判斷,沒有量化依據。簡單統計方法:根據寬平穩均值、方差不隨時間變化的特性,將序列前後拆分成兩段,分別計算均值、方差,對比看是否差異明顯。假設檢驗方法:當前主流單位根檢驗,檢驗序列中是否存在單位根,若存在,則為非平穩序列,不存在則為平穩序列。
  • 技術貼 | R語言:ggplot繪圖的Y軸截斷和拼接
    ## ggpubr# 1 普通安裝install.packages("ggpubr")# 2 source安裝packageurl = 'https://cran.r-project.org/src/contrib/ggpubr_0.4.0.tar.gz'install.packages(packageurl, repos = NULL, type
  • 時間序列:ARMA 應用指南
    ARMA分析的前提,所以輸入序列必須是平穩的。時間序列的平穩性檢驗主要有三種方法:圖形分析方法:繪製時間序列的折線圖,看曲線是否穩定;看自相關圖中自相關係數是否能很快退化到零。缺點是需要主觀判斷,沒有量化依據。簡單統計方法:根據寬平穩均值、方差不隨時間變化的特性,將序列前後拆分成兩段,分別計算均值、方差,對比看是否差異明顯。假設檢驗方法:當前主流單位根檢驗,檢驗序列中是否存在單位根,若存在,則為非平穩序列,不存在則為平穩序列。
  • 時間序列模型(一)
    時間序列模型時間序列分析與回歸分析時間序列模型是特殊的回歸模型,在選擇模型前,我們需要確定結果與變量之間的關係。回歸分析:訓練得到的是因變量y與自變量x(通常x為一個或多個,且當x為1個時與時間無關)的相關性𝑦=𝑤𝑥+𝑏y=wx+b,然後通過新的自變量x來預測因變量y時間序列分析:訓練得到的是因變量y與時間的相關性(自變量x只能為1個,而且與時間相關)回歸分析:擅長的是多變量與目標結果之間的分析,即便是單一變量,也往往與時間無關時間序列分析:建立在時間變化的基礎上
  • Eviews、Stata、R時間序列計量經濟學操作指南(一)
    VAR模型對於相互聯繫的時間序列變量系統是有效的預測模型,同時,向量自回歸模型也被頻繁地用於分析不同類型的隨機誤差項對系統變量的動態影響。如果變量之間不僅存在滯後影響,而不存在同期影響關係,則適合建立VAR模型,因為VAR模型實際上是把當期關係隱含到了隨機擾動項之中。單位根檢驗是序列的平穩性檢驗,如果不檢驗序列的平穩性直接OLS容易導致偽回歸。