OxCal > 解 析 > 解析操作

解 析 解析操作とモデル



確率密度分布の演算

OxCalプログラムには,各種データの尤度確率分布を演算したり解析するためのツールが備わっています。日付情報の変数化の章では,いくつかの演算ツールを紹介してきました。演算ツールの主な目的は,通常のデータ解析と同様に,(尤度関数として表現されている)誤差を持った変数の数学的な演算操作を行うことにあります。基本的なツールをはじめ以下のようなものが挙げられます。

OxCalでは,& | + - * / ( ) などの演算子や数学において一般的な関数(abs, exp, ln, sqrt, sin, cosなど)を使用することができます。下の一覧表では,これらの演算子や同等の機能をもつ関数の利用例をまとめてみました。

OxCal CQLを用いた表現 演算子を使用した場合 制約
Combine("C")
{
 R_Date("A",2000,20);
 C_Date("B",20,30);
};
C = R_Date(2000,20)  & C_Date(20,30);
tc=ta=tb
Sum("C")
{
 R_Date("A",2000,20);
 C_Date("B",20,30);
};
C = R_Date(2000,20)  | C_Date(20,30);
pc(tc) = pa(tc) + pb(tc)
R_Date("A",2000,20);
N("B",20,30);
Shift("C","A","B");
C = R_Date(2000,20)  + N(20,30);
tc=ta+tb
R_Date("A",2000,20);
N("B",20,30);
Difference("C","A","B");
C = R_Date(2000,20)  - N(20,30);
tc=ta-tb
- NA -
C = N(2000,20) * N(2,0.1);
tc=ta*tb
- NA -
C = N(2000,20) / N(2,0.2);
tc=ta/tb
- NA -
C = 1 / N(2,0.2);
tc=1/ta

Combine()関数は,&(アンド)演算子と同義の関数です。この関数は,双方の分布が同時期を示すべき変数である場合に使用します。一覧表には,あるイベントに対する放射性炭素年代が得られ,かつ,測定試料がAD20年あたりのどこかに属することが明らかな場合の使用例を示しています。相互参照からも同様の分布を求めることができます。

  C =  R_Date(2000,20);
  C &= C_Date(20,30);
  

あるいは,

  R_Date("C",2000,20);
  C_Date("=C",20,30);
  

Sum()関数は,|(OR)演算子と同義の関数です。この関数は,各データの分布が同時期を示す変数であろう場合に使用します。したがって,この演算子を明確に同時期と定義できない場合にも使用することがありますが,Sum()関数によって算出された分布は,各データの誤差を全て含んでおり誤ったデータの解釈を引き起こしてしまうことがあります。

全ての機能については以下の例を参照してください。(解析を行った後,[View > Plot parameters]から出力結果をみることができます)

And = N(200,20)  & N(150,30);
Or = N(200,20) | N(150,30);
Plus = N(100,20) + N(150,30);
Minus = N(200,30) - N(20,40);
Times = N(100,20) * N(2,0.1);
Divide = N(300,20) / N(2,0.2);

Maths ↓

The & (AND) operator or Combine() function

This is used to apply more than one probability distribution to the same parameter. The combined probability is just the product the two other distributions:

pc(tc) ∝ pa(tc) pb(tc)
The | (OR) operator or Sum() function

This is used when a parameter might equally well be sampled from either distribution. The combined probability is just the sum of the other distributions:

pc(tc) = pa(tc) + pb(tc)

In the MCMC coding the histogram for the parameter tc contains all samples of parameters ta and tb. The area of the histogram plotted is in proportion to the number of parameters sampled.

The operators + - * /

All of these operate in essentially the same way. In MCMC sampling, the independent parameters ta and tb are sampled according to their probabilities. The dependent parameter tc is then calculated and a histogram created for its distribution. Mathematically the probability distribution for tc are given respectively by:

pc(tc)=∫∫ pa(ta) pb(tb) δ(tc-(ta+tb)) dta dtb
pc(tc)=∫∫ pa(ta) pb(tb) δ(tc-(ta-tb)) dta dtb
pc(tc)=∫∫ pa(ta) pb(tb) δ(tc-(ta*tb)) dta dtb
pc(tc)=∫∫ pa(ta) pb(tb) δ(tc-(ta/tb)) dta dtb

However these can more conveniently be worked out in terms of the following single integrals:

