ブログ

「統計学実践ワークブック」 演習問題etc Ch.31 「ベイズ法」

当記事は「統計学実践ワークブック(学術図書出版社)」の読解サポートにあたってChapter.$31$の「ベイズ法」に関して演習問題を中心に解説を行います。事前分布を導入し、事後分布や最大事後確率を考えるベイズ的な手法はよく出てくるので、演習を通して抑えておくと良いと思います。

本章のまとめ

ベイズ推定量・MAP推定量

具体的な計算を下記で取り扱った。
https://www.hello-statisticians.com/python/stat_program7.html

共役事前分布

「二項分布-ベータ分布」、「正規分布-正規分布」、「ポアソン分布-ガンマ分布」などの共役事前分布などに関して下記で詳しく取り扱った。
https://www.hello-statisticians.com/explain-terms-cat/conjugate_dist1.html

ベイズ線形回帰と予測分布

計算が複雑なのでおそらく準$1$級では出題されないが、応用上重要な結果であるので、結果は抑えておくとよい。
https://www.hello-statisticians.com/explain-terms-cat/bayes_linear_reg1.html

演習問題解説

例31.1

$20$世帯中$x$世帯が保有していたことより、尤度関数$P(x|p)$は下記のように表すことができる。
$$
\large
\begin{align}
P(x|p) = {}_{20} C_{x} p^{x} (1-p)^{20-x}
\end{align}
$$

また、ここで$Be(2,20)$の確率密度関数の$f(p)$は下記のように表される。
$$
\large
\begin{align}
f(p) &= \frac{1}{B(2,20)} p^{2-1} (1-p)^{20-1} \\
&= \frac{1}{B(2,20)} p^{1} (1-p)^{19}
\end{align}
$$

ここまでの議論により、事後分布の確率密度関数$f(p|x)$に関して下記のように計算できる。
$$
\large
\begin{align}
f(p|x) & \propto P(x|p) \times f(p) \\
&= {}_{20} C_{x} p^{x} (1-p)^{20-x} \times \frac{1}{B(2,20)} p^{1} (1-p)^{19} \\
& \propto p^{x+2-1} (1-p)^{40-x-1}
\end{align}
$$

上記より事後分布が$Be(x+2,40-x)$であることがわかる。

例31.2

$1)$
ベータ分布$Be(a,b)$に対して、$\displaystyle E[X]=\frac{a}{a+b}$が成立するので、$Be(2+x,40-x)$に基づくベイズ推定量$\hat{p}_B$は下記のように計算できる。
$$
\large
\begin{align}
\hat{p}_B &= \frac{2+x}{2+x+40-x} \\
&= \frac{2+x}{42}
\end{align}
$$

$2)$
事前分布$Be(2,20)$の期待値は下記のように計算できる。
$$
\large
\begin{align}
\frac{2}{2+20} = \frac{1}{11}
\end{align}
$$

ここでベイズ推定量$\hat{p}_B$は下記のように変形することができる。
$$
\large
\begin{align}
\hat{p}_B &= \frac{2+x}{42} \\
&= \frac{20}{42} \times \frac{x}{20} + \frac{22}{42} \times \frac{1}{11}
\end{align}
$$

上記より、「ベイズ推定量」が「最尤推定値」と「事前分布の期待値」の加重平均で表せることがわかる。

$3)$
ベータ分布$Be(a,b)$のモードは$\displaystyle \frac{a-1}{a+b-2}$のように計算できる。MAP推定量$\hat{p}_{MAP}$は$Be(2+x,40-x)$のモードであるので、下記のように計算できる。
$$
\large
\begin{align}
\hat{p}_{MAP} &= \frac{2+x-1}{2+x+40-x-2} \\
&= \frac{1+x}{40}
\end{align}
$$

・参考
ベータ分布の定義と期待値・分散の計算
ベータ分布の増減表とモード_確率分布の演習

例31.3

$1)$
尤度関数$P(x|\lambda)$は下記のように表すことができる。
$$
\large
\begin{align}
P(x|\lambda) = \prod_{i=1}^{5} \frac{\lambda^{x_i} e^{-\lambda}}{x_i!}
\end{align}
$$

また、ここで$Ga(2,1)$の確率密度関数の$f(\lambda)$は下記のように表される。
$$
\large
\begin{align}
f(\lambda) = \frac{1}{\gamma(2)} \lambda^{2-1} e^{-x}
\end{align}
$$

ここまでの議論により、事後分布の確率密度関数$f(\lambda|x)$に関して下記のように計算できる。
$$
\large
\begin{align}
f(\lambda|x) & \propto P(x|\lambda) \times f(\lambda) \\
&= \prod_{i=1}^{5} \frac{\lambda^{x_i} e^{-\lambda}}{x_i!} \times \frac{1}{\gamma(2)} \lambda^{2-1} e^{-x} \\
& \propto \lambda^{\sum_{i=1}^{5} x_i + 2 -1} e^{-x-5x} \\
&= \lambda^{3+7+1+4+5+2-1} e^{-6x} \\
&= \lambda^{22-1} e^{-6x}
\end{align}
$$

上記より事後分布が$Ga(22,1/6)$であることがわかる。

$2)$
ガンマ分布$Be(\nu,\alpha)$のモードは$\displaystyle E[X] = \nu \alpha$のように計算できる。よって、$Ga(22,1/6)$の期待値は下記のように計算できる。
$$
\large
\begin{align}
E[X] &= \nu \alpha \\
&= 22 \times \frac{1}{6} \\
&= \frac{11}{3}
\end{align}
$$

$3)$
ガンマ分布$Ga(22,1/6)$のモードは$\displaystyle (\nu-1) \alpha$のように計算できる。MAP推定量$\hat{\lambda}_{MAP}$は$Be(22,1/6)$のモードであるので、下記のように計算できる。
$$
\large
\begin{align}
\hat{\lambda}_{MAP} &= (22-1) \times \frac{1}{6} \\
&= \frac{7}{2}
\end{align}
$$

・参考
ガンマ分布の定義と期待値・分散の計算
ガンマ分布の増減表とモード_確率分布の演習

問31.1

$1)$
一様分布$U(0,1)$にはベータ分布$Be(1,1)$が対応する。ここで、尤度関数が$L(\theta)={}_{10} C_{3} \theta^{3} (1-\theta)^{7}$なので、パラメータの事後分布を$f(\theta|x)$のようにおくと、$f(\theta|x)$は下記のように計算できる。
$$
\large
\begin{align}
f(\theta|x) & \propto \theta^{3} (1-\theta)^{7} \\
&= \theta^{4-1} (1-\theta)^{8-1}
\end{align}
$$

上記より、事後分布は$Be(4,8)$であることがわかる。また、これに対応するベイズ推定量は$Be(a,b)$の期待値が$\displaystyle E[X]=\frac{a}{a+b}$であることより、$\displaystyle \frac{4}{4+8}=\frac{1}{3}$であることがわかる。

$2)$
$1)$と同様に事後分布は下記のように計算できる。
$$
\large
\begin{align}
f(\theta|x) & \propto \theta^{1-1} (1-\theta)^{4-1} \times \theta^{3} (1-\theta)^{7} \\
&= \theta^{4-1} (1-\theta)^{11-1}
\end{align}
$$

上記位より事後分布は$Be(4,11)$であることがわかる。また、これに対応するMAP推定量は$\displaystyle \frac{4-1}{4+11-2}=\frac{3}{13}$であることがわかる。

・参考
ベータ分布の定義と期待値・分散の計算
ベータ分布の増減表とモード_確率分布の演習

問31.2

$1)$
$\lambda$の事後分布$\pi(\lambda|x)$は下記のように計算できる。
$$
\large
\begin{align}
\pi(\lambda|x) & \propto \prod_{i=1}^{5} \frac{\lambda^{x_i} e^{-\lambda}}{x_i!} \times \lambda^{2-1} e^{-3 \lambda} \\
& \propto \lambda^{5+3+4+1+2+2-1} e^{-3 \lambda – 5 \lambda} \\
&= \lambda^{17-1} e^{-8 \lambda}
\end{align}
$$

よって、$\lambda$の事後分布は$Ga(17,1/8)$であり、確率密度関数$\pi(\lambda|x)$は下記のように表せる。
$$
\large
\begin{align}
\pi(\lambda|x) = \frac{8^{17}}{\gamma(17)} \lambda^{17-1} e^{-8 \lambda}
\end{align}
$$

$2)$
$$
\large
\begin{align}
f(x_6|\lambda) = \frac{\lambda^{x_6} e^{-\lambda}}{x_6!}
\end{align}
$$

