VPAってなんだかご存知ですか?
VPAとはVertual Population Analysisの略称で、海にいる魚の資源量を計算するための方法です。

必要なデータは毎年の年齢別漁獲量だけ。努力量データは使いません(努力量という言葉がわからない人はこちらを参照してください)。

なぜ年齢別の漁獲量がわかるだけで海の中の「見えない」魚の数を数えられるのでしょうか。
その理屈をごくごく簡単に解説したうえで、RでVPAを計算するための自作コードを作成し、魚の数を数えます。

ちなみに北大仕様とは、2012年までの北海道大学水産学部における水産資源学の実験で使われたVPAの計算式をそのまま使っているからです。著名な「資源解析手法教科書」の計算式とはやや異なっている点にご留意ください。教科書のプログラムは別のページを参照してください。

目次

1.どうやって魚の数を数えているのか?
2.RでVPA(北大仕様)

1.どうやって魚の数を数えているのか?

VPAで使用するのは毎年の「年齢別漁獲量」です。
すなわち2000年には1歳の魚が5000尾獲れて、2歳が2000尾、3歳が1000尾獲れました、みたいなデータです。

大事なのは、こういう年齢別漁獲尾数が何年分もあるということです。

2001年にも同様に1歳の魚が5000尾獲れて、2歳が2000尾、3歳が1000尾獲れたとします。

さて、ここで水産資源解析における極めて重要な法則を理解しなければなりません。
法則とは以下の二つです。

1.去年1歳だった魚は今年2歳になっている
2.1歳だった魚は死んで個体数が減ることはありうるが、2歳になるときに個体数が増えることはありえない

1は当然ですね。犬が西むきゃ尾は東ってやつです。
2も、別の地域からの流入がないと仮定すれば、魚が分裂して増えることはない以上、増える魚はすべて0歳魚。ゆえに、1歳の魚が2歳になるときに個体数が増えることは万が一にもありえません。

ということは、以下の関係式が成り立ちます。
尚、自然死亡率とは「人間が何もしていなくても勝手に死ぬ割合」のことです。

2001年の2歳魚の漁獲尾数
= 2000年の1歳の海の中の個体数 × 自然死亡率 - 2001年の2歳魚の海の中の個体数
= 本来だったらこの量だけ海に魚がいるはず - 実際はこれくらいしか海の中にいなかった
= 人間が獲って減らした魚の量

この式を変形すると、こうなります。

2000年の1歳魚の海の中の個体数
= 2001年の2歳魚の海の中の個体数 ÷ 自然死亡率 + 2001年の2歳魚の漁獲尾数 ÷ 自然死亡率

漁獲量も自然死亡率で割っているのは、漁獲された魚も死なないで生き残っていた個体である以上当然の措置ですね。
しかし、実際のところは漁期のちょうど中間で一気に漁獲すると仮定することが多いので、自然死亡率の平方根をとったものになります。

これで、最近年の海の中の魚の個体数と自然死亡率がわかれば、今年の2歳魚の「漁獲量データ」から去年の1歳魚の「海の中の個体数」を計算することができるのがわかると思います。同様にして、年齢別の海の中にいる魚の個体数を順次計算していくことが可能です。

さらに、2年分の海の中の個体数(たとえば2000年の1歳魚の個体数と2001年の2歳魚の個体数)が計算できれば、

総死亡率
= 自然死亡率 × 漁獲による死亡率

と計算できることから、

漁獲による死亡率
=  総死亡率 ÷ 自然死亡率
=(2001年の2歳魚の個体数/2000年の1歳魚の個体数)÷ 自然死亡率

とすることによって、漁獲の影響を計算することも可能です。
実際の計算式は対数を取ってから計算されているのでややわかりづらいですが、基本はとても単純ですね。

実際のところは最近年の魚とか最高齢の魚の個体数をどうやって計算するんだとか、自然死亡率をどうするんだとか難しいことが色々あるんですが、一番の基本概念としては、これくらいで十分でしょう。
詳しい数式などは水産資源解析手法教科書を読まれることをお勧めします。

とりあえず、VPAを使うことによって、海の中の魚の個体数と漁獲の影響力の二つを計算することができるということをご理解ください。

 

2.RでVPA

では、Rを使ってVPAを実装してみましょう。

ここに載せると鬱陶しいくらい長いプログラム(forループを多用しているため遅くて汚いです。すいません)なので、コードはこちらからダウンロードしてください。右クリックして名前を付けてリンク先を保存するとよいです。

サンプルデータはこちらから落としてください。これは管理人の作成したシミュレーションデータであり、実データではありません。

では、VPAのプログラム「VPA_Hokudai.txt」とデータファイル「data.txt」が両方とも同じフォルダに格納されているという前提で話を進めていきます。

まずは、Rを起動した後コンソールのファイル→ディレクトリの変更をして、データや計算プログラムの入ったフォルダを指定してください。そのうえで、以下を実行します。

source("VPA_Hokudai.txt")

data <- read.table("data.txt", header=T)

一行目は計算プログラムを読み込むという指示で、2行目はデータの読み込みです。
source()という関数は最初あまり使わないかもしれませんがなれるととても便利な関数です。ぜひご銘記下さい。

私の作ったVPAという関数には引数として、データ、自然死亡係数、漁獲の影響力の初期パラメータの3つが必要となります。
これらを突っ込めば一瞬で海の中にいる魚の個体数と漁獲の影響力の経年変化を計算することが可能です。Rって便利ですね。
やってみます。

VPA(data, M=0.2, F.first=0.5)

Mが自然死亡係数(自然死亡の大きさ。自然死亡率そのものではない)で、F.firstが漁獲係数(漁獲の影響力。漁獲割合そのものではないので注意)の初期値です。

初期値は名前の通り初期の値なので、データを使って計算しなおした結果を出力してくれるのですが、自然死亡の大きさに関しては入れた値をそのまま使用して計算されてしまいます。Mを変えると結果は結構変わります。これが魚の数を数えることが難しい理由の一つですね。

計算結果は長いのでこちらからダウンロードしてください。