Constraint on tc Integrated against ta Integrated against tb
tc=ta+tb pc(tc) ∝ ∫ pa(ta) pb(tc-ta) dta pc(tc) ∝ ∫ pa(tc-tb) pb(tb) dtb
tc=ta-tb pc(tc) ∝ ∫ pa(ta) pb(ta+tc) dta pc(tc) ∝ ∫ pa(tc+tb) pb(tb) dtb
tc=ta*tb pc(tc) ∝ ∫ pa(ta) pb(tc/ta) (1/ta) dta pc(tc) ∝ ∫ pa(tc/tb) pb(tb) (1/tb) dtb
tc=ta/tb pc(tc) ∝ ∫ pa(ta) pb(ta/tc) (ta/tc2) dta pc(tc) ∝ ∫ pa(tc tb) pb(tb) tb dtb
tc=1/ta pc(tc) ∝ pa(1/tc) (1/tc2)
Functions of a single variable

In general if we have the relationship:

tc=f(ta)

then:

pc(tc)=pa(f-1(tc))/|f'(f-1(tc))|

This is used for all functions such as exp, ln, sqrt, sin, cos ... etc. Note that for MCMC analysis, again the independent parameter ta can be sampled and the dependent parameter tc calculated and a resultant histogram built up for the marginal probability density. In all cases the independent parameter will be assumed to have a uniform prior - this means that in most cases the effective prior for the dependent parameter is not uniform.


制約

OxCalには,直接的なデータ演算に加え,測定試料情報からデータ自体に制約を与えることができます。データに制約を加える方法には,試料の情報によっていくつかあります。例えば,ある測定試料が870ADから1066ADのものであることがすでに明らかであり,その14C年代が1120±27年であった場合です。この場合,二つの尤度をあわせて以下のようにあらわすことができます。

    R_Date(1180,27) & Date(U(870,1066));
    

ただし,実際の研究では,データを制約するための正確な情報が手に入らなかったり,イベントの相対的な関係だけしかわからないような場合が多いと思います。そのような時のために,OxCalでは4つの主な制約方法を用意しています。

ただし,以上の機能の使用方法を見る前に,イベントのグルーピングについて理解する必要があります。イベントグループとはなにかの関係性がある各イベントの集合で,個々のイベントを含んだグループ全体を解析する必要がある場合に使用します。イベントのグループ化を行わない場合は,各イベントが制約によらず完全に独立していることを意味します。この前提下では,ふたつ以上のイベントを持つモデルは,実際より幅の広い年代結果を出力することになります(Steier and Rom 2000を参照してください)。解析モデルにグループ定義がなされていなかったり,制約をかけていない場合,アラートが出るようになっています。

1つのグループに対して,イベントの開始とイベントの終末を定義する必要があります。イベントA, B, C, Dの前にグループ開始イベントSが起こり,これらがグループ終末イベントEの前に起こったとしたときは,以下ののように表すことができます。

    Sequence()
    {
     Boundary("S");
     Phase()
     {
      R_Date("A",3050,25);
      R_Date("B",3010,25);
      R_Date("C",3020,25);
      R_Date("D",3000,25);
     };
     Boundary("E");
    };

Seqence()は,各要素やグループが特定の新旧関係を持つと定義する場合に使用します。短いイベントには,演算子 < or > を使用することもできます。

ここで,ある内部制約を構築したモデルに入れることもできます。たとえば,A < B < C < D のとき,言い換えれば,AはBより古く,BはCより古く,CはDより古いことが明らか場合,以下のよう表すことができます。

    Sequence()
    {
     Boundary("S");
     R_Date("A",3050,25);
     R_Date("B",3010,25);
     R_Date("C",3020,25);
     R_Date("D",3000,25);
     Boundary("E");
    };
    Sequence()
    {
     Boundary("S");
     Sequence()
     {
      R_Date("A",3050,25);
      R_Date("B",3010,25);
      R_Date("C",3020,25);
      R_Date("D",3000,25);
     };
     Boundary("E");
    };
    Sequence()
    {
     Boundary("S");
     R_Date("A",3050,25)
       < R_Date("B",3010,25)
       < R_Date("C",3020,25)
       < R_Date("D",3000,25);
     Boundary("E");
    };