上記のように$f(x_6|\lambda)$が表せることからベイズ予測分布$f(x_6|x)$の確率密度関数は下記のように計算できる。
$$
\large
\begin{align}
f(x_6|x) &= \int_{0}^{\infty} f(x_6|\lambda) \pi(\lambda|x) d \lambda \\
&= \int_{0}^{\infty} \frac{\lambda^{x_6} e^{-\lambda}}{x_6!} \times \frac{8^{17}}{\gamma(17)} \lambda^{17-1} e^{-8 \lambda}d \lambda \\
&= \frac{8^{17}}{x_6! \gamma(17)} \int_{0}^{\infty} \lambda^{17+x_6-1} e^{-9\lambda} d \lambda \\
&= \frac{8^{17}}{x_6! \gamma(17)} \times \frac{\gamma(17+x_6)}{9^{17+x_6}} \\
&= \frac{\gamma(17+x_6)}{x_6! \gamma(17)} \cdot \left(\frac{8}{9}\right)^{17} \cdot \left(\frac{1}{9}\right)^{x_6}
\end{align}
$$

上記の計算にあたっては、ガンマ分布$Ga(\nu,\alpha)$の確率密度関数の全区間での積分に関する下記の関係式を用いた。
$$
\large
\begin{align}
\int_{0}^{\infty} \frac{1}{\gamma(\nu) \alpha^{\nu}} x^{\nu-1} e^{-\frac{x}{\alpha}} dx &= 1 \\
\int_{0}^{\infty} x^{\nu-1} e^{-\frac{x}{\alpha}} &= \gamma(\nu) \alpha^{\nu}
\end{align}
$$

問31.3

$1)$
$\alpha(x^{(t)},y)$は下記のように表現できる。
$$
\large
\begin{align}
\alpha(x^{(t)},y) &= \min \left\{ 1, \frac{\pi(y)}{\pi(x^{(t)})} \right\} \\
&= \min \left\{ 1, \frac{\frac{1}{8} \varphi(y+5) + \frac{3}{4} \varphi(y) + \frac{1}{8} \varphi(y-5)}{\frac{1}{8} \varphi(x^{(t)}+5) + \frac{3}{4} \varphi(x^{(t)}) + \frac{1}{8} \varphi(x^{(t)}-5)} \right\}
\end{align}
$$

$2)$
下記のように対応する。
ア) $a=1$
イ) $a=10$
ウ) $a=100$
エ) $a=0.1$

基本的にはステップ幅が大きい方が値の変動が起こりやすいが、$a=100$のように移動が大きい場合は採択確率が下がる場合があることに注意すると良い。

$3)$
繰り返し回数が少ない場合は初期値に左右されることがある。

問31.4

$$
\large
\begin{align}
f(x,y) &= \frac{1}{2 \pi \sqrt{1-0.5^2}} \exp \left( -\frac{x^2 – 2 \cdot 0.5 x(y-2) + (y-2)^2)}{2(1-0.5^2)} \right) \\
f(x) &= \frac{1}{\sqrt{2 \pi}} \exp \left( -\frac{x^2}{2} \right) \\
f(y) &= \frac{1}{\sqrt{2 \pi}} \exp \left( -\frac{(y-2)^2}{2} \right)
\end{align}
$$

また、条件付き確率密度関数$f(x|y), f(y|x)$に関して下記が成立する。
$$
\large
\begin{align}
f(x|y) &= \frac{f(x,y)}{f(y)} \\
&= \frac{1}{\sqrt{2 \pi (1-0.5^2)}} \exp \left( -\frac{x^2 – 2 \cdot 0.5 x(y-2) + (y-2)^2}{2(1-0.5^2)} – \frac{(y-2)^2}{2} \right) \quad (1) \\
f(y|x) &= \frac{f(x,y)}{f(x)} \\
&= \frac{1}{\sqrt{2 \pi (1-0.5^2)}} \exp \left( -\frac{x^2 – 2 \cdot 0.5 x(y-2) + (y-2)^2}{2(1-0.5^2)} – \frac{x^2}{2} \right) \quad (2)
\end{align}
$$

ここまでの式を元に各設問に関して考える。

$1)$
$f(x_{(t+1)}|y_{(t)})$より、$(1)$式を元に考える。$(1)$式は正規分布を表すことより、平均$\mu_{x_{(t+1)}|y_{(t)}}$と分散$\sigma_{x_{(t+1)}|y_{(t)}}^2$をそれぞれ考えれば良い。式の形より、$\sigma_{x_{(t+1)}|y_{(t)}}^2$は下記のように得られる。
$$
\large
\begin{align}
\sigma_{x_{(t+1)}|y_{(t)}}^2 &= 1-0.5^2 \\
&= \frac{3}{4}
\end{align}
$$

次に$\mu_{x_{(t+1)}|y_{(t)}}$を求めるにあたって、$(1)$式の変数を置き換えた式の指数関数の中身を$x_{(t+1)}$に関して整理することを考える。
$$
\large
\begin{align}
& -\frac{x_{(t+1)}^2 – 2 \cdot 0.5 x_{(t+1)}(y_{(t)}-2) + (y_{(t)}-2)^2}{2(1-0.5^2)} – \frac{(y_{(t)}-2)^2}{2} \\
&= -\frac{\left( x_{(t+1)} – \frac{1}{2}(y_{(t)}-2) \right)^2 + …}{2(1-0.5^2)}
\end{align}
$$

上記より、$\mu_{x_{(t+1)}|y_{(t)}}$は下記のように得られる
$$
\large
\begin{align}
\mu_{x_{(t+1)}|y_{(t)}} = \frac{1}{2}(y_{(t)}-2)
\end{align}
$$

$2)$
$f(y_{(t+1)}|x_{(t+1)})$より、$(2)$式を元に考える。$(2)$式は正規分布を表すことより、平均$\mu_{y_{(t+1)}|x_{(t+1)}}$と分散$\sigma_{y_{(t+1)}|x_{(t+1)}}^2$をそれぞれ考えれば良い。式の形より、$\sigma_{y_{(t+1)}|x_{(t+1)}}^2$は下記のように得られる。
$$
\large
\begin{align}
\sigma_{y_{(t+1)}|x_{(t+1)}}^2 &= 1-0.5^2 \\
&= \frac{3}{4}
\end{align}
$$

次に$\mu_{y_{(t+1)}|x_{(t+1)}}$を求めるにあたって、$(2)$式の変数を置き換えた式の指数関数の中身を$x_{(t+1)}$に関して整理することを考える。
$$
\large
\begin{align}
& -\frac{x_{(t+1)}^2 – 2 \cdot 0.5 x_{(t+1)}(y_{(t)}-2) + (y_{(t)}-2)^2}{2(1-0.5^2)} – \frac{x_{(t+1)}^2}{2} \\
& = -\frac{(y_{(t)} – 2 – \frac{1}{2}x_{(t+1)})^2 + …}{2(1-0.5^2)}
\end{align}
$$

上記より、$\mu_{y_{(t+1)}|x_{(t+1)}}$は下記のように得られる
$$
\large
\begin{align}
\mu_{y_{(t+1)}|x_{(t+1)}} = \frac{1}{2}x_{(t+1)} + 2
\end{align}
$$

参考

・準1級関連まとめ
https://www.hello-statisticians.com/toukeikentei-semi1

・Pythonで学ぶ統計モデリング(運営者作成)
https://www.amazon.co.jp/dp/B08FYMTYBW/

・共役事前分布
https://www.hello-statisticians.com/explain-terms-cat/conjugate_dist1.html

「統計学実践ワークブック」 演習問題etc Ch.30 「モデル選択」

当記事は「統計学実践ワークブック(学術図書出版社)」の読解サポートにあたってChapter.30の「モデル選択」に関して演習問題を中心に解説を行います。AIC(Akaike information criterion)やBIC(Bayesian information criterion)はよく出てくるトピックなので、抑えておくと良いと思います。

本章のまとめ

本章のまとめ

AIC

BIC

演習問題解説

問30.1

$$
\large
\begin{align}
L &= \max_{\mathbf{\beta},\sigma^2} (2 \pi)^{-\frac{n}{2}} |\sigma^2 I_{n}|^{-\frac{1}{2}} \exp \left( -\frac{1}{2}(\mathbf{y}-X\mathbf{\beta})^{\mathrm{T}}(\sigma^2 I_{n})^{-1}(\mathbf{y}-X\mathbf{\beta}) \right) \\
&= \max_{\mathbf{\beta},\sigma^2} (2 \pi)^{-\frac{n}{2}} (\sigma^2)^{-\frac{n}{2}} \exp \left( -\frac{1}{2 \sigma^2}(\mathbf{y}-X\mathbf{\beta})^{\mathrm{T}}(\mathbf{y}-X\mathbf{\beta}) \right) \quad (1)
\end{align}
$$

