« 読了:Hardie, Fader & Wisniewski (1998) 消費財トライアル売上予測バトルロイヤル | メイン | 消費者パネルデータの栄枯盛衰 »
2019年10月18日 (金)
Ferrari, P.A., Barbiero, A. (2012) Simulating Ordinal Data. Multivariate Behavioral Research, 47, 566-589.
いま、$m$個の順序変数があって、各変数の周辺分布はわかっている。さらに、任意の2個の変数について、(カテゴリに1,2,...と数字を振って得た)相関係数もわかっている。この周辺分布と相関行列にあわせてデータを生成するにはどうすればいいか、という論文。
なんでそんなの読んでるの?という感じだが、仕事の都合でそういうのが急遽必要になったのである。ああ流されていく人生。
著者らはRのGenOrdパッケージの中の人。
イントロは端折るけど、一般に、欲しい特徴を持つデータ行列をシミュレーションする方法は二つあるそうだ。
- 得られるデータが欲しい特徴を持つようにあらかじめ調整した変数からサンプリングする。
- サンプリングしてから事後的に調整し、欲しい特徴を持たせる。
この論文は前者のアプローチ。
いま、ターゲットである相関行列$\mathbf{R}^{O*}$をつかって、連続変数のデータ行列 $\mathbf{Z} \sim N(\mathbf{0}, \mathbf{R}^{O*})$を生成したとしよう。で、$\mathbf{Z}$の各列について、ターゲットである周辺分布に一致するように離散化したとしよう。ここまでは、まあ、思いつきますね。
ところが、このデータ行列から相関行列$\mathbf{R}^O$を得ると、それはターゲットの$\mathbf{R}^{O*}$からずれてしまう。そりゃまあそうだ。
そこで著者らが提案する手順は以下の通り。
- $\mathbf{R}^{C(0)} = \mathbf{R}^{O*}$を使って$\mathbf{Z}$を生成し、これを離散化して$\mathbf{X}^{(1)}$を得る。
- $\mathbf{X}^{(1)}$の相関行列$\mathbf{R}^{O(1)}$を求める。
- $\mathbf{R}^{C(0)}$の要素$\rho_{ij}^{C(0)}$を次式で更新する。
$\rho_{ij}^{C(t)} = \rho_{ij}^{C(t-1)} f_{ij}(t)$
$f_{ij}(t) = \rho_{ij}^{O*} / \rho_{ij}^{O(t)}$
[ああそうか、出てきた$\mathbf{R}^{O(1)}$が目標より大きい(小さい)箇所について、種である$\mathbf{R}^{C(1)}$の該当箇所をちょっと割り引こう(割り増そう)ってことね] - 得られた$\mathbf{R}^{C(1)}$がもはや相関行列になっていなかったら、一番近い正則行列を探す。[RではMatrix::nearPD()というのがそれらしい。知らなかったあああ]
- $\mathbf{R}^{C(1)}$を使って$\mathbf{Z}$を生成し、これを離散化して$\mathbf{X}^{(2)}$を得る。
- $\mathbf{X}^{(2)}$の相関行列$\mathbf{R}^{O(2)}$を求める。
- また$\mathbf{R}^{C(t)}$を更新して...という処理を繰り返す。$\rho_{ij}^{C(t)} - \rho_{ij}^{O*}$の最大値が閾値(0.001とか)以下になるか、最大回数を超えたらやめる。
- 最後に手に入った$\mathbf{R}^{C(t)}$から$\mathbf{Z}$を生成し、これを離散化して出来上がり。
後半は応用例。この方法でなにかの信頼区間を出すとか、PCAと非線形PCAの性質のちがいをシミュレーションするとか。眠くて読み飛ばした。
...意外に単純な話で拍子抜け。要はほしい相関行列を共分散としてもつMVNからサンプリングして離散化し、その相関行列をみて共分散を修正してまたサンプリングして離散化して、というのを繰り返すわけだ。
論文:データ解析(2018-) - 読了: Ferrari & Barbiero (2012) 指定された周辺分布と相関行列を持つ多変量順序データを生成する方法