はじめに
小地域推定とスタイン推定量について興味を持ったので、簡単にメモをまとめます。
参考になったのは、これらの資料やページです。
Small area estimation with mixed models: a review
スタイン推定量について
一般的な推定では推定量の最小二乗誤差が小さくなるようにパラメータを推定します。
一方、スタイン推定量は次のように定義される。
これは、各を平均値の方向にだけ引っ張ることを意味している
は推定量 に全体平均をどの程度混ぜるかを意味している。
このは、期待値のばらつき が大きくなると0に近づくことになり、推定値の縮小が大きくなる。
一方で、期待値のばらつきが小さい場合は、が大きくなり縮小効果が大きくなる。
これにより、推定値の二乗誤差の期待値が小さくなること期待され証明もされている。
この時の誤差が小さくなるとは個別の推定精度が上がるというわけではなく、サンプル全体における誤差が小さくなるということに気をつけなければならない。
スタイン推定量とベイズ推定の関係
このスタイン推定量は経験ベイズ推定量に一致することが知られている。
の事前分布は次のように仮定する。
ベイズの公式からの事後分布は次のようになる。
ここでは正則化定数ある。
ここからのMAP推定量は次のようになる。
事前分布の平均値と分散 は未知であるため、経験ベイズ法による近似をして推定を行う。
その結果、平均値と分散の推定量は次のようになる。
これを上記のMAP推定量に代入すると次のようになる。
この推定量は、ほぼスタイン推定量と一緒であり、 の分数の分母が異なるのみであるが、等しい推定量であることが証明されている。
Rで縮小推定
Rで二項分布の場合の縮小推定を行うためにはebbr packageがあります。
> trial_df # A tibble: 10 x 6 # Rowwise: prob samplesize n rate lower upper <dbl> <int> <int> <dbl> <dbl> <dbl> 1 0.2 172 35 0.203 0.146 0.271 2 0.23 117 23 0.197 0.129 0.280 3 0.25 31 11 0.355 0.192 0.546 4 0.22 229 52 0.227 0.174 0.287 5 0.3 300 94 0.313 0.261 0.369 6 0.22 98 26 0.265 0.181 0.364 7 0.26 287 70 0.244 0.195 0.298 8 0.19 81 17 0.210 0.127 0.315 9 0.12 232 31 0.134 0.0926 0.184 10 0.24 136 27 0.199 0.135 0.276
スタイン推定量と通常の平均値のMSEを見てみます。
スタイン推定量の方がMSEが小さいです。
> mean(sae_trial_df$stain_se) [1] 0.000524215 > mean(sae_trial_df$obs_se) [1] 0.001696015
各データの結果を可視化してみます。
# 描画 sae_trial_df %>% ggplot(aes(.fitted, rank(.fitted))) + geom_point() + geom_point(aes(x = prob), color = "red") + geom_point(aes(x = rate), color = "blue") + geom_errorbarh(aes(xmin = .low, xmax = .high, height = .4)) + geom_errorbarh(aes(xmin = lower, xmax = upper, height = .4), col = "blue") + labs(x = "推定量", y = "対象", title = "縮小推定結果", subtitle = "黒:推定量, 青:観測値, 赤:真値")+ theme_gray (base_family = "HiraKakuPro-W3")
一番上振れしたデータがあり、平均値への縮小がうまく聞いているようです。
小地域推定
人口統計などを考えるとき、狭い地域や人口が粗な地域に対しては十分なサンプルサイズが得られない。
このような地域では、その地域のデータだけでは統計量の十分な推測ができず、統計量の分散が大きくなってしまう。
この時の推定量は、得られている情報のみを利用しているため直接推定量と呼ばれている。
このような状況での推定問題を小地域推定とよび、周辺地域のデータを組み込んで推定精度を高めることができる。
代表的なモデルとして、Fay-Herriotモデルや枝分かれ誤差回帰モデル (nested error regression model, NERM) が挙げられる。
Fay-Herriotモデル
番目の小地域の観測データを , 共変量を とすると、Fay-Herriotモデルは次のように定義される。
ここで、は地域の差異を表す変量効果で に従い,それと独立に誤差項 が に従う。 この時のは未知である。
各地域の特性値が特徴量を用いて と表されるとき,この値 を予測する問題を考える.
このとき,小地域のデータ を与えたときの の条件付き期待値を求めると、次のようにかける。
これはベイズ推定量に対応し、の方向へ縮小する作用が得られることになる。
遠くとの一般化最小二乗推定量(GLS)は次のようになる。
これをに代入すると次のようにある。
最良線形不偏予測量 (best linear unbiased predictor, BLUP) とも呼ばれている。
枝分かれ誤差回帰モデル
このモデルでは、一地域から複数の観測値が得られている場合のモデルである。
番目の小地域の 番目のデータを , 共変量を とし,全体で 個 の小地域から構成され,各小地域から 個のデータが観測されているとする。
この時の枝分かれ誤差回帰モデルは次のようになる。
ここで、は地域の差異を表す変量効果で に従う確率変数とし、それと独立に誤差項 が に従う。
各地域の特性値を p次元のベクトル を用いて と表される。
例えば とおくと は平均に関する量を推定することになる。
このときの小地域のデータの組 を与えたときの の条件付き期待値を求めると次のようにかける。
これはベイズ推定量に対応し、との方向へ縮小する作用が得られることになる。
遠くとの一般化最小二乗推定量(GLS)は次のようになる。
そして、最良線形不偏予測量 (best linear unbiased predictor, BLUP) は次のようになる。
実際には、(一般化)線形混合モデルを用いて推定することになる。
RでFay-Herriotモデル
いくつかパッケージがありますが、BayesSAEパッケージを用いました。
以下のモデルに従うサンプルデータを作成しました。
クソコードですね。
set.seed(1234) N <- 20 beta <- c(0.23, 0.32, 0.15, 1) model_df <- data.frame(x1 = rgamma(N, 1.2), x2 = rgamma(N, 2.1), x3 = rbernoulli(N), v1 = rnorm(N, 0, 0.1)) %>% mutate(theta = beta[1]*x1 + beta[2]*x2 +beta[3]*x3 + beta[3]*v1) sample_df <- model_df %>% mutate(sample_size = 2*floor(rnorm(n=N,30,25))) %>% tibble() %>% mutate(theta_mu = map2(.x = sample_size, .y = theta, ~ rnorm(.x, .y, 0.2))) %>% mutate(Y = map(sample_df$theta_mu, mean) %>% unlist(), sd = map(sample_df$theta_mu, sd) %>% unlist(), Var = sd^2)
平均値と補助変数を用いた場合のMSEを見てみました。
今回の場合では、補助変数1つの場合が最も小さいという結果になりました。
> # 平均値のMSE > mean((sample_df$theta - sample_df$Y)^2) [1] 0.9035524 > # 補助変数1つの場合の縮小推定のMSE > mean((sample_df$theta - summary(bsae_res)$theta)^2) [1] 0.8464218 > # 補助変数3つの場合の縮小推定のMSE > mean((sample_df$theta - summary(bsae_val_res)$theta)^2) [1] 0.8622283
補助変数3つの場合、推定結果をグラフ化してみます。
# 描画 sample_df %>% mutate(fitted = summary(bsae_res)$theta) %>% ggplot(aes(fitted, rank(theta))) + geom_point(aes(x = theta), color = "red") + geom_point(aes(x = Y), color = "black", alpha = 0.5) + geom_point(aes(x = fitted), color = "blue") + geom_errorbarh(aes(xmin = Y-1.96*sd, xmax = Y+1.96*sd, height = .4), color = "black", alpha = 0.5) + labs(x = "推定量", y = "対象", title = "小地域推定結果", subtitle = "黒:観測平均値, 青:推定量, 赤:真値")+ theme_gray (base_family = "HiraKakuPro-W3")
かなり平均値に引っ張られているようです。
BayseSAEパッケージでは、二項分布のパラメータの推定ができないので、結局色々考慮するにはRstanでモデリングをするのが簡単な気がします...