上記のように表した$(1)$式に対して、$\mathbf{\beta},\sigma^2$の最尤推定量である$\displaystyle \hat{\mathbf{\beta}}=(X^{\mathrm{T}}X)^{-1}X^{\mathrm{T}}\mathbf{y},\hat{\sigma}^2=\frac{S_e}{n}$を代入した際に$L$は最大値をとる。よって$(1)$式は下記のように変形できる。
$$
\large
\begin{align}
L &= \max_{\mathbf{\beta},\sigma^2} (2 \pi)^{-\frac{n}{2}} (\sigma^2)^{-\frac{n}{2}} \exp \left( -\frac{1}{2 \sigma^2}(\mathbf{y}-X\mathbf{\beta})^{\mathrm{T}}(\mathbf{y}-X\mathbf{\beta}) \right) \quad (1) \\
&= (2 \pi)^{-\frac{n}{2}} \left( \frac{S_e}{n} \right)^{-\frac{n}{2}} \exp \left( -\frac{n}{2 S_e}(\mathbf{y}-X(X^{\mathrm{T}}X)^{-1}X^{\mathrm{T}}\mathbf{y})^{\mathrm{T}}(\mathbf{y}-X(X^{\mathrm{T}}X)^{-1}X^{\mathrm{T}}\mathbf{y}) \right) \\
&= \left( \frac{2 \pi S_e}{n} \right)^{-\frac{n}{2}} \exp \left( -\frac{n\cancel{S_e}}{2\cancel{S_e}}\right) = \left( \frac{2 \pi S_e}{n} \right)^{-\frac{n}{2}} \exp \left( -\frac{n}{2}\right) \quad (30.2)
\end{align}
$$

上記の変形では$S_e=(\mathbf{y}-X(X^{\mathrm{T}}X)^{-1}X^{\mathrm{T}}\mathbf{y})^{\mathrm{T}}(\mathbf{y}-X(X^{\mathrm{T}}X)^{-1}X^{\mathrm{T}}\mathbf{y})$を用いたので、以下この式が成立することを確認する。
$$
\large
\begin{align}
& (\mathbf{y}-X(X^{\mathrm{T}}X)^{-1}X^{\mathrm{T}}\mathbf{y})^{\mathrm{T}}(\mathbf{y}-X(X^{\mathrm{T}}X)^{-1}X^{\mathrm{T}}\mathbf{y}) \\
&= \mathbf{y}^{\mathrm{T}}\mathbf{y} – 2\mathbf{y}^{\mathrm{T}}X(X^{\mathrm{T}}X)^{-1}X^{\mathrm{T}}\mathbf{y} + \mathbf{y}^{\mathrm{T}}X\cancel{(X^{\mathrm{T}}X)^{-1}}\cancel{X^{\mathrm{T}}X}(X^{\mathrm{T}}X)^{-1}X^{\mathrm{T}}\mathbf{y} \\
&= \mathbf{y}^{\mathrm{T}}\mathbf{y} – 2\mathbf{y}^{\mathrm{T}}X(X^{\mathrm{T}}X)^{-1}X^{\mathrm{T}}\mathbf{y} + \mathbf{y}^{\mathrm{T}}X(X^{\mathrm{T}}X)^{-1}X^{\mathrm{T}}\mathbf{y} \\
&= \mathbf{y}^{\mathrm{T}}\mathbf{y} – \mathbf{y}^{\mathrm{T}}X(X^{\mathrm{T}}X)^{-1}X^{\mathrm{T}}\mathbf{y} \\
&= \mathbf{y}^{\mathrm{T}} (I_{n} – X(X^{\mathrm{T}}X)^{-1}X^{\mathrm{T}}) \mathbf{y} \\
&= S_e
\end{align}
$$

問30.2

下記を実行することで、説明変数の組み合わせごとのAIC、BICの値が得られる。

import numpy as np

n = 20.
x_combination = ["nothing", "x1", "x2", "x3", "x1-x2", "x1-x3", "x2-x3", "x1-x2-x3"]
k = np.array([0., 1., 1., 1., 2., 2., 2., 3.])
res = np.array([[53180., 10.881], [41499., 10.633], [30338., 10.320], [42420., 10.607], [29727., 10.3], [26252., 10.176], [26923., 10.201], [23893., 10.081]])

AIC = n*(res[:,1]+np.log(2*np.pi/n)+1)+2*(k+2)
BIC = n*(res[:,1]+np.log(2*np.pi/n)+1)+(k+2)*np.log(n)

for i in range(res.shape[0]):
    print("Variable: {}, AIC: {:.3f}, BIC: {:.3f}".format(x_combination[i],AIC[i],BIC[i]))

・実行結果

Variable: nothing, AIC: 218.463, BIC: 220.454
Variable: x1, AIC: 215.503, BIC: 218.490
Variable: x2, AIC: 209.243, BIC: 212.230
Variable: x3, AIC: 214.983, BIC: 217.970
Variable: x1-x2, AIC: 210.843, BIC: 214.826
Variable: x1-x3, AIC: 208.363, BIC: 212.346
Variable: x2-x3, AIC: 208.863, BIC: 212.846
Variable: x1-x2-x3, AIC: 208.463, BIC: 213.442

上記の計算結果より、AICによる変数選択で選ばれる説明変数の組み合わせは「$x_1,x_3$」、BICによる変数選択で選ばれる説明変数の組み合わせは「$x_2$」であることがそれぞれわかる。

参考

・準$1$級関連まとめ
https://www.hello-statisticians.com/toukeikentei-semi1

Ch.9 「社会移動データの分析手法」の章末問題の解答例 〜基礎統計学Ⅱ 人文・社会科学の統計学〜

当記事は「基礎統計学Ⅱ 人文・社会科学の統計学(東京大学出版会)」の読解サポートにあたってChapter.9の「社会移動データの分析手法」の章末問題の解説について行います。
基本的には書籍の購入者向けの解説なので、まだ入手されていない方は下記より入手をご検討ください。また、解説はあくまでサイト運営者が独自に作成したものであり、書籍の公式ページではないことにご注意ください。(そのため著者の意図とは異なる解説となる可能性はあります)

・解答まとめ
https://www.hello-statisticians.com/answer_textbook_stat_basic_1-3#green

章末の演習問題について

問題9.1の解答例

下記を実行することで、それぞれの値を計算できる。

import numpy as np

t = np.array([[104., 86., 36., 13.], [76., 175., 94., 11.], [64., 95., 227., 21.], [97., 175., 351., 268.]])

y_coef = np.zeros(t.shape[0])
for i in range(t.shape[0]):
    min_sum = np.minimum(np.sum(t[i,:]), np.sum(t[:,i]))
    y_coef[i] = (min_sum-t[i,i])/(min_sum-np.sum(t[i,:])*np.sum(t[:,i])/np.sum(t))

print("・Yasuda coef:")
print(y_coef)

・実行結果

・Yasuda coef:
[ 0.6889612   0.70664629  0.70649706  0.27161332]

問題9.2の解答例

問題9.3の解答例

問題9.4の解答例

問題9.5の解答例

まとめ

Ch.4 「VARモデル」の章末問題の解答例 〜計量時系列分析 朝倉書店〜

当記事は「経済・ファイナンスデータの計量時系列分析(朝倉書店)」の読解サポートにあたってChapter.4の「VARモデル」の章末問題の解説について行います。

基本的には書籍の購入者向けの解答例・解説なので、まだ入手されていない方は入手の上、ご確認ください。また、解説はあくまでサイト運営者が独自に作成したものであり、書籍の公式ページではないことにご注意ください。(そのため著者の意図とは異なる解説となる可能性はあります)

また、下記に公式の解答があるので、こちらも合わせて参照ください。
https://www.asakura.co.jp/user_data/contents/12792/3.pdf

章末の演習問題について

問題4.1の解答例

$\Gamma_k$の$(i,j)$成分$\Gamma_{k,ij}$と、$\Gamma_{-k}$の$(j,i)$成分$\Gamma_{-k,ji}$をそれぞれ考える。
・$\Gamma_{k,ij}$
$$
\large
\begin{align}
\Gamma_{k,ij} = Cov(y_{i,t}, y_{j,t-k})
\end{align}
$$

・$\Gamma_{-k,ji}$
$$
\large
\begin{align}
\Gamma_{-k,ji} &= Cov(y_{j,t}, y_{i,t+k}) \\
&= Cov(y_{j,t-k}, y_{i,t})
\end{align}
$$

上記より、$\Gamma_{k,ij} = \Gamma_{-k,ji}$であることが確認できるので、$\Gamma_k = \Gamma^{T}_{-k}$であることがわかる。

問題4.2の解答例

$(4.3)$式に基づき、AR特性方程式の計算を行う。
$$
\large
\begin{align}
\left| \mathbf{I}_{2} – \Phi_{1}z \right| &= 0 \\
\left| \left(\begin{array}{cc} 1 & 0 \\ 0 & 1 \end{array} \right) – \left(\begin{array}{cc} 0 & \gamma \\ 0 & 1 \end{array} \right) z \right| &= 0 \\
\left| \left(\begin{array}{cc} 1 & -\gamma z \\ 0 & 1-z \end{array} \right) \right| &= 0 \\
1-z &= 0 \\
z &= 1
\end{align}
$$

AR特性方程式の解の絶対値が$1$より大きくないことから、この$VAR(1)$過程が定常でないことが確認できる。

問題4.3の解答例

問題4.4の解答例

問題4.5の解答例

問題4.6の解答例

まとめ

Ch.2 「データの分析」の章末問題の解答例 〜基礎統計学Ⅱ 人文・社会科学の統計学〜

