Chapter 7 エラータム

7.1 エラータム第一刷

残念ながら本書(第一刷)でいくつかの誤りが見つかっている. 修正点の指摘について松野舜介氏に感謝します.

7.1.1 p44 例2.1について (20210308)

  • 図2.4のキャプション:「パラメータ\(p=2\)の…」とあるのは「パラメータ\(\lambda=2\)の指数乱数のヒストグラム.黒い実線は指数分布の確率密度関数」の誤り.

7.1.2 p48 例2.3について (20200511)

実数の繰り上げ,繰り下げに関する議論に誤りがあった. \(\lceil x\rceil\)\(x\)未満ではない最小の整数を表すとする.このとき\(1-(1-p)^x<U\)を満たす最大の整数は, \[ 1-U<(1-p)^x\leadsto\log(1-U)< x\log(1-p)\leadsto \frac{\log(1-U)}{\log(1-p)}>x \] より, \[ x=\left\lceil\frac{\log(1-U)}{\log(1-p)}-1\right\rceil \] とすべきだ.だから,乱数は \[ \left\lceil\frac{\log U}{\log(1-p)}-1\right\rceil \] で生成できる.R言語では

p <- 0.2
n <- 3
ceiling(log(runif(n))/log(1-p)-1)
## [1] 1 0 1

とすべきだった.ただし,教科書にある \[ \left [\frac{\log U}{\log(1-p)}\right] \] と先程の値が異なる確率は\(0\)だから,乱数生成の意味では問題を生じ得ない.

7.1.3 p70 定理3.2について (20210308)

\(l_1(x)\)\(l_2(x)\)の定義が逆.

7.1.4 p93 練習問題3.2について (20210308)

\(\int_a^b(x-a)^2\mathrm{d}x=\int_a^b(x-b)^2\mathrm{d}x=(b-a)^3/3\)とすべき.

7.1.5 p95 章のアブストラクト (20210308)

第6行目;「マルコ連鎖」とあるのは「マルコフ連鎖」の誤り.

7.1.6 p109 例4.6について (20210308)

恥ずかしながら一部計算ミスしていた.以下に差し替える.

実数\(\alpha,\beta\)および正の実数\(\sigma\)を定める.\(\alpha^2+\beta^2\sigma^2\neq \alpha\)とする.初期値\(X_0=x_0\)にたいし,\(m=0,1,\ldots\)として \[\begin{equation}\label{eq:nonlinear} X_{m+1}=\alpha X_m+\beta X_m W_{m+1}+W_{m+1} \end{equation}\] なる非線形なモデルを考えよう.ただし,\(W_1, W_2,\ldots\)は独立で\(\mathcal{N}(0,\sigma^2)\)に従う.この場合,マルコフカーネルは \[ P(x,\cdot)=\mathcal{N}(\alpha x, (1+\beta x)^2\sigma^2) \] で定まる.定義式は自己回帰過程と少し違うだけだが,振る舞いはかなり違う.たとえば\(P(x,\cdot)\)は正規分布だが,\(\beta\neq 0, x\neq 0\)なら\(P^2(x,\cdot)\)はもはや正規分布ではない.

自己回帰過程のように,長期的な振る舞いを検討してみよう.まず,\(X_0=x\)であるとき \[\begin{equation}\label{eq:nonlinear_moment} \mathbb{E}[X_1\mid X_0=x]=\alpha x,\ \mathbb{E}[X_1^2\mid X_0=x]=\alpha^2x^2+(1+\beta x)^2\sigma^2 \end{equation}\] となる.したがって,うまく計算すれば, \[\begin{align*} \mathbb{E}[X_1^2+\delta X_1\mid X_0=x]=\sigma^2 +\gamma(x^2+\delta x) \end{align*}\] となるのがわかるはずだ.ただし,\(\gamma=\alpha^2+\beta^2\sigma^2\)および\(\delta=2\beta\sigma^2/(\gamma-\alpha)\)である.この関係式を再帰的に使えば \[ \begin{align*} \mathbb{E}[X_m^2+\delta X_m\mid X_0=x]&=\sigma^2+\gamma~\mathbb{E}[X_{m-1}^2+\delta X_{m-1}\mid X_0=x]\\ &=\cdots= \sum_{i=0}^{m-1} \gamma^i\sigma^2+\gamma^m~(x^2+\delta x) \end{align*} \] である.だから,\(X_m^2+\delta X_m\)の期待値が発散しないためには\(\gamma=\alpha^2+\beta^2\sigma^2<1\)が必要十分だ.なお,\(X_m^2+\delta X_m\)の期待値が発散しないこととと\(X_m^2\)の期待値が発散しないことは同じことである.自己回帰過程の場合は,\(X_m^2\)の期待値が発散しないための条件は\(\alpha^2<1\)だった.それよりよりやや厳しい条件が必要だ.

