中古マンション売買データを分析してみた(3.1) - 階層性を考慮したモデルのさらなる精緻化
今更感がだいぶただよう感じのネタではありますが,発表しようと思ってスライドまとめたものの,一向に予定が組まれないので,現状のモデリングがうまくいっていないので,ここで一旦公開しちゃおうというのが今回のエントリの主旨です.
モデルを精緻化するには
遥か前に,暫定版の完成形ということで,以下のようなモデルをMCMCで組みました.
この時点では何も触れてはいないものの,実は薄々このモデルだとしっくりこないことに気がついてはいました.というのは,駅と路線の関係性を記述しない形でモデルに突っ込むべきではないのではないか,ということです.ありていにいうと,駅は路線に所属しているという関係性を,きちっとモデルに組み込むべきなのではないか,ということです.つまりは[物件→駅→路線]という関係性を,階層モデルとして表したいわけですね.
ということで,2段階の階層性をモデルにしてみると,以下のようになります*1.
ということで,今回はこのモデルを実際にMCMCで回してみたいと思います.
モデルの記述とシミュレーション
モデル式
Stanコードは以下のようになります.それほど特筆することもないのですが,前回は並列で並んでいた線形モデル部分の駅,路線のランダム効果項について,駅だけのランダム効果項を入れています.その上で,駅のランダム効果項を,路線のランダム効果で予測する形となっています.
data { int<lower=1> N; # sample num int<lower=1> M; # independents' num int<lower=1> N_T; # train num int<lower=1> N_S; # station num matrix[N, M] X; # independents vector[N] Y; # dependent int<lower=1>, upper=N_T> T[N_S]; # station-train matrix int<lower=1, upper=N_S> S[N]; # station } parameters { real a; vector[M] b; real as; real r_t[N_T]; real r_s[N_S]; real<lower=0> s; real<lower=0> s_rs; real<lower=0> s_rt; } model { # regresion model with random effect for (i in 1:N) Y[i] ~ normal(a+X[i]*b+r_s[S[i]], s); # prior distributions s ~ uniform(0, 1.0e+4); a ~ normal(39, 1.0e+4); for (i in 1:M) b[i] ~ normal(0, 1.0e+4); for (i in 1:N_S) r_s[i] ~ normal(as+r_t[T[i]], s_rs); # hierarchical prior distribution s_rs ~ uniform(0, 1.0e+4); as ~ normal(0, 1.0e+4); for (i in 1:N_T) r_t[i] ~ normal(0, s_rt); # 2 hierarchical prior distibution s_rt ~ uniform(0, 1.0e+4); }
ということで
この形だと上手くモデリングできないということがわかりました,というお話でした.実はそもそもこのモデリング,かなりいけてない部分がひとつあります.というのは,このモデルではひとつの駅はひとつの路線にしか所属できないという結構大きな制約を持っているのです.例えば川崎駅や横浜駅のように,複数路線が乗り入れている駅の場合には,完全に綺麗な形での階層化はできません.このモデルでは,データで指定されている駅とその路線を,そのまま使っています.もしかしたらこのデータのノイズが収束を阻んでいるのかもしれないなぁとは思います.
ただ,それを除いても,やはり1つの駅が1つの路線にしか所属できないという仮定には無理があるため,これを解消するようなモデルを組み直さないといけませんね,というお話でした.ということでまだ次回に続きます,この話.
*1:これに事前分布の階層も加わるので,実際には3層のモデルになります.