Mataの新機能
- Mata ではオブジェクト指向のプログラミングをサポートしました。その場合、クラスは一群の変数、関連する関数、もしくはその両者が単一名で結び付けられたものとなります。クラスは継承を介して別のクラスから誘導されることもあります。変数は public, private, protected, static のいずれかとなります。一方、関数は public, private, protected, static, virtual のいずれかとなります。変数であれ関数であれ、メンバは final となり得ます。クラス、メンバ関数、メンバ変数へのアクセス、メンバ関数へのコールはインタプリートされるわけではなく、完全にコンパイルされます。従ってプログラムをクラス化することで性能にペナルティが生じることはありません。
- 新たな関数群である moptimize()
は ml
で用いられる最適化エンジンを構成します。このため、それらは直接的な形であれ間接的な形であれ、ほとんどすべての
Stata 推定コマンドによって使用されることになります。moptimize()
は新たな因子変数機能をフルサポートしています。
Stata の ml は Mata の moptimize() を用いて実装されていますが、moptimize() 自身は Mata の optimize() によって実装されています。optimize() は f(p) を最大化、あるいは最小化するパラメータ p = (p1, p2, ..., pn) を求めます。moptimize() は p1 = X1b1, p2 = X2b2, ..., pn = Xnbn としたときの係数値 b = (b1, b2, ..., bn) を求めます。 - 新関数群 deriv() はベクトル関数の1階、2階導関数を数値的に計算します。
-
optimize() に対する改良点:
- 制約を伴う optimize() の性能は、評価種別が d0 と v0
の場合とすべての勾配ベースの手法の場合に、より高速なものとなりました。また評価種別が d1 と v1 の場合も、制約付きで nr
(Newton–Raphson) 手法の場合に処理が高速化されました。
- 2次最適化としても知られる Gauss–Newton 最適化が手法 gn としてサポートされました。評価関数はタイプ ‘q’ のものである必要があります。
- optimize() は手法 bhhh, nr, bfgs, dfp (Berndt–Hall–Hall–Hausman, Newton–Raphson, broyden–Fletcher–Goldfarb–Shanno, Davidon–Fletcher–Powell) の間で切替え可能になりました。
- optimize() は、収束値のトレースが求められた場合に、恒等式と収束判定基準の値を表示するようになりました。
- optimize() は次に示す15の初期化関数を新たにサポートしました:
optimize_init_cluster() optimize_init_trace_dots() optimize_init_colstripe() optimize_init_trace_gradient() optimize_init_conv_ignorenrtol() optimize_init_trace_Hessian() optimize_init_conv_warning() optimize_init_trace_params() optimize_init_evaluations() optimize_init_trace_step() optimize_init_gnweightmatrix() optimize_init_trace_tol() optimize_init_iterid() optimize_init_trace_value() optimize_init_negH()
- 制約を伴う optimize() の性能は、評価種別が d0 と v0
の場合とすべての勾配ベースの手法の場合に、より高速なものとなりました。また評価種別が d1 と v1 の場合も、制約付きで nr
(Newton–Raphson) 手法の場合に処理が高速化されました。
- 既存の関数 st_data(), st_view() が強化され、変数を文字列スカラーとしても文字列行ベクトルとしても指定できるようになりました。また文字列スカラーによる指定の場合には、時系列演算子付きの変数(例えば l.gnp)や因子変数(例えば i.rep78)を使用することができます。
- 34の LAPACK (linear Algebra PACKage) 関数が as-is 形式で使用できます。LAPACK は連立方程式の解法、固有値問題、特異値分解に対する主導的なソフトウェアです。Mata の行列関数の多くが LAPACK を使って実装されています。今後、倍精度の LAPACK 関数(実数、複素数)すべてをプログラムからも直接使用できるようにすべく、対応を推進中です。
- 新関数群 eigensystemselect() は選択された固有値に対応する固有ベクトルを計算します。
- 新関数群 geigensystem() は固有ベクトルと固有値を計算します。
- 新関数群 hessenbergd(), ghessenbergd() は(一般化)Hessenberg 分解を計算します。
- 新関数群 schurd(), gschurd() は(一般化)Schur 分解を計算します。
- 新関数 _negate() は行列の符合を反転させます。
- 新関数 Dmatrix(), Kmatrix(), Lmatrix() は、対称行列の関数の導関数を計算する際に用いられる duplication matrix, commutation matrix, elimination matrix を計算します。
- 新関数 sublowertriangle() は対角要素よりも下側に位置する下三角要素を抽出します。
- 新関数 hasmissing() は行列中に欠損値が含まれているかどうかを応答として返します。
- 新関数 strtoname() は Stata の strtoname() 関数と同一の機能を提供します。それは一般的な文字列を変換し、Stata の命名規則に従う文字列を生成します。
- 新関数 abbrev() は Stata の abbrev() 関数と同一の機能を提供します。それは短縮された変数名を応答として返します。
- 新関数 _st_tsrevar() は既存の関数 st_tsrevar() の変種であり、エラーのハンドリングは自分で行う形となります。
- 既存の関数 ghk(), ghkfast() は多変量正規積分を評価する機能を有しますが、構文が改良されました。
- 既存の関数 vec(), vech() は実数行列、複素数行列双方に対して性能が改善されました。
- Mata に13の分布関連関数が加わりました:hypergeometric(), hypergeometricp(); nbinomial(), nbinomialp(), nbinomialtail(); invnbinomial(), invnbinomialtail(); poisson(), poissonp(), poissontail(); invpoisson(), invpoissontail(); binomialp()。
-
Mata
に9種類の乱数発生関数が加わりました:rbeta(), rbinomial(), rchi2(),
rgamma(), rhypergeometric(), rnbinomial(),
rnormal(), rpoisson(), rt()。
また一般的な離散分布を対象とした rdiscrete() もサポートされました。
関数 uniform(), uniformseed() は runiform(), rseed() によって置き換えられました。すべての乱数発生関数は r の文字で始まります。 - 既存の関数 sinh(), cosh(), asinh(), acosh() の演算精度が向上しました。
- 新関数 soundex() は名前に対する soundex コードを応答として返しますが、それは1つの文字に3つの数字が続く形となっています。新関数 soundex_nara() は名前に対する U.S. Census soundex を応答として返します。それも1つの文字に3つの数字が続く形を取りますが、異なるアルゴリズムによって生成されます。
- 既存の関数 J(r, c, val) において val が行列で指定できるようになりました。結果は r*rows(val) × c*cols(val) のような形となります。従来、引数 val は 1 × 1 でなくてはなりませんでした。1 × 1 の場合の振舞いは変化しません。
- 既存の関数 sort(), _sort(), order() は最大500個までの列に基づいて行列の行のソートを行っていましたが、この制限がなくなりました。
- 新関数 asarray() は連想配列の機能を提供します。
- 新関数 hash1() は Jenkins の one-at-a-time hash 機能を提供します。
- Mata のオブジェクトコードライブラリ (.mlib) はデフォルトで1,024個の関数を、最大で2,048個の関数まで格納できるようになりました。デフォルトの変更は mlib create の size() オプションで行えます。従来の最大値は500でした。
- 64-bit 機上での Mata では2GBより大きな行列が扱えます。
-
Stata/MP
を使用した場合、既存の109個の関数で複数コアが利用されるようになります。
acos() factorial() mm() ark() Fden() mmC() asin() floatround() mod() atan2() floor() mofd() atan() Ftail() month() betaden() gammaden() msofhours() binomial() gammap() msofminutes() binomialtail() gammaptail() msofseconds() binormal() halfyear() nbetaden() ceil() hh() nchi2() chi2() hhC() nFden() chi2tail() hofd() nFtail() Cofc() hours() nibeta() cofC() ibeta() normal() Cofd() ibetatail() normalden() cofd() invbinomial() npnchi2() comb() invbinomialtail() qofd() cos() invchi2() quarter() day() invchi2tail() round() dgammapda() invF() seconds() dgammapdada() invFtail() sin() dgammapdadx() invgammap() sqrt() dgammapdx() invgammaptail() ss() dgammapdxdx() invibeta() tan() digamma() invibetatail() tden() dofC() invnchi2() trigamma() dofc() invnFtail() trunc() dofd() invnibeta() ttail() dofh() invnormal() week() dofm() invttail() wofd() dofq() ln() year() dofw() lnfactorial() yh() dofy() lngamma() ym() dow() lnnormal() yq() doy() lnnormalden() yw() exp() mdy() F() minutes()