7.1.7 p139 定理5.7について (20210308)

\(x\in, y\in F\)」とあるのは 「\(x\in E, y\in F\)」の誤り.

また,「練習問題4.13から」とあるのは「練習問題4.12から」の誤り.

7.1.8 p140 5.3.3について (20210308)

「第5.1節であつかったギブスサンプリングは\(E=\mathbb{R}\)」 とあるのは 「第5.1節であつかったギブスサンプリングは\(E=(0,1)\)」の誤り.

7.1.9 p144 例5.7 について (20210308)

第12行目で\(p(x^N, y^N\mid \theta)\)とあるのは \(p(x^N\mid y^N,\theta)\)の誤り.

また,下から二行目,正規分布の分散の\(\tau^{-1}\)を掛けるのを忘れている.

7.1.10 p146 練習問題 5.10について (20210308)

「練習問題1.8」とあるのは「練習問題1.9」の誤り.

7.1.11 p155 下から8行目 (20210308)

\[ P(x,A)=(1-M^{-1})Q(x,A)+M^{-1}\Pi(A) \] が正しい.

7.1.12 p156 6.3.1について (20210308)

上から十行目 \[ \min\left\{1,\frac{\pi(y)}{\pi(x)}\right\} \] とすべき.

7.1.13 p159 6.3.2について (20210308)

上から3行目 \[ \frac{1}{M}\sum_{m=1}^N\|X_m-X_{m-1}\|^2 \] とすべき.

また,Step 2で\(U\le \alpha(X_{n-1}, Y_n)\)とあるのは \(U_n\le \alpha(X_{n-1}, Y_n)\)の誤り.

7.1.14 p160 引き続き6.3.2について (20210308)

下から6,7行目

\[ \sum_{i=1}^n X_{0i}w_{1i},\quad \sum_{i=1}^n X_{0i}\frac{w_{1i}}{\|w_1\|} \] はそれぞれ \[ \sum_{i=1}^d X_{0i}w_{1i},\quad \sum_{i=1}^d X_{0i}\frac{w_{1i}}{\|w_1\|} \] の誤り.

7.1.15 p161 引き続き6.3.2について (20210308)

下から11行目 \[ \sigma^2=\frac{l}{d} \] ではなく \[ \sigma^2=\frac{l^2}{d}. \]

7.1.16 p164 リスト6.3について (20210308)

恥ずかしながら,プログラムにバグが有り,ニュートン・ラフソン法がよく見えているが,実際はもっと悪い.コードを直し,以下のように初期値を十分真値に近く取り直す.

set.seed(1234)

N <- 100
theta <- c(0.3,0.4)

x <- matrix(c(rep(1,N),rnorm(N)), nrow = 2, byrow = TRUE)
p <- exp(as.vector(theta%*% x))/(1+exp(as.vector(theta%*% x)))
u <- runif(N)
y <- as.numeric(u <= p)


f <- function(theta){
  sum(as.vector(theta %*% x) * y)-sum(log(1 + exp(as.vector(theta %*% x))))
}

df <- function(theta){
  rowSums(t(t(x)*y)) - rowSums(t(t(x) * exp(as.vector(theta %*% x))/(1 + exp(as.vector(theta %*% x)))))
}

ddf <- function(theta){
  prob <- exp(as.vector(theta%*% x))/(1+exp(as.vector(theta%*% x)))
  -x %*% diag(prob*(1-prob))%*% t(x)
}

data.grid <- expand.grid(s.1 = seq(-5, 8, length.out=200), s.2 = seq(-5, 11, length.out=200))

pv <- numeric(0)
for(i in 1:(dim(data.grid)[1])){
  pv <- append(pv,f(as.numeric(data.grid[i,])))
}

M <- 20
theta0 <- c(-1.5,1)

theta <- theta0
theta_mat <- matrix(0, nrow=M, ncol=2)
theta_mat[1,] <- theta0
for(m in 2:M){
 theta <- theta - as.vector(solve(ddf(as.vector(theta))) %*% df(theta))
 theta_mat[m,] <- theta
}

htheta <-theta

data.fr <- data.frame(x=theta_mat[,1],y=theta_mat[,2], z=1:M)

q.samp <- data.frame(cbind(data.grid, z = pv))

