R untuk Hidrologi (1): hydroTSM

R untuk Hidrologi (1): hydroTSM

19 Apr 2020
hidrologi, statistika
timeseries, hujan, plot, grafik

Artikel berikut merupakan terjemahan dari contoh penggunaan paket hydroTSM yang ditulis oleh Mauricio Zambrano-Bigiarini dengan sedikit penyesuaian.

Instalasi paket

Menginstal versi paket stabil terakhir dari CRAN:

install.packages("hydroTSM")

Sebagai alternatif, teman-teman bisa juga menginstal versi yang sedang dikembangkan dari Github:

if (!require(devtools)) install.packages("devtools")
library(devtools)
install_github("hzambran/hydroTSM")

Mengatur lingkungan kerja

Memuat pustaka hydroTSM, yangmana berisi data dan fungsi-fungsi yang akan digunakan dalam analisis ini.

library(hydroTSM)
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## Loading required package: xts

Memuat data hujan harian dari stasiun pengamatan San Martino di Castrozza, Provinsi Trento, Italia. Data sejak 01 Jan 1921 hingga 31 Des 1990.

data(SanMartinoPPts)

Memilih hanya potongan data dengan durasi selama 6 tahun untuk analisis.

x <- window(SanMartinoPPts, start=as.Date("1985-01-01"))

Mengubah/menjumlah nilai hujan harian menjadi bulanan.

( m <- daily2monthly(x, FUN=sum) )
## 1985-01-01 1985-02-01 1985-03-01 1985-04-01 1985-05-01 1985-06-01 1985-07-01 
##      141.2        7.0      140.6       72.0      175.6      131.4       85.4 
## 1985-08-01 1985-09-01 1985-10-01 1985-11-01 1985-12-01 1986-01-01 1986-02-01 
##      159.4       27.2       58.4      101.8       54.8       75.8      131.6 
## 1986-03-01 1986-04-01 1986-05-01 1986-06-01 1986-07-01 1986-08-01 1986-09-01 
##       59.6      237.8      108.2      144.8       81.2      141.0       69.8 
## 1986-10-01 1986-11-01 1986-12-01 1987-01-01 1987-02-01 1987-03-01 1987-04-01 
##       38.2       44.4       20.4       46.8      111.0       45.6       98.4 
## 1987-05-01 1987-06-01 1987-07-01 1987-08-01 1987-09-01 1987-10-01 1987-11-01 
##      212.0      153.8      221.8      175.0       90.6      278.8      164.8 
## 1987-12-01 1988-01-01 1988-02-01 1988-03-01 1988-04-01 1988-05-01 1988-06-01 
##       29.8      118.0       49.8       22.4      100.6      187.4      193.0 
## 1988-07-01 1988-08-01 1988-09-01 1988-10-01 1988-11-01 1988-12-01 1989-01-01 
##      120.4      149.2       61.2      136.4       10.0       59.4        0.0 
## 1989-02-01 1989-03-01 1989-04-01 1989-05-01 1989-06-01 1989-07-01 1989-08-01 
##      152.6       46.2      365.4       77.4      241.6      302.8      114.4 
## 1989-09-01 1989-10-01 1989-11-01 1989-12-01 1990-01-01 1990-02-01 1990-03-01 
##       65.4       12.8      145.0      110.6       51.6       12.4       65.8 
## 1990-04-01 1990-05-01 1990-06-01 1990-07-01 1990-08-01 1990-09-01 1990-10-01 
##      127.0       74.4      175.0      143.8       90.8      106.0      153.0 
## 1990-11-01 1990-12-01 
##      326.6      106.0

Mengekstraksi nilai tanggal dari data harian x.

dates <- time(x)

Banyaknya tahun dalam x (dibutuhkan untuk perhitungan)

( nyears <- yip(from=start(x), to=end(x), out.type="nmbr" ) )
## [1] 6

Analisis data eksplorasi dasar (exploratory data analysis / EDA)

  1. Ringkasan statistika
smry(x)
##               Index         x
## Min.     1985-01-01    0.0000
## 1st Qu.  1986-07-02    0.0000
## Median   1988-01-01    0.0000
## Mean     1988-01-01    3.7470
## 3rd Qu.  1989-07-01    2.6000
## Max.     1990-12-31  122.0000
## IQR            <NA>    2.6000
## sd             <NA>   10.0428
## cv             <NA>    2.6800
## Skewness       <NA>    5.3512
## Kurtosis       <NA>   39.1619
## NA's           <NA>    0.0000
## n              <NA> 2191.0000

Menggunakan fungsi hydroplot, yangmana (secara standar) akan memplot 9 grafik berbeda, yakni: 3 plot seri waktu, 3 boxplot dan 3 histogram yang meringkaas x. Pada contoh ini, hanya plot-plot harian dan bulanan yang akan dihasilkan, dan hanya data yang dimulai pada 01 Jan 1987 yang akan diplot.

