本文章はStan Development Team. 2015. Stan Modeling Language Users Guide and Reference Manual, Version 2.7.0.の3章: Data Typesの翻訳となります。
訳者は勉強がてら翻訳しようと思っただけで、プログラムの専門家でもデータ解析の専門家でもありません。そのため誤訳・意味の取り違えなどあると思いますが、その際はご指摘いただけると幸いです。4章、5章はやりたいと思っていますが、その先は未定です。また、翻訳ペースも気分しだいです。ご了承ください。
##3.データ型
本章ではStanで変数の宣言や、式の値に使われるデータ型について議論します。変数の型はパラメータの宣言、データの一貫性、関数の呼び出し、変数に値を割り当てる場合のすべてにおいて重要な要素となります。
Stanにおいて、すべての式と変数の宣言は、静的に定められたデータ型と関係しています(すなわちプログラムがコンパイルされた時)。これは動的に文字列に変数を代入し、後からそれらをマトリクスに割り当てることができる、Rのような言語とは大きく異なっています。
式は変数、定数のような基礎要素、もしくは引数に適用される関数やオペレータのような要素から構成されているでしょう。
本章では基本的なデータ型に話題を絞り、それらがどのように宣言、割り当て、使用されるかについて解説します。アレイ、ベクトル、マトリクスなどのコンテナ型の詳細な比較については次章に譲ります。
###3.1. 基本データ型
組み込み型関数やユーザ定義が定義した関数、ローカル変数の引数はいずれも、制約付けられていない基本要素、ベクトル、行列などの、データ配列を意味する基本データ型である必要があります。
####基本要素型
Stanには連続値に対応したrealと、整数に対応したintの2種の基本要素型が用意されています。
####ベクトル、行列型
Stanには列に対応したvector, 行に対応したrow_vector, 行列に対応したmatrix3種の行列型のデータ型が用意されています。
####アレイ型
アレイ引数を宣言することで、任意の型(次項で紹介する制約付き型も含む)をアレイ型とすることができます。以下に具体例を示します。
real x[10];
matrix[3,3] m[6,7];
上記のように記述すると、xは1次元で10個の実数が含まれた値として宣言することになります。mは同様に、3 × 3行列の値を含む、サイズ6 × 7のアレイを宣言したことになります。
###3.2. 制約付きデータ型
ローカル変数以外の変数を宣言する際には、制約をつけても構いません。この際、それぞれの制約付きデータ型は、制約付きの基本データ型と対応しています。
制約は"data", "transformed data", "transformed parameters", "generated quantities"ブロックで宣言された変数のエラーをチェックします。
そのため、制約は、パラメータブロック内で宣言された変数を扱う際に重要になります。ここでは、パラメータブロックで、制約付き変数(宣言された制約を満たすもの)を制約のない変数(実数全体)に変換しています。これは、
"モデルは宣言された制約を満たしているパラメータすべての値に対応 (Non-zero 密度)する必要がある"
という、制約付きデータ型の最も重要な側面を示しています。
もし宣言されたパラメータの制約が対応よりも厳格でない場合、サンプラーやオプティマイザはさまざまな問題を抱えることになるでしょう。例えば、そもそも動かない、初期化の失敗、過剰なMetropolis rejection、分布の裾をサンプリングできないことに起因するサンプリングのバイアスなどが問題として挙げられます。
####上限、下限の設定
以下のようにすべての基本データに制約を宣言できるような構文を使うことで、変数に上限、下限を与えることができます。
int<lower=1> N;
real<upper=0> log_p;
vector<lower=-1,upper=1>[3,3] corr;
####構造化ベクトル
Stanには構造化されたベクトルを扱うためのデータ型が用意されています。昇順で並べた値のベクトルに使われる"ordered"と、昇順に並べた正の値のベクトルについて使われる"positive_ordered"がそれにあたります。
また、合計すると1になる非負の値のベクトルに対するデータ型として"simplex"が、乗じると1になるベクトルに対するデータ型として"unit_vector"が用意されています。
####構造化マトリクス
対称な正定値行列を表すために、"cov_matrix"が、単位行列である対称な正定値行列、すなわち相関行列を表すために、"corr_matrix"が用意されています。
また、コレスキー因子の型も用意されています。"cholesky_factor_cov"が対角成分が正の値の下三角正定値対称行列のコレスキー因子を表すために、"cholesky_factor_corr"た各列の長さが1、対角成分が正の値の下三角行列である、相関行列のコレスキー因子を表すために使うことができます。ファクター、スケーリングが容易なコレスキー因子型を使うことで、すべての相関、共分散マトリクスを計算するよりもはるかに効率よく計算を行うことができます。
###3.3. 代入・引数の受け渡し
####代入
制約付けられたデータ値は、基本型にマッチングする制約付けられていない変数や、基本型にマッチングする制約付けられた変数に割り当てることができます。マッチングに際してはアレイの次元数、基本型が同じであるか、厳密に解釈されます。制約付けは考慮されませんが、基本データ型については考慮されます。
アレイ、ベクトルは、お互いに代入することはできません。同様に、たとえ次元が一致していても、ベクトル、マトリクスは、お互いに代入することはできません。第4章ではベクトル、アレイをどのように使い分けるのが適切かについて、詳細を示します。
####関数の呼び出し
Stanの関数に引数を渡すと、基本型に割り当てられたように動作します。Stanの関数はアレイの次元数を含む、引数の基本データ型にのみ指定されています(アレイの大きさ、制約は含まない)。もちろん、関数はしばしばそれらの動作の一部として制約を確認することがあります。
####参考資料
Stan Development Team. 2015. Stan Modeling Language Users Guide and Reference Manual, Version 2.7.0.
Stan のデータ型についてまとめてみた