ggplot(q.samp, aes(x=s.1, y=s.2, z=z)) + geom_contour(color=black,alpha=0.5) + 
  geom_path(data=data.fr,aes(x=x,y=y),lty=2,color=black,alpha=0.5) + geom_point(data=data.fr,aes(x=x,y=y),color=black,alpha=0.5,size=I(2.0))+xlim(-5, 8) + ylim(-5, 11) + xlab(TeX("$\\theta_1$")) + ylab(TeX("$\\theta_2$")) + theme_bw()

7.1.16.1 定義6.1 p169 について (20200511)

大事な定義だが間違っていた.たいへん大きなミスだ.文章はあっているが,その下の式が何から何まで間違っている.以下の式がただしい. \[ H(x,w)=-\log\pi(x)-\log\phi_\sigma(w)=-\log\pi(x)+\|w\|^2/2\sigma^2+\log(2\pi\sigma^2)/2. \]

7.2 エラータム 第二刷

7.2.1 p21 例1.8の後の文章 (20200511)

事後確率の計算の直前「すなわち\(\theta>0\)」とあるのは「すなわち\(\theta>0.5\)」の誤り.

7.2.2 p49 例2.4の後の文章 (20211125)

\(F(n)\)の式の分子の指数部は\(n\)でなく,\(m\)

7.2.3 p57 定理2.7の後の証明の途中式 (20211125)

\(p(z)\)の式の\(p(y)\)(青色)の部分は\(2^{\nu/2}\)ではなく\(2^{-\nu/2}\).

7.2.4 p66 練習問題2.8

コードが一部違っている.

r <- 10
y <- rgamma(1, shape = r, rate = (1-theta)/theta)
x <- rpois(1, y)

7.2.5 p77 図3.7のキャプション (20211125)

青色の \(f(x)\)\(g(x)\)の誤り.

7.2.6 p100 定理4.2のあとの解説 (20211125)

「さらに\(|\alpha|>1\)となると,\(x\neq \mu\)なら平均も発散する」とあるが,\(x\)ではなく\(x_0\)とすべき.

7.2.7 p 125, 126 定理5.2のあとの解説 (20211125)

p125の(5.1)式およびp126の最初の式,さらにp126のギブスサンプリングStep2において\(m_0\)\(m_1\)が反対になっている.

7.2.8 p 159 6.3.2 について (20211125)

アルゴリズムStep 2において\(X_{n+1}=X_n\)\(X_n=X_{n-1}\)の誤り.

7.2.9 p 176 練習問題6.9 について (20211127)

\(h^2(-x_0^2+w_h^2)\)ではなく,\(\frac{h^2(-x_0^2+w_h^2)}{2}\).

7.3 エラータム第三刷

第三刷の修正に関し,岩重文也氏,橋本真太郎准教授(広島大学),千葉航平助教(大阪大学),森田潤一氏(京都女子高校講師)に貴重なご意見を頂いた.この場をお借りして感謝いたします.注:所属はご指摘いただいた当時.

7.3.1 p 31 リスト1.5について

13行目の sqrt の適用範囲が誤り.正しくは下記.

data("ToothGrowth")
x <- ToothGrowth$len
y <- ToothGrowth$supp
sd <- sd(x)
n1 <- sum(y=="OJ")
x1 <- x[y=="OJ"]
mu1 <- sum(x1) / (1 + n1)
sd1 <-  sd * sqrt(1 + sum(y=="OJ"))
n2 <- sum(y=="VC")
x2 <- x[y=="VC"]
mu2 <- sum(x2) / (1 + n2)
sd2 <-  sd * sqrt(1 + sum(y=="VC"))
q <- 1/(1 + sqrt((1 + n1 + n2) / ((1 + n1) * (1 + n2))) * exp(-(sum(x^2)/(1+n1+n2) - sum(x1^2)/(1+n1)-sum(x2^2)/(1+n2))/(2*sd^2))) # Model Posterior probability of Model mu1=mu0
log10(q/(1-q)) # BayesFactor

7.3.2 p 35 リスト1.6について

説明変数の中心化が抜けている.対応する図も少し変わる.

data("airquality")
airquality
x <- airquality$Solar.R[is.na(airquality$Solar.R)+is.na(airquality$Ozone)==0]
x <- x - mean(x) #<<
y <- airquality$Ozone[is.na(airquality$Solar.R)+is.na(airquality$Ozone)==0]
sd <- 31.33
ggplot(airquality,aes(x = Ozone)) + 
  stat_function(fun=dnorm, args = list(mean = sum(y)/(1+length(y)), sd = sd/sqrt(1+length(y))),color = "blue")+theme_bw()+xlim(35,50) 

ggplot(airquality,aes(x = Ozone)) + 
  stat_function(fun=dnorm, args = list(mean = sum(x*y)/(1+sum(x^2)), sd = sd/sqrt(1+sum(x^2))),color = "blue")+theme_bw()+xlim(0,0.28)
