将来予測

fres.HS <- future.vpa(res.pma,
                  multi=1,
                  nyear=50, # 将来予測の年数
                  start.year=2012, # 将来予測の開始年
                  N=100, # 確率的計算の繰り返し回数
                  ABC.year=2013, # ABCを計算する年
                  waa.year=2009:2011, # 生物パラメータの参照年
                  maa.year=2009:2011,
                  M.year=2009:2011,
                  is.plot=TRUE, # 結果をプロットするかどうか
                  seed=1,
                  recfunc=HS.recAR, # 再生産関係の関数
                  # recfuncに対する引数
                  rec.arg=list(a=HS.par$pars$a,b=HS.par$pars$b,rho=HS.par$pars$rho,
                               sd=HS.par$pars$sd,bias.correction=TRUE,
                               resample=TRUE,resid=HS.par$resid))

## さっきと同じ引数を使ってもう一度将来予測をするやり方:do.callを使う
# fres.HS$inputに、将来予測で使った引数が入っているので、それにdo.call(関数、引数)すると同じ計算を再現できる
fres.HS2 <- do.call(future.vpa,fres.HS$input)

# 引数の一部だけを変えて計算する
input.tmp <- fres.HS2$input
input.tmp$multi <- 0.5 # current Fの1/2で漁獲
fres.HS3 <- do.call(future.vpa,input.tmp)

# 結果の比較
plot.futures(list(fres.HS,fres.HS3),legend.text=c("F=Fcurrent","F=0.5Fcurrent"),target="SSB")
plot.futures(list(fres.HS,fres.HS3),legend.text=c("F=Fcurrent","F=0.5Fcurrent"),target="Catch")
plot.futures(list(fres.HS,fres.HS3),legend.text=c("F=Fcurrent","F=0.5Fcurrent"),target="Biomass")

## Frecの例
fres.test <- future.vpa(res.pma,
                  multi=1,
                  nyear=50, # 将来予測の年数
                  start.year=2012, # 将来予測の開始年
                  N=100, # 確率的計算の繰り返し回数
                  ABC.year=2013, # ABCを計算する年
                  waa.year=2009:2011, # 生物パラメータの参照年
                  maa.year=2009:2011,
                  M.year=2009:2011,seed=1,
                  is.plot=TRUE, # 結果をプロットするかどうか
                  Frec=list(stochastic=TRUE,future.year=2023,Blimit=max(colSums(res.pma$ssb)),scenario="blimit",target.probs=50),
                  recfunc=HS.rec, # 再生産関係の関数
                  # recfuncに対する引数
                  rec.arg=list(a=HS.par$pars$a,b=HS.par$pars$b,
                               sd=HS.par$pars$sd,bias.correction=TRUE))

## HSで推定されたパラメータを使って将来予測する(残差リサンプリング)
fres.HS4 <- future.vpa(res.pma,multi=1,nyear=50, start.year=2012,
                       N=1000, ABC.year=2013,is.plot=TRUE, seed=1,
                       waa.year=2009:2011, # 生物パラメータの参照年
                       maa.year=2009:2011,
                       M.year=2009:2011,
                       recfunc=HS.rec, # 再生産関係の関数(HS.rec=Hockey-stick)
                       rec.arg=list(a=HS.par$pars$a,b=HS.par$pars$b,
                                    sd=HS.par$pars$sd,bias.correction=TRUE,
                                    resample=TRUE,resid=HS.par$resid))
plot(fres.HS$vssb[,-1],fres.HS$naa[1,,-1]) # 対数正規分布
plot(fres.HS4$vssb[,-1],fres.HS4$naa[1,,-1]) # 残差リサンプリング
plot.futures(list(fres.HS,fres.HS4))

## BHによる将来予測
fres.BH <- future.vpa(res.pma,multi=1,nyear=50, start.year=2012,
                      N=1000, ABC.year=2013,is.plot=TRUE, seed=1,
                      waa.year=2009:2011, # 生物パラメータの参照年
                      maa.year=2009:2011,
                      M.year=2009:2011,
                      recfunc=BH.rec, # 再生産関係の関数(HS.rec=Hockey-stick)
                      rec.arg=list(a=BH.par$pars$a,b=BH.par$pars$b,
                                   sd=BH.par$pars$sd,bias.correction=TRUE,
                                   resample=TRUE,resid=BH.par$resid))

# 将来予測期間はgeneration timeの20倍
GT <- Generation.Time(res.pma,maa.year=2009:2011, M.year=2009:2011,Plus = 100)

MSY管理基準値の計算(VPAの結果と将来予測の引数を使う)

nyear(将来予測年数)やN(シミュレーション回数),seed(乱数のシード)はこの関数の引数としても設定できる。 nyearで指定した最終年の資源量や漁獲量の平均値を見てB0やMSYが計算される。 最後、数年分の平均値を使いたい場合はeyear=3とかで指定すると、最終年の3年分の平均が参照される。

MSY.HS <- est.MSY(res.pma,fres.HS$input,nyear=20*GT,N=500,PGY=c(0.9,0.6,0.1),B0percent=c(0.3,0.4))