当記事は「基礎統計学Ⅱ 人文・社会科学の統計学(東京大学出版会)」の読解サポートにあたってChapter.$2$の「データの分析」の章末問題の解説について行います。
基本的には書籍の購入者向けの解説なので、まだ入手されていない方は下記より入手をご検討ください。また、解説はあくまでサイト運営者が独自に作成したものであり、書籍の公式ページではないことにご注意ください。

・解答まとめ
https://www.hello-statisticians.com/answer_textbook_stat_basic_1-3#green

章末の演習問題について

問題2.1の解答例

下記を実行することで、幹葉表示を作成できる。

import numpy as np

x = np.array([5.9, 6.7, 7.1, 5.9, 7.5, 7.9, 7.4, 6.5, 6.7, 6.7, 4.5, 4.9, 5.2, 4.5, 7.3, 6.6, 7.2, 7.8, 7.3, 6.4, 6.1, 5.2, 7.2, 6.5, 6.4, 5.5, 6.4, 6.3, 8.1, 8.2, 7.5, 6.7, 7.8, 8.3, 7.5, 7.6, 8.9, 6.4, 7.9, 7.4, 7.5, 7.9, 7.4, 8.6, 4.9])

stem = np.unique(x//1)
leaf = x%1

leaves = dict()
for i in range(stem.shape[0]):
    leaves[int(stem[i])] = list()

for i in range(x.shape[0]):
    leaves[int(x[i]//1)].append(int(np.floor((x[i]%1)*10)))

for i in range(stem.shape[0]):
    leaves[int(stem[i])] = np.sort(leaves[int(stem[i])])
    l = ""
    for j in range(len(leaves[int(stem[i])])):
        l += str(leaves[int(stem[i])][j])
    print("stem: {}, leaves: {}".format(int(stem[i]),l))

・実行結果

stem: 4, leaves: 5599
stem: 5, leaves: 22599
stem: 6, leaves: 0244445557777
stem: 7, leaves: 022224445555577999
stem: 8, leaves: 01359

問題2.2の解答例

下記を実行することで、ジニ係数を計算することができる。

import numpy as np

y_1 = np.array([0., 0.07, 0.21, 0.39, 0.61, 1.00])
y_2 = np.array([0., 0.11, 0.26, 0.45, 0.68, 1.00])

gini_1 = 2*(0.5-np.sum((y_1[:-1]+y_1[1:])*0.2/(2.)))
gini_2 = 2*(0.5-np.sum((y_2[:-1]+y_2[1:])*0.2/(2.)))

print("gini_1: {:.3f}".format(gini_1))
print("gini_2: {:.3f}".format(gini_2))

・実行結果

> print("gini_1: {:.3f}".format(gini_1))
gini_1: 0.288
> print("gini_2: {:.3f}".format(gini_2))
gini_2: 0.200

問題2.3の解答例

問題2.4の解答例

下記を実行することで$t$統計量や相関係数$r_{xD}$を計算することができる。

import numpy as np

x = np.array([176., 173., 175., 170., 173., 170., 165., 164., 165., 160.])
D = np.array([1., 1., 1., 1., 1., 0., 0., 0., 0., 0.])

s = np.sqrt((np.sum((x[:5]-np.mean(x[:5]))**2)+np.sum((x[5:]-np.mean(x[5:]))**2))/(10.-2.))
t = np.sqrt(5.*5./10.) * (np.mean(x[:5])-np.mean(x[5:])) / s

r = t/np.sqrt(t**2+10.-2.)

print("t-statistic: {:.3f}".format(t))
print("r_xD: {:.4f}".format(r))

・実行結果

t-statistic: 4.533
r_xD: 0.8484

問題2.5の解答例

下記を実行することでそれぞれの値の計算を行うことができる。

import numpy as np

a, b, c, d = 2415., 274., 2002., 620.

phi_coef = (a*d-b*c)/np.sqrt((a+b)*(a+c)*(b+d)*(c+d))
omega = (a*d)/(b*c)
Q = (omega-1)/(omega+1)

print("Phi coefficient: {:.2f}".format(phi_coef))
print("Sample odds ratio: {:.2f}".format(omega))
print("Yule's coefficient: {:.2f}".format(Q))

・実行結果

> print("Phi coefficient: {:.2f}".format(phi_coef))
Phi coefficient: 0.18
> print("Sample odds ratio: {:.2f}".format(omega))
Sample odds ratio: 2.73
> print("Yule's coefficient: {:.2f}".format(Q))
Yule's coefficient: 0.46

$\phi$係数の値が巻末の解答と異なるが、適合度検定に用いる$\chi^2$の値が$171.7…$であることよりも上記が正しいことが確認できるので、巻末の解答は誤植であると考えられる。

問題2.6の解答例

まとめ

Ch.3 「予測」の章末問題の解答例 〜計量時系列分析 朝倉書店〜

当記事は「経済・ファイナンスデータの計量時系列分析(朝倉書店)」の読解サポートにあたってChapter.3の「予測」の章末問題の解説について行います。

基本的には書籍の購入者向けの解答例・解説なので、まだ入手されていない方は入手の上、ご確認ください。また、解説はあくまでサイト運営者が独自に作成したものであり、書籍の公式ページではないことにご注意ください。(そのため著者の意図とは異なる解説となる可能性はあります)

また、下記に公式の解答があるので、こちらも合わせて参照ください。
https://www.asakura.co.jp/user_data/contents/12792/3.pdf

章末の演習問題について

問題3.1の解答例

$$
\large
\begin{align}
E[(y_{t+h}-\hat{y}_{t+h|t})^2| & \Omega_{t}] = E[((y_{t+h}-\mu_{t+h|t})+(\mu_{t+h|t}-\hat{y}_{t+h|t}))^2|\Omega_{t}] \\
&= E[(y_{t+h}-\mu_{t+h|t})^2|\Omega_{t}] + E[(\mu_{t+h|t}-\hat{y}_{t+h|t})^2|\Omega_{t}] \\
& + E[(y_{t+h}-\mu_{t+h|t})(\mu_{t+h|t}-\hat{y}_{t+h|t})|\Omega_{t}]
\end{align}
$$

上記に対し、$E[(y_{t+h}-\mu_{t+h|t})(\mu_{t+h|t}-\hat{y}_{t+h|t})|\Omega_{t}]=0$が成立することより、$(3.4)$式が成り立つことが確認できる。

問題3.2の解答例

$(3.14)$式に$(3.11)$式を代入すると下記のように変形を行うことができる。
$$
\large
\begin{align}
\hat{y}_{t+2|t} &= c + \phi_1 \hat{y}_{t+1|t} + \phi_2 y_{t} + … + \phi_p y_{t-p+2} \\
&= c + \phi_1 (c + \phi_1 y_t + \phi_2 y_{t-1} + … + \phi_p y_{t-p+1}) + \phi_2 y_{t} + … + \phi_p y_{t-p+2} \\
&= (1 + \phi_1)c + (\phi_1^2 + \phi_2) y_{t} + (\phi_1 \phi_2 + \phi_3) y_{t-1} + … + \phi_1 \phi_p y_{t-p+1})
\end{align}
$$

上記より、$(3.13)$式と$(3.14)$式が一致することがわかる。

問題3.3の解答例

$1)$
$(3.11)$式と$y_t=4.0$より、最適一期先点予測$\hat{y}_{t+1|t}$は下記のように計算できる。
$$
\large
\begin{align}
\hat{y}_{t+1|t} &= 0.5 y_t \\
&= 0.5 \times 4.0 = 2.0
\end{align}
$$

また、$(3.12)$式と$\epsilon_{t} \sim N(0,4)$より、$MSE(\hat{y}_{t+1|t})$は下記のように計算できる。 $$
\large
\begin{align}
MSE(\hat{y}_{t+1|t}) &= E[\epsilon_{t+1}^2] \\
&= 4
\end{align}
$$

$2)$
$(3.15)$式と$1)$の結果より、一期先区間予測は下記のように計算できる。
$$
\large
\begin{align}
& [\hat{y}_{t+1|t} – 1.96 \sqrt{MSE(\hat{y}_{t+1|t})}, \hat{y}_{t+1|t} + 1.96 \sqrt{MSE(\hat{y}_{t+1|t})}] \\
&= [2.0 – 1.96 \times 2, 2.0 + 1.96 \times 2] \\
&= [-1.92, 5.92]
\end{align}
$$

$3)$
$2$期先点予測$\hat{y}_{t+2|t}$は、$(3.14)$式と$1)$の結果より、下記のように計算できる。
$$
\large
\begin{align}
\hat{y}_{t+2|t} &= 0.5 \hat{y}_{t+1|t} \\
&= 0.5 \times 2.0 = 1.0
\end{align}
$$

また、$MSE(\hat{y}_{t+2|t})$は下記のように計算できる。
$$
\large
\begin{align}
MSE(\hat{y}_{t+2|t}) &= E[\epsilon_{t+2}^2+\phi_{1}^2\epsilon_{t+2}^2] \\
&= (1+0.5^2) \times 4 = 5
\end{align}
$$

