SSブログ

R: multispatialCCMをためしてみる [統計]

多地点でとった時系列データから因果関係の推定をおこなうRパッケージ"multispatialCCM"をためしてみました。

文献

  • Multispatial Convergent Cross Mappingの論文
    Clark AT, Ye H, Isbell F, et al. (2015) Spatial convergent cross mapping to detect causal relationships from short time series. Ecology 96:1174–1181. doi: 10.1890/14-1479.1
  • その元になったConvergent Cross Mappingの論文
    Sugihara G, May R, Ye H, et al. (2012) Detecting Causality in Complex Ecosystems. Science (80- ) 338:496–500. doi: 10.1126/science.1227079

まずはマニュアルにある例題をなぞってみます。

library(multispatialCCM)

## テスト用データ生成
ccm_data_out <- make_ccm_data()

データを表示してみます。

> ccm_data_out
$Accm
  [1]         NA 0.43901652 0.79590473 0.45745491 0.83460391 0.45385562 0.84711147 0.46431136 0.85405916
 [10] 0.44028015 0.80988939         NA 0.77394628 0.50868099 0.75072820 0.54043692 0.71517458 0.64343894
 [19] 0.67257285 0.66059170 0.59307618 0.76662347         NA 0.81329423 0.24778903 0.65303490 0.65149461
 [28] 0.77784334 0.42598562 0.82328657 0.17839953 0.55973942 0.79396914         NA 0.61901154 0.76976034
 [37] 0.39202567 0.72334355 0.40143345 0.77342292 0.32859612 0.73835989 0.45910903 0.70411524         NA
 [46] 0.07408985 0.25883116 0.71985429 0.65495765 0.71721333 0.59018707 0.75129321 0.53257335 0.78749496
 [55] 0.58023205         NA 0.52757398 0.90314512 0.16201049 0.45751593 0.89654287 0.14312029 0.42308294
 [64] 0.91370467 0.22389105 0.56685459         NA 0.33905268 0.73830754 0.41803639 0.76309231 0.37411698
 [73] 0.77916190 0.32660413 0.73105269 0.38595567 0.83359802         NA 0.82682676 0.40456035 0.81540750
 [82] 0.41965262 0.81463214 0.39700595 0.83158657 0.43483506 0.86150160 0.39205463         NA 0.80021704
 [91] 0.40485886 0.81042904 0.46213196 0.86347764 0.35071113 0.81890450 0.54824255 0.83420078 0.41293884
[100]         NA 0.50315667 0.82310454 0.38496252 0.80126249 0.52895966 0.80645166 0.48950919 0.77597976
[109] 0.48378555 0.81250842         NA 0.77108294 0.51237159 0.76134275 0.57784527 0.79057760 0.46140948
[118] 0.79948424 0.33500715 0.77095052 0.49105923         NA 0.82556749 0.48095290 0.80857228 0.46419525
[127] 0.82178492 0.47398297 0.79040277 0.47869930 0.79937962 0.48158445         NA 0.67433002 0.58197186
[136] 0.72390650 0.51124741 0.81188930 0.24630789 0.62026584 0.66830317 0.60177587 0.69187134         NA
[145] 0.37106585 0.82783432 0.49098194 0.82730979 0.40712843 0.82023510 0.47244781 0.84475828 0.38969284
[154] 0.80092820         NA 0.73744867 0.47758898 0.83066887 0.29786583 0.74315775 0.52140186 0.83230047
[163] 0.27490998 0.69124363 0.53008126         NA 0.69420245 0.65841239 0.59679112 0.80473088 0.26779278
[172] 0.69992847 0.56164770 0.83440522 0.22971113 0.61302620         NA 0.37020055 0.75735869 0.40216174
[181] 0.82121564 0.29879303 0.67701271 0.58641414 0.68690893 0.54920165 0.76971380         NA 0.73939765
[190] 0.62742746 0.71950126 0.67072640 0.61824435 0.79385562 0.31657031 0.77840676 0.38995558 0.82817371
[199]         NA 0.80341495 0.43547307 0.80058175 0.53485761 0.82555841 0.41682826 0.75587140 0.51089785
[208] 0.79190020 0.48775917         NA 0.76485978 0.52061322 0.78038398 0.50492346 0.77698532 0.53808179
[217] 0.78969978 0.50552758 0.79326317 0.52442889