hydroplot(x, var.type="Precipitation", main="at San Martino", 
          pfreq = "dm", from="1987-01-01")

  1. Banyaknya hari dengan informasi hujan (termasuk 0, bukan NA) per tahun
dwi(x)
## 1985 1986 1987 1988 1989 1990 
##  365  365  365  366  365  365
  1. Banyaknya hari dengan informasi hujan (termasuk 0, bukan NA) per bulan per tahun
dwi(x, out.unit="mpy")
##      Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
## 1985  31  28  31  30  31  30  31  31  30  31  30  31
## 1986  31  28  31  30  31  30  31  31  30  31  30  31
## 1987  31  28  31  30  31  30  31  31  30  31  30  31
## 1988  31  29  31  30  31  30  31  31  30  31  30  31
## 1989  31  28  31  30  31  30  31  31  30  31  30  31
## 1990  31  28  31  30  31  30  31  31  30  31  30  31
  1. Memplot nilai hujan bulanan tiap tahun, berguna untuk mengidentifikasi bulan-bulan basah/kering.
# kelas data zoo (ts) harian menjadi bulanan
m <- daily2monthly(x, FUN=sum, na.rm=TRUE)
     
# membuat sebuah matrix dengan nilai bulanan per tahun dalam tiap kolom
M <- matrix(m, ncol=12, byrow=TRUE)
colnames(M) <- month.abb
rownames(M) <- unique(format(time(m), "%Y"))
     
# memplot nilai hujan bulanan
require(lattice)
## Loading required package: lattice
print(matrixplot(M, ColorRamp="Precipitation", 
           main="Monthly precipitation at San Martino st., [mm/month]"))

Analisis tahunan

Nilai-nilai hujan tahunan (annual)

daily2annual(x, FUN=sum, na.rm=TRUE)
## 1985-01-01 1986-01-01 1987-01-01 1988-01-01 1989-01-01 1990-01-01 
##     1154.8     1152.8     1628.4     1207.8     1634.2     1432.4

Rata-rata hujan tahunan

Cara yang mudah dipahami:

mean( daily2annual(x, FUN=sum, na.rm=TRUE) )
## [1] 1368.4

Cara lain (lebih berguna untuk analisis aliran, dimana FUN=mean):

Fungsi annualfunction menerapkan FUN dua kali pada x:

( i) pertama, pada seluruh elemen x termasuk ke tahun yang sama, untuk mendapatkan nilai tahunan yang sesuai, dan

  1. kedua, pada seluruh nilai tahunan x yang sebelumnya diperoleh, untuk mendapatkan nilai tahunan tunggal.
annualfunction(x, FUN=sum, na.rm=TRUE) / nyears
##  value 
## 1368.4

Analisis bulanan

Nilai tengah (median) dari hujan bulanan pada station x. Tidak diperlukan, hanya untuk melihat nilai-nilainya melalui boxplot.

monthlyfunction(m, FUN=median, na.rm=TRUE)
##   Jan   Feb   Mar   Apr   May   Jun   Jul   Aug   Sep   Oct   Nov   Dec 
##  63.7  80.4  52.9 113.8 141.9 164.4 132.1 145.1  67.6  97.4 123.4  57.1

Vektor dengan nama bulan yang memiliki format singkatan tiga huruf.

cmonth <- format(time(m), "%b")

Membuat tipe data bulan menjadi factor yang memiliki bobot terurut.

months <- factor(cmonth, levels=unique(cmonth), ordered=TRUE)

Boxplot nilai hujan bulanan

boxplot( coredata(m) ~ months, col="lightblue", main="Monthly Precipitation", 
         ylab="Precipitation, [mm]", xlab="Month")

Analisis musiman

Rata-rata nilai hujan musiman.

seasonalfunction(x, FUN=sum, na.rm=TRUE) / nyears
##      DJF      MAM      JJA      SON 
## 213.1333 369.4000 470.8000 315.0667

Mengekstrak nilai musiman untuk tiap tahun.

( DJF <- dm2seasonal(x, season="DJF", FUN=sum) )
##  1985  1986  1987  1988  1989  1990 
## 148.2 262.2 178.2 197.6 212.0 174.6
( MAM <- dm2seasonal(m, season="MAM", FUN=sum) )
##  1985  1986  1987  1988  1989  1990 
## 388.2 405.6 356.0 310.4 489.0 267.2
( JJA <- dm2seasonal(m, season="JJA", FUN=sum) )
##  1985  1986  1987  1988  1989  1990 
## 376.2 367.0 550.6 462.6 658.8 409.6
( SON <- dm2seasonal(m, season="SON", FUN=sum) )
##  1985  1986  1987  1988  1989  1990 
## 187.4 152.4 534.2 207.6 223.2 585.6

Memplot evolusi waktu dari nilai hujan musiman.

hydroplot(x, pfreq="seasonal", FUN=sum, stype="default")

Beberapa indikasi ekstrim

Langkah yang umum/biasa untuk bagian analisis ini:

