シェルスクリプト課題
問題
このファイルには, 1990 年から 2019 年までの, 北半球の各経度緯度点における 海面更生気圧 (sea level pressure; slp (hPa)) と 700 hPa 圧力面のジオポテンシャル高度 (z700 (m)) の 月平均値が保存されたファイルが含まれている.
このファイルに含まれるデータを用いて, 2 地点 (20W,70N), (165W,50N) の海面更生気圧の差の月平均気候値からの偏差と, 北半球の各経度緯度点における 700 hPa 圧力面のジオポテンシャル高度の月平均気候値からの偏差との 相関係数を求めるシェルスクリプトを作成しなさい. (結果として得られる結果は, 相関係数の経度緯度分布となる.)
必要であれば, 演算のために下に示す ruby スクリプトを用いても良い.
(シェルスクリプト課題としてはスクリプトを作ればよいが, せっかくなので相関係数の空間分布を確認して, その意味を考えてみると良いでしょう.)
注意: W は西経, N は北緯を表す.
用語説明
- 気候値 (climatology)
- 長期間の平均値. 平均期間に決まりはないが, 30 年以上の平均値を表すことが多い (と思う).
- ここでの「月平均気候値」は, 30 年間の 1 月の平均値, 2 月の平均値, ... を表す.
- 気候値からの偏差
- 各値の気候値からのずれ.
- ここでは, 各年, 各月の平均値の月平均気候値からのずれを考えるため, 1990 年 1 月の 1 月気候値からのずれ, 1990 年 2 月の 2 月気候値からのずれ, ... を用いることになる.
- なお, このような気候値からの偏差を anomaly という (日本語では「アノマリ」とカタカナで表記されることもある).
- anomaly には「異常」という意味があるが, 日本語で「異常値」と表現することはない (と思う).
データファイルの説明
<URL:data.tgz> は, tar と gzip で複数のファイルをまとめて圧縮してある. 適切に解凍し, 展開すること. 展開すると data という名前のディレクトリが作られる. このディレクトリには, 下の名前のファイルが含まれている.
- slp_MMM_NNN.txt : 地点 MMM, NNN の海面更生気圧
- z700_MMM_NNN.txt : 地点 MMM, NNN の 700 hPa 圧力面ジオポテンシャル高度
MMM, NNN はそれぞれ経度方向と緯度方向の格子点番号である. 格子点は経度, 緯度ともに 2.5 度間隔で,
- MMM = 000, 001, 002, ... はそれぞれ経度 0 度, 2.5 度, 5 度,
- NNN = 000, 001, 002, ... はそれぞれ緯度 0 度, 2.5 度, 5 度,
に対応する. また, それぞれのファイルには, 下のように値が保存されている.
$ cat ../data/slp_000_000.txt 0 1010.6754150390625 1 1011.0782470703125 2 1010.8497314453125 3 1009.8889770507812 4 1011.52685546875 ...
- 1 カラム目 : 1990 年 1 月からの月 (0, 1, 2, ... が 1990 年 1 月, 2 月, 3 月, ... に対応)
- 2 カラム目 : 物理量 (上の例では経度番号 000, 緯度番号 000 の格子点における海面更生気圧)
データについて
データは, NCEP/NCAR Reanalys (Kalnay et al., 1996) から取得したものを加工して用意した.
参考文献
演算用 ruby スクリプト
シェルスクリプトのみでは, 気候値からの偏差や相関係数を求めることは難しいかもしれない. (正直なところ, 自分にはどうやれば良いかわからない. Fortran を用いれば簡単.) 必要であれば, 下の ruby スクリプトを用いると良い.
なお, 特に記述のない場合は入出力時系列データファイルの形式は, 上に述べた data.tgz 内のファイルと同じである.
- 物理量の気候値からの偏差を計算する ruby スクリプト
使い方 :
$ ruby calc_anom.rb in_file out_file
- in_file : [入力] 時系列データファイル名
- out_file : [出力] 偏差時系列データファイル名
- 二つの物理量の差を計算する ruby スクリプト
使い方 :
$ ruby calc_diff.rb in_file1 in_file2 out_file
- in_file1 : [入力] 時系列データファイル名 1
- in_file2 : [入力] 時系列データファイル名 2
- out_file : [出力] 差 (<in_file2 の値> - <in_file1 の値>) の時系列データ
- 二つの物理量の相関係数を計算する ruby スクリプト
使い方 :
$ ruby calc_corrcoef.rb in_file1 in_file2
- in_file1 : [入力] 時系列データファイル名 1
- in_file2 : [入力] 時系列データファイル名 2
- 標準出力 : 相関係数 (一つの数値)
結果の確認方法
相関係数の空間分布は,
1 カラム : 経度 2 カラム : 緯度 3 カラム : 相関係数
として,
0 0 0.18961137153695992 2.5 0 0.18368970680129787 5.0 0 0.17578998512336388 ... 355.0 0 0.17609242569770553 357.5 0 0.1704328932998691 <= 空行 0 2.5 0.18961137153695992 2.5 2.5 0.18368970680129787 5.0 2.5 0.17578998512336388 ...
(ただし, 緯度が変わるときには空行を入れる) の形式でファイルに保存すれば, gnuplot で描画できる.
または, 下の ruby (GPhys) スクリプトを用いれば, 上の形式のファイルを 読ませることで経度緯度分布の図を描くことができる (海岸線付き).
- 相関係数の空間分布の図を描く ruby スクリプト
使い方 :
$ ruby disp_corrcoef in_file
- in_file : [入力] 空間分布データ
- 注意 : この ruby スクリプトは GPhys を用いています.
おまけ
上に説明してあるように, ここで用意したデータは NCEP/NCAR Reanalys から取得したものであり, 元々は netcdf 形式で提供されている. そして, ここではシェルスクリプトの練習のために, わざわざ netcdf 形式の時空間データを各緯度経度点の時系列データに分割し, テキストデータに変換したものを入力ファイルとして用意している. しかし, データ処理だけを目的にするならばテキスト形式を経る必要はなく, 元々の netcdf ファイルを GPhys と ruby で処理すれば良い.
興味があれば, netcdf データを用いて, GPhys および ruby で相関係数の空間分布を描画してみると良いでしょう.
(それではシェルスクリプトの練習にはならないけれど.)