$Bccm
  [1]        NA 0.8446986 0.4163134 0.8012023 0.4628400 0.8666743 0.4201954 0.8401107 0.4743030 0.8638343
 [11] 0.4250372        NA 0.6395852 0.8506177 0.4704501 0.9225798 0.3048221 0.7453019 0.6493348 0.8405217
 [21] 0.4603383 0.9407567        NA 0.7895522 0.5499925 0.8645317 0.3693855 0.8760876 0.4410223 0.8865948
 [31] 0.3154533 0.7923424 0.6086976        NA 0.2844921 0.8004781 0.6572119 0.8386878 0.4835386 0.9746074
 [41] 0.1883518 0.5610565 0.9273107 0.2513766        NA 0.2772417 0.7131462 0.7033820 0.7564373 0.6534527
 [51] 0.8528067 0.5211974 0.9448948 0.2670747 0.7019178        NA 0.1724594 0.5327164 0.9817420 0.1488442
 [61] 0.4785245 0.9895916 0.1338863 0.4565686 0.9496481 0.1701330        NA 0.2927145 0.7713924 0.6407255
 [71] 0.8854483 0.3396591 0.8798452 0.4131358 0.9329670 0.2030786 0.6421861        NA 0.4577212 0.8555631
 [81] 0.4439446 0.8295234 0.4369317 0.8487085 0.4505406 0.8218474 0.4748893 0.8877870        NA 0.5750282
 [91] 0.8730500 0.3627040 0.8176051 0.5060148 0.9398667 0.3413530 0.7841011 0.5732435 0.9040860        NA
[101] 0.7946518 0.5805083 0.8117651 0.4197869 0.8842215 0.4003038 0.8628444 0.4109841 0.8984029 0.4060367
[111]        NA 0.4571004 0.9530335 0.2699988 0.7499394 0.7316465 0.7551385 0.7632637 0.7740296 0.7036927
[121] 0.7874270        NA 0.4621049 0.8404663 0.4728596 0.8164959 0.4641774 0.8282664 0.4857008 0.8258110
[131] 0.4585424 0.8281014        NA 0.7784526 0.6729299 0.8468216 0.4958559 0.9176932 0.2618412 0.6436158
[141] 0.8161512 0.6084921 0.8690876        NA 0.8794025 0.3844722 0.8630498 0.5102798 0.8466225 0.3586957
[151] 0.8469254 0.5003982 0.8943609 0.3722045        NA 0.8187618 0.5382421 0.8605279 0.3858501 0.8348715
[161] 0.4890104 0.8601642 0.3451875 0.8198689 0.5597063        NA 0.4436194 0.8965343 0.3272831 0.7917398
[171] 0.6072002 0.8710965 0.3708173 0.8347499 0.4110317 0.9051043        NA 0.4965309 0.8951191 0.2703243
[181] 0.7592161 0.7515354 0.7431187 0.7153286 0.7946363 0.6661621 0.8011591        NA 0.4175404 0.8671194
[191] 0.4319680 0.9074746 0.3815152 0.8207540 0.4502697 0.8857891 0.3624559 0.8505024        NA 0.5309351
[201] 0.9428647 0.3199439 0.7978699 0.5593886 0.8892320 0.3759853 0.8605281 0.4745956 0.8922223        NA
[211] 0.3862380 0.7963640 0.4993282 0.8676377 0.3888409 0.8591025 0.4622835 0.8576267 0.3921987 0.8328497