Memuat data hujan harian dari stasiun pengamatan San Martino di Castrozza, Provinsi Trento, Italia, dengan data sejak 01 Jan 1921 hingga 31 Des 1990.

data(SanMartinoPPts)

Memilih hanya potongan data dengan durasi selama 3 tahun untuk analisis.

x <- window(SanMartinoPPts, start=as.Date("1988-01-01"))

Memplot seri waktu terpilih:

hydroplot(x,  ptype="ts", pfreq="o", var.unit="mm")

Hari-hari saat hujan lebat (R10mm) - heavy precipitation days

Menghitung dan memplot banyaknya hari dalam suatu periode dimana hujan >10 mm.

( R10mm <- length( x[x>10] ) )
## [1] 127

Hari-hari basah (R95p) - very wet days

  • mengidentifikasi hari-hari hujan (hujan harian >= 1 mm):
wet.index <- which(x >= 1)
  • menghitung persentil ke-95 dari hujan pada hari-hari basah (PRwn95):
( PRwn95 <- quantile(x[wet.index], probs=0.95, na.rm=TRUE) )
##   95% 
## 39.75

Catatan 1: perhitungan ini was dilakukan untuk periode waktu tiga tahun 1988-1990, bukan periode 30 tahun 1961-1990 yang biasa digunakan.

Catatan 2: nilai-nilai yang hilang telah dihapus dari perhitungan.

  • mengidentifikasi hari-hari sangat basah (hujan harian >= PRwn95)
(very.wet.index <- which(x >= PRwn95))
##  [1]   30   92  234  287  422  423  461  550  551  674  676  719  939  950  998
## [16] 1058 1061 1075
  • Menghitung hujan total pada hari-hari sangat basah:
( R95p <- sum(x[very.wet.index]) )
## [1] 1196.4

Catatan 3: perhitungan ini dilakukan untuk periode waktu tiga tahun 1988-1990, bukan periode 30 tahun 1961-1990 yang biasa digunakan.

Hujan total 5 harian

Menghitung total (akumulasi) hujan 5 hari:

x.5max <- rollapply(data=x, width=5, FUN=sum, fill=NA, partial= TRUE, 
                    align="center")

hydroplot(x.5max,  ptype="ts+boxplot", pfreq="o", var.unit="mm")
## [Note: pfreq='o' => ptype has been changed to 'ts']

Nilai tahunan maksimum dari hujan total 5 hari:

(x.5max.annual <- daily2annual(x.5max, FUN=max, na.rm=TRUE))
## 1988-01-01 1989-01-01 1990-01-01 
##      113.2      170.8      237.2

Catatan 1: untuk perhitungan ini, digunakan hari pertengahan. Jika teman-teman ingin hujan total 5 hari diakumulasikan dalam 4 hari sebelum hari sekarang + hujan pada hari sekarang, teman-teman harus melalukan modifikasi.

Catatan 2: untuk dua nilai awal dan dua nilai terakhir, lebar disesuaikan untuk tidak mengikutsertakan nilai yang bukan di dalam seri waktu.

Klimograf

Sejak versi 0.5-0, hydroTSM menyertakan sebuah fungsi untuk memplot klimograf, tidak hanya data hujan/presipitasi tetapi juga data suhu udara seperti:

# memuat seri waktu harian dari hujan, max dan min suhu
data(MaquehueTemuco)

# mengekstrak seri waktu individual dari hujan, max dan min suhu
pcp <- MaquehueTemuco[, 1]
tmx <- MaquehueTemuco[, 2]
tmn <- MaquehueTemuco[, 3]
     
# memplot klimograf
m <- climograph(pcp=pcp, tmx=tmx, tmn=tmn, na.rm=TRUE)

Detail piranti lunak

Tutorial ini dibuat dengan spesifikasi komputer seperti berikut (versi penerjemah):

## [1] "x86_64-pc-linux-gnu (64-bit)"
## [1] "R version 3.6.3 (2020-02-29)"
## [1] "hydroTSM 0.6-0"

Lampiran

Agar mempermudah penggunaan hydroTSM bagi teman-teman yang belum familiar dengan R, penulis menyediakan sekumpulan informasi sebagai panduan untuk teman-teman menggunakan R.

Mengimpor data

  • ?read.table, ?write.table: mengizinkan teman-teman untuk membaca/menulis sebuah berkas (dalam format tabel) dan membuat sebuah data.frame menggunakannya. Fungsi-fungsi lain yang berkaitan adalah ?read.csv, ?write.csv, ?read.csv2, ?write.csv2.
  • foreign: membaca data yang tersimpan dalam beberapa format di luar format R (misalnya: dBase, Minitab, S, SAS, SPSS, Stata, Systat, Weka, …)
  • ?zoo::read.zoo, ?zoo::write.zoo: fungsi-fungsi untuk membaca dan menulis data seri waktu dari/menjadi berkas teks.
  • R Data Import/Export (EN)
  • Beberapa contoh lain (EN)