#MSY.HS <- est.MSY(res.pma,fres.HS$input,nyear=20*GT,N=500,PGY=c(0.9,0.95),B0percent=c(0.3,0.4),trace.multi=seq(from=0,to=1,by=0.1))
# 計算時間を短縮するいくつかのオプション
# 通常計算(N=500回で78秒)
#aa0 <- system.time(MSY.HS1 <- est.MSY(res.pma,fres.HS$input,nyear=20*GT,N=1000,PGY=c(0.9,0.6,0.1),B0percent=NULL))
# グリッドサーチ(かえって遅くなる、92秒)
#system.time(a2 <- est.MSY(res.pma,fres.HS$input,nyear=20*GT,N=500,PGY=NULL,B0percent=NULL,optim.method="grid"))
# yield curveを正確に書かない(最初、決定論的な将来予測でグリッドサーチして、そこで推定されたFmsy付近で確率的計算をし、最適化する。BMSYがHS付近にある場合には探索範囲を変えながらoptimを繰り返すので場合によっては遅くなるかも)(29秒)
#system.time(a3 <- est.MSY(res.pma,fres.HS$input,nyear=20*GT,N=500,PGY=NULL,B0percent=NULL,calc.yieldcurve=FALSE))

# BHによるMSY管理基準値を計算する場合:BH関数を使った将来予測の結果を引数に入れる
MSY.BH <- est.MSY(res.pma,fres.BH$input,nyear=20*GT,N=1000,PGY=c(0.9,0.95),B0percent=c(0.3,0.4))

### 岡村さん関数を使った管理基準値の計算
# 岡村さん関数では内部でGTが計算されているのでGTを与える必要はない
MSY.HS2 <- est.MSY2(res.pma,sim0=fres.HS,future.function.name="future.vpa",res1=HS.par,
                    nyear=NULL,N=1000,current.resid=5)

## ABC計算 => ここで出てくるABCはまだ確かめていないので使わない。アルファだけ使う
abc1 <- calc.abc(MSY.HS2,delta.est=FALSE,delta=1)

## パフォーマンス指標のとりだし
MSY.index <- get.perform(MSY.HS$fout.msy,
                         Blimit=HS.par$pars$b, # Blimit的なしきい値を下回る確率を計算するときのしきい値を与える
                         longyear=50, # 十分長いと考えられる年。longyear年の間に何回悪いことが起きるか、という指標を計算するときに使う
                         smallcatch=0.5) # おこってほしくない漁獲量のしきい値。平均に対する割合であたえる(0.5の場合、平均漁獲量の半分よりも漁獲量が少なくなる年数をカウントする)

PGY.index <- sapply(MSY.HS$fout.PGY,get.perform,
                    Blimit=HS.par$pars$b, longyear=50, smallcatch=0.5)
B0percent.index <- sapply(MSY.HS$fout.B0percent,get.perform,
                    Blimit=HS.par$pars$b, longyear=50, smallcatch=0.5)

total.index <- rbind(MSY.index, t(PGY.index),t(B0percent.index)) # パフォーマンス指標まとめ
index.name <- c("catch.mean","biom.mean","short.catch3","short.catch5","short.catch10","catch.safe","ssb.safe","effort","largefish.catch") # 特に注目したいパフォーマンス指標のみとりだす
total.index[index.name] # パフォーマンス指標の出力

プロット

短期的戦略=>Kobe matrix的なものを出力する

kobe2.msy <-get.kobemat(MSY.HS$fout.msy,Btarget=MSY.HS$summary$SSB[1],nyear=15,fmulti=seq(from=0.2,to=0.7,by=0.1),N=1000)
kobe2.B30 <-get.kobemat(MSY.HS$fout.msy,Btarget=MSY.HS$summary$SSB[7],nyear=15,fmulti=seq(from=0.2,to=0.7,by=0.1),N=1000)
kobe2.B40 <-get.kobemat(MSY.HS$fout.msy,Btarget=MSY.HS$summary$SSB[8],nyear=15,fmulti=seq(from=0.2,to=0.7,by=0.1),N=1000)
par(mfrow=c(2,2),mar=c(4,4,2,1))
plot.kobemat(kobe2.msy,title.name="MSY",line=MSY.HS$summary$"Fref/Fcur"[1])
plot.kobemat(kobe2.B30,title.name="B0_30%",line=MSY.HS$summary$"Fref/Fcur"[7])
plot.kobemat(kobe2.B40,title.name="B0_40%",line=MSY.HS$summary$"Fref/Fcur"[8])

## 再生産関係の推定から管理基準値の計算まで一気にやるプログラム。
mout.hs <- SR.est(res.pma,
                  what.est=c(TRUE,TRUE,TRUE), # HS,BH,RIのどれをフィットするか。
                  bref.year=1982:2011, # 生物パラメータを用いる期間(比較的長い期間をとったほうがロバストかも)
                                    #               years=1970:2013, # 観測されたSR関係を用いる期間
                  er.log=TRUE, # 誤差。TRUEで対数正規誤差。残差のサンプリングにはまだ対応していないです。
                  fc.year=2009:2011, # MSY計算のさいに選択率を平均する期間
                  N=50, # stochastic simulationの繰り返し回数。5000以上が推奨値ですが、最初はN=10くらいでエラーが出ないか確認してください
                  seed=1, # 乱数の種。この値を変えると乱数が変わるので結果も変わる
                  PGY=c(0.9,0.95) # PGY管理基準値を計算するかどうか。計算しない場合はNULLを入れる
                  )