$4)$
$(3.16)$式を考えることで、$2$期先$95$%区間予測は下記のように計算できる。
$$
\large
\begin{align}
& [\hat{y}_{t+2|t} – 1.96 \sqrt{MSE(\hat{y}_{t+2|t})}, \hat{y}_{t+2|t} + 1.96 \sqrt{MSE(\hat{y}_{t+1|t})}] \\
&= [1.0 – 1.96 \sqrt{5}, 2.0 + 1.96\sqrt{5}] = [-3.38, 5.38]
\end{align}
$$

$5)$
直前の値のみ参照を行うが、$y_t=4.0$であることは変わらないので関連する全ての結果も同じ結果が得られる。このことは$1$階のマルコフ性と同様に考えることができる。

問題3.4の解答例

$1)$
$(3.14)$式と$y_t=2.1, y_{t-1}=0.8$より、最適$2$期先点予測$\hat{y}_{t+2|t}$は下記のように計算できる。
$$
\large
\begin{align} \hat{y}_{t+1|t} &= c + \phi_1 y_t + \phi_2 y_{t-1} \\
&= 1.1 + 0.3 \times 2.1 – 0.4 \times 0.8 = 2.0
\end{align}
$$

$2)$
$\epsilon_{t} \sim N(0,9)$より、$1$期先の$MSE(\hat{y}_{t+1|t})$は下記のように計算できる。
$$
\large
\begin{align}
MSE(\hat{y}_{t+1|t}) &= E[\epsilon_{t+1}^2] \\
&= 9
\end{align}
$$

上記より、$1$期先$95$%区間予測は下記のように計算できる。
$$
\large
\begin{align}
& [\hat{y}_{t+1|t} – 1.96 \sqrt{MSE(\hat{y}_{t+1|t})}, \hat{y}_{t+1|t} + 1.96 \sqrt{MSE(\hat{y}_{t+1|t})}] \\
&= [1.41 – 1.96 \times 3, 2.0 + 1.96 \times 3] = [-4.47, 7.29]
\end{align}
$$

$3)$
$(3.11)$式と$\hat{y}_{t+2|t}=1.41, y_t=2.1$より、最適$1$期先点予測$\hat{y}_{t+1|t}$は下記のように計算できる。
$$
\large
\begin{align}
\hat{y}_{t+1|t} &= c + \phi_1 \hat{y}_{t+1|t} + \phi_2 y_{t} \\
&= 1.1 + 0.3 \times 1.41 – 0.4 \times 2.1 = 0.683
\end{align}
$$

$4)$
$y_{t-1}$の値が異なることから、全ての値が変わる。

問題3.5の解答例

$1)$
$1$期先点予測は下記を実行することで計算できる。

import numpy as np

mu = 0.1
theta = np.array([0.3, 0.4])
y = np.array([0.5, 1.1, 1.9, 0.7, 1.6, -0.3, 0.1, -0.4, 0.8, -0.1])

epsilon = np.zeros(y.shape[0]+2)
for i in range(y.shape[0]):
    epsilon[i+2] = y[i] - mu - theta[0]*epsilon[i+1] - theta[1]*epsilon[i]
    print(y[i])

y_pred = mu + theta[0]*epsilon[-1] + theta[1]*epsilon[-2]

print("Predicted y(t+1): {:.2f}".format(y_pred))

・実行結果

> print("Predicted y(t+1): {:.2f}".format(y_pred))
Predicted y(t+1): 0.32

$2)$
$2$期先点予測は下記のように計算できる。
$$
\large
\begin{align}
\hat{y}_{t+2} &= \mu + \theta_{2} \epsilon_{t} \\
&= 0.1 + 0.3 \times (-0.378…) \\
&= -0.0512…
\end{align}
$$

$3)$
$MA(2)$過程であるので、$\hat{y}_{t+3}=\mu=0.1$

$4)$
$1)$と$2)$の解答が変わる。

まとめ

Pythonを用いた回帰のプログラミング 〜単回帰、重回帰、ロジスティック回帰 etc〜

数式だけの解説ではわかりにくい場合もあると思われるので、統計学の手法や関連する概念をPythonのプログラミングで表現します。当記事では回帰の理解にあたって、単回帰、重回帰、ロジスティック回帰、プロビット回帰、ポアソン回帰などのPythonでの実装を取り扱いました。

・Pythonを用いた統計学のプログラミングまとめ
https://www.hello-statisticians.com/stat_program

線形回帰

単回帰のパラメータ推定

サンプルの生成

$y_i = 0.7 + 2.1x_i + \epsilon_i, \quad \epsilon_i \sim N(0,1)$に基づいてサンプルの生成を行い、散布図を描画するにあたっては、以下を実行すれば良い。

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

np.random.seed(0)

x = 10*np.random.rand(100)
y = 0.7 + 2.1*x + stats.norm.rvs(size=100)

plt.scatter(x,y)
plt.show()

・実行結果

パラメータ推定

$$
\large
\begin{align}
\hat{y}_i &= \beta_0 + \beta_1 x_i \\
\hat{\beta}_1 &= \frac{\sum(x-\bar{x})(y-\bar{y})}{\sum(x-\bar{x})^2} \\
\hat{\beta}_0 &= \bar{y} – \hat{\beta}_1 \bar{x}
\end{align}
$$

前項で生成を行ったxyに対して、上記で表した正規方程式の解に基づいて以下を実行することでパラメータ推定と回帰式の描画を行うことができる。

beta = np.zeros(2)

beta[1] = np.sum((x-np.mean(x))*(y-np.mean(y)))/np.sum((x-np.mean(x))**2)
beta[0] = np.mean(y) - beta[1]*np.mean(x)

print("Estimated (beta_0, beta_1): ({:.2f}, {:.2f})".format(beta[0],beta[1]))

plt.scatter(x,y,color="lightblue")
plt.plot(x,beta[0]+beta[1]*x,color="blue")
plt.show()

・実行結果

> print("Estimated (beta_0, beta_1): ({:.2f}, {:.2f})".format(beta[0],beta[1]))
Estimated (beta_0, beta_1): (0.92, 2.09)

上記では$y_i = 0.7 + 2.1x_i + \epsilon_i, \quad \epsilon_i \sim N(0,1)$に対して概ね正しい結果が得られたが、切片の値がやや異なるので、サンプルを$20,000$に変えて再度パラメータ推定を行うと下記のように精度が向上することが確認できる。

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

np.random.seed(0)

beta = np.zeros(2)

x = 10*np.random.rand(20000)
y = 0.7 + 2.1*x + stats.norm.rvs(size=20000)

beta[1] = np.sum((x-np.mean(x))*(y-np.mean(y)))/np.sum((x-np.mean(x))**2)
beta[0] = np.mean(y) - beta[1]*np.mean(x)

print("Estimated (beta_0, beta_1): ({:.2f}, {:.2f})".format(beta[0],beta[1]))

・実行結果

> print("Estimated (beta_0, beta_1): ({:.2f}, {:.2f})".format(beta[0],beta[1]))
Estimated (beta_0, beta_1): (0.70, 2.10)

回帰係数の統計的推測

・仮説検定

$y_i = \beta_{0} + \beta_{1} x_i$の推定値を$\hat{\beta}_{0}, \hat{\beta}_{1}$のように定義し、回帰式の傾きに関する帰無仮説を$H_0: \hat{\beta}_{1}=a$と設定すると、このときの検定統計量$t$は下記のように計算できる。
$$
\large
\begin{align}
t &= \frac{\hat{\beta}_1-a}{s.e.(\hat{\beta}_1)} \\
s.e.(\hat{\beta}_1) &= \frac{\sqrt{\sum_{i=1}^{n} \hat{\epsilon}_{i}^{2}/n-2}}{\sqrt{\sum_{i=1}^{n} (x_i-\bar{x})^2}}
\end{align}
$$

上記の検定統計量$t$は、サンプル数が$n$のとき自由度$n-2$の$t$分布$t(n-2)$に従う。ここでは前項の例に対し、$a=1.8, 2.02, 2.1, 2.15, 2.2$とおくとき帰無仮説が棄却されるか採択されるかをそれぞれ確認する。

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

np.random.seed(0)

a = np.array([1.8, 2.02, 2.1, 2.15, 2.2])
beta = np.zeros(2)

x = 10*np.random.rand(100)
y = 0.7 + 2.1*x + stats.norm.rvs(size=100)

beta[1] = np.sum((x-np.mean(x))*(y-np.mean(y)))/np.sum((x-np.mean(x))**2)
beta[0] = np.mean(y) - beta[1]*np.mean(x)

epsilon = y-(beta[0]+beta[1]*x)
s = np.sqrt(np.sum(epsilon**2)/(x.shape[0]-2.))

s_beta1 = s/np.sqrt(np.sum((x-np.mean(x))**2))
t = (beta[1]-a)/s_beta1

