|
| 1 | +--- |
| 2 | +title: "それほど簡単ではないワークフロー" |
| 3 | +author: "Simon Goring, Socorro Dominguez Vidaña" |
| 4 | +date: "`r Sys.Date()`" |
| 5 | +output: |
| 6 | + html_document: |
| 7 | + code_folding: show |
| 8 | + fig_caption: yes |
| 9 | + keep_md: yes |
| 10 | + self_contained: yes |
| 11 | + theme: readable |
| 12 | + toc: yes |
| 13 | + toc_float: yes |
| 14 | + css: "text.css" |
| 15 | + pdf_document: |
| 16 | + pandoc_args: "-V geometry:vmargin=1in -V geometry:hmargin=1in" |
| 17 | +dev: svg |
| 18 | +highlight: tango |
| 19 | +--- |
| 20 | + |
| 21 | +新しい年表の構築 |
| 22 | + |
| 23 | +この RMarkdown ドキュメントでは、次のプロセスについて説明します。 |
| 24 | + |
| 25 | +1. 単一記録のダウンロード |
| 26 | +2. その記録の年表と関連する時系列管理を調査する |
| 27 | +3. 記録用に新しい年表を作成する |
| 28 | +4. 記録に年表を追加する |
| 29 | +5. デフォルトの暦間の切り替え |
| 30 | + |
| 31 | +このアプローチは単一の記録に焦点を当てていますが、ここで行われる処理の多くは関数を使用して複数の記録に拡張できます。 |
| 32 | + |
| 33 | +## パッケージの読み込み |
| 34 | + |
| 35 | +このワークショップ要素に必要なのは `neotoma2`, `dplyr`, `ggplot2` および `Bchron`の4 つのパッケージだけです。 Neotomaから記録を読み込み、その記録の新しい年表を作成してから、その年表を記録に追加し直します。 |
| 36 | + |
| 37 | +ここではR パッケージ`pacman`を使用して(実際には 5 つのパッケージが必要です)、パッケージを自動的に読み込み、インストールします。 |
| 38 | + |
| 39 | +```{r setup} |
| 40 | +pacman::p_load(neotoma2, dplyr, ggplot2, Bchron) |
| 41 | +``` |
| 42 | + |
| 43 | +## データセットの読み込み |
| 44 | + |
| 45 | +[前回のワークショップ](https://open.neotomadb.org/Current_Workshop/simple_workflow.html)では、`neotoma2`を使用して記録を検索してダウンロードするプロセスを実行しました。興味のある記録が見つかったと仮定すると、戻ってその`datasetid`を使用して1 つの記録を取得できます。この場合、データセットは[Lac Castor](https://data.neotomadb.org/346)のものです。 まずは記録を取得し、`chronologies()`ヘルパー関数を使用して記録に関連付けられた年表を確認しましょう。 |
| 46 | + |
| 47 | +```{r getcastor, message = FALSE, eval = FALSE} |
| 48 | +# We could also search for Lac Castor: |
| 49 | +# castor <- get_sites(sitename = "Lac Castor", datasettype = "pollen") %>% |
| 50 | +# get_downloads() |
| 51 | +# But we know the datasetid so we can directly call get_downloads with the datasetid: |
| 52 | +castor <- get_downloads(346) |
| 53 | +castor_chron <- chronologies(castor) |
| 54 | +castor_chron %>% as.data.frame() |
| 55 | +``` |
| 56 | + |
| 57 | +```{r getcastorShow, eval=TRUE, echo = FALSE} |
| 58 | +castor <- get_downloads(346) |
| 59 | +castor_chron <- chronologies(castor) |
| 60 | +castor_chron %>% as.data.frame() %>% |
| 61 | + DT::datatable(data = ., |
| 62 | + options = list(scrollX = "100%")) |
| 63 | +``` |
| 64 | + |
| 65 | +「Lac Castor」には 4 つの年表がありますが、方法を標準化したいため、それらを使用しないことにしました。[`Bchron`パッケージ](https://cran.r-project.org/web/packages/Bchron/vignettes/Bchron.html)の関数`Bchronology()`を使用して新しいものを構築したいと思います。 |
| 66 | + |
| 67 | +ここで`isdefault`列を指摘する必要があります。Neotomaは、複数の年表を1つの記録にリンクする機会を提供します。これにより、研究者は新しい研究を発表する時に年表を追加できるようになります。たとえば、**Wang *et al.** 年表は、Yue Wangによって出版された一連のベイズ(Bayesian)年表に由来しています([ Wang *et al*., 2019 ](https://doi.org/10.1038/s41597-) 019-0182-7)。各年齢タイプ (放射性炭素年 BP、暦年 BP など)に対して、 日付補間のモデルを定義するデフォルトの暦法があります。デフォルトの年表にも階層があります。デフォルトでは、Neotomaは暦年を使用した年齢モデルを最優先に割り当て、次に校正された放射性炭素年、次に放射性炭素年を割り当てます。 |
| 68 | +`get_table("age types")` の内容を見れば、実際の順序がわかります。 |
| 69 | + |
| 70 | +### `chroncontrols` を引き出す |
| 71 | + |
| 72 | +テンプレートとして年表`24863`を選択します。これは Yue Wang が生成した Baconモデルです。 この記録の新しい年表を生成するには、どの時系列制御ポイントがその記録に使用されたかを確認する必要があります。すべての `chroncontrols` を引き出し、`chronologyid`でフィルターし、深さによって並べ替えます |
| 73 | + |
| 74 | +```{r buildChronControl, message = FALSE, eval = FALSE} |
| 75 | +# Extract the chronological controls used in the original chronology: |
| 76 | +controls <- chroncontrols(castor) %>% |
| 77 | + dplyr::filter(chronologyid == 24863) %>% |
| 78 | + arrange(depth) |
| 79 | +``` |
| 80 | + |
| 81 | +```{r buildChronControlShow, eval = TRUE, message = FALSE, echo = FALSE} |
| 82 | +controls <- chroncontrols(castor) %>% |
| 83 | + dplyr::filter(chronologyid == 24863) %>% |
| 84 | + arrange(depth) |
| 85 | +
|
| 86 | +controls %>% DT::datatable(data = ., |
| 87 | + options = list(scrollX = "100%")) |
| 88 | +``` |
| 89 | + |
| 90 | +他のツールを検討して、`chroncontrol` を管理する方法を決定することができます。たとえば、保存したり、*Excel* や別のスプレッドシート プログラムを使用して編集したりします。新しい行を追加することで、新しい日付を追加できます。この例では、コアの上部でより適切な制約を提供するために既存の年齢を変更するだけです。コアトップを*-55 校正年 BP*に設定し、不確実性を 2 年、厚さを 2cm と仮定します。 |
| 91 | + |
| 92 | +通常、これはあまり変わりません。これを明示的に行うための実際の根拠はありませんが、これは単に説明のためです。 |
| 93 | + |
| 94 | +これらの割り当てを行うには、 `controls`の`data.frame`内のセルを直接変更するだけです。 |
| 95 | + |
| 96 | +```{r modifyControls, message = FALSE, eval=FALSE} |
| 97 | +# Directly assign the values |
| 98 | +controls$chroncontrolage[1] <- -55 |
| 99 | +controls$agelimityounger[1] <- -53 |
| 100 | +controls$agelimitolder[1] <- -57 |
| 101 | +controls$thickness[1] <- 2 |
| 102 | +``` |
| 103 | + |
| 104 | +```{r modifyControlsShow, message = FALSE, eval = TRUE, echo=FALSE} |
| 105 | +controls$chroncontrolage[1] <- -55 |
| 106 | +controls$agelimityounger[1] <- -53 |
| 107 | +controls$agelimitolder[1] <- -57 |
| 108 | +controls$thickness[1] <- 2 |
| 109 | +controls %>% DT::datatable(data = ., |
| 110 | + options = list(scrollX = "100%")) |
| 111 | +``` |
| 112 | + |
| 113 | +### 深さと分析ユニットID`を抽出 |
| 114 | + |
| 115 | +`chroncontrols`テーブルが更新されたら、データセット`samples()`から深さ(`depth`)と分析単位ID(`analysisunitid`)を抽出します。単一の`analysisunit`に複数のデータセットが含まれる可能性があり、それらのデータセットには重複しない深さの順序が含まれる可能性があるため、深さと分析単位IDの両方を取得することが重要です。したがって、サンプル年齢を記録に追加し直す時は、深さが単一のデータセットに固有である可能性があるため、`analysisunitid`を使用して正しい割り当てが提供されていることを確認します。 |
| 116 | + |
| 117 | +```{r predictDepths, message = FALSE, results="hide"} |
| 118 | +# Get a two column data.frame with columns depth and analysisunitid. |
| 119 | +# Sort the table by depth from top to bottom for "Bchronology" |
| 120 | +predictDepths <- samples(castor) %>% |
| 121 | + select(depth, analysisunitid) %>% |
| 122 | + unique() %>% |
| 123 | + arrange(depth) |
| 124 | +
|
| 125 | +# Pass the values from `controls`. We're assuming the difference between |
| 126 | +# chroncontrolage and the agelimityounger is 1 SD. |
| 127 | +# Note that for the parameter 'calCurves' we are using a "normal" |
| 128 | +# distribution for the modern sample (core top) and choosing the |
| 129 | +# IntCal20 curve for the other two radiocarbon dates. |
| 130 | +
|
| 131 | +newChron <- Bchron::Bchronology(ages = controls$chroncontrolage, |
| 132 | + ageSds = abs(controls$agelimityounger - |
| 133 | + controls$chroncontrolage), |
| 134 | + calCurves = c("normal", rep("intcal20", 6)), |
| 135 | + positionThicknesses = controls$thickness, |
| 136 | + positions = controls$depth, |
| 137 | + predictPositions = predictDepths$depth, |
| 138 | + allowOutside = TRUE, |
| 139 | + ids = controls$chroncontrolid) |
| 140 | +
|
| 141 | +# Predict ages at each depth for which we have samples. Returns a matrix. |
| 142 | +newpredictions <- predict(newChron, predictDepths$depth) |
| 143 | +``` |
| 144 | + |
| 145 | +```{r chronologyPlot, fig.cap="Age-depth model for Stará Boleslav, with probability distributions superimposed on the figure at each chronology control depth."} |
| 146 | +plot(newChron) + |
| 147 | + ggplot2::labs( |
| 148 | + xlab = "Age (cal years BP)", |
| 149 | + ylab = "Depth (cm)" |
| 150 | + ) |
| 151 | +``` |
| 152 | + |
| 153 | +### 新しい年表`chronology`と`contact`オブジェクトの作成 |
| 154 | + |
| 155 | +新しい年表を考慮して、それを`sites`オブジェクトに追加して、`samples()`への呼び出しのデフォルトになるようにしたいと思います。新しい年表のメタデータを作成するには、[Neotoma の年表テーブル(chronology table)](https://open.neotomadb.org/dbschema/tables/chronologies.html)のプロパティを使用して、`set_chronology()`を使用します。 |
| 156 | + |
| 157 | +```{r createChronology, message = FALSE} |
| 158 | +# Add information about the people who generated the new chronology: |
| 159 | +creators <- c(set_contact(givennames = "Simon James", |
| 160 | + familyname = "Goring", |
| 161 | + ORCID = "0000-0002-2700-4605"), |
| 162 | + set_contact(givennames = "Socorro", |
| 163 | + familyname = "Dominguez Vidaña", |
| 164 | + ORCID = "0000-0002-7926-4935")) |
| 165 | +
|
| 166 | +# Add information about the chronology: |
| 167 | +newChroncastor <- set_chronology(agemodel = "Bchron model", |
| 168 | + contact = creators, |
| 169 | + isdefault = 1, |
| 170 | + ageboundolder = max(newpredictions), |
| 171 | + ageboundyounger = min(newpredictions), |
| 172 | + dateprepared = lubridate::today(), |
| 173 | + modelagetype = "Calendar years BP", |
| 174 | + chronologyname = "Simon's example chronology", |
| 175 | + chroncontrols = controls) |
| 176 | +
|
| 177 | +
|
| 178 | +newChroncastor$notes <- 'newChron <- Bchron::Bchronology(ages = controls$chroncontrolage, |
| 179 | + ageSds = abs(controls$agelimityounger - |
| 180 | + controls$chroncontrolage), |
| 181 | + calCurves = c("normal", rep("intcal20", 2)), |
| 182 | + positionThicknesses = controls$thickness, |
| 183 | + positions = controls$depth, |
| 184 | + allowOutside = TRUE, |
| 185 | + ids = controls$chroncontrolid, |
| 186 | + predictPositions = predictDepths)' |
| 187 | +``` |
| 188 | + |
| 189 | +### `collectionunit`に年表`chronology` を追加する |
| 190 | + |
| 191 | +年表を作成したら、それをコレクションユニットに適用し直す必要があります。また、コレクションユニットに関連付けられた各データセットのサンプルに予測された日付を追加する必要があります。 |
| 192 | + |
| 193 | +1. `Lac Castor`には、 `castor[[1]]$collunits`でアクセスできるコレクションユニットがあります。 |
| 194 | + |
| 195 | +2. `add_chronology()`関数を使用すると、年表オブジェクトとサンプル年齢の`data.frame()`を受け取ります。 |
| 196 | + |
| 197 | +3. 新しい年表に関連付けられた予測日付は、`collectionunit`の各`samples`オブジェクトに転送される必要があります。 |
| 198 | + |
| 199 | +これはすべて`add_chronology()`関数に関連付けられており、この関数は`collectionunit`を取得して変更し、そして新しく更新された`collectionunit`を返します。 |
| 200 | + |
| 201 | +```{r addChronology, message = FALSE} |
| 202 | +newSampleAges <- data.frame(predictDepths, |
| 203 | + age = colMeans(newpredictions), |
| 204 | + ageolder = colMeans(newpredictions) + |
| 205 | + apply(newpredictions, 2, sd), |
| 206 | + ageyounger = colMeans(newpredictions) - |
| 207 | + apply(newpredictions, 2, sd), |
| 208 | + agetype = "Calendar years") |
| 209 | +
|
| 210 | +castor[[1]]$collunits[[1]] <- add_chronology(castor[[1]]$collunits[[1]], |
| 211 | + newChroncastor, |
| 212 | + newSampleAges) |
| 213 | +``` |
| 214 | + |
| 215 | +これで、更新されたコレクションユニットが完成しました。これが年齢モデル全体にどのような影響を与えるかを見てみましょう。以前の年表から年齢を取得するには、「set_default()」関数を使用してデフォルトの年表を変更し、年齢、深さ、分析単位を抽出します。 |
| 216 | + |
| 217 | + |
| 218 | +```{r getAgesfromChronologies} |
| 219 | +# The new chronology is currently the default chronology. |
| 220 | +newages <- samples(castor) %>% |
| 221 | + select(depth, analysisunitid, age) %>% |
| 222 | + unique() %>% |
| 223 | + arrange(depth) %>% |
| 224 | + mutate(agecat = "new") |
| 225 | +
|
| 226 | +castor[[1]]$collunits[[1]]$chronologies <- set_default(castor[[1]]$collunits[[1]]$chronologies, |
| 227 | + 24863) |
| 228 | +plotforages <- samples(castor) %>% |
| 229 | + select(depth, analysisunitid, age) %>% |
| 230 | + unique() %>% |
| 231 | + arrange(depth) %>% |
| 232 | +
|
| 233 | + mutate(agecat = "old") %>% |
| 234 | + bind_rows(newages) |
| 235 | +
|
| 236 | +``` |
| 237 | + |
| 238 | +そして、違いを視覚的に見ることができます。 |
| 239 | + |
| 240 | +```{r plotAgeDifferences, fig.cap="Differences in age representation between chronologies between existing chronologies and the new Bchron chronology."} |
| 241 | +ggplot(plotforages, aes(x = depth, y = age)) + |
| 242 | + geom_path(aes(color = agecat)) + |
| 243 | + theme_bw() + |
| 244 | + xlab("Depth (cm)") + |
| 245 | + ylab("Calibrated Years BP") |
| 246 | +``` |
| 247 | + |
| 248 | +したがって、新しい年表が記録の年齢モデルに与える影響を確認でき、今後どのモデルを使用するかを選択できます。このアプローチを使用すると、`Bchronology()`でパラメーターを調節したり、`Bacon`やさまざまなパラメーターを使用したりして、単一の記録に対して複数の新しい年表を作成できます。年表(`chronology`)は`R`オブジェクトであるため、将来のセッションで使用するためにオブジェクを保存し、既存の記録に関連付けたり、モデルを再度実行したりできます。 |
| 249 | + |
| 250 | +## まとめ |
| 251 | + |
| 252 | +このノートブックから、次の方法を学びました。 |
| 253 | + |
| 254 | +1. 単一の記録(`get_downloads()`を使用したキャスター レコード)をダウンロードします。 |
| 255 | +2. 記録の年表を調べる(`chronologies()`を使用し、関連する時系列コントロールを使用する(`chroncontrols()`を使用) |
| 256 | +3. 記録の新しい年表の作成(`set_chronology()`を使用) |
| 257 | +4. 記録に年表を追加する(`add_chronology()`を使用) |
| 258 | +5. デフォルトの暦間の切り替え(`set_default()`を使用) |
| 259 | + |
| 260 | +このアプローチは単一の記録に焦点を当てていますが、ここで行われる処理の多くは関数を使用して複数の記録に拡張できます。 |
| 261 | + |
| 262 | +お役に立てば幸いです! |
0 commit comments