一方,AはBとCより古く,BとCの相対的な年代を知らないが,これらはDよりも古い場合には,以下のようになります。

    Sequence()
    {
     Boundary("S");
     R_Date("A",3050,25);
     Phase()
     {
      R_Date("B",3010,25);
      R_Date("C",3020,25);
     };
     R_Date("D",3000,25);
     Boundary("E");
    };
    Sequence()
    {
     Boundary("S");
     Sequence()
     {
      R_Date("A",3050,25);
      Phase()
      {
       R_Date("B",3010,25);
       R_Date("C",3020,25);
      };
      R_Date("D",3000,25);
     };
     Boundary("E");
    };
    Sequence()
    {
     Boundary("S");
     R_Date("A",3050,25)
       < (R_Date("B",3010,25) | R_Date("C",3020,25))
       < R_Date("D",3000,25);
     Boundary("E");
    };

いま,イベントDをイベントT以後に起こったイベントであると定義してみます。この定義には,After()を使用します。(After()は前バージョンのTPQと同義です)。

    Sequence()
    {
     Boundary("S");
     Sequence()
     {
      R_Date("A",3050,25);
      Phase()
      {
       R_Date("B",3010,25);
       R_Date("C",3020,25);
      };
      After(R_Date("T",3100,30));
      R_Date("D",3000,25);
     };
     Boundary("E");
    };

ベントTはグループを構成するすべての要素にかかっているわけではないことに注意してください。すべての要素に対してイベントTで制約をかけたい場合,以下のように,尤度の定義部とモデルの定義部にコマンドを分けることをおすすめします。

    // parameter and likelihood definitions
    A=R_Date(3050,25);
    B=R_Date(3010,25);
    C=R_Date(3020,25);
    D=R_Date(3000,25);
    T=R_Date(3100,30);
    
    // set up the group
    Boundary("S") < (A|B|C|D|T) < Boundary("E");
    
    // define the internal constraints
    
    A < (B|C) < D;
    T < D;

こように定義の形式は自由ですが,この形式はミスを起こしやすかったり,拡張しにくくなります。Sequence()やPhase()の制約における定義には,<, >や|を併用して使用することができます。

Maths ↓

Each constraint introduces another component in the prior probability function p(t). For example the constraint ta < tb introduces the factor:

H(tb-ta)

where H(x) is the Heaviside function which is zero is x is less than zero, half if x is equal to zero and one if x is greater than zero.

More conveniently we define a function for multiple variables:

pH(ta, tb, tc, ...)

which is one if the arguments are in the correct order:

ta < tb < tc < ...

and zero if they are not (strictly this should be half if they are all equal, though in practice as the numbers are real this has an infinitesimally small probability and is ignored).

In the case of the example above where we have the code:

    A < (B|C) < D;
    T < D;
    

the prior will have a factor:

pH(ta, tb, td) pH(ta, tc, td) pH(tt, td)

Before and After

The two functions Before() and After() are used in Bayesian models to define constraints as described above. In addition, during the calculation phase of the program the functions calculates a cumulative integration of the probability distribution operated on:

After(p(t)) = ∫-∞t p(t') dt'
Before(p(t)) = ∫t p(t') dt'

グループ化

上述した制約と同じくらいに重要なのが,グループ属性の定義です。最小単位のモデルにおいても,最低一組のグループ属性を定義する必要があります。モデルに対してグループ定義を行わない場合,そのモデルを構成する全てのイベントに関連性がなく独立していると定義することになります。このような定義のもとでは,構成する全てのイベントを集合として扱ったり,グループ属性から反映される出力結果を得ることができません。

最もよく使用するグループ属性は,一様分布です。これは,グループの開始から終了までの間で,各イベントは一様に分散していることを意味します(Buck et al. 1992を基としています)。数学的に言えば,このグループに属する各イベントの事前確率がグループの存続期間内で一定であることを意味しています。これについては,前章にて単一層の例をすでに見てきました。

    Sequence()
    {
     Boundary("S");
     Phase()
     {
      R_Date("A",3050,25);
      R_Date("B",3010,25);
      R_Date("C",3020,25);
      R_Date("D",3000,25);
     };
     Boundary("E");
    };

この例から,Boundary()がどのようにグループ属性を定義しているかも確かめることができます。前章での場合では,グループ構成イベントが概値の順番によってどのように制約を受けるかを確認するために構築したモデルでした。

OxCalで使用できるグループ属性は一様分布化した事前確率だけではなく,Boundaryコマンドの組み合わせから以下のような定義を行うことができます。

各Boundaryコマンドで囲まれたグループにはそれぞれ異なった事前分布が定義されます。以下の一覧表には,boundaryコマンドの組み合わせとそれによって定義されるグループ内の事前分布についてまとめました。

Boundary Uniform Boundary
Sigma_Boundary Gaussian Sigma_Boundary
Sigma_Boundary Gaussian rise Boundary
Boundary Gaussian fall Sigma_Boundary
Tau_Boundary Exponential rise Boundary
Boundary Exponential fall Tau_Boundary
Zero_Boundary Linear rise Boundary
Boundary Linear fall Zero_Boundary

具体例として,終末イベントEへ向かってグループの事前確率密度が指数関数的に上昇すると仮定されるイベントグループのモデルを挙げてみました。

    Sequence()
    {
     Tau_Boundary("T");
     Phase()
     {
      R_Date("A",3050,25);
      R_Date("B",3010,25);
      R_Date("C",3020,25);
      R_Date("D",3000,25);
     };
     Boundary("E");
    };
    Tau=(E-T);
    Tau&= U(0,200);

この例にある最後二行は,指数関数分布の時間定数であるタウ変数を定義し,事前確率を0から200年の間を一様にするために付け加えたものです。

すべてのBoundaryコマンドは,グループの境界に対する尤度も出力します。境界年代の尤度分布に対して制約を与える例として,以下のようにBC1300からBC1150年の間に一様分布をはることもできます。

    Boundary("E",Date(U(-1300,-1150)));
    

プロジェクトマネージャーでは,主なグループ属性を定義して自動的にモデル作成する機能があります。これらは[Tools > Models]にあります。

Maths ↓

Single groups

The mathematical formulation of all of these groupings is similar. In all cases we have two boundaries which we will which define the group. These are assumed to be independent parameters ta and tb of the model with uniform priors and subject to the constraint ta < tb. The members of the group ti have priors which are dependent on ta and tb. In all cases the prior for the span of the group tb-ta is uniform.

Type of
ta
Prior for elements of the group
ti
Type of
tb
Boundary pH(ta, ti, tb)/(tb-ta) Boundary
Sigma_Boundary [1/((tb-ta)√(π/2))] exp(-(2 ti-tb-ta)2/(2(tb-ta)2) Sigma_Boundary
Sigma_Boundary [pH(ti, tb)/((tb-ta)√(2 π))] exp(-(ti-tb)2/(2(tb-ta)2) Boundary
Boundary [pH(ta, ti)/((tb-ta)√(2 π))] exp(-(ti-ta)2/(2(tb-ta)2) Sigma_Boundary
Tau_Boundary [pH(ti, tb)/(tb-ta)] exp(-(tb-ti)/(tb-ta)) Boundary
Boundary [pH(ta, ti)/(tb-ta)] exp(-(ti-ta)/(tb-ta)) Tau_Boundary
Zero_Boundary 2 pH(ta, ti, tb) ((ti-ta)/(tb-ta)2) Boundary
Boundary 2 pH(ta, ti, tb) ((tb-ti)/(tb-ta)2) Zero_Boundary

See section on constraints for details of the pH function.

So for example if we have a single phase within two Boundary() elements, the overall prior for this group is given by;

p(t) ∝ pH(ta, tb) Πi pH(ta, ti, tb)/(tb-ta)

which, subject to the constraints, is just proportional to (tb-ta)-n where there are n elements in the group (cf. Buck et al. 1992).

To take another example for an exponentially rising distribution of events (up to some terminating event tb), the overall prior is:

p(t) ∝ pH(ta, tb) Πi [pH(ti, tb)/(tb-ta)] exp(-(tb-ti)/(tb-ta))

Multiple groups and limits

In many models there are multiple groups.

Where one group is nested within another, the outer boundaries of the inner group are treated in exactly the same way as any other elements within the outer group.

Where you have a whole series of boundaries, each group segment, between each pair of boundaries is treated in the same way, as described in the equations above. However, as it is desirable that the prior for the overall span of such a sequence of groups is independent of the number of sub-groups we use the following model.

Let the boundaries be described by parameters ta, tb ... tn such that there are n boundaries in total. As they are in a sequence of some sort we have the constraint that We assume that

ta < tb < ... < tn

We assume that ta and tn are otherwise independent and have uniform priors. The normalised prior for any of the other boundaries t is then just:

pH(ta,t,tn)/(tn-ta)

Overall this gives a factor in the prior (in addition to the constraints) which is:

1/(tn-ta)n-2

This is as recommended by Nicholls and Jones 2001 and is included in the overall prior unless the option UniformSpanPrior is set to off.

In addition, if there are limits on the range of outer boundaries under consideration (because of constraints or simply because the program has to set limits somewhere) this can have an effect on the prior for the span of the overall group. This is because the number of possible combinations of solutions depends on the overall span. To make the prior for the overall span uniform despite these limits the following factor is added to the prior unless the UniformSpanPrior options is set to off:

1/min((ulimn - llima) - (tn - ta),(tn - ta) - (llimn - ulima),ulimn - llimn,ulima - llima)

where llima and ulima are the lower and upper limits on boundary ta. This is a further extension of a similar factor suggested by Nicholls and Jones 2001.


堆積モデル

OxCalは,堆積作用に関連した試料に対して堆積モデルを用意しています。詳細につていは,Bronk Ramsey 2008 を参照してください。

OxCalの堆積モデルは,各イベント間で明確な時間的な間隔が明らかな場合に使用するD_Sequence()から,イベントの発生順序のみが明らかな場合に使用する一般的なSequence()など,多くの事例に対して利用することができます。

ウィグルマッチング

D_Sequence()関数は,14C年代測定された樹木年輪のウィグルマッチングに対して使用され,特殊な方法でデータをまとめます(Bronk Ramsey et al. 2001を参照してください)。D_Sequence使用時にはGap()コマンドを併用し,連続する各要素の時間的な間隔を定義してゆきます。Combine()関数でモデルを作成しても同じ結果を出力することができます。この場合,各要素に設定するGap()コマンドを最終的なイベントに対する時間的間隔を定義しなくてはなりません。以下に,D_SequenceとCombineを用いて同じデータを解析するためのモデルを立ててみました。

  D_Sequence()
  {
   R_Date("A",2023,20);
   Gap(10);
   R_Date("B",1961,20);
   Gap(10);
   R_Date("C",1999,20);
   Gap(10);
   R_Date("D",1966,20);
   Gap(10);
   R_Date("E",1954,20);
   Gap(10);
   R_Date("F",1936,20);
   Gap(10);
   R_Date("G",1948,20);
   Gap(10);
   R_Date("H",1925,20);
  };
  Combine()
  {
   R_Date("A",2023,20);
   Gap(70);
   R_Date("B",1961,20);
   Gap(60);
   R_Date("C",1999,20);
   Gap(50);
   R_Date("D",1966,20);
   Gap(40);
   R_Date("E",1954,20);
   Gap(30);
   R_Date("F",1936,20);
   Gap(20);
   R_Date("G",1948,20);
   Gap(10);
   R_Date("H",1925,20);
  };

上述した二つの例では,各グループ関数(D_Sequence()とcombine()関数)が最終イベントHの確率の分布関数を求めています。

OxCalの前バージョンから継承しているV_Sequence()は,各イベント間の時間的間隔に誤差をつけることができ,D_Sequence()を拡張した関数と考えることができます。各イベントも,新旧関係によって制約を受けます(誤差は0で切り捨てられます)。 現バージョンでは,同様のことが通常のSequence関数の各イベント間にインターバルコマンドを設定することで,応用することができます。以下の二つの例は,同義です。

  V_Sequence()
  {
   Boundary("Start");
   Gap(10,5);
   R_Date("A",2023,20);
   Gap(10,5);
   R_Date("B",1961,20);
   Gap(10,5);
   R_Date("C",1999,20);
   Gap(10,5);
   R_Date("D",1966,20);
   Gap(10,5);
   R_Date("E",1954,20);
   Gap(10,5);
   R_Date("F",1936,20);
   Gap(10,5);
   R_Date("G",1948,20);
   Gap(10,5);
   R_Date("H",1925,20);
   Gap(10,5);
   Boundary("End");
  };
  Sequence()
  {
   Boundary("Start");
   Interval(N(10,5));
   R_Date("A",2023,20);
   Interval(N(10,5));
   R_Date("B",1961,20);
   Interval(N(10,5));
   R_Date("C",1999,20);
   Interval(N(10,5));
   R_Date("D",1966,20);
   Interval(N(10,5));
   R_Date("E",1954,20);
   Interval(N(10,5));
   R_Date("F",1936,20);
   Interval(N(10,5));
   R_Date("G",1948,20);
   Interval(N(10,5));
   R_Date("H",1925,20);
   Interval(N(10,5));
   Boundary("End");
  };

後者の例は,どのような事前確率でも時間的な間隔として使用することができるために非常にパワフルな利用方法といえます。

一定堆積型モデル

試料の持つ情報が時間的な間隔と直接関連している場合は多くありません。時間的な間隔以外の堆積情報として,採取試料の堆積深度あります。試料の深さ情報も,各試料間の時間的な間隔をあらわしています。D_Sequenceの場合では,各イベント間の時間的な間隔を正確に定義しました(例として年輪試料)。各試料間の時間的な間隔が未知であるかわりに,各イベントが時間に対して一定の割合で堆積していることを知っているとします。言い換えれば,堆積速度が一定であることを仮定し,年代測定した各イベントの深度が明らかな場合を言います。このような試料には,U_Sequence()関数を使うことができ,以下の例に示したようにそれぞれのイベントに深度を割り当てています。

  U_Sequence()
  {
   Boundary();
   R_Date("A",2023,20){ z=70; };
   R_Date("B",1961,20){ z=60; };
   R_Date("C",1999,20){ z=50; };
   R_Date("D",1966,20){ z=40; };
   R_Date("E",1954,20){ z=30; };
   R_Date("F",1936,20){ z=20; };
   R_Date("G",1948,20){ z=10; };
   R_Date("H",1925,20){ z=0;  };
   Boundary();
  };

深度に対する年代値を参照する場合は,年代-深度モデルを見てください。

定位置堆積モデル

もちろん定常的な堆積速度を持つモデルも一般的にはあまりありません。年代測定された堆積イベントが(Sequenceで得られるような)想定される順番で堆積したものなのかもわかりません。堆積速度の変化を考慮する必要があります。このような場合には,あらかじめ堆積物に対して単位深度を設けてSequenceを使用してゆきます。単位深度を細かくしてゆくと,一定堆積速度モデルに近似していきます。ただし,このアプローチの仕方だと,例えば1mの堆積物試料に対して単位深度を1mmに設定した時には1000個のイベントが必要になりモデルが非常に煩雑になってしまう側面がありますが,OxCalはこれをエミュレートする機能があります。それはP_Sequence関数です。P_Sequenceは,単位深度を独立変数(k)として設けています。一般的な堆積物への応用を考慮し,この単位深度は,1mmから1cmの間で設定することができます。年代対深度モデルの作成時には,年代測定したイベントが独立変数kを参照して自動的にデータを内挿します。以下には,cmあたりの深度をもとにした二つの例をあげています。最初のコードは,0.1cm(10 cm-1),二つ目は,1cmを単位深度としています。後者の例からは,(実際には区別が難しいですが)堆積速度の主な変化をもとめることができます。

  P_Sequence(10)
  {
   Boundary();
   R_Date("A1",2023,20){ z=70; };
   R_Date("B1",1961,20){ z=60; };
   R_Date("C1",1999,20){ z=50; };
   R_Date("D1",1966,20){ z=40; };
   R_Date("E1",1954,20){ z=30; };
   R_Date("F1",1936,20){ z=20; };
   R_Date("G1",1948,20){ z=10; };
   R_Date("H1",1925,20){ z=0;  };
   Boundary();
  };
  P_Sequence(1)
  {
   Boundary();
   R_Date("A2",2023,20){ z=70; };
   R_Date("B2",1961,20){ z=60; };
   R_Date("C2",1999,20){ z=50; };
   R_Date("D2",1966,20){ z=40; };
   R_Date("E2",1954,20){ z=30; };
   R_Date("F2",1936,20){ z=20; };
   R_Date("G2",1948,20){ z=10; };
   R_Date("H2",1925,20){ z=0;  };
   Boundary();
  };

原理的には,P_Sequence()でどんなレベルの堆積モデルでも解析することが可能です。kを高く設定すればモデルはU_Sequenceに近似し,低く設定すれば通常のSequenceに近似してゆきます。

内挿

実際に年代測定を行っていない部分における仮想的な年代値をシミュレートすることは堆積モデルを議論する上で非常に有用になります。OxCalでは,二つの方法で年代値の内挿ができます。特定の深度に対してDate()コマンドを使用することができます。仮に上に挙げたU_Sequenceの例の中で,深度40の部分にデータがなかった場合,以下のコードを置くことで仮想的な放射性炭素年代を置くことができます。

 Date("D"){ z=40; };
    

OxCalでは,内挿変数の追加を行うことで,一定区間毎に内挿値を自動的に置くこともできます。

内挿変数の単位深度あたりにイベントが内挿されます(P_Sequenceのk と同様)。今,m単位で5cm毎に内挿値を出力したい場合,20を内挿変数として設定することになります。深度がcm単位の場合には,0.2とします。したがって,上述したU_Sequenceの例に対しては,最初のコマンドを書き換える必要があります。

 U_Sequence(0.2)
    

解析結果から年代深度モデルの抽出も非常に簡単です。出力結果の一覧表にあるU_SequenceあるいはP_Sequenceの次の行に出力された表の(≡)アイコンをクリックしてください。追加された年代値を含むすべての深度データをコンマ切りリストとして出力することができます。このファイルは,スプレッドシート形式で,csvフォーマットで保存できます。

堆積過程の概念

以下の図は,基本的な堆積過程に対する堆積モデルを概念的に表しています。

堆積モデルのイメージがシミュレートできます。どこかクリックしてみてください。

D_Sequence Sequence P_Sequence(1) P_Sequence(2) U_Sequence






Key

Sample level

Known age gap

Assumed step size

Maths ↓

The mathematical details for the deposition models are given in Bronk Ramsey 2008 (pre-print available)


照 会

ここまで,モデルに様々な情報を追加するためのコマンドを紹介してきました。一方でOxCalには,モデルの情報を抽出するためにのコマンドも用意されています。

情報の抽出は,新規に関連変数を計算させることでえることができます。例えば,上述した指数関数を用いた例では以下のようなコマンドを使用し,

    Tau=(E-T);
    

イベントEとイベントTの時間的な間隔の差を確率密度分布で表しました。同様のことが,Difference()を用いても求めることができます。

    Difference("Tau","E","T");
    

OxCalには,出力結果に対して情報を問い合わせるためのコマンドが備わっています。

Sumは,確率分布の演算の章で説明したように確率分布の和を直接求めることも可能ですが,照会コマンドとして使用することもできます。Sumに対して独立変数なしで使用する場合は,Sumが属するグループの確率分布の和を返します。特定の順序で並ぶイベントなどの要素の確率密度を求めるOrder()関数についても同様のことがいえます。MCMC_Sample()は,Order()関数と同じような働きをしますが,解析モデルに対して行ったMCMCsampleを選択的に書きだすことができます。この機能を利用して,MCMCを習得することができます。

First(), Last()およびSpan()のコマンドも二通りの使い道があります。各コマンドに対して特定の変数が与えられている場合は関数として働き,変数が与えられていない場合は,各コマンドが属するグループに対する情報を返します。三つのコマンドは共に,事前確率の独立変数を追加することが可能です。例としては以下の通りです。

	First("First in phase",Date(U(AD(1066),AD(1100))));
	

このコマンドは,適用したグループの最初のイベントとしてAD1066年からAD1100年のどこかに該当すると制約をかけたものです。下の例では,ひとつのグループに対して5つの照会コマンドすべてを使用しています。

    Sequence()
    {
     Boundary();
     Phase()
     {
      R_Date("A",2145,25);
      R_Date("B",2235,26);
      R_Date("C",2112,23);
      R_Date("D",2083,23);
      Sum();
      Order();
      First();
      Last();
      Span();
     };
     Boundary();
    };

Interval()は,堆積物に対して各イベントやイベントの属する各グループの時間的な間隔を出力します。事前確率も,上述した堆積モデルの例で紹介したように利用できます。

前のバージョンから継承しているDifference()とShift()は, 二つの変数間あるいは,ある変数に対して追加された変数との差を確率密度分布で出力します。確率密度分布の演算を参照ください。

Correlation()関数は,以下の例のように,相互比較されたデータを展開されたみつける一つに対してひとつの分布をプロットします。以下の様に,

  P_Sequence(1)
  {
   Boundary();
   R_Date("A",2023,20){ z=70; };
   R_Date("B",1961,20){ z=60; };
   R_Date("C",1999,20){ z=50; };
   R_Date("D",1966,20){ z=40; };
   R_Date("E",1954,20){ z=30; };
   R_Date("F",1936,20){ z=20; };
   R_Date("G",1948,20){ z=10; };
   R_Date("H",1925,20){ z=0;  };
   Boundary();
   Correlation("Correl","D","E");
  };

Outlier()コマンドは,異常値として要素にタグ付けしたりデータをモデルの外にはずしたりすることができます。同様にプログラムは,試料が連続野中の特定の場所で確率を計算するでしょう。以下のサンプルコードは,使用される系統的を見せます。

    Sequence()
    {
     Boundary("S");
     Phase()
     {
      R_Date("A",3050,25);
      R_Date("B",3010,25){Outlier();};
      R_Date("C",3020,25);
      R_Date("D",3000,25);
     };
     Boundary("E");
    };

インプットユーティリティを使うことで,Outlier()コマンドを挿入する時またはそれを選択するためにこのように各アイテムは質問されることができるでしょう。より複雑な異常値分析は次の章を参照してください。

Maths ↓

Most of the query commands here simply provide marginal densities for dependent parameters. In the following cases we will assume that the queries are applied to a group of events ta, tb, tc,...:

FunctionDefinition
R=Sum() See Sum() function and | (OR) operator in operations on probability distributions
Order() Uses MCMC to find probability ta<tb, ta<tc... etc.
R=First() tr=min(ta, tb, tc,...)
R=Last() tr=max(ta, tb, tc,...)
R=Span() tr=max(ta, tb, tc,...) - min(ta, tb, tc,...)
The following require specific arguments
Difference("R","A","B") tr=ta-tb
Shift("R","A","B") tr=ta+tb
Correlation("R","A","B") Provides a probability density plot of tb against ta

The Interval() query depends on its place in the sequence. The function returns the difference between the maximum of the preceding elements and the minimum of the elements following the query.

When there are observations pertaining directly to one of the queried parameters, a likelihood distribution p(yr|tr) can be defined. This will be used in calculation of the global posterior.

When an item has the Outlier() function applied, the prior is for that parameter is reduced to the simple uniform prior. Thus:

p(tr|yr) ∝ p(yr|tr) p(tr) ∝ p(yr|tr)

the prior and posterior probability densities are the same. In addition if the parameter would otherwise have been subject to a constraint, the probability of the constraint being true is calculated (during MCMC analysis) and reported (in column P of the output table). In the case of parameters questioned in this way in a Combine() group, or D_Sequence(), the same parameter can be estimated from all of the other information in the model. We will denote all of the information in the model except for yr as y(r). We can then compare the likelihood of these distributions:

Li=p(yr|tr) p(tr|y(r))/(p(yr|tr) p(tr|yr))

This value is presented in column L of the output table.


異常値分析

OxCalに含まれる異常値分析法は,Andres Christen (Christen 1994)による研究によって考案されたものを拡張しており,Bronk Ramsey 2009ですべて説明しています。異常値分析を引き出して使うこの二つのコマンドは,

Outlier_Model()コマンドは,異常モデルを設定し,Outlier()コマンドは,他の測定や個々の14C年代測定へ応用するときに使用します。モデルを設定するために,以下のことを知る必要があります。

OxCalのモデルツールに組み込んだ4つの異常分析モデルの例を挙げてみました。

  Outlier_Model("General",T(5),U(0,4),"t");
  Outlier_Model("SSimple",N(0,2),0,"s");
  Outlier_Model("RSimple",N(0,100),0,"r");
  Outlier_Model("TSimple",N(0,100),0,"t");
  Outlier_Model("RScaled",T(5),U(0,4),"r");
  Outlier_Model("Charcoal",Exp(1,-10,0),U(0,3),"t");
    

これらのすべては,Bronk Ramsey 2009に詳細を示していますが,ここで二つの好例についてコメントしておきます。

異常分析を含めた各サンプルのために,我々は,異常であった測定の事前確率を与えなくてはならなりません。これは異常値コマンドを含んでいます。以下の例は,実際どのように使うかを表しています。

 Plot()
 {
  Outlier_Model("General",T(5),U(0,4),"t");
  Sequence()
  {
   Boundary("");
   Sequence("")
   {
    R_Date(3095,25)
    {
     Outlier(0.05);
    };
    R_Date(3028, 25)
    {
     Outlier(0.05);
    };
    R_Date(2951, 25)
    {
     Outlier(0.05);
    };
    R_Date(2888, 25)
    {
     Outlier(0.05);
    };
    R_Date(3134, 25)
    {
     Outlier(0.05);
    };
    R_Date(2759, 25)
    {
     Outlier(0.05);
    };
    R_Date(2590, 25)
    {
     Outlier(0.05);
    };
   };
   Boundary("");
  };
 };

Maths ↓

The mathematical details for outlier analysis are given in Bronk Ramsey 2009