print("Estimated (beta_0, beta_1): ({:.2f}, {:.2f})".format(beta[0],beta[1]))
print("95% t-Limit: ({:.2f}, {:.2f})".format(stats.t.ppf(0.025,x.shape[0]-2),stats.t.ppf(0.975,x.shape[0]-2)))
for i in range(t.shape[0]):
    if t[i] < stats.t.ppf(0.025,x.shape[0]-2) or stats.t.ppf(0.975,x.shape[0]-2) < t[i]:
        print("a: {}, t: {:.3f}, {} H_0".format(a[i],t[i],"reject"))
    else:
        print("a: {}, t: {:.3f}, {} H_0".format(a[i],t[i],"accept"))

・実行結果

Estimated (beta_0, beta_1): (0.92, 2.09)
95% t-Limit: (-1.98, 1.98)
a: 1.8, t: 8.414, reject H_0
a: 2.02, t: 2.111, reject H_0
a: 2.1, t: -0.181, accept H_0
a: 2.15, t: -1.613, accept H_0
a: 2.2, t: -3.046, reject H_0

詳しくは下記などでも取り扱いを行った。
https://www.hello-statisticians.com/explain-books-cat/toukeigakunyuumon-akahon/ch13_practice.html

重回帰のパラメータ推定

サンプルの生成

$y_i = 0.3 + 2.5x_{i1} + 1.8x_{i2} + \epsilon_i, \quad \epsilon_i \sim N(0,1)$に基づいてサンプルの生成を行い、散布図を描画するにあたっては、以下を実行すれば良い。

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

np.random.seed(0)

x = 10*np.random.rand(500,3)
x[:,0] = 1.
y = 0.7 + 2.5*x[:,1] + 1.8*x[:,2] + stats.norm.rvs(size=500)

plt.subplot(1,2,1)
plt.scatter(x[:,1],y)
plt.subplot(1,2,2)
plt.scatter(x[:,2],y)
plt.show()

・実行結果

なお、xがデザイン行列になるように左の列の各行に対して、それぞれ1.の代入を行った。

パラメータ推定

$$
\large
\begin{align}
\hat{\mathbf{y}} &= \mathbf{X} \mathbf{\beta} \\
\hat{\mathbf{\beta}} &= (\mathbf{X}^{T}\mathbf{X})^{-1} \mathbf{X}^{T} \mathbf{y}
\end{align}
$$
前項で生成を行ったxyに対して、上記で表した正規方程式の解に基づいて以下を実行することでパラメータ推定を行うことができる。

beta = np.dot(np.linalg.inv(np.dot(x.T,x)), np.dot(x.T,y))

print("Estimated (beta_0, beta_1, beta_2): ({:.1f}, {:.2f}, {:.2f})".format(beta[0], beta[1], beta[2]))

・実行結果

> print("Estimated (beta_0, beta_1, beta_2): ({:.1f}, {:.2f}, {:.2f})".format(beta[0], beta[1], beta[2]))
Estimated (beta_0, beta_1, beta_2): (0.7, 2.51, 1.81)

質的回帰

ロジスティック回帰

パラメータ推定

観測値$(x_i,y_i)$に対してロジスティック回帰を用いるとき、対数尤度関数は下記のように表すことができる。
$$
\large
\begin{align}
\log{L(\beta_0,\beta_1)} &= \sum_{i=1}^{n} \left( y_i \log{p_i} + (1-y_i) \log{(1-p_i)} \right) \\
&= \sum_{i=1}^{n} \left( y_i \log \left( \frac{\exp(\beta_0+\beta_1x_i)}{1+\exp(\beta_0+\beta_1x_i)} \right) + (1-y_i) \log{ \left( \frac{1}{1+\exp(\beta_0+\beta_1x_i)} \right) } \right)
\end{align}
$$

ここで上記を$\beta_0,\beta_1$に関して偏微分を行うとそれぞれ下記が得られる。
$$
\large
\begin{align}
\frac{\partial \log{L(\beta_0,\beta_1)}}{\partial \beta_0} &= \sum_{i=1}^{n} (y_i – p_i) \\
\frac{\partial \log{L(\beta_0,\beta_1)}}{\partial \beta_1} &= \sum_{i=1}^{n} (y_i – p_i) x_i \\
p_i &= \frac{\exp(\beta_0+\beta_1x_i)}{1+\exp(\beta_0+\beta_1x_i)}
\end{align}
$$

上記の式を$\beta_0,\beta_1$に関して解くのは難しいので、勾配法やニュートン法などを用いることでパラメータ推定を行う。以下では$\beta_0=1,\beta_1=1$を初期値に設定し、勾配法を用いてパラメータ推定を行う。

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

np.random.seed(0)

x = np.linspace(-3.,3.,100)
y = x + 1.5*stats.norm.rvs(size=100)

y[y>=0] = 1.
y[y<0] = 0.

alpha = 0.02
beta = np.array([1., 1.])

for i in range(50):
    p = 1./(1.+np.exp(-(beta[0]+beta[1]*x)))
    beta[0] += alpha*np.sum(y-p)
    beta[1] += alpha*np.sum((y-p)*x)
    if (i+1)%10==0:
        print("Step.{}, (beta_0,beta_1): ({:2f}, {:.2f})".format(i+1,beta[0],beta[1]))

plt.scatter(x,y,color="lightgreen")
plt.plot(x,p,color="green")
plt.show()

・実行結果

Step.10, (beta_0,beta_1): (0.148453, 0.97)
Step.20, (beta_0,beta_1): (-0.024882, 0.94)
Step.30, (beta_0,beta_1): (-0.056919, 0.94)
Step.40, (beta_0,beta_1): (-0.062806, 0.94)
Step.50, (beta_0,beta_1): (-0.063890, 0.94)

上記のように勾配法を用いることでロジスティック回帰のパラメータの推定を行うことができる。

・勾配の導出の詳細
ロジスティック回帰の対数尤度の導出

合成関数の微分とロジスティック回帰のパラメータ推定

オッズ比の計算

プロビット回帰

パラメータ推定

標準正規分布の確率密度関数を$\varphi(x)$、累積分布関数を$\Phi(x)$とおく。観測値$(x_i,y_i)$に対してプロビット回帰を用いるとき、対数尤度関数は下記のように表すことができる。
$$
\large
\begin{align}
\log{L(\beta_0,\beta_1)} = \sum_{i=1}^{n} \left( y_i \log{\Phi(\beta_0 + \beta_1 x_i)} + (1-y_i) \log{(1-\Phi(\beta_0 + \beta_1 x_i))} \right)
\end{align}
$$

ここで上記を$\beta_0,\beta_1$に関して偏微分を行うとそれぞれ下記が得られる。
$$
\large
\begin{align}
\frac{\partial \log{L(\beta_0,\beta_1)}}{\partial \beta_0} &= \sum_{i=1}^{n} \left( \frac{y_i \varphi(\beta_0+\beta_1x_i)}{\Phi(\beta_0+\beta_1x_i)} – \frac{(1-y_i) \varphi(\beta_0+\beta_1x_i)}{1-\Phi(\beta_0+\beta_1x_i)} \right) \\
\frac{\partial \log{L(\beta_0,\beta_1)}}{\partial \beta_1} &= \sum_{i=1}^{n} \left( \frac{y_i \varphi(\beta_0+\beta_1x_i)}{\Phi(\beta_0+\beta_1x_i)} – \frac{(1-y_i) \varphi(\beta_0+\beta_1x_i)}{1-\Phi(\beta_0+\beta_1x_i)} \right)x_i
\end{align}
$$

上記の式を$\beta_0,\beta_1$に関して解くのは難しいので、勾配法やニュートン法などを用いることでパラメータ推定を行う。以下では$\beta_0=1,\beta_1=1$を初期値に設定し、勾配法を用いてパラメータ推定を行う。

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

np.random.seed(0)

x = np.linspace(-3.,3.,100)
y = x + 1.5*stats.norm.rvs(size=100)

y[y>=0] = 1.
y[y<0] = 0.

alpha = 0.02
beta = np.array([1., 1.])

for i in range(50):
    linear_pred = beta[0]+beta[1]*x
    lp_pdf, lp_cdf = stats.norm.pdf(linear_pred), stats.norm.cdf(linear_pred)
    beta[0] += alpha*np.sum(y*lp_pdf/lp_cdf - (1-y)*lp_pdf/(1-lp_cdf))
    beta[1] += alpha*np.sum((y*lp_pdf/lp_cdf - (1-y)*lp_pdf/(1-lp_cdf))*x)
    if (i+1)%10==0:
        print("Step.{}, (beta_0,beta_1): ({:2f}, {:.2f})".format(i+1,beta[0],beta[1]))

plt.scatter(x,y,color="lightgreen")
plt.plot(x,lp_cdf,color="green")
plt.show()

・実行結果

Step.10, (beta_0,beta_1): (-0.015828, 0.64)
Step.20, (beta_0,beta_1): (-0.025181, 0.90)
Step.30, (beta_0,beta_1): (-0.028015, 0.97)
Step.40, (beta_0,beta_1): (-0.028060, 0.97)
Step.50, (beta_0,beta_1): (-0.028060, 0.97)

離散値の回帰

ポアソン回帰