$time_ccm
  [1] NA  1  2  3  4  5  6  7  8  9 10 NA  1  2  3  4  5  6  7  8  9 10 NA  1  2  3  4  5  6  7  8  9 10 NA  1
 [36]  2  3  4  5  6  7  8  9 10 NA  1  2  3  4  5  6  7  8  9 10 NA  1  2  3  4  5  6  7  8  9 10 NA  1  2  3
 [71]  4  5  6  7  8  9 10 NA  1  2  3  4  5  6  7  8  9 10 NA  1  2  3  4  5  6  7  8  9 10 NA  1  2  3  4  5
[106]  6  7  8  9 10 NA  1  2  3  4  5  6  7  8  9 10 NA  1  2  3  4  5  6  7  8  9 10 NA  1  2  3  4  5  6  7
[141]  8  9 10 NA  1  2  3  4  5  6  7  8  9 10 NA  1  2  3  4  5  6  7  8  9 10 NA  1  2  3  4  5  6  7  8  9
[176] 10 NA  1  2  3  4  5  6  7  8  9 10 NA  1  2  3  4  5  6  7  8  9 10 NA  1  2  3  4  5  6  7  8  9 10 NA
[211]  1  2  3  4  5  6  7  8  9 10

NAが、時系列データの地点間の区切りになっています。

データをグラフでみてみます。

plot(Accm ~ time_ccm, data = ccm_data_out, type = "l", col = 2,
     ylim = c(min(c(ccm_data_out$Accm, ccm_data_out$Bccm), na.rm = TRUE),
              max(c(ccm_data_out$Accm, ccm_data_out$Bccm), na.rm = TRUE)),
     las = 1)
lines(Bccm ~ time_ccm, data = ccm_data_out, col = 4)

Rplot001.png

AccmとBccmとをプロットしてみます。1期ずらしたものも表示してみます。

plot(Bccm ~ Accm, data = ccm_data_out, type = "p",
     xlim = c(0, 1), ylim = c(0, 1), las = 1, asp = 1)
plot(Bccm[-1] ~ Accm[-length(Accm)], data = ccm_data_out, type = "p",
     xlim = c(0, 1), ylim = c(0, 1), las = 1, asp = 1,
     xlab = "Accm[t]", ylab = "Bccm[t+1]")
plot(Bccm[-length(Bccm)] ~ Accm[-1], data = ccm_data_out, type = "p",
     xlim = c(0, 1), ylim = c(0, 1), las = 1, asp = 1,
     xlab = "Accm[t+1]", ylab = "Bccm[t]")

Rplot002.png
Rplot003.png
Rplot004.png

これだけみても傾向はあまりはっきりとはしないようです。

ここから解析です。まず、データをデータフレームからとりだしておきます。

Accm <- ccm_data_out$Accm
Bccm <- ccm_data_out$Bccm

最適なembedding dimensionを決定します。論文によると、embedding dimensionとは、LOO CVで予測能力がもっともたかくなるようなtime step数とのことです。

# 最適なEを求める
maxE <- 5 # Maximum E to test
# 出力を格納する行列
Emat <- matrix(nrow = maxE - 1, ncol=2)
colnames(Emat) <- c("A", "B")

for(E in 2:maxE) {
  #Uses defaults of looking forward one prediction step (predstep)
  #And using time lag intervals of one time step (tau)
  Emat[E - 1, "A"] <- SSR_pred_boot(A = Accm, E = E,
                                    predstep = 1, tau = 1)$rho
  Emat[E - 1, "B"] <- SSR_pred_boot(A = Bccm, E = E,
                                    predstep = 1, tau = 1)$rho
}

# グラフをみて、rhoを最大化するEを決める
matplot(2:maxE, Emat, type = "l", col = 1:2, lty = 1:2,
          xlab = "E", ylab = "rho", lwd = 2, las = 1)
legend("bottomleft", c("A", "B"),
       lty = 1:2, col = 1:2, lwd = 2, bty = "n")