log10(exp(1/(2*sd^2)*sum(x*y)^2/(1+sum(x^2)))*1/sqrt(1+sum(x^2)))#Bayes Factor

7.3.3 p 41 線形合同法について

「擬似乱数法RANDUは \(a=65539, b=0, n=2^{31}-1\)とした線形合同法」とあるのは, 「擬似乱数法RANDUは \(a=65539, b=0, \color{red}{n=2^{31}}\)とした線形合同法」の誤り.

7.3.4 p62 2.2.3 近似累積分布関数による乱数生成

rnormの出力が,runifの出力をqnorm関数で変換した逆関数法にように記述しているが,正確には異なる.

実際のrnormコードによると

#define BIG 134217728 /* 2^27 */
    /* unif_rand() alone is not of high enough precision */
    u1 = unif_rand();
    u1 = (int)(BIG*u1) + unif_rand();
    return qnorm5(u1/BIG, 0.0, 1.0, 1, 0);

と書かれており,内部で二つの擬似一様乱数を生成して精度を担保している.二つの疑似乱数のうち最初の項が主要項なので,奇数番目に生成した乱数に逆変換法を用いた値はrnormにほとんど一致するが,細かいところでは異なる.以下のように,細かく見ると差を確認できる.

m <- 3
set.seed(1)
print(rnorm( m ), digits = 10)
## [1] -0.6264538107  0.1836433242 -0.8356286124
set.seed(1)
print(qnorm( c( runif(2*m)[ seq(from = 1, to = 2*m - 1, by = 2) ] ) ), digits = 10)
## [1] -0.6264538071  0.1836433242 -0.8356286213

7.3.5 p75 例2.7 ガンマ乱数の生成

ガンマ分布\(\mathcal{G}(\nu, 1)\)からの乱数の生成において,\(\nu >0\)の場合の乱数生成を\(\mathcal{G}([\nu],1)\)からの乱数による棄却法で生成できるように書いているが誤り.

\(\nu<1\)の場合はこの方法は使えない.

7.3.6 p82

5行目は「ラグランジュ多項式」ではなく「ルジャンドル多項式」

7.3.7 p84 定理3.6の証明

\(Y_M/Z_M\)とすべきところが\(Z_M/Y_M\)となっていた. \[ I_M=I~\frac{Y_M}{Z_M}\approx I~\left(1-(Z_M-1)+(Y_M-1)\right) \] とすべき.合わせて次の式も \[ M^{1/2}(I_M-I)\approx I~\left( -M^{1/2}(Z_M-1)+M^{1/2}(Y_M-1)\right)=M^{\color{red}{-}1/2} I\sum_{m=1}^M(-\overline{g}(X_m)+\overline{f}(X_m)) \] とする.\(M\)の指数も誤り.次の式も以下のようになる. \[\begin{align*} \sigma^2&=I^2\operatorname{Var}(-\overline{g}(X_1)+\overline{f}(X_1))\\ &=I^2\left\{\operatorname{Var}(\overline{f}(X_1))-2 \operatorname{Cov}(\overline{f}(X_1),\overline{g}(X_1)) +\operatorname{Var}(\overline{g}(X_1))\right\} \end{align*}\]

7.3.8 p93 3.1

\(\Gamma(n)=(n-1)!\)とすべき.

7.3.9 p93 3.2

\(a=x_1<x_2<x_3=b\)および\(x_2=(a+b)/2\)とすべき.

7.3.10 p145 例5.7

\(y_n\sim\chi^2_\nu\)の部分等で誤りがあった.第六行目は \[ p(y_n\mid x_n,\theta)\propto p(x_n,y_n\mid\theta)\propto y_n^{1/2}\exp\left(-\left\{\frac{(x_n-\mu)^2}{2\nu} \tau\right\}y_n\right) \color{red}{y_n^{\nu/2-1}\exp\left(-\frac{y_n}{2}\right)} \] とし,次の式とStep 1のガンマ分布は \[ \mathcal{G}\left(\frac{1+\nu}{2}, \frac{(x_n-\mu)^2}{2\nu} \tau+\frac{1}{2}\right) \] とすべき.またStep 2は\(\tau\)が抜けている.

\(\mu\sim \mathcal{N}\left(\frac{\left(\nu^{-1} \sum_{n=1}^Nx_n y_n\right)}{1+\nu^{-1}\sum_{n=1}^N y_n},\left(1+\nu^{-1}\sum_{n=1}^N y_n\right)^{-1}~\color{red}{\tau^{-1}}\right)\)