- こちらで一度ぱらぱらめくったのだけれど、消化不良だったので(それと、色々な意味で必要なので)、もう一度、ぱらぱらめくってみる
- PDFはこちら
- 書きかけ
[ぱらぱらめくるシリーズ][分布推定][Wavelet変換][ノンパラメトリック][Gaussian sequence model][James Stein]ぱらぱらめくる『Gaussian estimation: Sequence and wavelet models』
http://d.hatena.ne.jp/ryamada22/20131127
で一度ぱらぱらめくったのだけれど、消化不良だったので(それと、色々な意味で必要なので)、もう一度、ぱらぱらめくってみる
PDFは
http://statweb.stanford.edu/~imj/GE12-27-11.pdf
基本となる対象はGaussian Sequence Model
n=1個以上の対象があって、その値を$\theta_i;i=1,2,...$とする
これを観察するときに、正規乱数誤差が入るが、この正規乱数は平均0ですべてのiについて等分散であるとする
その観測値を
$$
\begin{equation}
y_i = \theta_i + \epsilon z_i\\
z \sim N(0,1)
\end{equation}
$$
と書ける
これを素直にRでシミュレーションすれば
```{r}
n <- 100
theta <- runif(n)*1 # これはなんでもよい
epsilon <- 2
y <- theta + epsilon * rnorm(n)
```
今、このn個の値の組をn次元変数とすれば、各成分の平均が$\theta_i$で与えられた、全軸に関して等分散なn次元正規乱数ともみなせる。そのつもりでシミュレーションすれば、以下のように、n次元ベクトルを1個発生させることと同じ
```{r}
library(MASS)
# n個の値の観測に入りこむ乱数が相互に独立であることを、mvnorm()の分散共分散行列を対角行列にすることが示している
y <- mvrnorm(1,theta,diag(rep(epsilon,n)))
```
観察データを使って推定しよう
一番単純なのは、観測値そのものを推定値とする方法。最尤推定である。$\hat{\theta_i} = y_i$
この場合のMean Squared Error(MSE)は
$$
\begin{equation}
\sum_{i=1}^n (y_i-\theta_i)^2
\end{equation}
$$
```{r}
sum((y-theta)^2)
```
この値の期待値は
$$
\begin{equation}
n\epsilon^2
\end{equation}
$$
になる
```{r}
n.iter <- 10000
mses <- rep(0,n.iter)
for(i in 1:n.iter){
tmp.y <- theta + epsilon * rnorm(n)
tmp.theta <- tmp.y # 推定値はそのまま
mses[i] <- sum((tmp.y-theta)^2)
}
mean(mses)/n
epsilon^2
```
これとは別の2つの推定法がある
一つ目は少し小さくする方法。
Shrinkage法。
```{r}
s <- runif(1)
n.iter <- 10000
mses <- rep(0,n.iter)
for(i in 1:n.iter){
tmp.y <- theta + epsilon * rnorm(n)
tmp.theta <- tmp.y*s # 推定値はsで縮める
mses[i] <- sum((tmp.theta-theta)^2)
}
mean(mses)/n
epsilon^2
```
観測値より少し小さくしただけなのに、MSEが小さくなりました。
この方法では、$\theta$の値が0近辺のときとそうでないときとで、MSEが小さくできるかどうかが変わってくるので、その様子を確認してみる。
```{r}
mean.theta <- seq(from=-10,to=10,length=50)
means <- rep(0,length(mean.theta))
for(j in 1:length(mean.theta)){
mses <- rep(0,n.iter)
for(i in 1:n.iter){
tmp.y <- theta + mean.theta[j] + epsilon * rnorm(n)
tmp.theta <- tmp.y*s # 推定値はsで縮める
mses[i] <- sum((tmp.theta-(theta+mean.theta[j]))^2)
}
means[j] <- mean(mses)
}
plot(mean.theta,means)
abline(h=epsilon^2*n,col=2)
```
このように$\theta$の値の絶対値が小さい範囲では、Shrinkage法の方がMSEが小さくなるが、絶対値が大きくなると返ってMSEは大きくなる様子が見て取れる。
では、絶対値に応じて縮め方を調節するとどうなるだろうか。
以下のように、n個の観測値をn次元ベクトルとみなし、その長さの二乗と、観測誤差の分散とを用いた係数でShrinkageの係数を決めると、n次元ベクトルの長さが0に近い当たりでは、$\epsilon^2 *2$くらいにまでMSEが小さくなり、n次元ベクトルの長さが長くなっても、観測値そのものを推定値としたときのMSEより大きくなることはない、という挙動をすることがわかる。
その係数を式で表すと
$$
\begin{equation}
\frac{(n-2)\epsilon^2}{|y|^2}
\end{equation}
$$
となる。
```{r}
mean.theta <- seq(from=-10,to=10,length=50)
means <- rep(0,length(mean.theta))
for(j in 1:length(mean.theta)){
mses <- rep(0,n.iter)
for(i in 1:n.iter){
tmp.y <- theta + mean.theta[j] + epsilon * rnorm(n)
s2 <- 1-(n-2)*epsilon^2/sum(tmp.y^2)
tmp.theta <- tmp.y*s2 # 縮め方を値で調節する
mses[i] <- sum((tmp.theta-(theta+mean.theta[j]))^2)
}
means[j] <- mean(mses)
}
plot(mean.theta,means,ylim = c(0,epsilon^2*n*1.3))
abline(h=epsilon^2*n,col=2)
abline(h=epsilon^2*2,col=3)
```