観測値$(x_i,y_i)$に対してポアソン回帰を用いるとき、対数尤度関数は下記のように表すことができる。
$$
\large
\begin{align}
\log{L(\beta_0,\beta_1)} &= \sum_{i=1}^{n} ( y_i \log{\lambda_i} – \lambda_i – \log{y_i!} ) \\
\log{\lambda_i} &= \beta_0 + \beta_1 x_i
\end{align}
$$

ここで上記を$\beta_0,\beta_1$に関して偏微分を行うとそれぞれ下記が得られる。
$$
\large
\begin{align}
\frac{\partial \log{L(\beta_0,\beta_1)}}{\partial \beta_0} &= \sum_{i=1}^{n} \left( y_i – \exp(\beta_0+\beta_1x_i) \right) \\
\frac{\partial \log{L(\beta_0,\beta_1)}}{\partial \beta_1} &= \sum_{i=1}^{n} \left( y_i – \exp(\beta_0+\beta_1x_i) \right) x_i
\end{align}
$$

上記の式を$\beta_0,\beta_1$に関して解くのは難しいので、勾配法やニュートン法などを用いることでパラメータ推定を行う。以下では$\beta_0=0,\beta_1=0$を初期値に設定し、勾配法を用いてパラメータ推定を行う。

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

np.random.seed(0)

pop_beta = np.array([0.5, 0.8])
x = np.linspace(-3.,3.,100)
y = stats.poisson.rvs(np.exp(pop_beta[0]+pop_beta[1]*x))

alpha = 0.001
beta = np.array([0., 0.])

for i in range(100):
    grad_ = y-np.exp(beta[0]+beta[1]*x)
    beta[0] += alpha*np.sum(grad_)
    beta[1] += alpha*np.sum((grad_)*x)
    if (i+1)%20==0:
        print("Step.{}, (beta_0,beta_1): ({:2f}, {:.2f})".format(i+1,beta[0],beta[1]))

plt.scatter(x,y,color="lightgreen")
plt.plot(x,np.exp(beta[0]+beta[1]*x),color="green")
plt.show()

・実行結果

Step.20, (beta_0,beta_1): (0.428261, 0.81)
Step.40, (beta_0,beta_1): (0.442874, 0.79)
Step.60, (beta_0,beta_1): (0.445618, 0.79)
Step.80, (beta_0,beta_1): (0.446100, 0.79)
Step.100, (beta_0,beta_1): (0.446182, 0.79)

上記のように勾配法を用いることで概ね正しいパラメータを推定できることが確認できる。

・勾配の導出の詳細
ポアソン回帰の対数尤度と勾配の導出

Ch.6 「経済分析における回帰分析」の章末問題の解答例 〜基礎統計学Ⅱ 人文・社会科学の統計学〜

当記事は「基礎統計学Ⅱ 人文・社会科学の統計学(東京大学出版会)」の読解サポートにあたってChapter.6の「経済分析における回帰分析」の章末問題の解説について行います。
基本的には書籍の購入者向けの解説なので、まだ入手されていない方は下記より入手をご検討ください。また、解説はあくまでサイト運営者が独自に作成したものであり、書籍の公式ページではないことにご注意ください。(そのため著者の意図とは異なる解説となる可能性はあります)

・解答まとめ
https://www.hello-statisticians.com/answer_textbook_stat_basic_1-3#green

章末の演習問題について

問題6.1の解答例

問題6.2の解答例

下記を実行することで回帰式の係数$\alpha, \beta, \gamma, \delta$と相関係数$r_{XY}, r_{ZY}$を計算することができる。

import numpy as np

x = np.array([7.7, 8.4, 9.6, 10.9, 10.4, 10.7, 11.7, 11.9]) 
y = np.array([73.4, 77.2, 84.6, 93.0, 92.5, 93.8, 99.9, 105.4])
z = np.array([30.6, 32.3, 35.0, 38.0, 38.8, 40.7, 42.0, 44.0])

beta = np.sum((y-np.mean(y))*(x-np.mean(x)))/np.sum((y-np.mean(y))**2)
delta = np.sum((y-np.mean(y))*(z-np.mean(z)))/np.sum((y-np.mean(y))**2)

alpha = np.mean(x)-beta*np.mean(y)
gamma = np.mean(z)-delta*np.mean(y)

r_xy = np.sum((y-np.mean(y))*(x-np.mean(x)))/np.sqrt(np.sum((y-np.mean(y))**2)*np.sum((x-np.mean(x))**2))
r_zy = np.sum((y-np.mean(y))*(z-np.mean(z)))/np.sqrt(np.sum((y-np.mean(y))**2)*np.sum((z-np.mean(z))**2))

print("(alpha,beta): ({:.2f},{:.3f})".format(alpha,beta))
print("(gamma,delta): ({:.2f},{:.2f})".format(gamma,delta))
print("(r_xy,r_zy): ({:.2f},{:.2f})".format(r_xy,r_zy))

・実行結果

> print("(alpha,beta): ({:.2f},{:.3f})".format(alpha,beta))
(alpha,beta): (-2.07,0.136)
> print("(gamma,delta): ({:.2f},{:.2f})".format(gamma,delta))
(gamma,delta): (-0.78,0.43)
> print("(r_xy,r_zy): ({:.2f},{:.2f})".format(r_xy,r_zy))
(r_xy,r_zy): (0.99,0.99)

問題6.3の解答例

i)
下記を実行することで、回帰式$y = \beta_0 + \beta_1 x_1$のパラメータ推定を行うことができる。

import numpy as np

beta = np.zeros(2)

x = np.array([[27464., 4.47], [29810., 4.44], [31824., 4.46], [34122., 4.41], [37708., 4.38], [41807., 4.22], [46930., 4.17], [52116., 4.17], [58104., 4.13], [62340., 4.11], [68468., 4.05], [75429., 4.01], [82601., 3.94], [92406., 3.86]]) 
y = np.array([24231., 26092., 27799., 29375., 32093., 34896., 39339., 43927., 48324., 51859., 56515., 61918., 67402., 74760.])

beta[1] = np.sum((x[:,0]-np.mean(x[:,0]))*(y-np.mean(y)))/np.sum((x[:,0]-np.mean(x[:,0]))**2) 
beta[0] = np.mean(y) - beta[1]*np.mean(x[:,0])

print("Estimated (beta_0, beta_1): ({:.1f}, {:.2f})".format(beta[0], beta[1]))

・実行結果

> print("Estimated (beta_0, beta_1): ({:.1f}, {:.2f})".format(beta[0], beta[1]))
Estimated (beta_0, beta_1): (2700.3, 0.78)

ⅱ)
下記を実行することで、回帰式$y = \beta_0 + \beta_1 x_1 + \beta_2 x_2$のパラメータ推定を行うことができる。

import numpy as np

X = np.array([[1., 27464., 4.47], [1., 29810., 4.44], [1., 31824., 4.46], [1., 34122., 4.41], [1., 37708., 4.38], [1., 41807., 4.22], [1., 46930., 4.17], [1., 52116., 4.17], [1., 58104., 4.13], [1., 62340., 4.11], [1., 68468., 4.05], [1., 75429., 4.01], [1., 82601., 3.94], [1., 92406., 3.86]]) 
y = np.array([24231., 26092., 27799., 29375., 32093., 34896., 39339., 43927., 48324., 51859., 56515., 61918., 67402., 74760.])

beta = np.dot(np.linalg.inv(np.dot(X.T,X)), np.dot(X.T,y))

print("Estimated (beta_0, beta_1, beta[2]): ({:.1f}, {:.2f}, {:.2f})".format(beta[0], beta[1], beta[2]))

・実行結果

> print("Estimated (beta_0, beta_1): ({:.1f}, {:.2f})".format(beta[0], beta[1]))
Estimated (beta_0, beta_1, beta[2]): (-3805.9, 0.80, 1383.99)

まとめ

Ch.1 「統計学とデータ」の章末問題の解答例 〜基礎統計学Ⅱ 人文・社会科学の統計学〜

当記事は「基礎統計学Ⅱ 人文・社会科学の統計学(東京大学出版会)」の読解サポートにあたってChapter.1の「統計学とデータ」の章末問題の解説について行います。
※ 基本的には書籍の購入者向けの解説なので、まだ入手されていない方は下記より入手をご検討ください。また、解説はあくまでサイト運営者が独自に作成したものであり、書籍の公式ページではないことにご注意ください。(そのため著者の意図とは異なる解説となる可能性はあります)

・解答まとめ
https://www.hello-statisticians.com/answer_textbook_stat_basic_1-3#green

章末の演習問題について

問題1.1の解答例

問題1.2の解答例

該当グループ以外か、ランダムサンプリングによって標本を作成し、仮説が正しいかを検証する必要がある。

問題1.3の解答例

中庸な回答が選ばれやすいことや、直前に確認した概況などによって回答が異なる場合があることに注意が必要である。また、賛否を調査する必要があるかも予め検討する必要がある。

問題1.4の解答例

問題1.5の解答例