Rplot005.png
ということで、Aについては2、Bについては3ということになりました。

E_A <- 2
E_B <- 3

次に、非線形性と確率的ノイズのチェックをします。論文によると、CCMはcoupled nonlinear systemに適用されるのでシステムが完全にランダムなものではないこと、またノイズが大きすぎないことを確認する必要があるとのことです。

signal_A_out <- SSR_check_signal(A = Accm, E = E_A, tau = 1,
                                 predsteplist = 1:10)
signal_B_out <- SSR_check_signal(A = Bccm, E = E_B, tau = 1,
                                 predsteplist = 1:10)

結果です。

> signal_A_out
$predatout
   predstep        rho
1         1 0.41092654
2         2 0.37104873
3         3 0.23067061
4         4 0.18685019
5         5 0.03532828
6         6 0.09244104
7         7 0.18237867
8         8 0.12596805
9         9 0.02908599
10       10 0.49743669

$rho_pre_slope
   Estimate    Pr(>|t|) 
-0.01269674  0.50750092 

$rho_predmaxCI
[1] 0.3849831 0.5953362

> signal_B_out
$predatout
   predstep         rho
1         1  0.55893684
2         2  0.62654258
3         3  0.34631536
4         4  0.26467229
5         5  0.23766947
6         6  0.16090055
7         7  0.13669368
8         8  0.08082902
9         9  0.52535764
10       10 -0.02419999

$rho_pre_slope
   Estimate    Pr(>|t|) 
-0.04693735  0.04188685 

$rho_predmaxCI
[1] -0.1690604  0.1216839

非線形なシステムであれば、predstepの増加に対してrhoが減少するはず(ただし逆はなりたたない)とのことです。一方、完全にランダムなシステムではrhoは一貫してひくい値となるということです。

いよいよ解析実行です。100のブートストラップをおこなっています。

# AがBの原因か?
CCM_boot_A <- CCM_boot(Accm, Bccm, E_A, tau = 1, iterations = 100)
# BがAの原因か?
CCM_boot_B <- CCM_boot(Bccm, Accm, E_B, tau = 1, iterations = 100)

#Test for significant causal signal
#See R function for details
CCM_significance_test <- ccmtest(CCM_boot_A, CCM_boot_B)
> CCM_significance_test
pval_a_cause_b pval_b_cause_a 
           0.2            0.0 

BがAの原因になっているという仮説は有意でしたが、AがBの原因になっているという仮説は有意ではありませんでした。

結果をグラフで表示します。

plotxlimits <- range(c(CCM_boot_A$Lobs, CCM_boot_B$Lobs))

#Plot "A causes B"
plot(CCM_boot_A$Lobs, CCM_boot_A$rho, type = "l", col = 1, lwd = 2,
     xlim = c(plotxlimits[1], plotxlimits[2]), ylim = c(0, 1),
     xlab = "L", ylab = "rho")
#Add +/- 1 standard error
matlines(CCM_boot_A$Lobs,
         cbind(CCM_boot_A$rho - CCM_boot_A$sdevrho,
               CCM_boot_A$rho + CCM_boot_A$sdevrho),
         lty = 3, col = 1)

#Plot "B causes A"
lines(CCM_boot_B$Lobs, CCM_boot_B$rho, type = "l", col = 2, lty = 2, lwd = 2)
#Add +/- 1 standard error
matlines(CCM_boot_B$Lobs,
         cbind(CCM_boot_B$rho - CCM_boot_B$sdevrho,
               CCM_boot_B$rho + CCM_boot_B$sdevrho),
         lty = 3, col = 2)

legend("topleft",
       c("A causes B", "B causes A"),
       lty = c(1, 2), col = c(1, 2), lwd = 2, bty = "n")

Rplot006.png
BがAの原因になっているというモデルの方がrhoの値がたかくなっています。


タグ:R
nice!(1)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

nice! 1

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

Facebook コメント

トラックバック 0