i)
それぞれ下記のように計算できる。
a)
$$
\large
\begin{align}
\frac{{}_7 C_3}{{}_{10} C_3} &= \frac{7 \cdot 6 \cdot 5}{3 \cdot 2 \cdot 1} \times \frac{3 \cdot 2 \cdot 1}{10 \cdot 9 \cdot 8} \\
&= \frac{7}{24}
\end{align}
$$

b)
$$
\large
\begin{align}
\frac{{}_7 C_2 \times {}_3 C_1}{{}_{10} C_3} &= \frac{7 \cdot 6}{2 \cdot 1} \times \frac{3}{1} \times \frac{3 \cdot 2 \cdot 1}{10 \cdot 9 \cdot 8} \\
&= \frac{21}{40}
\end{align}
$$

c)
$$
\large
\begin{align}
\frac{{}_7 C_1 \times {}_3 C_2}{{}_{10} C_3} &= \frac{7}{1} \times \frac{3 \cdot 2}{2 \cdot 1} \times \frac{3 \cdot 2 \cdot 1}{10 \cdot 9 \cdot 8} \\
&= \frac{7}{40}
\end{align}
$$

d)
$$
\large
\begin{align}
\frac{{}_3 C_3}{{}_{10} C_3} &= \frac{3 \cdot 2 \cdot 1}{10 \cdot 9 \cdot 8} \\
&= \frac{7}{40}
\end{align}
$$

ⅱ)
期待値は下記のように計算できる。
$$
\large
\begin{align}
1 \times \frac{21}{40} + 2 \times \frac{7}{40} + 3 \times \frac{1}{120} &= \frac{21 + 14 + 1}{40} \\
&= \frac{36}{40} = \frac{9}{10}
\end{align}
$$

問題1.6の解答例

図$1.9$の議論より、偏りのないコインを$100$回投げる場合、期待値$100 \times 0.5 = 50$、標準偏差$\sqrt{100 \times 0.5 \times (1-0.5)} = 5$が計算される。

これより標準化を行うと$z=3$が得られるが、これに対応する$P$値は$0.00135$であり、$1,000$回に$1$〜$2$回ほど起こる希少な事象であることが確認できる。

問題1.7の解答例

i)
標本平均$\bar{x}$と不偏標本分散$s^2$は下記を実行することで得られる。

import numpy as np

x = np.array([24.2, 25.3, 26.2, 25.7, 24.4, 25.1, 25.6])
mean_x = np.mean(x)
s2 = np.sum((x-mean_x)**2)/(x.shape[0]-1)

print("Mean x: {:.2f}".format(mean_x))
print("Variance: {:.2f}".format(s2))

・実行結果

> print("Mean x: {:.2f}".format(mean_x))
Mean x: 25.21
> print("Variance: {:.2f}".format(s2))
Variance: 0.51

ⅱ)
$t$統計量は下記を実行することで得られる。

mu = 25. 

t = (mean_x-mu)/(np.sqrt(s2/x.shape[0]))

print("t_statistic: {:.3f}".format(t))

・実行結果

> print("t_statistic: {:.3f}".format(t))
t_statistic: 0.793

ⅲ)
下記を実行することで有意確率を計算することができる。

from scipy import stats

alpha = 1 - stats.t.cdf(t, x.shape[0]-1)

print("Significance probability: {:.2f}".format(alpha))

・実行結果

> print("Significance probability: {:.2f}".format(alpha))
Significance probability: 0.23

iv)
ⅲ)より$P$値が$0.05$より大きいので帰無仮説$H_0: \mu=25$は棄却されない。

問題1.8の解答例

i)
下記を実行することで期待件数や$\chi^2$値を計算することができる。

import numpy as np

x = np.array([435., 293., 106.])
y = np.array([41., 23., 15.])

p = x/np.sum(x)
y_expected = np.sum(y)*p

chi2 = np.sum((y-y_expected)**2/y_expected)

print("Expected y: ({:.2f}, {:.2f}, {:.2f})".format(y_expected[0], y_expected[1], y_expected[2]))
print("chi^2: {:.2f}".format(chi2))

・実行件数

> print("Expected y: ({:.2f}, {:.2f}, {:.2f})".format(y_expected[0], y_expected[1], y_expected[2]))
Expected y: (41.21, 27.75, 10.04)
> print("chi^2: {:.2f}".format(chi2))
chi^2: 3.26

ⅱ)
i)で計算した$\chi^2$値の有意確率は、scipy.stats.chi2.cdfを用いて下記のように計算できる。

from scipy import stats

alpha = 1 - stats.chi2.cdf(chi2,x.shape[0]-1)

print("Significance probability: {:.5f}".format(alpha))

・実行結果

> print("Significance probability: {:.5f}".format(alpha))
Significance probability: 0.19546

ⅲ)
帰無仮説$H_0$に「xの確率に沿ってyが生じる」をおくと、$P$値が$0.05$より大きいことより、帰無仮説は棄却されないことがわかる。

まとめ

Ch.2 「1次元のデータ」の章末問題の解答例 〜基礎統計学Ⅰ 統計学入門(東京大学出版会)〜

当記事は「基礎統計学Ⅰ 統計学入門(東京大学出版会)」の読解サポートにあたってChapter.2の「$1$次元のデータ」の章末問題の解説について行います。
※ 基本的には書籍の購入者向けの解説なので、まだ入手されていない方は下記より入手をご検討ください。また、解説はあくまでサイト運営者が独自に作成したものであり、書籍の公式ページではないことにご注意ください。(そのため著者の意図とは異なる解説となる可能性はあります)

・解答まとめ
https://www.hello-statisticians.com/answer_textbook_stat_basic_1-3#red

章末の演習問題について

問題2.1の解答例

問題2.2の解答例

下記を実行することで平均差とジニ係数の計算を行うことができる。

import numpy as np

A = np.array([0., 3., 3., 5., 5., 5., 5., 7., 7., 10.])
B = np.array([0., 1., 2., 3., 5., 5., 7., 8., 9., 10.])
C = np.array([3., 4., 4., 5., 5., 5., 5., 6., 6., 7.])

diff_A, diff_B, diff_C = 0., 0., 0.
for i in range(10):
    for j in range(10):
        diff_A += np.abs(A[i]-A[j])/100.
        diff_B += np.abs(B[i]-B[j])/100.
        diff_C += np.abs(C[i]-C[j])/100.

gini_A = diff_A/(2.*np.mean(A))
gini_B = diff_B/(2.*np.mean(B))
gini_C = diff_C/(2.*np.mean(C))

print("diff_A: {:.2f}, diff_B: {:.2f}, diff_C: {:.2f}".format(diff_A,diff_B,diff_C))
print("gini_A: {:.3f}, gini_B: {:.3f}, gini_C: {:.3f}".format(gini_A,gini_B,gini_C))

・実行結果

> print("diff_A: {:.2f}, diff_B: {:.2f}, diff_C: {:.2f}".format(diff_A,diff_B,diff_C))
diff_A: 2.76, diff_B: 3.76, diff_C: 1.20
> print("gini_A: {:.3f}, gini_B: {:.3f}, gini_C: {:.3f}".format(gini_A,gini_B,gini_C))
gini_A: 0.276, gini_B: 0.376, gini_C: 0.120

問題2.3の解答例

下記を実行することでエントロピーの計算を行うことができる。

import numpy as np

res_recent = np.array([32., 19., 10., 24., 15.])
res_previous = np.array([28., 13., 18., 29., 12.])

prob_recent = res_recent/np.sum(res_recent)
prob_previous = res_previous/np.sum(res_previous)

entropy_recent = np.sum(-prob_recent*np.log10(prob_recent))
entropy_previous = np.sum(-prob_previous*np.log10(prob_previous))

print("Recent entropy: {:.3f}".format(entropy_recent))
print("Previous entropy: {:.3f}".format(entropy_previous))

・実行結果

> print("Recent entropy: {.3f}".format(entropy_recent))
Recent entropy: 0.668
> print("Previous entropy: {.3f}".format(entropy_previous))
Previous entropy: 0.670

計算結果より、集中度合いは緩和していないことが確認できる。また、巻末の解答と結果を合わせるにあたって、エントロピーの計算には常用対数を用いた。

問題2.4の解答例

下記を実行することで標準得点$z_i$と、偏差値得点$T_i=10z_i+50$を計算することができる。

import numpy as np

B = np.array([0., 1., 2., 3., 5., 5., 7., 8., 9., 10.])

s = np.sqrt(np.sum((B-np.mean(B))**2)/B.shape[0])
z = (B-np.mean(B))/s
T = 10.*z + 50.

print("z: {}".format(z))
print("T: {}".format(T))

・実行結果

> print("z: {}".format(z))
z: [-1.52145155 -1.21716124 -0.91287093 -0.60858062  0.          0.
  0.60858062  0.91287093  1.21716124  1.52145155]
> print("T: {}".format(T))
T: [ 34.78548451  37.82838761  40.87129071  43.91419381  50.          50.
  56.08580619  59.12870929  62.17161239  65.21451549]

まとめ