├── .gitattributes ├── .gitignore ├── README.md ├── data ├── Y.RData ├── d.RData ├── d1.csv ├── data2.RData ├── data3.csv ├── data6a.csv ├── data6b.csv ├── data6c.csv ├── data7.csv ├── data7a.csv └── dummydata.csv ├── figs └── glmdevelopment.svg └── notes ├── chapter2.Rmd ├── chapter2.html ├── chapter3.Rmd ├── chapter3.html ├── chapter4.Rmd ├── chapter4.html ├── chapter5.Rmd ├── chapter5.html ├── chapter6.Rmd ├── chapter6.html ├── chapter7.Rmd └── chapter7.html /.gitattributes: -------------------------------------------------------------------------------- 1 | *.Rmd linguist-detectable=true 2 | *.html linguist-generated=true 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | kubobook_2012/ 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 『データ解析のための統計モデリング入門』 - aviatesk 2 | 3 | [久保拓弥『データ解析のための統計モデリング入門: 一般化線形モデル・階層ベイズモデル・MCMC』][kubopage]を勉強したときのノートを, [R-markdown]を用いて出力したHTLMファイルとしてまとめています. 4 | 5 | [全てのデータ][data]および[ノート][notes]に含まれるコードの大部分は, [久保さんのwebページ][kubopage]で公開されているものによります. 6 | 7 | 8 |

TOC

9 | 10 | 11 | 12 | 13 | * [Tasks](#tasks) 14 | * [Who I am](#who-i-am) 15 | * [References](#references) 16 | 17 | 18 | 19 | 20 | 21 | ## Tasks 22 | 23 | - [x] Setups(R, R-markdown, [Atom]) 24 | - [x] [Chapter 2](notes/chapter2.Rmd): 確率分布と統計モデルの最尤推定 25 | - [x] [Chapter 3](notes/chapter3.Rmd): 一般化線形モデル(GLM) ― ポアソン回帰 ― 26 | - [x] [Chapter 4](notes/chapter4.Rmd): GLMのモデル選択 ― AICとモデルの予測の良さ ― 27 | - [x] [Chapter 5](notes/chapter5.Rmd): GLMの尤度比検定と検定の枠組み 28 | - [x] [Chapter 6](notes/chapter6.Rmd): GLMの応用範囲を広げる ― ロジスティック回帰など ― 29 | - [x] [Chapter 7](notes/chapter7.Rmd): 一般化線形モデル(GLMM) ― 個体差のモデリング ― 30 | - [ ] Chapter 8: マルコフ連鎖モンテカルロ(MCMC)法とベイズ統計モデル 31 | - [ ] Chapter 9: GLMのベイズモデル化と事後分布の推定 32 | - [ ] WINBUGS部分を, [Tensorflow probability][tfp] あるいは [PyMC3][pymc3] を使ってを置き換え 33 | - [ ] Chapter 10: 階層ベイズモデル ― GLMMのベイズモデル化 ― 34 | - [ ] Chapter 11: 空間構造のある階層ベイズモデル 35 | 36 | 37 | ## Who I am 38 | 39 | - **KADOWAKI, Shuhei** - *Undergraduate@Kyoto Univ.* - [aviatesk][aviatesk] 40 | 41 | 42 | ## References 43 | 44 | - [久保拓弥, 『データ解析のための統計モデリング入門: 一般化線形モデル・階層ベイズモデル・MCMC』, 2012年, 岩波書店][kubopage] 45 | 46 | 47 | 48 | 49 | 50 | [aviatesk]: https://github.com/aviatesk 51 | [kubopage]: http://hosho.ees.hokudai.ac.jp/~kubo/ce/IwanamiBook.html 52 | [R-markdown]: https://rmarkdown.rstudio.com/ 53 | [data]: ./data/ 54 | [figs]: ./figs/ 55 | [notes]: ./notes/ 56 | [atom]: https://github.com/aviatesk/avi-atom 57 | [tfp]: https://www.tensorflow.org/probability/ 58 | [pymc3]: https://docs.pymc.io/ 59 | -------------------------------------------------------------------------------- /data/Y.RData: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aviatesk/intro-statistical-modeling/706acb7c9a2400a5a3140409ad7dfe1f9b5a8019/data/Y.RData -------------------------------------------------------------------------------- /data/d.RData: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aviatesk/intro-statistical-modeling/706acb7c9a2400a5a3140409ad7dfe1f9b5a8019/data/d.RData -------------------------------------------------------------------------------- /data/d1.csv: -------------------------------------------------------------------------------- 1 | id,pot,f,y 2 | 1,A,C,6 3 | 2,A,C,3 4 | 3,A,C,19 5 | 4,A,C,5 6 | 5,A,C,0 7 | 6,A,C,19 8 | 7,A,C,4 9 | 8,A,C,8 10 | 9,A,C,12 11 | 10,A,C,8 12 | 11,B,C,0 13 | 12,B,C,1 14 | 13,B,C,1 15 | 14,B,C,5 16 | 15,B,C,7 17 | 16,B,C,4 18 | 17,B,C,0 19 | 18,B,C,4 20 | 19,B,C,2 21 | 20,B,C,23 22 | 21,C,C,2 23 | 22,C,C,1 24 | 23,C,C,4 25 | 24,C,C,3 26 | 25,C,C,4 27 | 26,C,C,0 28 | 27,C,C,1 29 | 28,C,C,1 30 | 29,C,C,3 31 | 30,C,C,6 32 | 31,D,C,27 33 | 32,D,C,3 34 | 33,D,C,29 35 | 34,D,C,17 36 | 35,D,C,1 37 | 36,D,C,16 38 | 37,D,C,16 39 | 38,D,C,6 40 | 39,D,C,4 41 | 40,D,C,8 42 | 41,E,C,6 43 | 42,E,C,16 44 | 43,E,C,8 45 | 44,E,C,3 46 | 45,E,C,2 47 | 46,E,C,8 48 | 47,E,C,4 49 | 48,E,C,0 50 | 49,E,C,0 51 | 50,E,C,2 52 | 51,F,T,2 53 | 52,F,T,2 54 | 53,F,T,0 55 | 54,F,T,0 56 | 55,F,T,1 57 | 56,F,T,0 58 | 57,F,T,0 59 | 58,F,T,1 60 | 59,F,T,0 61 | 60,F,T,1 62 | 61,G,T,11 63 | 62,G,T,2 64 | 63,G,T,2 65 | 64,G,T,18 66 | 65,G,T,3 67 | 66,G,T,8 68 | 67,G,T,7 69 | 68,G,T,3 70 | 69,G,T,1 71 | 70,G,T,0 72 | 71,H,T,7 73 | 72,H,T,0 74 | 73,H,T,0 75 | 74,H,T,0 76 | 75,H,T,1 77 | 76,H,T,1 78 | 77,H,T,0 79 | 78,H,T,0 80 | 79,H,T,1 81 | 80,H,T,1 82 | 81,I,T,10 83 | 82,I,T,2 84 | 83,I,T,11 85 | 84,I,T,4 86 | 85,I,T,3 87 | 86,I,T,16 88 | 87,I,T,4 89 | 88,I,T,37 90 | 89,I,T,5 91 | 90,I,T,19 92 | 91,J,T,27 93 | 92,J,T,1 94 | 93,J,T,1 95 | 94,J,T,2 96 | 95,J,T,0 97 | 96,J,T,1 98 | 97,J,T,1 99 | 98,J,T,2 100 | 99,J,T,1 101 | 100,J,T,0 102 | -------------------------------------------------------------------------------- /data/data2.RData: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aviatesk/intro-statistical-modeling/706acb7c9a2400a5a3140409ad7dfe1f9b5a8019/data/data2.RData -------------------------------------------------------------------------------- /data/data3.csv: -------------------------------------------------------------------------------- 1 | y,x,f 2 | 6,8.31,C 3 | 6,9.44,C 4 | 6,9.5,C 5 | 12,9.07,C 6 | 10,10.16,C 7 | 4,8.32,C 8 | 9,10.61,C 9 | 9,10.06,C 10 | 9,9.93,C 11 | 11,10.43,C 12 | 6,10.36,C 13 | 10,10.15,C 14 | 6,10.92,C 15 | 10,8.85,C 16 | 11,9.42,C 17 | 8,11.11,C 18 | 3,8.02,C 19 | 8,11.93,C 20 | 5,8.55,C 21 | 5,7.19,C 22 | 4,9.83,C 23 | 11,10.79,C 24 | 5,8.89,C 25 | 10,10.09,C 26 | 6,11.63,C 27 | 6,10.21,C 28 | 7,9.45,C 29 | 9,10.44,C 30 | 3,9.44,C 31 | 10,10.48,C 32 | 2,9.43,C 33 | 9,10.32,C 34 | 10,10.33,C 35 | 5,8.5,C 36 | 11,9.41,C 37 | 10,8.96,C 38 | 4,9.67,C 39 | 8,10.26,C 40 | 9,10.36,C 41 | 12,11.8,C 42 | 8,10.94,C 43 | 9,10.25,C 44 | 8,8.74,C 45 | 6,10.46,C 46 | 6,9.37,C 47 | 10,9.74,C 48 | 10,8.95,C 49 | 9,8.74,C 50 | 12,11.32,C 51 | 6,9.25,C 52 | 14,10.14,T 53 | 6,9.05,T 54 | 7,9.89,T 55 | 9,8.76,T 56 | 6,12.04,T 57 | 7,9.91,T 58 | 9,9.84,T 59 | 13,11.87,T 60 | 9,10.16,T 61 | 13,9.34,T 62 | 7,10.17,T 63 | 8,10.99,T 64 | 10,9.19,T 65 | 7,10.67,T 66 | 12,10.96,T 67 | 6,10.55,T 68 | 15,9.69,T 69 | 3,10.91,T 70 | 4,9.6,T 71 | 6,12.37,T 72 | 10,10.54,T 73 | 8,11.3,T 74 | 8,12.4,T 75 | 7,10.18,T 76 | 5,9.53,T 77 | 6,10.24,T 78 | 8,11.76,T 79 | 9,9.52,T 80 | 9,10.4,T 81 | 6,9.96,T 82 | 7,10.3,T 83 | 10,11.54,T 84 | 6,9.42,T 85 | 11,11.28,T 86 | 11,9.73,T 87 | 11,10.78,T 88 | 5,10.21,T 89 | 6,10.51,T 90 | 4,10.73,T 91 | 5,8.85,T 92 | 6,11.2,T 93 | 5,9.86,T 94 | 8,11.54,T 95 | 5,10.03,T 96 | 9,11.88,T 97 | 8,9.15,T 98 | 6,8.52,T 99 | 8,10.24,T 100 | 7,10.86,T 101 | 9,9.97,T 102 | -------------------------------------------------------------------------------- /data/data6a.csv: -------------------------------------------------------------------------------- 1 | N,y,x,f 2 | 8,1,9.76,C 3 | 8,6,10.48,C 4 | 8,5,10.83,C 5 | 8,6,10.94,C 6 | 8,1,9.37,C 7 | 8,1,8.81,C 8 | 8,3,9.49,C 9 | 8,6,11.02,C 10 | 8,0,7.97,C 11 | 8,8,11.55,C 12 | 8,0,9.46,C 13 | 8,2,9.47,C 14 | 8,0,8.71,C 15 | 8,5,10.42,C 16 | 8,3,10.06,C 17 | 8,6,11,C 18 | 8,3,9.95,C 19 | 8,4,9.52,C 20 | 8,5,10.26,C 21 | 8,8,11.33,C 22 | 8,5,9.77,C 23 | 8,8,10.59,C 24 | 8,1,9.35,C 25 | 8,4,10,C 26 | 8,1,9.53,C 27 | 8,8,12.06,C 28 | 8,4,9.68,C 29 | 8,7,11.32,C 30 | 8,5,10.48,C 31 | 8,5,10.37,C 32 | 8,8,11.33,C 33 | 8,1,9.42,C 34 | 8,7,10.68,C 35 | 8,1,7.91,C 36 | 8,3,9.39,C 37 | 8,8,11.65,C 38 | 8,6,10.66,C 39 | 8,7,11.23,C 40 | 8,7,10.57,C 41 | 8,4,10.42,C 42 | 8,7,11.73,C 43 | 8,8,12.02,C 44 | 8,8,11.55,C 45 | 8,0,8.58,C 46 | 8,6,11.08,C 47 | 8,5,10.49,C 48 | 8,8,11.12,C 49 | 8,3,8.99,C 50 | 8,8,10.08,C 51 | 8,8,10.8,C 52 | 8,0,7.83,T 53 | 8,5,8.88,T 54 | 8,5,9.74,T 55 | 8,8,9.98,T 56 | 8,3,8.46,T 57 | 8,2,7.96,T 58 | 8,7,9.78,T 59 | 8,8,11.93,T 60 | 8,3,9.04,T 61 | 8,5,10.14,T 62 | 8,8,11.01,T 63 | 8,3,8.88,T 64 | 8,6,9.68,T 65 | 8,7,9.8,T 66 | 8,8,10.76,T 67 | 8,6,9.81,T 68 | 8,5,8.37,T 69 | 8,5,9.38,T 70 | 8,0,7.68,T 71 | 8,8,10.23,T 72 | 8,8,9.83,T 73 | 8,0,7.66,T 74 | 8,6,9.33,T 75 | 8,1,8.2,T 76 | 8,8,9.54,T 77 | 8,8,10.55,T 78 | 8,6,9.88,T 79 | 8,6,9.34,T 80 | 8,6,10.38,T 81 | 8,6,9.63,T 82 | 8,8,12.44,T 83 | 8,8,10.17,T 84 | 8,7,9.29,T 85 | 8,8,11.17,T 86 | 8,6,9.13,T 87 | 8,2,8.79,T 88 | 8,0,8.19,T 89 | 8,7,10.25,T 90 | 8,8,11.3,T 91 | 8,8,10.84,T 92 | 8,8,10.97,T 93 | 8,3,8.6,T 94 | 8,7,9.91,T 95 | 8,8,11.38,T 96 | 8,8,10.39,T 97 | 8,7,10.45,T 98 | 8,0,8.94,T 99 | 8,5,8.94,T 100 | 8,8,10.14,T 101 | 8,1,8.5,T 102 | -------------------------------------------------------------------------------- /data/data6b.csv: -------------------------------------------------------------------------------- 1 | y,x,A 2 | 57,0.68,10.3 3 | 64,0.27,15.6 4 | 49,0.46,10 5 | 64,0.45,14.9 6 | 82,0.74,14 7 | 29,0.15,9.6 8 | 37,0.5,11.8 9 | 33,0.57,6.8 10 | 61,0.79,11.8 11 | 46,0.57,9.5 12 | 61,0.8,10.5 13 | 30,0.62,6.8 14 | 45,0.84,6.4 15 | 21,0.36,6 16 | 39,0.49,11.9 17 | 43,0.57,10.1 18 | 54,0.55,12 19 | 24,0.13,9 20 | 33,0.65,7.1 21 | 39,0.62,7.4 22 | 53,0.52,12.4 23 | 44,0.64,8.3 24 | 50,0.42,12.1 25 | 52,0.67,8.4 26 | 59,0.52,11.4 27 | 33,0.19,11.5 28 | 38,0.58,9 29 | 46,0.48,10.5 30 | 30,0.22,9.6 31 | 35,0.24,11.9 32 | 68,0.55,16.2 33 | 70,0.69,10 34 | 47,0.86,8.9 35 | 57,0.74,10.3 36 | 33,0.49,5.8 37 | 57,0.56,11.7 38 | 90,0.78,15.3 39 | 41,0.66,10 40 | 44,0.4,9.6 41 | 63,0.73,9.8 42 | 61,0.75,10.7 43 | 43,0.47,11.7 44 | 64,0.56,12.9 45 | 29,0.27,10.2 46 | 13,0.48,4.5 47 | 43,0.54,12.7 48 | 37,0.51,7.9 49 | 36,0.27,12.1 50 | 47,0.57,8.8 51 | 45,0.69,8.4 52 | 88,0.8,15.8 53 | 28,0.45,6.3 54 | 40,0.38,8.8 55 | 46,0.35,11.4 56 | 54,0.51,13 57 | 38,0.61,8.8 58 | 45,0.52,9.5 59 | 52,0.47,11.9 60 | 53,0.38,15.6 61 | 47,0.69,7.4 62 | 33,0.41,5.8 63 | 70,0.78,10.1 64 | 24,0.28,8.6 65 | 22,0.35,5.5 66 | 14,0.35,3.5 67 | 31,0.31,7.7 68 | 29,0.54,5 69 | 91,0.65,14.3 70 | 39,0.4,9.5 71 | 44,0.37,11.2 72 | 54,0.5,10.3 73 | 76,0.59,14.8 74 | 70,0.52,14.2 75 | 36,0.33,9.8 76 | 38,0.23,10.1 77 | 48,0.41,12.3 78 | 36,0.38,10.6 79 | 43,0.49,11.2 80 | 69,0.72,13.3 81 | 55,0.44,13.6 82 | 51,0.41,13.4 83 | 26,0.15,9.4 84 | 62,0.62,12 85 | 42,0.99,5.7 86 | 46,0.5,9.9 87 | 67,0.75,12.9 88 | 67,0.65,13.4 89 | 68,0.55,12.8 90 | 19,0.46,4.9 91 | 47,0.44,10 92 | 41,0.62,9 93 | 69,0.22,16.8 94 | 33,0.05,11.4 95 | 46,0.43,11.2 96 | 74,0.58,17.4 97 | 57,0.76,9.8 98 | 49,0.17,12.5 99 | 95,0.98,11.4 100 | 27,0.54,5.4 101 | 71,0.47,13.5 102 | -------------------------------------------------------------------------------- /data/data6c.csv: -------------------------------------------------------------------------------- 1 | x,y 2 | 0.001,0.0008873584 3 | 0.01730612,0.0234652087 4 | 0.03361224,0.0698755633 5 | 0.04991837,0.0343402528 6 | 0.06622449,0.0265204047 7 | 0.08253061,0.1592148027 8 | 0.09883673,0.1650783893 9 | 0.11514286,0.1240028738 10 | 0.13144898,0.0596455047 11 | 0.1477551,0.0552452656 12 | 0.16406122,0.1922147499 13 | 0.18036735,0.0305346235 14 | 0.19667347,0.1050614252 15 | 0.21297959,0.076275922 16 | 0.22928571,0.1524998027 17 | 0.24559184,0.0564525639 18 | 0.26189796,0.0959048838 19 | 0.27820408,0.119482688 20 | 0.2945102,0.0379757879 21 | 0.31081633,0.1923054736 22 | 0.32712245,0.183303215 23 | 0.34342857,0.094980184 24 | 0.35973469,0.0912946482 25 | 0.37604082,0.1452412815 26 | 0.39234694,0.1090217347 27 | 0.40865306,0.2394445515 28 | 0.42495918,0.1933050241 29 | 0.44126531,0.202679323 30 | 0.45757143,0.2090867442 31 | 0.47387755,0.2804643819 32 | 0.49018367,0.3679867385 33 | 0.5064898,0.153935256 34 | 0.52279592,0.1653358407 35 | 0.53910204,0.2970396128 36 | 0.55540816,0.3508910552 37 | 0.57171429,0.1824436007 38 | 0.58802041,0.1344558643 39 | 0.60432653,0.4186216605 40 | 0.62063265,0.3261179044 41 | 0.63693878,0.0558967727 42 | 0.6532449,0.2488526264 43 | 0.66955102,0.483436485 44 | 0.68585714,0.1486623573 45 | 0.70216327,0.0416329786 46 | 0.71846939,0.61453564 47 | 0.73477551,0.1978335852 48 | 0.75108163,0.1915292152 49 | 0.76738776,0.3220098859 50 | 0.78369388,0.453920294 51 | 0.8,0.1788958933 52 | -------------------------------------------------------------------------------- /data/data7.csv: -------------------------------------------------------------------------------- 1 | "N","y","x","id" 2 | 8,0,2,1 3 | 8,1,2,2 4 | 8,2,2,3 5 | 8,4,2,4 6 | 8,1,2,5 7 | 8,0,2,6 8 | 8,0,2,7 9 | 8,7,2,8 10 | 8,1,2,9 11 | 8,6,2,10 12 | 8,0,2,11 13 | 8,0,2,12 14 | 8,0,2,13 15 | 8,0,2,14 16 | 8,0,2,15 17 | 8,1,2,16 18 | 8,3,2,17 19 | 8,5,2,18 20 | 8,3,2,19 21 | 8,7,2,20 22 | 8,2,3,21 23 | 8,1,3,22 24 | 8,0,3,23 25 | 8,6,3,24 26 | 8,1,3,25 27 | 8,2,3,26 28 | 8,0,3,27 29 | 8,0,3,28 30 | 8,0,3,29 31 | 8,3,3,30 32 | 8,5,3,31 33 | 8,5,3,32 34 | 8,0,3,33 35 | 8,0,3,34 36 | 8,0,3,35 37 | 8,8,3,36 38 | 8,4,3,37 39 | 8,2,3,38 40 | 8,0,3,39 41 | 8,8,3,40 42 | 8,6,4,41 43 | 8,2,4,42 44 | 8,0,4,43 45 | 8,5,4,44 46 | 8,6,4,45 47 | 8,2,4,46 48 | 8,8,4,47 49 | 8,2,4,48 50 | 8,7,4,49 51 | 8,7,4,50 52 | 8,8,4,51 53 | 8,0,4,52 54 | 8,4,4,53 55 | 8,7,4,54 56 | 8,3,4,55 57 | 8,1,4,56 58 | 8,3,4,57 59 | 8,2,4,58 60 | 8,8,4,59 61 | 8,0,4,60 62 | 8,7,5,61 63 | 8,4,5,62 64 | 8,2,5,63 65 | 8,3,5,64 66 | 8,3,5,65 67 | 8,7,5,66 68 | 8,8,5,67 69 | 8,7,5,68 70 | 8,0,5,69 71 | 8,7,5,70 72 | 8,8,5,71 73 | 8,8,5,72 74 | 8,8,5,73 75 | 8,6,5,74 76 | 8,7,5,75 77 | 8,4,5,76 78 | 8,5,5,77 79 | 8,1,5,78 80 | 8,8,5,79 81 | 8,2,5,80 82 | 8,1,6,81 83 | 8,1,6,82 84 | 8,0,6,83 85 | 8,8,6,84 86 | 8,8,6,85 87 | 8,8,6,86 88 | 8,8,6,87 89 | 8,8,6,88 90 | 8,8,6,89 91 | 8,8,6,90 92 | 8,8,6,91 93 | 8,0,6,92 94 | 8,6,6,93 95 | 8,3,6,94 96 | 8,3,6,95 97 | 8,7,6,96 98 | 8,5,6,97 99 | 8,7,6,98 100 | 8,2,6,99 101 | 8,8,6,100 102 | -------------------------------------------------------------------------------- /data/data7a.csv: -------------------------------------------------------------------------------- 1 | id,y 2 | 1,0 3 | 2,2 4 | 3,7 5 | 4,8 6 | 5,1 7 | 6,7 8 | 7,8 9 | 8,8 10 | 9,1 11 | 10,1 12 | 11,4 13 | 12,0 14 | 13,1 15 | 14,4 16 | 15,7 17 | 16,8 18 | 17,7 19 | 18,0 20 | 19,2 21 | 20,2 22 | 21,1 23 | 22,1 24 | 23,5 25 | 24,7 26 | 25,8 27 | 26,3 28 | 27,8 29 | 28,4 30 | 29,6 31 | 30,0 32 | 31,8 33 | 32,7 34 | 33,8 35 | 34,0 36 | 35,2 37 | 36,6 38 | 37,7 39 | 38,8 40 | 39,2 41 | 40,1 42 | 41,1 43 | 42,0 44 | 43,0 45 | 44,7 46 | 45,8 47 | 46,5 48 | 47,7 49 | 48,2 50 | 49,8 51 | 50,1 52 | 51,5 53 | 52,7 54 | 53,3 55 | 54,8 56 | 55,0 57 | 56,8 58 | 57,6 59 | 58,3 60 | 59,2 61 | 60,0 62 | 61,0 63 | 62,1 64 | 63,2 65 | 64,8 66 | 65,7 67 | 66,7 68 | 67,7 69 | 68,8 70 | 69,0 71 | 70,0 72 | 71,0 73 | 72,5 74 | 73,1 75 | 74,0 76 | 75,0 77 | 76,0 78 | 77,8 79 | 78,1 80 | 79,8 81 | 80,4 82 | 81,7 83 | 82,2 84 | 83,1 85 | 84,4 86 | 85,7 87 | 86,0 88 | 87,8 89 | 88,1 90 | 89,8 91 | 90,7 92 | 91,6 93 | 92,2 94 | 93,8 95 | 94,6 96 | 95,6 97 | 96,1 98 | 97,0 99 | 98,4 100 | 99,7 101 | 100,0 102 | -------------------------------------------------------------------------------- /data/dummydata.csv: -------------------------------------------------------------------------------- 1 | "Dose","Logdose","Positive","Total" 2 | 12023,4.08,4,5 3 | 23988,4.38,5,6 4 | 66069,4.82,2,6 5 | 93325,4.97,4,6 6 | 141254,5.15,5,6 7 | 257040,5.41,2,6 8 | 588844,5.77,4,6 9 | 851138,5.93,5,6 10 | 89125,4.95,1,6 11 | 446684,5.65,3,6 12 | 1047129,6.02,4,6 13 | 3890451,6.59,6,6 14 | 1e+07,7,6,6 15 | 23988329,7.38,6,6 16 | 44668359,7.65,6,6 17 | 67608298,7.83,8,8 18 | 158489,5.2,1,6 19 | 1258925,6.1,2,6 20 | 4677351,6.67,6,6 21 | 12023,4.08,0,6 22 | 23988,4.38,1,6 23 | 52481,4.72,2,6 24 | 95499,4.98,1,6 25 | 154882,5.19,4,6 26 | 724436,5.86,3,6 27 | 1148154,6.06,5,6 28 | 5495409,6.74,5,6 29 | 23988329,7.38,6,6 30 | 50118723,7.7,6,6 31 | 1e+06,6,5,6 32 | 5495409,6.74,6,6 33 | 1e+07,7,6,6 34 | 19952623,7.3,5,6 35 | 40738028,7.61,6,6 36 | 158489,5.2,5,6 37 | 1513561,6.18,3,5 38 | 7762471,6.89,6,6 39 | 1e+07,7,5,6 40 | -------------------------------------------------------------------------------- /figs/glmdevelopment.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 20 | 22 | 29 | 36 | 41 | 42 | 49 | 54 | 55 | 62 | 67 | 68 | 69 | 92 | 94 | 95 | 97 | image/svg+xml 98 | 100 | 101 | 102 | 103 | 108 | 118 | 128 | 129 | 134 | 階層ベイズモデル 146 | 一般化線形混合モデル 158 | 一般化線形モデル 169 | 線形モデル 180 | 線形モデルの発展 192 | 最小二乗法 204 | 最尤推定法 216 | MCMCによる事後分布の推定 228 | 推定計算方法 240 | 244 | 249 | 253 | 257 | 261 | 262 | 263 | 正規分布以外の確率分布をあつかいたい 282 | 個体差・場所差といったランダム効果をあつかいたい 301 | もっと自由で現実的な統計モデリングを! 320 | 324 | 329 | 333 | 337 | 341 | 342 | 343 | 347 | 352 | 356 | 360 | 364 | 365 | 366 | 367 | 368 | -------------------------------------------------------------------------------- /notes/chapter2.Rmd: -------------------------------------------------------------------------------- 1 | --- 2 | title: chapter2 ― 確率分布と統計モデルの最尤推定 3 | author: KADOWAKI, Shuhei 4 | date: 2018/11/26 5 | output: 6 | html_document: 7 | toc: true 8 | toc_float: true 9 | number_sections: true 10 | theme: cosmo 11 | code_folding: show 12 | df_print: paged 13 | --- 14 | 15 | ```{r echo=FALSE} 16 | ### Setting the global code chunk options ### 17 | # Args 18 | # comment='': won't append any string to the start of each line of results 19 | # fig.align='center': align figures to the center of document 20 | knitr::opts_chunk$set(comment="", fig.align="center") 21 | ``` 22 | 23 | ```{r} 24 | print('hello R world and statistical modeling !') 25 | ``` 26 | 27 | 28 | # basic operations 29 | 30 | ```{r} 31 | load('../data/data2.RData') 32 | print(data) 33 | print(length(data)) 34 | print(summary(data)) 35 | print(table(data)) 36 | hist(data, breaks = seq(-0.5, 9.5, 1)) 37 | var(data) 38 | mean(data) 39 | sd(data) 40 | sqrt(var(data)) 41 | ``` 42 | 43 | 44 | ## probability distribution 45 | 46 | 確率分布: **確率変数**(random variable)の値とそれが出現する確率を対応させたもの 47 | 48 | とりあえずポアソン分布(Poisson distribution)なるものを見てみる 49 | 50 | $$ 51 | p(y|\lambda) = \frac{\lambda^y \exp(-\lambda)}{y!} 52 | $$ 53 | $p(y|\lambda)$: 平均が$\lambda$であるときに, ポアソン分布に従う確率変数が$y$という値になる確率 54 | $\lambda$: ポアソン分布唯一のパラメータ 55 | 56 | - ポアソン分布の性質 57 | - 全ての和は1: $\sum_{y=0}^{\infty} p(y|\lambda) = 1$ 58 | - (分散)=(平均)=$\lambda$ 59 | 60 | - ポアソン分布を選ぶ理由 61 | - データがカウントデータ(非負の整数) 62 | - $y$に下限(0)はあるが, 上限はわからない 63 | - 観測データの平均と分散がだいたい等しい 64 | 65 | ```{r, results='hold'} 66 | y <- 0:9 67 | prob <- dpois(y, lambda = 3.56) 68 | print(prob) 69 | plot(y, prob, type = 'b', lty = 2) 70 | ``` 71 | 72 | 重ねて描写してみる 73 | 74 | ```{r, results='hold'} 75 | hist(data, breaks = seq(-0.5, 9.5, 1)) 76 | lines(y, length(data) * prob, type = 'b', lty = 2) 77 | ``` 78 | 79 | 80 | # maximum likelihood estimation 81 | 82 | - 最尤推定: 尤度(=「あてはまりの良さ」)を最大にするようなパラメータ推定方法 83 | - 尤度: パラメータ$\theta$を決めた時の$p(y|\theta)$の積 84 | - なぜ積なのか?: 「$y_{1}=2$」,...といったすべての事象が同時に真である確率を計算したいから 85 | - $p(y|\theta)$が最大になる$\theta$を探す 86 | - $ \prod_{i} p(y_{i}|\lambda) = \prod_{i} \frac{\lambda^{y_i} \exp(-\lambda)}{y_{i}!} $ 87 | 88 | - 対数変換を施した対数尤度関数(log likelihood function)を使って最尤推定する 89 | - 尤度$L$の単調増加関数 90 | - $\log L(\lambda) = \sum_{i} (y_{i}\log \lambda - \lambda - \sum_{k}^{y_{i}} \log k)$ 91 | 92 | - 今回のような簡単な対数尤度関数ならそれを最大にする$\lambda$を解析的に求めることができる 93 | - $\log L(\lambda)$を$\lambda$で偏微分 => 傾きがゼロになる$\lambda$を求める 94 | - $\hat{\lambda} = \frac{\sum_{i} y_{i}}{データ数}$ 95 | 96 | - 最尤推定量($\hat{\lambda}$): 対数尤度あるいは尤度が最大になる$\lambda$ 97 | - 最尤推定値($\hat{\lambda} = 3.56$など): 具体的な最尤推定量 98 | 99 | 対数尤度と$\log L(\lambda)$と$\lambda$の関係を図示する 100 | 101 | ```{r} 102 | logL <- function(m) sum(dpois(data, m, log = TRUE)) 103 | lambda <- seq(2, 5, 0.1) 104 | plot(lambda, sapply(lambda, logL), type = 'l') 105 | ``` 106 | 107 | 108 | # standard error 109 | 110 | - 標準誤差: 推定値の不確かさを表す量 111 | - 最尤推定値のばらつき 112 | - 「真のモデル」を知らないと使えない 113 | - ふつうは知らない => たまたま得られた観測データから推定されただけの値を用いて行う(意味あるの?) 114 | 115 | 116 | # sampling, estimation, prediction 117 | 118 | - 統計モデリングの流れ 119 | 1. データ(標本)を発生(**sampling**)させた確率分布(「真の統計モデル」)を考える 120 | 2. パラメータを**推定**する(**estimation**, あるいは「**あてはめ**」(**fitting**)) 121 | 3. 同じsampling方法で得られる次のデータの分布を見積もる(**予測**, **prediction**) 122 | 123 | - predictionの種類 124 | - 次に得られる応答変数の平均だけを示す 125 | - 「回帰直線を引く」なども含まれる 126 | - 次に得られるデータはこの範囲に散らばるはずだという予測区間も示す 127 | - 将来予測(時系列構造データ), 欠損予測(空間構造データ) 128 | 129 | 130 | # probability distribution (again) 131 | 132 | - まず「この現象がどのような確率分布で説明されそうか」を考える 133 | - 次の点に注意 134 | - 離散 or 連続 135 | - 範囲 136 | - 標本分散と標本平均の関係 137 | 138 | - examples 139 | - ポアソン分布(Poisson distribution): 離散, 0以上上限なし, 平均≈分散 140 | - 二項分布(binomial distiribution): 離散, 0以上有限, 分散は平均の関数 141 | - 正規分布(normal distribution): 連続, 無限小から無限大, 分散は平均と無関係 142 | - ガンマ分布(gamma distribution): 連続, 0から無限大, 分散は平均の関数 143 | -------------------------------------------------------------------------------- /notes/chapter3.Rmd: -------------------------------------------------------------------------------- 1 | --- 2 | title: chapter3 ― 一般化線形モデル(GLM) 3 | subtitle: ポアソン回帰 4 | author: KADOWAKI, Shuhei 5 | date: 2018/11/27 6 | output: 7 | html_document: 8 | toc: true 9 | toc_float: true 10 | number_sections: true 11 | theme: cosmo 12 | code_folding: show 13 | df_print: paged 14 | --- 15 | 16 | ```{r echo=FALSE} 17 | ### Setting the global code chunk options ### 18 | # Args 19 | # comment='': won't append any string to the start of each line of results 20 | # fig.align='center': align figures to the center of document 21 | knitr::opts_chunk$set(comment="", fig.align="center") 22 | ``` 23 | 24 | 25 | 26 | # basic operations 27 | 28 | ```{r} 29 | # load data as data.frame object 30 | d <- read.csv('../data/data3.csv') 31 | ``` 32 | 33 | ```{r results='hold', rows.print=5, max.print=25} 34 | # only the first 25 rows gonna be rendered (5 rows per page) 35 | print(class(d)) 36 | d 37 | ``` 38 | 39 | ```{r, results='hold'} 40 | print(class(d$x)) 41 | d$x 42 | ``` 43 | 44 | ```{r, results='hold'} 45 | print(class(d$y)) 46 | d$y 47 | ``` 48 | 49 | ```{r, results='hold'} 50 | print(class(d$f)) 51 | d$f 52 | ``` 53 | 54 | ```{r} 55 | summary(d) 56 | ``` 57 | 58 | ```{r, results='hold'} 59 | # scatter plot 60 | plot(d$x, d$y, pch = c(21, 19)[d$f]) 61 | legend('topleft', legend = c('C', 'T'), pch = c(21, 19)) 62 | ``` 63 | 64 | ```{r, results='hold'} 65 | # box-whisker plot - factor variables on x label 66 | plot(d$f, d$y) 67 | ``` 68 | ハコの上中下の水平線はそれぞれ75%, 50%, 25%点, 上下のヒゲの範囲が近似的な95%区間, マルはその近似95%をはみ出したデータ点(outliers)を表す 69 | 70 | 71 | # Poisson regression 72 | 73 | 種子数の平均$\lambda$を説明変数$x_{i}$(個体ごとの体サイズ)を用いて$\lambda_{i}$に拡張 74 | $$ 75 | p(y_{i}|\lambda_{i}) = \frac{\lambda_{i}^{y_{i}} \exp(-\lambda_{i})}{y_{i}!} \\ 76 | \lambda_{i} = \exp(\beta_{1} + \beta_{2}x_{i}) \\ 77 | \log \lambda_{i} = \beta_{1} + \beta_{2} x_{i} 78 | $$ 79 | 80 | - $x_{i}$: 説明変数(explanatory variable, あるいは 共変量(covariate)) 81 | - $\beta_{1}, \beta_{2}$: パラメーター(parameter あるいは 係数(coefficient)) 82 | - $\beta_{1}$: 切片(intercept) 83 | - $\beta_{2}$: 傾き(slope) 84 | - $\beta_{1} + \beta_{2} x_{i}$: 線形予測子(linear predictor) 85 | - 2乗以上の項が含まれても線形予測子(線形結合だから) 86 | - $\log \lambda_{i}$: 対数リンク関数(log link function) 87 | - $\lambda_{i}$の関数を「リンク関数」と呼び, 対数リンク関数以外にもロジットリンク関数などもある 88 | - GLMにはそれぞれの確率分布ごとに都合がよいリンク関数があり, 正準リンク関数と呼ばれる 89 | 90 | - GLM with Possion regressionで対数リンク関数を使う理由 91 | - $\exp(線形予測子) \geq 0$となる: ポアソン分布の平均は非負である必要がある 92 | - 要因の効果が積で表されるから 93 | 94 | 以上から, このポアソン回帰(観測データに対するポアソン分布と使った統計モデルのfitting)モデルの対数尤度(パラメータ$\beta_{1}, \beta_{2}$の関数)は次のよう. 95 | $$ 96 | \log L(\beta_{1}, \beta_{2}) = \sum_{i} \log\frac{\lambda_{i}^{y_{i}} \exp(-\lambda_{i})}{y_{i}!} 97 | $$ 98 | 99 | 100 | ## fitting 101 | 102 | この場合の最尤推定量の導出は簡単ではないが, 数値的な試行錯誤によって導かれるので, Rに任せておいてok 103 | 104 | ```{r} 105 | fit <- glm(formula = y ~ x, data = d, family = poisson(link = log)) 106 | fit 107 | summary(fit) 108 | ``` 109 | 110 | - `(Intercept)`: 切片$\beta_{1}$ 111 | - `x`: 傾き$\beta_{2}$ 112 | - `Estimate`: 最尤推定値 113 | - `Std.Error`: 標準誤差の**推定値** 114 | - 「真のモデル」は知らないのであくまで「推定」した値 115 | - 推定のばらつきが正規分布であると仮定し, さらに対数尤度関数(最尤推定値で最大になる凸関数)は最大値付近でのカタチがその正規分布に近いと仮定することで得ている(ある種の近似) 116 | - `z value`: z値(最尤推定値をSEで除した値) 117 | - 最尤推定値がゼロから十分に離れているかの目安 118 | - Wald統計量(Wald statistics)とも呼ばれる 119 | - `Pr(>|z|)`: 平均=(z値の絶対値), 標準偏差1の正規分布がマイナス無限大からゼロまでの値を取る確率の2倍 120 | - 大きいほどz値がゼロに近い(=最尤推定値がゼロに近い) 121 | 122 | モデルの最大対数尤度は`logLik`関数を用いて調べることができる 123 | `df`は自由度(degrees of freedom)=最尤推定したパラメーターの数を表す 124 | 125 | ```{r} 126 | logLik(fit) 127 | ``` 128 | 129 | 130 | ## prediction 131 | 132 | 推定結果$\lambda = \exp(1.29 + 0.0757x)$を用いる 133 | 134 | ```{r, fig.show='hold'} 135 | xx <- seq(min(d$x), max(d$x), length = 100) 136 | plot(d$x, d$y, pch = c(21, 19)[d$f]) 137 | lines(xx, exp(1.29 + 0.0757 * xx), lwd = 2) 138 | ``` 139 | 140 | `predict`関数を使えばお手軽 141 | ```{r, fig.show='hold'} 142 | yy <- predict(fit, newdata = data.frame(x = xx), type = 'response') 143 | plot(d$x, d$y, pch = c(21, 19)[d$f]) 144 | lines(xx, yy, lwd = 2) 145 | ``` 146 | 147 | 148 | # advanced explanatory variables 149 | 150 | 151 | ## factor variable 152 | 153 | ダミー変数$d_{i}$を用いて, 次のようなリンク関数を考えることができる 154 | $$ 155 | \lambda_{i} = \exp(\beta_{1} + \beta_{2}d_{i}) \\ 156 | d_{i} = \left\{ 157 | \begin{array}{ll} 158 | 1 & (f_{i} = C) \\ 159 | 0 & (f_{i} = T) 160 | \end{array} 161 | \right. 162 | $$ 163 | 164 | ```{r} 165 | fit.f <- glm(y ~ f, data = d, family = poisson) 166 | fit.f 167 | logLik(fit.f) 168 | ``` 169 | 170 | - `fT`: $\beta_{2}$に対応 171 | - 「肥料をやると平均種子数がほんの少しだけ増える」 172 | 173 | 2水準以上の因子型説明変数については, Rのデフォルトでは(水準数 - 1)のダミー変数を用意する 174 | 175 | 176 | ## numerical variable + factor variable 177 | 178 | 対数リンク関数は次のよう. 179 | $$ 180 | \log \lambda_{i} = \beta_{1} + \beta_{2}x_{i} + \beta_{3}d_{i} 181 | $$ 182 | 183 | ```{r} 184 | fit.all <- glm(y ~ x + f, data = d, family = poisson) 185 | fit.all 186 | logLik(fit.all) 187 | ``` 188 | 肥料の効果はマイナスに推定されてしまった 189 | 190 | 191 | # interpretability of log link function - factorial effect 192 | 193 | `fit.all`のリンク関数は次のように分解できる. 194 | $$ 195 | \lambda_{i} = (定数) \times (サイズの効果) \times (肥料の効果) 196 | $$ 197 | よって平均$\lambda_{i}$はサイズ・肥料の効果の積になる. 198 | e.g.) 「サイズ$x_{i}$が1増加すると, 平均$\lambda_{i}$は$\exp(0.08\times1)=1.08$倍に増える 199 | 200 | 一方恒等リンク関数(平均が線形予測子に等しい, つまりリンク関数がとくに何もない状態)では, 201 | $$ 202 | \lambda_{i} = (定数) + (サイズの効果) + (肥料の効果) 203 | $$ 204 | となり, 対数リンク関数の考え方とは全く違うものになる. 205 | これは, 一般化ではない線形モデル(linear model, LM)あるいは一般線形モデル(*general* linear model)と呼ばれる 206 | 207 | 以下は対数リンク関数と, 恒等リンク関数(`fit.id`に格納)の比較. 208 | 209 | ```{r fig.show="hold", out.width="50%", out.height="100%", fig.align="default"} 210 | x.min <- 5 211 | x.max <- 20 212 | xx <- seq(x.min, x.max, length = 50) 213 | y <- function(x) exp(fit.all$coefficients[1] + fit.all$coefficients[2] * x) 214 | 215 | plot.link <- function(file, yyC, yyT) 216 | { 217 | plot( 218 | numeric(0), numeric(0), type = "n", 219 | xlim = c(x.min, x.max), 220 | ylim = c(y(x.min) * 0.7, y(x.max) * 1.05), 221 | xlab = "size x_{i}", ylab = "mean of seeds lambda_{i}" 222 | ) 223 | lines(xx, yyC, lwd = 2, col = "#000000") 224 | lines(xx, yyT, lwd = 2, col = "#808080") 225 | } 226 | 227 | coef <- fit.all$coefficients 228 | plot.link( 229 | "linkLog", 230 | exp(coef[1] + coef[2] * xx), 231 | exp(coef[1] + coef[2] * xx + coef[3] * 3) 232 | ) 233 | 234 | fit.id <- glm(y ~ x + f, data = d, family = poisson(link = "identity")) 235 | coef <- fit.id$coefficients 236 | plot.link( 237 | "linkIdentity", 238 | (coef[1] + coef[2] * xx), 239 | (coef[1] + coef[2] * xx + coef[3] * 3) 240 | ) 241 | ``` 242 | 243 | 244 | ## LM in GLM 245 | 246 | LMでよく使われるあてはめの1つである直線回帰(linear regression)をGLMのスキーマの中で理解すると以下のよう. 247 | 248 | - 観測値$X$(説明変数)と$Y$(応答変数)のペアがある 249 | - $Y$は平均$\mu_{i}$, 標準偏差$\sigma$の正規分布に従う 250 | - あるデータ点$i$において平均値が$\mu_{i}=\beta_{1} + \beta_{2}x_{i}$となる 251 | 252 | 例としてLMとGLMのモデルと確率分布の関係を図示する. 253 | 新たな架空データに対してLMとGLMを当てはめる. 254 | 上が正規分布&恒等リンク関数のGLM(つまりLM), 下がポアソン分布&対数リンク関数のGLM. 255 | 256 | ```{r, results='hold'} 257 | N <- 30 258 | x <- seq(0, 2, length = N) 259 | m <- function(xx) exp(-4 + 3 * xx) 260 | d0 <- data.frame( 261 | x = x, 262 | y = rpois(N, lambda = m(x)) 263 | ) 264 | 265 | width <- 3.0 # inch 266 | height <- 2.1 # inch 267 | col.d <- "#aaaaaa" 268 | 269 | range.y <- c(-1.9, 7) 270 | plot.d0 <- function() 271 | { 272 | par(mar = c(1.5, 1.5, 0.1, 0.1), mgp = c(1.5, 0.5, 0), cex = 1.0) 273 | plot( 274 | d0$x, d0$y, 275 | type = "n", 276 | ylim = range.y, 277 | xlab = "x", 278 | ylab = "y", 279 | axes = FALSE 280 | ) 281 | lines(c(0, 2), c(0, 0)) 282 | axis(1, at = seq(0.5, 2.0, 0.5), pos = 0) 283 | axis(2, pos = 0) 284 | abline(v = 0) 285 | } 286 | add.points <- function() 287 | { 288 | points(d0$x, d0$y) 289 | } 290 | ``` 291 | 292 | ```{r} 293 | # lm 294 | plot.d0() 295 | fit.lm <- glm(y ~ x, data = d0, family = gaussian) 296 | draw.norm <- function(x) 297 | { 298 | abline(v = x, col = col.d) 299 | m <- predict(fit.lm, newdata = data.frame(x = x), type = "response") 300 | sd <- sd(fit.lm$residuals) 301 | yy <- seq(range.y[1] - 3, range.y[2] + 3, length = 100) 302 | polygon( 303 | x - dnorm(yy, m, sd) * 0.5, 304 | yy, 305 | border = NA, 306 | col = col.d 307 | ) 308 | } 309 | draw.norm(x = 0.5) 310 | draw.norm(x = 1.1) 311 | draw.norm(x = 1.7) 312 | abline(fit.lm, lty = 2, lwd = 2) 313 | add.points() 314 | ``` 315 | 316 | ```{r} 317 | # glm with Possion distribution 318 | plot.d0() 319 | fit.glm <- glm(y ~ x, data = d0, family = poisson) 320 | draw.pois <- function(x) 321 | { 322 | abline(v = x, col = col.d) 323 | lambda <- predict(fit.glm, newdata = data.frame(x = x), type = "response") 324 | sd <- sd(fit.glm$residuals) 325 | for (yy in 0:10) rect( 326 | x - dpois(yy, lambda) * 0.5, 327 | yy - 0.3, 328 | x, 329 | yy + 0.3, 330 | border = NA, 331 | col = col.d 332 | ) 333 | } 334 | draw.pois(x = 0.5) 335 | draw.pois(x = 1.1) 336 | draw.pois(x = 1.7) 337 | b <- fit.glm$coefficients 338 | lines(x, exp(b[1] + b[2] * x), lty = 2, lwd = 2) 339 | add.points() 340 | ``` 341 | 342 | 図からわかるように, 常に直線回帰で片付けようとするのは非常に危険. 343 | 上図の場合だと, 直線回帰は次のような問題点がある. 344 | 345 | - 正規分布は連続的な値を扱うハズでは?? 346 | - カウントデータなのに, 平均値の予測がマイナスになる?? 347 | - 「ばらつき一定」ではないのに, **分散一定**を仮定する?? 348 | 349 | 一方でこの場合だとポアソン分布を用いることで上記3点をつぎのように解決できる. 350 | 351 | - ポアソン分布を使っているのでカウントデータに正しく対応 352 | - 対数リンク関数を使えば平均値は常に非負 353 | - $y$のばらつきは平均とともに増大する 354 | -------------------------------------------------------------------------------- /notes/chapter4.Rmd: -------------------------------------------------------------------------------- 1 | --- 2 | title: chapter4 ― GLMのモデル選択 3 | subtitle: AICとモデルの予測の良さ 4 | author: KADOWAKI, Shuhei 5 | date: 2018/12/01 6 | output: 7 | html_document: 8 | toc: true 9 | toc_float: true 10 | number_sections: true 11 | theme: cosmo 12 | code_folding: show 13 | df_print: paged 14 | --- 15 | 16 | # then, how to select model ? 17 | 18 | - 対数尤度は**いま手元にある観測データへの**あてはまりの良さでしかない 19 | - 最大対数尤度とは, 推定された統計モデルが真の統計モデルに似ているかどうかではなく, たまたま得られた観測データへのあてはまりの良さを表す 20 | 21 | - **AIC**によるモデル選択(model selection) 22 | - AIC: 「あてはまりの良さ(goodness of fit)」ではなく「予測の良さ(goodness of prediction)」を重視するモデル選択基準 23 | 24 | 25 | # deviance 26 | 27 | - 逸脱度(deviance): 「あてはまりの悪さ」を表す. 28 | - 最大対数尤度を$\log L^{*}$とすると, $-2 \log L^*$ で表される. 29 | - いろいろな逸脱度 30 | - 残差逸脱度(residual deviance): 「あてはまりの悪さ」の**相対値** 31 | - $(残差逸脱度) = D - (最小逸脱度)$ 32 | - 最小逸脱度: フルモデルの逸脱度 33 | - フルモデル(full model): その統計モデルで最も複雑なモデル 34 | - データ数と同じ数だけのパラメータを使ってあてはめた統計モデル 35 | - 全データの「読み上げ」に相当する 36 | - Null逸脱度(null deviance): 残差逸脱度の**最大値** 37 | - $(Null逸脱度) = (最大逸脱度) - (最小逸脱度)$ 38 | - 最大逸脱度: Nullモデルの逸脱度 39 | - Nullモデル(null model): 「もっともあてはまりの悪い」モデル 40 | - 最もパラメータ数の少ないモデル(切片だけ) 41 | - Rでは`glm(y ~ 1)`で指定可能 42 | - パラメータ数$k$を増やせば増やすほど残差逸脱度は小さくなる 43 | 44 | 45 | ```{r, comment=''} 46 | # deviance 47 | d <- read.csv("../data/data3.csv") 48 | fit <- glm(y ~ x, family = poisson, data = d) 49 | dev <- -2 * logLik(fit) 50 | dev[1] 51 | ``` 52 | 53 | ```{r, results='hold', comment=''} 54 | # residual deviance 55 | dev.min <- -2 * sum(log(dpois(d$y, lambda = d$y))) 56 | print(dev.min) 57 | dev.res <- dev - dev.min 58 | print(dev.res[1]) 59 | ``` 60 | 61 | ```{r, results='hold', comment=''} 62 | # null deviance 63 | fit.null <- glm(y ~ 1, family = poisson, data = d) 64 | print(fit.null) 65 | dev.null = -2 * logLik(fit.null) - dev.min 66 | print(dev.null[1]) 67 | ``` 68 | 69 | ```{r, comment=''} 70 | # summary 71 | fit 72 | ``` 73 | 74 | 75 | # AIC 76 | 77 | 最尤推定したパラメータの個数を$k$としたときのAICは次の式で表される 78 | $$ 79 | -2(\log L^{*} - k) = D + 2k 80 | $$ 81 | このAICが**最も小さいモデル**が良いモデルとなる 82 | 83 | ```{r, results='hold', comment=''} 84 | fit.f <- glm(y ~ f, family = poisson, data = d) 85 | fit.x <- glm(y ~ x, family = poisson, data = d) 86 | fit.xf <- glm(y ~ x + f, family = poisson, data = d) 87 | k.null <- 1 * 2 88 | k.f <- 2 * 2 89 | k.x <- 2 * 2 90 | k.xf <- 2 * 3 91 | k.full <- 2 * 100 92 | d.null <- -2 * logLik(fit.null) 93 | d.f <- -2 * logLik(fit.f) 94 | d.x <- -2 * logLik(fit.x) 95 | d.xf <- -2 * logLik(fit.xf) 96 | d.full <- dev.min # dev.min <- -2 * sum(log(dpois(d$y, lambda = d$y))) 97 | ``` 98 | ```{r, comment='', echo=F, results='asis'} 99 | cat( 100 | 'model | 2k | D | AIC', '\n', 101 | '--|--|--|--', '\n', 102 | 'null', '|', k.null, '|', d.null[1], '|', fit.null$aic, '\n', 103 | 'f', '|', k.f, '|', d.f[1], '|', fit.f$aic, '\n', 104 | 'x', '|', k.x, '|', d.x[1], '|', fit.x$aic, '\n', 105 | 'xf', '|', k.xf, '|', d.xf[1], '|', fit.xf$aic, '\n', 106 | 'full', '|', k.full, '|', d.full[1], '|', d.full[1] + k.full, '\n' 107 | ) 108 | ``` 109 | 110 | ## why AIC can choose a model ? 111 | 112 | - **平均対数尤度**(mean log likelihood): 統計モデルの予測の良さをあらわす量 113 | 1. 手元のデータに対してあるモデルのパラメータを推定する 114 | 2. 「真のモデル」から(同じデータ取得法で)サンプリングを繰り替えして, そのそれぞれの評価済みデータセットに対して対数尤度を評価する 115 | 3. その平均が平均対数尤度: $E(\log L)$ 116 | - **バイアス**(bias): $b = \log L^* - E(\log L)$ 117 | - ある統計モデルの$(最大対数尤度) - (平均対数尤度)$ 118 | - **バイアス補正**(bias correction) 119 | - 平均対数尤度のstep.2は「実際には不可能」 120 | - $b$の定義を変更して, $E(\log L) = \log L^* - b$とすることで, 平均対数尤度$E(\log L)$の推定をする 121 | - (-> これ以外には交差検証法(cross-validation)などの方法もある) 122 | - **平均対数尤度の推定量が$\log L^* - k$であることがであることが解析的かつ一般的に導出されている** 123 | - $E(\log L)^* = \log L^* - k$ 124 | - **AIC: $-2\times E(\log L)^* = -2(\log L^* - k)$** 125 | - 平均対数尤度は「統計モデルの予測の良さをあらわす量」であるから, AICは「統計モデルの予測の悪さをあらわす量」として解釈できる 126 | - -> モデル選択とは「予測の悪さが小さいモデルを選ぶ」こと 127 | 128 | 129 | ## AIC between nested GLMs 130 | 131 | - AICは平均対数尤度の推定量であり, それは$b$=(平均対数尤度と最大対数尤度のズレ)が*平均的に*パラメータ数$k$と同じであるという導出に基づいている 132 | - $b$のバラつき(*分散*)は??:=> (同一データに対する)モデルがネストしていれば$b$の分散は小さくなる 133 | - (2つ以上のモデルが)**ネストにある**(nested): 一方のモデルに他方が含まれていること 134 | - e.g.) `fit.x`モデルの傾きを0とすれば`fit.null`モデルになるので, これらはネストしている 135 | -------------------------------------------------------------------------------- /notes/chapter5.Rmd: -------------------------------------------------------------------------------- 1 | --- 2 | title: chapter5 ― GLMの尤度比検定と検定の非対称性 3 | author: KADOWAKI, Shuhei 4 | date: 2018/12/03 5 | output: 6 | html_document: 7 | toc: true 8 | toc_float: true 9 | number_sections: false 10 | theme: cosmo 11 | code_folding: show 12 | df_print: paged 13 | --- 14 | 15 | ```{r echo=FALSE} 16 | ### Setting the global code chunk options ### 17 | # Args 18 | # comment='': won't append any string to the start of each line of results 19 | # fig.align='center': align figures to the center of document 20 | knitr::opts_chunk$set(comment="", fig.align="center") 21 | ``` 22 | 23 | 24 | # AICモデル選択 vs. Neyman-Pearson検定 25 | 26 | - 尤度比検定(likelihood ratio test): 逸脱度の差に注目し, どのような統計モデルであっても, ネストしているモデルたちを比較できる検証法 27 | 28 | - **Neyman-Pearson検定**: 「帰無仮説は正しい」という命題が否定できるかどうかを調べる検定の枠組み 29 | 30 | - 共通手順(step.1 ~ step.3) 31 | 1. 解析対象のデータを確定 32 | 2. データを説明できるような統計モデルを設計 33 | 3. ネストした統計モデルたちのパラメータの最尤推定計算 34 | - 「単純モデル」(AICモデル選択) vs. 「**帰無仮説(null hypothesis)**」(統計学的な検定) 35 | - 「複雑モデル」(AICモデル選択) vs. 「**対立仮説(alternative hypothesis)**」(統計学的な検定) 36 | 37 | - 異なる手順(step.4 ~ step.5) 38 | - AICモデル選択の手順 39 | 4. モデル選択基準AICの評価 40 | 5. 予測の良いモデルを選ぶ 41 | - (Neyman-Pearson)検定の手順 42 | 4. 帰無仮説棄却の危険率の評価 43 | 5. 帰無仮説棄却の可否を判断 44 | 45 | - Neyman-Pearson検定のstep.4 ~ step.5の詳細 46 | - step.4 帰無仮説棄却の危険率の評価 47 | - step.4.1 モデルの当てはまりの良さや逸脱度などを検定統計量(test statistics)に指定する 48 | - step.4.2 検定統計量の値が取りうる「ありがちな範囲」を定める 49 | - e.g.) 「ありがちな範囲」の大きさが95%である場合は, 「5%の**有意水準**(signficant level)」を設定したという 50 | - step.4.3 帰無仮説が「真のモデル」であると仮定して, そのときに検定統計量の理論的なばらつき(確率分布)を調べる 51 | - step.5 帰無仮説棄却の可否を判断 52 | - step.5.1 対立仮説のモデルで得られた検定統計量が, この「ありがちな範囲」からはみ出ているかどうかを確認 53 | - step.5.2 もしはみ出ていれば帰無仮説は棄却され, 対立仮説が支持されたと結論する 54 | - もしはみ出ていない(帰無仮説が棄却できない)場合は, 帰無仮説・対立仮説のどちらも**正しいとも正しくないとも言えない**と判断を保留する 55 | 56 | 57 | # step.4.1 - 統計検定量の指定 58 | 59 | 例としてchapter3の`Nullモデル`と`xモデル`を比較する 60 | 61 | - `Nullモデル` 62 | - 種子数の平均$\lambda_{i}$が定数: $\lambda_{i} = \exp(\beta_{1})$ 63 | - パラメータ数1: $\beta_{1}$ 64 | - `xモデル` 65 | - 種子数の平均$\lambda_{i}$が体サイズ$x_{i}$に依存: $\lambda_{i} = \exp(\beta_{1} + \beta_{2}x_{i})$ 66 | - パラメータ数2: $\beta_{1}$, $\beta_{2}$ 67 | 68 | ポアソン回帰の結果は以下のようになる 69 | 70 | ```{r, echo=FALSE, results='asis'} 71 | d <- read.csv('../data/data3.csv') 72 | 73 | fit.null <- glm(y ~ 1, family = poisson, data = d) 74 | fit.x <- glm(y ~ x, family = poisson, data = d) 75 | 76 | k.null <- 1 77 | k.x <- 2 78 | k.full <- 100 79 | loglik.null <- logLik(fit.null)[1] 80 | loglik.x <- logLik(fit.x)[1] 81 | loglik.full <- sum(log(dpois(d$y, lambda = d$y))) 82 | 83 | d.null <- -2 * loglik.null 84 | d.x <- -2 * loglik.x 85 | d.full <- -2 * loglik.full 86 | 87 | cat( 88 | 'model | $k$ | loglik $\\log L^*$ | D ($-2\\log L^*$) | residual dev | AIC', '\n', 89 | '--|--|--|--|--|--', '\n', 90 | 'null', '|', k.null, '|', loglik.null, '|', d.null, '|', fit.null$deviance, '|', fit.null$aic, '\n', 91 | 'x', '|', k.x, '|', loglik.x, '|', d.x, '|', fit.x$deviance, '|', fit.x$aic, '\n', 92 | 'full', '|', k.full, '|', loglik.full, '|', d.full, '|', 0, '|', d.full + 2 * k.full, '\n' 93 | ) 94 | ``` 95 | 96 | 97 | ## 尤度比とNeyman-Pearson検定における検定統計量 98 | **尤度比**(likelihood ratio)は以下の式で定義される 99 | 100 | $$ 101 | \frac{L_{1}^*}{L_{2}^*} = \frac{Nullモデルの最大尤度: \exp(-237.6)}{xモデルの最大尤度: \exp(-235.4)} 102 | $$ 103 | 104 | 尤度比検定では, 尤度比の対数を取り-2をかけて, **逸脱度の差**に変換して統計検定量として扱う 105 | 106 | $$ 107 | \Delta D_{1, 2} = -2 (\log L_{1}^* - \log L_{2}^*) = D_{1} - D_{2} 108 | $$ 109 | 110 | - $D_{1}$: `Nullモデル`の逸脱度 111 | - $D_{2}$: `xモデル`の逸脱度 112 | 113 | 上記の`Nullモデル`と`xモデル`の逸脱度の差$\Delta D_{1, 2}$は 114 | ```{r, echo=F, results='asis'} 115 | dd <- fit.null$deviance - fit.x$deviance 116 | cat(dd) 117 | ``` 118 | となっているおり, 尤度比検定ではこの逸脱度の差が「 119 | ```{r, echo=F, results='asis'} 120 | cat(dd) 121 | ``` 122 | ぐらいでは改善されていない」と言ってよいのかどうかを調べる 123 | 124 | 125 | ## 2種類の過誤とNeyman-Pearson検定の非対称性 126 | 127 | Neyman-Pearson検定では比較するモデルを次のように分類する 128 | 129 | - 帰無仮説: `Nullモデル` ($k = 1$, $\beta_{2} = 0$) 130 | - 「棄却されるための仮説」であり, 「無に帰される」ときにのみその役割を果たす特殊な統計モデル 131 | - 対立仮説: `xモデル` ($k = 2$, $\beta_{2} \neq 0$) 132 | - 対立仮設の意味としては「代替仮設」の方が訳語としては正しい(検定によって帰無仮説が「追放」(棄却)されたあと, 現象の説明を代替するために残されたモデルであるから) 133 | 134 | このとき, 次のような2種類の過誤が予期される 135 | 136 | 帰無仮説は/を | 棄却する | 棄却しない 137 | --|---|-- 138 | 真のモデルである | 第一種の過誤 | (問題なし) 139 | 真のモデルでない | (問題なし) | 第二種の過誤 140 | 141 | - **第一種の過誤**(type Ⅰ error): (帰無仮説が真のモデルであるのに)逸脱度の差が「ありえない値」だと判断して, 帰無仮説を棄却してしまう 142 | - **第二種の過誤**(type Ⅱ error): (帰無仮説が真のモデルではないのに)逸脱度の差が「あえりえる値」だと判断して, 帰無仮説を棄却しない 143 | - **検定の非対称性**: Neyman-Pearson検定では**第一種の過誤の検討にだけ専念する**こと 144 | - 「帰無仮説が正しい」という仮説が否定できるかどうかだけに注目することで以下のように検定に必要な計算を簡単にできる 145 | - step 4.1: まず帰無仮説(`Nullモデル`)が正しいと仮定し, $beta_{1}=2.06$を真のモデルと考える 146 | - step 4.2: 帰無仮説を棄却するための有意水準を設定する 147 | - step 4.3: このモデルからデータを何度も生成し, そのたびに帰無仮説(`Nullモデル`)と対立仮説(`xモデル`)をあてはめれば, たくさんの$\Delta D_{1, 2}$を得ることができ, $\Delta_{1, 2}$の分布がわかり, $\Delta D_{1, 2} \geq 4.51$となる確率$P$を評価できる 148 | 149 | ```{r, include=F} 150 | cat(fit.null$coefficients[1]) 151 | cat(dd) 152 | ``` 153 | 154 | # step.4.2 - 有意水準の設定 155 | 156 | - **$P$値**($P$ value): 第一種の過誤をおかす確率 157 | - e.g.)この例題では, $\Delta_{1, 2} \geq 4.51$となる確率 158 | - $P$値が大きい($\Delta_{1, 2} = 4.51$はよくあること) ⇒ 帰無仮説は棄却できない 159 | - $P$値が小さい($\Delta_{1, 2} = 4.51$は珍しい) ⇒ 帰無仮説は棄却し, 残った対立仮説を正しいとする 160 | - **有意水準$\alpha$**: $P$値の大小を判断するために, 事前に決めておく量 161 | - $P \geq \alpha$: 帰無仮説は棄却できない 162 | - $P < \alpha$: 帰無仮説は棄却できる 163 | - **自分で好き勝手に決めるほかない** 164 | - $\alpha = 0.05$, つまり「めったにないことは, 20回のうち1回より少ない発生件数である」とする値がよく使われている 165 | - データをとる前の段階であらかじめ決めておくのが正しいお作法とされる 166 | 167 | 168 | # step 4.3 - 統計検定量の確率分布, $P$値を調べる 169 | 170 | ## パラメトリックブーツストラップ法 171 | 172 | - **パラメトリックブーツストラップ法(parametric bootstrap, PB method)**: いかなる面倒な状況でも必ず$P$値を計算する方法 173 | - 「データをたくさん生成する」のに乱数発生のシミュレーションを用いる 174 | - 具体的には次のようなステップを**繰り返す** 175 | - 帰無仮説を真のモデルとして, データを乱数を用いて生成する 176 | - 帰無仮説, 対立仮説をそのデータに対して当てはめる 177 | - 逸脱度の差を計算する 178 | 179 | この例題データで帰無仮説(`Nullモデル`)で推定された平均種子数$\lambda$は 180 | ```{r, echo=F, results='asis'} 181 | cat(exp(fit.null$coefficients)) 182 | ``` 183 | であったので, 真のモデルを「平均7.83の100個のポアソン乱数」と仮定でき, Rのポアソン乱数生成関数`rpois`を用いてPB法を以下のように実装できる. 184 | 185 | ```{r} 186 | get.dd <- function(data) { 187 | n.sample <- nrow(data) 188 | lambda <- 7.83 189 | d$y.rand <- rpois(n.sample, lambda = lambda) 190 | fit.rand.null <- glm(d$y.rand ~ 1, data = data, family = poisson) 191 | fit.rand.x <- glm(d$y.rand ~ x, data = data, family = poisson) 192 | fit.rand.null$deviance - fit.rand.x$deviance 193 | } 194 | pb <- function(data, n.boostrap) { 195 | replicate(n.boostrap, get.dd(data)) 196 | } 197 | ``` 198 | 199 | $\Delta_{1, 2}$を10000回計算し, 結果を図示すると以下のようになる ($\Delta_{1, 2}$のサインプルサイズは$10^3$ほどでは十分ではなく, 精度を高めるためには$10^4$以上にする方がよい) 200 | 201 | ```{r, results='hold', fig.show='hold'} 202 | n.boostrap = 10000 203 | dd12 <- pb(data = d, n.boostrap = n.boostrap) 204 | summary(dd12) 205 | hist(dd12, 100) 206 | abline(v = 4.5, lty = 2) 207 | ``` 208 | 209 | 210 | 得られた$\Delta_{1, 2}$のうちいくつが, 211 | ```{r, echo=FALSE, results='asis'} 212 | cat(dd) 213 | ``` 214 | よりも大きいのかを数えると以下のように$P$値を計算できる 215 | ```{r, echo=T, results='asis'} 216 | dd <- fit.null$deviance - fit.x$deviance 217 | p <- sum(dd12 >= dd) / n.boostrap 218 | ``` 219 | ```{r, echo=F, results='asis'} 220 | cat('$$P = ', p, '$$') 221 | ``` 222 | 223 | よって, この尤度比検定の結論として, 「$\Delta_{1, 2}$の$P$値は 224 | ```{r, echo=F, results='asis'} 225 | cat(p) 226 | ``` 227 | だったので, これは有意水準$\alpha = 0.05$よりも小さい」ので有意差があり(significantly different), 「帰無仮説(`Nullモデル`)は棄却され, 対立仮説(`xモデル`)が残るのでこれを採択」と判断する 228 | 229 | - 有意差は説明変数が及ぼす効果の大きさだけで決まるわけではなく, サンプルサイズが大きい場合は小さな差でも統計学的には有意となる場合があることに注意 230 | - $P$値は小さければ小さいほど有意というわけではなく, Neyman-Pearson検定の枠組みの下では$P < \alpha$となっているか, あるいはなっていないかだけが問題であることに注意 231 | - 棄却点と棄却域も気にしてみる 232 | - 棄却点(critical point): $P = \alpha$となるような$\Delta_{1, 2}$ 233 | - 棄却域(critical region, rejection region): 棄却点よりも大きい$\Delta_{1, 2}$の領域 234 | 235 | 棄却点はRでは以下のように調べることができる 236 | ```{r} 237 | alpha <- 0.05 238 | critical_point <- quantile(dd12, 1 - alpha) 239 | cat('critical point:', critical_point) 240 | ``` 241 | つまり, 有意水準5%のNeyman-Pearson検定の枠組みの下では, $\Delta_{1, 2} \leq$ 242 | ```{r, echo=F, results='asis'} 243 | cat(critical_point) 244 | ``` 245 | ぐらいまでは「よくある差」とみなす 246 | 247 | 248 | ## $\chi^2$分布を使った近似計算法 249 | 250 | PB法は計算量が非常に大きくなるが, 近似計算法を使うとよりお手軽に尤度比検定ができる場合がある 251 | 近似計算法で得られた$P$値とPB法で得られる$P$値は一致しないことに注意 252 | 253 | - $\Delta_{1, 2}$の確率分布を自由度$k$の$\chi^2$分布($\chi^2$ distribution)で近似できる場合がある 254 | - e.g.) 今回は自由度1となる 255 | - $\chi^2$分布近似は**サンプルサイズが大きい場合に有効な近似計算**であり, サンプルサイズによってはあまり正確ではない可能性がある 256 | - **サンプルサイズが大きくない小標本の下では, PB法を使って逸脱度差分布の差をシミュレーションで生成する方がよい** 257 | - PB法の検定統計量のサンプルサイズは, 問題によるので試行錯誤して決めるしかない 258 | 259 | Rでは以下のように, `anova`関数で引数`test = "Chisq"`とすることで利用可能 260 | (`Pr(>Chi)`が$P$値に対応) 261 | 262 | ```{r} 263 | anova(fit.null, fit.x, test = "Chisq") 264 | ``` 265 | 266 | - **等分散正規分布**の場合には, サンプルサイズが小さい場合の検定統計量の確率分布を利用できる 267 | - 平均差を検定統計量とする場合: $t$分布 268 | - 分散比を検定統計量とする場合: $F$分布 269 | 270 | 271 | # 帰無仮説を棄却できない場合($P \geq \alpha$となるとき) 272 | 273 | - 「帰無仮説が棄却できない(failed to reject)」= 「帰無仮説が正しい」**ではない** 274 | - 「帰無仮説・対立仮説のどちらも**正しいとも正しくないともいえない**と判断を保留する 275 | - Neyman-Pearson検定には非対称性があるので, $P < \alpha$となった場合と, $P \geq \alpha$となった場合では結論できることが大きく異なる 276 | - 以下のように第一種の過誤のみを排除できただけ, と解釈するべき 277 | 278 | 帰無仮説は/を | 棄却する | 棄却しない 279 | --|---|-- 280 | 真のモデルである | ~~第一種の過誤 ($P$)~~ | (問題なし) 281 | 真のモデルでない | (問題なし) | 第二種の過誤 ($P_{2}$) 282 | 283 | - 第二種の過誤の確率を$P_{2}$と評価することもある 284 | - Neyman-Pearson検定の枠組みの下では, $P_{2}$を使って何かを定量的に主張する手続きは用意されていない 285 | - **検定力**(検出力, power): 「帰無仮説が間違っていたときに棄却できる」確率 $1 - P_{2}$ 286 | 287 | 288 | # モデル選択 vs. 検定 (again) 289 | 290 | - モデル選択: 291 | - 目的: 「良い予測をするモデルを選ぶ」 292 | - 解釈: 「予測の良さは平均対数尤度」と明示し, 平均対数尤度を最大対数尤度とパラメータ数から推定する 293 | - 検定: 294 | - 目的: 「帰無仮説の安全な棄却」 295 | - 解釈: 帰無仮説が棄却されたあとに残された対立仮説が, どのような意味で「良い」モデルなのかは明確でない 296 | 297 | 298 | モデル選択や検定のいずれを使用するにしろ, その結果だけに注目するのではなく, 推定された統計モデルが, 対象となる現象の挙動をどのように予測しているのかも確認するべきである 299 | - 推定されたパラメータがどのような値なのか(**効果の大きさ**(effect size)) 300 | - 標準誤差などで表される推定の誤差はどれほどなのか 301 | - それらを組み合わせたときの統計モデルの挙動はどうなると予測されるのか 302 | - などなど(特にサンプルサイズとの関連を考える) 303 | -------------------------------------------------------------------------------- /notes/chapter6.Rmd: -------------------------------------------------------------------------------- 1 | --- 2 | title: chapter6 ― GLMの応用範囲を広げる 3 | subtitle: ロジスティック回帰など 4 | author: KADOWAKI, Shuhei 5 | date: 2018/12/21 6 | output: 7 | html_document: 8 | toc: true 9 | toc_float: true 10 | number_sections: true 11 | theme: cosmo 12 | code_folding: show 13 | df_print: paged 14 | --- 15 | 16 | ```{r echo=FALSE} 17 | ## Setting the global code chunk options ## 18 | # Args 19 | # comment='': won't append any string to the start of each line of results 20 | # fig.align='center': align figures to the center of document 21 | knitr::opts_chunk$set(comment="", fig.align="center") 22 | ``` 23 | 24 | 25 | 26 | 27 | # GLMの汎用性 28 | 29 | `glm`系関数でよく使われる確率分布と, よく使われるリンク関数 30 | 31 | 確率分布 | 乱数生成 | `glm.family` | `link` 32 | --|---|---|-- 33 | 二項分布 | `rbinom` | `binomial` | `logit` 34 | ポアソン分布 | `rpois` | `poisson` | `log` 35 | 負の二項分布 | `rnbinom` | `glm.nb` | `log` 36 | 正規分布 | `rnorm` | `gaussian` | `identity` 37 | ガンマ分布 | `rgamma` | `gamma` | `log` 38 | 39 | 40 | 41 | # 二項分布を使ったGLM 42 | 43 | 44 | ## 二項分布(binomial distribution) 45 | 46 | - 上限のあるカウントデータを表すことができる 47 | - e.g.) 「$N$ 個体の実験対象に同じ処理をしたら, $y$ 個体で反応が陽性, $N-y$ 個体では陰性だった」 48 | - c.f.) ポアソン分布: 上限のないカウントデータ 49 | - 確率分布: $p(y | N, q) = \Biggl( \begin{matrix}N\\ y\end{matrix} \Biggr) q^y (1 - q)^{N - y}$ 50 | - 「$N$ 個中の $y$ 個で事象が生起する」という確率を表す 51 | 52 | $N = 8$ の時の確率分布を図示すると以下のよう. 53 | 54 | ```{r} 55 | y <- 0:8 56 | p <- dbinom(y, max(y), prob = 0.1) 57 | plot(y, p, type = "n", xlab = "y", ylab = "p(y |8, q)") 58 | for (q in c(0.1, 0.3, 0.8)) { 59 | p <- dbinom(y, max(y), prob = q) 60 | lines(y, p, type = "b", col = rgb(0, 0, 0, min(q + 0.3, 1)), lwd = 2, pch = 16) 61 | } 62 | legend("topright", legend = c(0.1, 0.3, 0.6), pch = c(21, 23, 24), title = "q") 63 | ``` 64 | 65 | 66 | ## (線形)ロジスティック回帰 67 | 68 | - **ロジスティック回帰(logistic regression)**: 確率分布に二項分布, リンク関数にロジットリンク関数(logit link function)を使用するGLM 69 | - リンク関数には, profitリンク関数や, complementary log-logリンク関数なども使われる 70 | 71 | ### ロジットリンク関数とロジスティック関数 72 | 73 | - **ロジットリンク関数(logit link function)**: 二項分布のパラメータ $q_{i}$ の制約 $0 \leq q_{i} \leq 1$ と線形予測子をうまく結びつけるリンク関数 74 | - **ロジスティック関数(logistic function)**: ロジット(リンク)関数の逆関数 75 | $$ 76 | q_{i} = {\rm logistic} (z_{i}) = \frac{1}{1 + \exp(-z_{i})} \\ 77 | z_{i} = \beta_{1} + \beta_{2} x_{i} + .. 78 | $$ 79 | 80 | ロジスティック関数を図示すると以下のよう. 81 | 82 | ```{r} 83 | logistic <- function(z) 1 / (1 + exp(-z)) 84 | z <- seq(-5, 5, 0.1) 85 | plot(z, logistic(z), type = "l", xlab = "z", ylab = "q") 86 | abline(v = 0, lty = 2) 87 | ``` 88 | 89 | $z_{i}$ がどのような値でも, 必ず, $0 \leq q_{i} \leq 1$ となる. 90 | 91 | 次に, $q_{i}$ が $x_{i}$ だけに依存していると仮定( $z_{i} = \beta_{1} + \beta_{2} x_{i}$ )して, ロジスティック関数と線形予測子の関係を図示すると以下のよう. 92 | 93 | ```{r fig.show='hold', out.width='50%', out.height='100%', fig.align='default'} 94 | xx <- seq(-3, 3, 0.1) 95 | cols <- c("#118ab6", "#212198", "#af13a4") 96 | 97 | # left 98 | plot(xx, logistic(0 + 2 * xx), type = "l", lwd = 2, col = cols[1], ylim = c(0, 1), yaxs = "i", xlab = "x", ylab = "q", main = "beta_2 = 2") 99 | lines(xx, logistic(2 + 2 * xx), lwd = 2, col = cols[2]) 100 | lines(xx, logistic(-3 + 2 * xx), lwd = 2, col = cols[3]) 101 | legend("topleft", legend = c(0, 2, -3), col = cols, lwd = 2, title = "beta_1") 102 | 103 | # right 104 | plot(xx, logistic(0 + 2 * xx), type = "l", lwd = 2, col = cols[1], ylim = c(0, 1), yaxs = "i", xlab = "x", ylab = "q", main = "beta_1 = 0") 105 | lines(xx, logistic(0 + 4 * xx), lwd = 2, col = cols[2]) 106 | lines(xx, logistic(0 - 1 * xx), lwd = 2, col = cols[3]) 107 | legend("left", legend = c(2, 4, -1), col = cols, lwd = 2, title = "beta_1") 108 | ``` 109 | 110 | このロジスティック関数を以下のように変形したとき, 左辺がロジット(リンク)関数, 右辺が線形予測子. 111 | 112 | $$ 113 | \log \frac{q_{i}}{1 - q_{i}} = z_{i} \\ 114 | {\rm logit}(q_{i}) = \log \frac{q_{i}}{1 - q_{i}}\\ 115 | z_{i} = \beta_{1} + \beta_{2} x_{i} + ... 116 | $$ 117 | 118 | ### パラメータ推定 119 | 120 | 尤度関数と対数尤度関数は以下のようになる. 121 | 122 | $$ 123 | L({\beta_{j}}) = \prod_{i} \Biggl( \begin{matrix}N_{i} \\ y_{i} \end{matrix} \Biggr) q_{i}^{y_{i}} (1 - q_{i})^{N_{i} - y_{i}} \\ 124 | \log L({\beta_{j}}) = \sum_{i} \Biggl\{ \log \Biggl( \begin{matrix}N_{i} \\ y_{i} \end{matrix} \Biggr) + y_{i} \log q_{i} + (N_{i} - y_{i}) \log (1 - q_{i}) \Biggr\} \\ 125 | q_{i} = f(\{\beta_{1}, \beta_{2}, ...\}) 126 | $$ 127 | 128 | この $\log L$ を最大化する $\{{\hat \beta_{j}}\}$ はRの `glm` がやってくれる. 129 | 130 | 131 | *** 132 | **Example data** 133 | 134 | 今回使うデータは次のようなもの. 135 | 136 | - ある植物個体 $i$ について, 137 | - $N_{i}$: 観察種子数 138 | - $y_{i}$: 生存種子数 139 | - $q_{i}$: 「$i$から得られた1個の種子が生きている確率」 140 | - 今回は $N_{i}$ は常に8なので, $y_{i}$ の増加 = $q_{i}$ の増加 141 | - $x_{i}$: 体サイズ 142 | - $f_{i}$: 施肥処理の有無 143 | 144 | ```{r} 145 | d <- read.csv("../data/data6a.csv") 146 | summary(d) 147 | 148 | plot.data <- function(...) { 149 | plot( 150 | d$x, d$y, 151 | pch = c(21, 16)[d$f], 152 | xlab = "x", ylab = "y", 153 | ... 154 | ) 155 | } 156 | 157 | plot.data() 158 | legend("topleft", legend = c("C", "T"), pch = c(21, 19)) 159 | ``` 160 | 161 | - $x_{i}$ が大きくなると, $y_{i}$ も大きくなる 162 | - $f_{i}$ =`T` で $y_{i}$ が増加 163 | 164 | 165 | *** 166 | 167 | 168 | `glm`でのロジスティック回帰は次のように行う. 169 | 170 | - 応答変数: `cbind(y, N - y)`: (生存した種子数, 死んだ種子数)の行列を生成 171 | - `y`が「生存した(`0`)」「死んだ(`1`)」のような2値分類を取るときは, `glm(y ~ x, ...)` とできる 172 | - `family = binomial` とすると, デフォルトでリンク関数が, `binomial(link = "logit")` となる 173 | 174 | ```{r} 175 | fit.xf <- glm(cbind(y, N - y) ~ x + f, data = d, family = binomial) 176 | print(fit.xf) 177 | ``` 178 | 179 | 予測された切片 $\{{\hat \beta_{1}}, {\hat \beta_{2}}, {\hat \beta_{3 }}\}$ = $\{-19.536, 1.952, 2.022\}$ を用いた平均の予測曲線は次のようになる. 180 | 181 | ```{r fig.show="hold", out.width="50%", out.height="100%", fig.align="default"} 182 | xx <- seq(min(d$x), max(d$x), length = 50) 183 | 184 | # control 185 | plot.data(col = c("#000000", NA)[d$f]) 186 | ff <- factor("C", levels = c("C", "T")) 187 | p <- predict(fit.xf, newdata = data.frame(x = xx, f = ff), type = "response") 188 | lines(xx, p * 8, lwd = 3, col = "gray") 189 | 190 | # treatment 191 | plot.data(col = c(NA, "#000000")[d$f]) 192 | ff <- factor("T", levels = c("C", "T")) 193 | p <- predict(fit.xf, newdata = data.frame(x = xx, f = ff), type = "response") 194 | lines(xx, p * 8, lwd = 3, col = "black") 195 | ``` 196 | 197 | - 例題データからcontrolデータだけを選んで, fitさせた予測曲線と, 各 $x$ での二項分布の図示. 198 | 199 | ```{r echo=FALSE, fig.show="hold", out.width="50%", out.height="100%", fig.align="default"} 200 | d0 <- d[d$f == "C", ] 201 | col.d <- "#00000040" 202 | range.x <- c(7, 12) 203 | range.y <- c(0, 8) 204 | 205 | plot.d0 <- function(type = "p") { 206 | plot( 207 | d0$x, d0$y, 208 | xlim = range.x, 209 | ylim = range.y, 210 | type = type, 211 | axes = FALSE 212 | ) 213 | axis(1, pos = 0) 214 | axis(2, pos = range.x[1]) 215 | abline(v = range.x[1]) 216 | abline(h = 0) 217 | } 218 | 219 | plot.d0(type = "p") 220 | 221 | plot.d0(type = "n") 222 | fit.c <- glm(cbind(y, N - y) ~ x, data = d0, family = binomial) 223 | draw.binom <- function(x) { 224 | abline(v = x, col = col.d) 225 | p <- predict(fit.c, newdata = data.frame(x = x), type = "response") 226 | sd <- sd(fit.c$residuals) 227 | for (yy in 0:8) rect( 228 | x - dbinom(yy, 8, p) * 2, 229 | yy - 0.4, 230 | x, 231 | yy + 0.4, 232 | border = NA, 233 | col = col.d 234 | ) 235 | points(x, 8 * p, pch = 16) 236 | } 237 | draw.binom(x = 8.5) 238 | draw.binom(x = 10) 239 | draw.binom(x = 12) 240 | b <- fit.c$coefficients 241 | x <- seq(min(d0$x), max(d0$x), length = 100) 242 | lines(x, 8 * logistic(b[1] + b[2] * x), lty = 1, lwd = 2) 243 | ``` 244 | 245 | ### ロジットリンク関数の意味・解釈 246 | 247 | ロジットリンク関数の $\log$ の中身をオッズ(odds)とよぶ. 248 | $$ 249 | {\rm logit}(q_{i}) = \log \frac{q_{i}}{1 - q_{i}} \\ 250 | \frac{q_{i}}{1 - q_{i}} = \exp(\beta_{1} + \beta_{2} x_{i} + \beta_{3} f_{i}) = \exp(\beta_{1}) \exp(\beta_{2} x_{i}) \exp(\beta_{3} f_{i}) 251 | $$ 252 | 253 | - この例題の場合だと, (生存する確率) / (生存しない確率) という比を表す 254 | - c.f.) $q_{i} = 0.8$ なら, 「オッズ4倍」などという 255 | - オッズは $\exp$ (パラメータ $\times$ 要因) に比例する 256 | - e.g.) 個体 $i$ の大きさが「1単位」増大すれば, 生存確率のオッズは, $\exp (\beta_{2} \times 1) = \exp(1.95) = 7$ 倍ほど増大する 257 | - e.g.) 「肥料なし(control, $f_{i} = 0$)」に比べて, 「施肥処理あり(treatment, $f_{i} = 1$)」のオッズは, $\exp (\beta_{3} \times 1) = \exp(2.02) = 7.5$ 倍ほど増大する 258 | - => このように, ロジットリンク関数で生存確率を定義することで, さまざまな要因と応答事象のオッズの解釈が簡単になる(ロジスティック回帰のもう1つの利点) 259 | - もともとの利点: 生存確率が $0 \leq q_{i} \leq 1$ となる 260 | - c.f.) オッズ比で(発病のなどの)「リスク」を(近似的)に表すことができる 261 | - e.g.) 個人の生活習慣 $X$ の効果を表す係数 $\beta_{s}$ をロジスティック回帰で推定 -> 病気になるオッズ比(リスク)は $\exp({\hat \beta_{s}})$ 倍 262 | 263 | ### ロジスティック回帰のモデル選択 264 | 265 | ロジスティック回帰のネストしているモデルたちもAICでモデル選択できる. 266 | Rの`Mass`packageの`stepAIC`関数を使うと, ネストしているモデルのAICを自動的に比較しながら, AIC最小のモデルを選択できる. 267 | 268 | ```{r} 269 | library(MASS) 270 | print(stepAIC(fit.xf)) 271 | ``` 272 | 273 | `x + f`モデルがAICの観点から最良であることが確認できる. 274 | 1つ1つ確認するコードは以下. 275 | 276 | ```{r} 277 | fit.null <- glm(cbind(y, N - y) ~ 1, data = d, family = binomial) 278 | fit.f <- glm(cbind(y, N - y) ~ f, data = d, family = binomial) 279 | fit.x <- glm(cbind(y, N - y) ~ x, data = d, family = binomial) 280 | fit.xf <- glm(cbind(y, N - y) ~ x + f, data = d, family = binomial) 281 | 282 | k.null <- 1 * 2 283 | k.f <- 2 * 2 284 | k.x <- 2 * 2 285 | k.xf <- 2 * 3 286 | k.full <- 2 * 100 287 | d.null <- -2 * logLik(fit.null) 288 | d.f <- -2 * logLik(fit.f) 289 | d.x <- -2 * logLik(fit.x) 290 | d.xf <- -2 * logLik(fit.xf) 291 | d.full <- -2 * sum(dbinom(d$y, d$N, prob = d$y / d$N, log = TRUE)) 292 | ``` 293 | ```{r, comment="", echo=F, results="asis"} 294 | cat( 295 | "model | 2k | deviance | residual deviance | AIC", "\n", 296 | "--|--|--|--|--", "\n", 297 | "null", "|", k.null, "|", d.null[1], "|", d.null[1] - d.full[1], "|", fit.null$aic, "\n", 298 | "f", "|", k.f, "|", d.f[1], "|", d.f[1] - d.full[1], "|", fit.f$aic, "\n", 299 | "x", "|", k.x, "|", d.x[1], "|", d.x[1] - d.full[1], "|", fit.x$aic, "\n", 300 | "x + f", "|", k.xf, "|", d.xf[1], "|", d.xf[1] - d.full[1], "|", fit.xf$aic, "\n", 301 | "full", "|", k.full, "|", d.full[1], "|", d.full[1] - d.full[1], "|", d.full[1] + k.full, "\n" 302 | ) 303 | ``` 304 | 305 | 306 | 307 | # 交互作用項 308 | 309 | - **交互作用項(interaction)**: 線形予測子の項を掛け合わせ 310 | - e.g.) この例題の場合, 体のサイズ $x_{i}$ と施肥処理の効果 $f_{i}$ の「積」の効果 311 | - ${\rm logit} (q_{i}) = \beta_{1} + \beta_{2} x_{i} + \beta_{3} f_{i} + \beta_{4} x_{i} f_{i}$ 312 | - 因子型説明変数の $f_{i}$ を{0, 1}の2値とすれば, この交互作用項は単純に「 $x_{i}$ と $f_{i}$ の積に係数 $\beta_{4}$ の値をかけたもの」と考えられる 313 | - -> 交互作用が大きな影響をもつ場合, 平均生存種子数の体サイズ $x_{i}$ 依存性は, 施肥処理 $f_{i}$ によって大きく変わる 314 | - Rでは, `glm(cbind(y, N - y) ~ x * f, ...)`として指示する 315 | - `x * f`: `x + f + x:f` の省略記法(`x:f`が交互作用を表す) 316 | 317 | ```{r} 318 | fit.xfi <- glm(cbind(y, N - y) ~ x * f, data = d, family = binomial) 319 | print(fit.xfi) 320 | ``` 321 | 322 | 一見すると, `x + f` モデルの係数 `fT` の推定値(2.02)と, `xfi` モデルの係数 `fT` の推定値(-0.06)が大きく異なるようにみえるが, 施肥処理をした場合のリンク関数(線形予測子)を考えると, 323 | 324 | $$ 325 | {\rm logit}(q_{i}) = -18.5 - 0.0638 + (1.85 + 0.216) = -18.6 + 2.07 x_{i} 326 | $$ 327 | 328 | となり, かなり値は近くなる. 329 | また, 以下に図示するように, モデルの予測も大きく変わらない. 330 | 331 | ```{r fig.show="hold", out.width="50%", out.height="100%", fig.align="default"} 332 | cols = c("#11b5c6", "#542ac1") 333 | 334 | plot.xf <- function(fit, main = NA) { 335 | plot(d$x, d$y, type = "n", main = main, xlab = "x", ylab = "y") 336 | xx <- seq(min(d$x), max(d$x), length = 50) 337 | ff <- factor("C", levels = c("C", "T")) 338 | q <- predict(fit, newdata = data.frame(x = xx, f = ff), type = "response") 339 | lines(xx, q * 8, col = cols[1], lwd = 3) 340 | ff <- factor("T", levels = c("C", "T")) 341 | q <- predict(fit, newdata = data.frame(x = xx, f = ff), type = "response") 342 | lines(xx, q * 8, col = cols[2], lwd = 3) 343 | } 344 | 345 | plot.xf(fit.xf, main = "without interaction") 346 | legend("topleft", legend = c("C", "T"), lwd = 3, col = cols) 347 | plot.xf(fit.xfi, main = "with interaction") 348 | legend("topleft", legend = c("C", "T"), lwd = 3, col = cols) 349 | ``` 350 | 351 | `stepAIC` を利用することもできる 352 | 353 | ```{r} 354 | print(stepAIC(fit.xfi)) 355 | ``` 356 | 357 | 今回は, 交互作用項を入れると, AICは悪化してしまっている. 358 | 359 | - **交互作用項に関する注意点** 360 | - 係数だけを見ても解釈できない場合が多い 361 | - 実際の観測データに基づいて, 交互作用項が表す複雑なパターンを特定するのはなかなか難しい 362 | - むやみに交互作用項を入れてしまうと, 説明変数が多い場合にはその個数が「組み合わせ論的爆発」で増大して, パラメータ推定が困難になる 363 | - 交互作用項の効果の過大推定の可能性 364 | - 現実のデータにGLMをあてはめた場合, 交互作用項を多数含んだモデルのAICが最良になる場合がある 365 | - -> ニセの交互作用でつじつまあわせをしている可能性がある 366 | - => 説明変数では説明できない「個体差」「場所差」の効果を組み込んだGLMを使う必要がある 367 | 368 | 369 | 370 | # オフセット項わざ 371 | 372 | - 観測データ同士の割算により生じる問題 373 | - **情報が失われる**: e.g.) 1000打数300安打の打者 ≠ 10打数3安打の打者 374 | - **変換された値の分布**: 分子・分母にそれぞれ誤差が入った数量同士を割算して作られた割算値の確率分布を導出するのは非常に難しい 375 | 376 | - ロジスティック回帰(二項分布&ロジットリンク関数)を使うもう1つの利点 377 | - **何かの生起確率を推定するときに, (観測データ) / (観測データ)という割算を作り出さなくてもよい** 378 | - 逆に言えば, 応答変数に割算や変数変換による数値を用いなくてもよい統計モデリングが**必ずある** 379 | - => **オフセット項わざ** 380 | 381 | *** 382 | Example data 383 | 384 | - 森林の100箇所の調査: 植物個体の「人口密度」と「明るさ」の影響を調べたい 385 | - $A_{i}$ : 面積 386 | - $x_{i}$ : 明るさ 387 | - $y_{i}$ : 植物個体数 388 | 389 | ```{r fig.show="hold", out.width="50%", out.height="100%", fig.align="default"} 390 | d <- read.csv("../data/data6b.csv") 391 | 392 | v.cex <- d$A * 0.2 393 | col.a <- function(x, o = 0.1) { 394 | rgb(0, x, 0, (1 - x) * (1 - 2 * o) + o) 395 | } 396 | v.col <- col.a(d$x) 397 | plot.offset <- function(xx, xlab = NA) 398 | { 399 | plot( 400 | xx, d$y, 401 | xlab = xlab, ylab = "y", 402 | cex = v.cex, col = v.col, pch = 1, 403 | xlim = c(0, max(xx) * 1.05), 404 | ylim = c(0, max(d$y) * 1.05) 405 | ) 406 | } 407 | 408 | plot.offset(d$x, xlab = "x") 409 | plot.offset(d$A, xlab = "A") 410 | ``` 411 | 412 | 明るい地点ほど明るく, 広い地点ほど大きくプロット 413 | 414 | *** 415 | 416 | GLMのオフセット項を利用すれば, 人口密度という概念を扱うからといって, 割算値をこしらえる必要はない. 417 | 418 | $$ 419 | \frac{平均個体数\lambda_{i}}{A_{i}} = 人口密度 \\ 420 | \lambda_{i} = A_{i} \times 人口密度 = A_{i} \exp(\beta_{1} + \beta_{2} x_{i}) \\ 421 | \lambda_{i} = \exp(\beta_{1} + \beta_{2} x_{i} + \log A_{i}) 422 | $$ 423 | 424 | とモデル化することができて, $\exp(\beta_{1} + \beta_{2} x_{i} + \log A_{i})$ を線形予測子とすると対数リンク関数・ポアソン分布のGLMとなる. 425 | 426 | - **オフセット項**: この $\log A_{i}$ のような, 線形予測子の中でパラメータのつかない項 427 | - 線形予測子に $\log A_{i}$ という「ゲタ」を履かせている 428 | 429 | Rでは以下のように, `glm(offset)` 引数を指定することで使用可能. 430 | 431 | 432 | ```{r} 433 | fit <- glm(y ~ x, offset = log(A), data = d, family = poisson) 434 | print(fit) 435 | 436 | b <- fit$coefficients 437 | plot.offset(d$A) 438 | v.a <- c(0, 20) 439 | for (x in c(0.1, 0.3, 0.5, 0.7, 0.9)) { 440 | lines(v.a, v.a * exp(b[1] + b[2] * x), col = col.a(x, o = 0), lwd = 3) 441 | } 442 | ``` 443 | 444 | 上は, 明るさごとの平均個体数予測をプロットしたもの(明るい場所ほど明るい直線). 445 | 446 | - 「単位面積あたり」ではなく「単位時間あたり」の事象にも使える 447 | - **観察時間の対数**をオフセット項に指定する 448 | - カウントデータだけではなく, (連続値) / (連続値) のような比率・密度にも使用可能 449 | 450 | 451 | 452 | # 正規分布とその尤度 453 | 454 | - **正規分布(normal distribution, ガウス分布(Gaussian distribution))**: **連続値**データを扱うための確率分布 455 | - パラメータ 456 | - 平均値 $\mu \in (-\infty, \infty)$ 457 | - 標準偏差 $\sigma$ 458 | 459 | 正規分布の**確率密度関数**は以下. 460 | $$ 461 | p(y | \mu, \sigma) = \frac{1}{\sqrt{2 \pi \sigma^2}} \exp \Biggl\{ - \frac{(y - \mu)^2}{2 \sigma^2} \Biggr\} 462 | $$ 463 | (これまでのような離散確率分布の確率の分布は**確率質量関数**と呼ばれる) 464 | 465 | ```{r} 466 | y <- seq(-5, 5, 0.1) 467 | plot(y, dnorm(y, mean = 0, sd = 1), type = "l") 468 | ``` 469 | 470 | - 連続値の確率分布では, 確率密度を積分した量が確率として定義される 471 | - Rの `pnorm(x, mu, sd)` 関数は $\int_{-\infty}^{x}p(y | \mu, \sigma) dy$ を計算してくれる 472 | - `pnorm(x2, mu, sd) - pnorm(x1, mu, sd)` で, $y$ が`x2`から`x1`までの値をとる確率を計算できる 473 | - 他にも, 長方形の面積による近似計算などもある 474 | 475 | $p(1.2 \leq y \leq 1.8 | \mu, \sigma)$の評価例. 476 | 477 | ```{r} 478 | # integration 479 | print(pnorm(1.8, 0, 1) - pnorm(1.2, 0, 1)) 480 | # approximation 481 | print(dnorm(1.5, 0, 1) * (1.8 - 1.2)) 482 | ``` 483 | 484 | 485 | ## 正規分布の最尤推定 486 | 487 | 確率 = 確率密度関数 $\times \Delta y$ という考えに基づく, 正規分布の尤度関数と対数尤度関数は以下. 488 | 489 | $$ 490 | L(\mu, \sigma) = \prod_{i}^N p(y_{i} | \mu, \sigma) \Delta y \\ 491 | L(\mu, \sigma) = \prod_{i}^N \frac{1}{\sqrt{2 \pi \sigma^2}} \exp \Biggl\{ - \frac{(y_{i} - \mu)^2}{2 \sigma^2} \Biggr\} \Delta y \\ 492 | \log L(\mu, \sigma) = - \frac{1}{2} N \log (2 \pi \sigma^2) - \frac{1}{2 \sigma^2} \sum_{i}^N (y_{i} - \mu)^2 + N \log(\Delta y) 493 | $$ 494 | 495 | ここで, $\Delta y$ は定数なので, パラメータ $\{\mu, \sigma\}$ の最尤推定に影響を与えないため, 無視して省略できるため, 対数尤度関数は次のように書ける. 496 | 497 | 498 | $$ 499 | \log L(\mu, \sigma) = - \frac{1}{2} N \log (2 \pi \sigma^2) - \frac{1}{2 \sigma^2} \sum_{i}^N (y_{i} - \mu)^2 500 | $$ 501 | 502 | - 尤度が確率密度の積である場合には, 対数尤度は負の値になるとは限らない 503 | - e.g.) $\sigma^2$ が $0$ に近い場合 504 | - -> AICや逸脱度が負の値になることもある 505 | - 正規分布の最尤推定と最小二乗法 506 | - $\sigma$ が $\mu$ と無関係な定数だとすると, 二乗誤差の和 $\sum_{i} (y_{i} - \mu)^2$ を最小にするパラメータ ${\hat \mu}$ で対数尤度が最大になる 507 | - => 標準偏差 $\sigma$ が一定である正規分布の最尤推定 = 最小二乗法による推定 508 | - 直線回帰 = 最小二乗法による直線のあてはめ 509 | - 線形予測子: $z_{i} = \beta_{1} + \beta_{2} x_{i} $ 510 | - 恒等リンク関数: $\mu_{i} = z_{i}$ 511 | 512 | 513 | 514 | # ガンマ分布のGLM 515 | 516 | - **ガンマ分布(gamma distribution)**: 確率変数の取りうる範囲が0以上の連続確率分布 517 | 518 | $$ 519 | p(y | s, r) = \frac{\Gamma(s)}{r^s} y^{s - 1} \exp(-ry) 520 | $$ 521 | 522 | - パラメータ 523 | - $s$: shapeパラメータ 524 | - $\Gamma(s)$: ガンマ関数 525 | - $r$: rateパラメータ 526 | - $1/r$: scaleパラメータ 527 | - $s = 1$のとき **指数分布(exponential distribution)** となる 528 | - Rの`dgamma(y, shape, rate)`関数を使うとガンマ分布の確率密度を評価できる 529 | 530 | ```{r fig.show="hold", out.width="50%", out.height="100%", fig.align="default"} 531 | y <- seq(0, 5, 0.1) 532 | plot(y, dgamma(y, shape = 1, rate = 1), type = "l") 533 | plot(y, dgamma(y, shape = 5, rate = 5), type = "l") 534 | ``` 535 | 536 | *** 537 | Example data 538 | 539 | 540 | - 架空植物50個体の葉の重量と花の重量の関係を調べる 541 | - $x_{i}$ : 葉の重量 542 | - $y_{i}$ : 花の重量 543 | 544 | ```{r} 545 | d <- read.csv("../data/data6c.csv") 546 | plot(d$x, d$y, xlab = "x", ylab = "y") 547 | ``` 548 | 549 | $x_{i}$ が大きくなるにつれて $y_{i}$ も大きくなっているよう. 550 | 551 | *** 552 | 553 | - 応答変数 $y_{i}$ は連続値だが, 重量なので正の値しか取らない 554 | - 正規分布ではなく, ガンマ分布で説明した方がよい 555 | 556 | 平均花重量 $\mu_{i}$ を以下のように定義すると, 対数リンク関数を用いたガンマ分布のGLMの線形予測子を導出できる. 557 | 558 | $$ 559 | \mu_{i} = A x_{i}^b \\ 560 | \mu_{i} = \exp(a) x_{i}^b = \exp(a + b \log x_{i}) \\ 561 | \log \mu_{i} = a + b \log x_{i} 562 | $$ 563 | ($A = \exp (a)$ とした.) 564 | 565 | 以上から, 推定するべきパラメータは切片 $a$ と 傾き $b$. 566 | 例によってRの`glm`関数を用いて次のように推定できる. 567 | 568 | ```{r} 569 | fit <- glm(y ~ log(x), family = Gamma(link = "log"), data = d) 570 | print(fit) 571 | 572 | plot(d$x, d$y, xlab = "x", ylab = "y") 573 | lines(d$x, predict(fit, newdata = data.frame(x = d$x), type = "response"), lwd = 3, col = "#390ea2") 574 | ``` 575 | 576 | 以下は, より詳細なプロット. 577 | 578 | - 破線: 真の平均 579 | - 黒い曲線: `glm`による平均予測 580 | - グレーの曲線: 予測分布の中央値 581 | - より薄い領域: 50%予測区間(25 ~ 75%の区間) 582 | - さらに薄いグレーの領域: 90%予測区間(5 ~ 95%の区間) 583 | 584 | 585 | ```{r, echo=FALSE, fig.show='hold'} 586 | x <- seq(0.001, 0.8, length = 50) 587 | get.y.mean <- function(b1, b2, x) exp(b1 + b2 * log(x)) 588 | p <- list(b1 = -1, b2 = 0.7, inv.phi = 3) # phi: dispersion parameter 589 | y.mean <- get.y.mean(p[["b1"]], p[["b2"]], x) 590 | 591 | sum.fit <- summary(fit) 592 | vc <- sum.fit$coefficients[,"Estimate"] 593 | names(vc) <- c("b1", "b2") 594 | phi <- sum.fit$dispersion # dispersion parameter 595 | 596 | get.y.mean <- function(b1, b2, x) exp(b1 + b2 * log(x)) 597 | plot.d <- function(tline = TRUE) 598 | { 599 | plot(d$x, d$y, xlab = "x", ylab = "y") 600 | if (tline) { 601 | lines(d$x, get.y.mean(p[["b1"]], p[["b2"]], d$x), lty = 2, lwd = 2) 602 | } 603 | } 604 | 605 | plot.d() 606 | lines(d$x, predict(fit, newdata = data.frame(x = d$x), type = "response"), lwd = 2) 607 | m <- get.y.mean(vc["b1"], vc["b2"], d$x) 608 | rate <- 1 / (phi * m) 609 | shape <- 1 / phi 610 | plot.pi <- function(q) polygon( 611 | c(d$x, rev(d$x)), 612 | c(qgamma(q, shape, rate), rev(qgamma(1 - q, shape, rate))), 613 | border = NA, 614 | col = "#00000020" 615 | ) 616 | plot.pi(q = 0.05) 617 | plot.pi(q = 0.25) 618 | # median 619 | lines(d$x, qgamma(0.5, shape, rate), col = "#808080", lwd = 2) 620 | ``` 621 | -------------------------------------------------------------------------------- /notes/chapter7.Rmd: -------------------------------------------------------------------------------- 1 | --- 2 | title: chapter7 一般化線形混合モデル(GLMM) 3 | subtitle: 個体差のモデリング 4 | author: KADOWAKI, Shuhei 5 | date: 2018/12/22 6 | output: 7 | html_document: 8 | toc: true 9 | toc_float: true 10 | number_sections: true 11 | theme: cosmo 12 | code_folding: show 13 | df_print: paged 14 | --- 15 | 16 | ```{r echo=FALSE} 17 | ### Setting the global code chunk options ### 18 | # Args 19 | # comment="": won't append any string to the start of each line of results 20 | # fig.align='center': align figures to the center of document 21 | knitr::opts_chunk$set(comment = "", fig.align='center') 22 | ``` 23 | 24 | # GLMでは説明できないカウントデータ 25 | 26 | - 現実のデータのばらつきは, ポアソン分布や二項分布だけではうまく説明できない 27 | - データにばらつきをもたらす「原因不明な(人間が測定できない・測定しなかった)個体差」がある 28 | - => **GLMM** 29 | - **一般化線形混合モデル(generalized linear mixed model, GLMM)**: 「測定できない・しなかった個体差」を組み込んだGLM 30 | - **複数の確率分布を部品とする統計モデル** 31 | - e.g.) データのばらつきは二項分布、個体のばらつきは正規分布で表す 32 | 33 | ![GLMの拡張](../figs/glmdevelopment.svg) 34 | 35 | *** 36 | 37 | Example data 38 | 39 | - 生存種子数が葉数とともにどのように増大するかを調べる 40 | - $y_{i} \leq 8$: $i$ の生存種子数 41 | - $2 \leq x_{i} \leq 6$: $i$ の葉数 42 | - $x_{i}$ の値ごとに20個体ずつサンプル, 全部で100個体をサンプル 43 | 44 | ```{r rows.print=5, max.print=25} 45 | # only the first 25 rows gonna be rendered (5 rows per page) 46 | d <- read.csv('../data/data7.csv') 47 | d 48 | ``` 49 | 50 | ```{r} 51 | summary(d) 52 | ``` 53 | 54 | 以下の破線が真の生存確率. 55 | 56 | ```{r } 57 | v.x <- 0:8 58 | xx <- seq(1, 7, 0.1) 59 | 60 | logistic <- function(z) 1 / (1 + exp(-z)) 61 | 62 | plot.d <- function( 63 | d, w = 0.1, col = "#199a60", 64 | xlab = "x", ylab = "y", 65 | axes = TRUE, 66 | ylim = range(d$y), 67 | ...) { 68 | plot( 69 | d$x, d$y, 70 | type = "n", # no plot 71 | xlab = xlab, ylab = ylab, 72 | axes = axes, 73 | ylim = ylim 74 | ) 75 | for (x in sort(unique(d$x))) { 76 | dsub <- d[d$x == x, ] 77 | for (ns in sort(unique(dsub$y))) { 78 | n <- sum(dsub$y == ns) 79 | sx <- 1:n 80 | sdx <- ifelse(n == 1, 1, sd(sx)) 81 | points( 82 | x + (sx - mean(sx)) / sdx * w, 83 | rep(ns, n), 84 | col = col, 85 | ... 86 | ) 87 | } 88 | } 89 | } 90 | 91 | par.glmm <- function() par(mar = c(1.5, 1.5, 0.1, 0.1), mgp = c(1.5, 0.5, 0), cex = 1.0) 92 | col.true = "#398ac2" 93 | line.true <- function(col = col.true) lines(xx, logistic(-4 + 1 * xx) * max(v.x), lwd = 2, lty = 4, col = col) 94 | 95 | par.glmm() 96 | plot.d(d) 97 | line.true() 98 | ``` 99 | 100 | *** 101 | 102 | まず, ロジットリンク関数を用いたGLMでモデリングを行うと以下のような結果になる. 103 | 104 | $$ 105 | {\rm logit}(q_{i}) = \beta_{1} + \beta_{2} x_{i} \\ 106 | p(y_{i} | \beta_{1}, \beta_{2}, x_{i}) = \Biggl( \begin{matrix}8 \\ y\end{matrix} \Biggr) q_{i}^{y_{i}} (1 - q_{i})^{8 - y_{i}} \\ 107 | {\rm log} L = \sum_{i} {\rm log} p(y_{i} | \beta_{1}, \beta_{2}) 108 | $$ 109 | 110 | ```{r} 111 | fit.glm <- glm(cbind(y, N - y) ~ x, family = binomial, data = d) 112 | beta.glm <- fit.glm$coefficients 113 | ``` 114 | 115 | - 切片 ${\hat \beta_{1}}$ : `r beta.glm[1]` 116 | - 傾き ${{\hat \beta_{2}}}$ : `r beta.glm[2]` 117 | 118 | 推定結果に基づく図示が以下. 119 | 120 | ```{r, } 121 | col.glm <- "#de4545" 122 | 123 | par.glmm() 124 | plot.d(d) 125 | line.true() 126 | lines(xx, logistic(beta.glm[1] + beta.glm[2] * xx) * max(v.x), lwd = 3, col = col.glm) 127 | ``` 128 | 129 | 真の傾き $\beta_{2} = 1$ に対して, かなり小さな値が推定されてしまっている. 130 | 131 | 132 | 133 | # 過分散と個体差 134 | 135 | - $x_{i} = 4$ だった場合の生存種子数と, 推定されたモデルの予測を比較する. 136 | - 予測生存確率 $q_{i}$ : logistic(`r beta.glm[1]` + `r beta.glm[2]` * 4) = `r logistic(beta.glm[1] + beta.glm[2] * 4)` 137 | 138 | ```{r, } 139 | par.glmm() 140 | d4 <- d[d$x == 4,] 141 | prob <- logistic(beta.glm[1] + beta.glm[2] * 4) 142 | plot( 143 | v.x, dbinom(v.x, 8, prob = prob) * nrow(d4), 144 | type = "b", 145 | ylim = c(0, 6), 146 | pch = 20, col = col.glm, 147 | xlab = "x", ylab = "y" 148 | ) 149 | points(v.x, summary(factor(d4$y, levels = v.x)), pch = 1, col = "#199a60") 150 | ``` 151 | 152 | - データは明らかに二項分布に従っていない 153 | - => **過分散(過大分散, overdispersion)**: 二項分布で期待されるよりも大きなばらつきが生じている 154 | - c.f.) **過小分散(underdispersion)**: 期待される分散よりも標本分散がかなり小さくなること 155 | 156 | 157 | ## 過分散 158 | 159 | $x_{i} = 4$ の個体の, 平均および分散は以下のようになる. 160 | 161 | ```{r} 162 | c(mean(d4$y), var(d4$y)) 163 | ``` 164 | 165 | - 生存確率の平均が $4.05 / 8 = 0.5$ ぐらいなら, もし生存種子数 $y_{i}$ が二項分布に従うならば, その分散は, $8 \times 0.5 \times (1 - 0.5) = 2$ ぐらいになるはず 166 | - [c.f.](https://mathtrain.jp/bin) ) 二項分布 $X \sim B(n, p)$ としたとき 167 | - 期待値 $E(X) = np$ 168 | - 分散 $V(X) = np(1 - p)$ 169 | - しかし, 実際の分散は `r var(d4$y)` であり, 4倍ほど大きい: 二項分布における過分散の例 170 | - c.f. ) ポアソン分布も過分散が生じる 171 | - ポアソン分布: 平均と分散が等しい確率分布 172 | - but ) 実際のカウントデータでは, 平均よりも分散のほうが大きくなる場合がほとんど 173 | 174 | 175 | ## 観測されていない個体差 176 | 177 | - 極端な個体差があるとして, 全個体の半数の生存種子数が8, 残りの半数が0とした場合, 過分散はよりひどくなる 178 | - 平均: $(8 \times 4 + 0 \times 4) / 8 = 4$ 179 | - 分散: $8 \times 4^2 / 8 = 16$ 180 | - 二項分布から期待される分散: $Nq(1 - q) = 8 \times 0.5 \times 0.5 = 2$ 181 | - -> *個体差があれば過分散が生じうる* 182 | - 「個体たちはみんな均質」といった過度に単純化した仮定を設けて, 「全個体の生存種子数の分布は, ただひとつの二項分布で説明できる」としてしまった 183 | 184 |
185 | 186 | - 観測者が観測対象に影響を与えている要因すべてを定量・特定することはどうやっても不可能 187 | - => 個体差や場所差を原因不明ののまま, これらの及ぼす影響を統計モデルにうまく取り込む必要がある: 一般化線形混合モデル, GLMM 188 | 189 | 190 | 191 | # 一般化線形混合モデル 192 | 193 | ## 個体差を表すパラメータの追加 194 | 195 | 個体差を表すパラメータ $r_{i}$ を $q_{i}$ に追加. 196 | 197 | $$ 198 | {\rm logit} (q_{i}) = \beta_{1} + \beta_{2} x_{i} + r_{i} 199 | $$ 200 | 201 | - $q_{i} \in (- \infty, \infty)$ : 連続値 202 | - GLMは $q_{i} = 0$ としていることに相当する 203 | 204 | ```{r} 205 | cols <- c("#118ab6", "#212198", "#af13a4") 206 | plot(xx, logistic(-4 + 1 * xx + 0) * max(v.x), type = "l", xlab = "x", ylab = "y", col = cols[1], lwd = 3) 207 | lines(xx, logistic(-4 + 1 * xx + 2) * max(v.x), col = cols[2], lwd = 3) 208 | lines(xx, logistic(-4 + 1 * xx + -2) * max(v.x), col = cols[3], lwd = 3) 209 | legend("topleft", legend = c(0, 2, -2), col = cols, lwd = 2, title = "r") 210 | ``` 211 | 212 | ## 個体差のばらつきを表す確率分布 213 | 214 | - GLMM: 個体差をあらわすパラメータ ${r_{1}, r_{2}, ..., r_{100}}$ が何かの確率分布に従っていると仮定 215 | - データに基づいてその確率分布のパラメータを推定できると考える 216 | - ここでは, $r_{i}$ が平均 $\mu = 0$ で, 標準偏差 $s$ の (相互に独立した) *正規分布* に従うと仮定する 217 | - **なぜ正規分布なのか??** 218 | - そもそも, $r_{i}$ は観測できない・しなかった量なので, どのような確率分布に従うかはわからない 219 | - 正規分布を使う理由: 単にこのような統計モデリングに便利だから 220 | - c.f. ) 221 | - 異常値の多い集団を扱うときは, $r_{i}$ がもっと「すその重い」確率分布に従うと仮定する: $t$ 分布 222 | - 階層ベイズモデル: $r_{i}$ の分布にさまざまなばらつきの正規分布を混合したものを使う 223 | 224 | $r_{i}$ の確率密度分布は以下のようになり, $s$ を変化させたとき分布のプロットは次のようになる. 225 | $$ 226 | p(r_{i} | s) = \frac{1}{\sqrt{2 \pi s^2}} \exp \biggl( - \frac{r_{i}^2}{2s^2} \biggr) 227 | $$ 228 | 229 | ```{r} 230 | x <- seq(-7.5, 7.5, 0.05) 231 | cols <- c("#118ab6", "#212198", "#af13a4") 232 | plot(x, dnorm(x, 0, 1), type = "l", xlab = "x", ylab = "y", col = cols[1], lwd = 3) 233 | lines(x, dnorm(x, 0, 1.5), col = cols[2], lwd = 3) 234 | lines(x, dnorm(x, 0, 3), col = cols[3], lwd = 3) 235 | legend("topleft", legend = c(1, 1.5, 3), col = cols, lwd = 2, title = "s") 236 | ``` 237 | 238 | - $p(r_{i} | s)$ は $r_{i}$ の「出現しやすさ」を表している 239 | - $r_{i}$ が0に近い: ありがち 240 | - $|r_{i}|$ が大きい: あまりない 241 | - 標準偏差$s$ は「集団内の $r_{i}$ のばらつき」を表している 242 | - $s$ が大きい: 個体差の大きい集団(過分散がひどい) 243 | 244 | ## 固定効果とランダム効果: 線形予測子の構成要素 245 | 246 | - GLMMは以下の効果を「混合(mix)」した混合(効果)モデル(mixed effects model) 247 | - **固定効果(fixed effects)** : $\beta_{1}, \beta_{2} x_{i}$ 248 | - データのかなり広い範囲を説明する大域的なパラメータ 249 | - $r_{i}$ のばらつき $s$ は(最尤推定される)固定効果 250 | - **ランダム効果(random effects)** : $r_{i}$ 251 | - データのごく一部だけ担当している局所的なパラメータ 252 | 253 | ## 一般化線形混合モデルの最尤推定 254 | 255 | - **$r_{i}$ は最尤推定できない** 256 | - 100個体分の生存数データ $y_{i}$ を説明するために100個のパラメータ $\{{\hat {r_{i}}}\}$ を最尤推定する: フルモデルになってしまう 257 | - => *個体ごとの尤度 $L_{i}$ の式の中で $r_{i}$ を積分してしまう* 258 | 259 | $$ 260 | L_{i} = \int_{-\infty}^{\infty} p(y_{i} | \beta_{1}, \beta_{2}, r_{i}) p(r_{i} | s) dr_{i} 261 | $$ 262 | 263 | - 尤度の期待値 $E(L)$ を算出しているのに相当 264 | - 二項分布 $p(y_{i} | \beta_{1}, \beta_{2}, r_{i})$ と正規分布 $p(r_{i} | s)$ をかけて $r_{i}$ で積分する = **2種類の分布を混ぜ合わせている: 無限混合分布(infinite mixture distribution)** 265 | - c.f.) ポアソン分布と正規分布を混ぜることもできる 266 | - => $r_{i}$ が消えた対数尤度 $\log L(\beta_{1}, \beta_{2}, s) = \log \prod_{i} L_{i}$ を最大にするような, パラメータ $\beta_{1}, \beta_{2}, s$ の最尤推定値を探す 267 | 268 | ### RでのGLMMの最尤推定 269 | 270 | - `glmmML` packageを使用する 271 | - `cluster = id`: $r_{i}$ が「個体ごとに異なる独立なパラメータ」であることを指定 272 | - `d` 内の `id` 列に格納されている個体番号を使う 273 | 274 | ```{r} 275 | library(glmmML) 276 | fit.glmm <- glmmML(cbind(y, N - y) ~ x, data = d, family = binomial, cluster = id) 277 | print(fit.glmm) 278 | ``` 279 | 280 | - `coef`: パラメータの最尤推定値 (`se(coef)` や `z` は近似標準誤差やWaldのz値など) 281 | - ${\hat \beta_{1}}$: -4(真の値) vs. `r fit.glmm$coefficients[1]`(推定値) 282 | - ${\hat \beta_{2}}$: 1(真の値) vs. `r fit.glmm$coefficients[2]`(推定値) 283 | - `Scale parameter ...`: $r_{i}$ のばらつき $s$ の最尤推定値 284 | - ${\hat s}$: 3(真の値) vs. `r fit.glmm$sigma` 285 | - `Std. Error`: $s$ の推定値のばらつき(標準誤差) 286 | - `Residual deviance ...` 287 | - `97 degrees`: 最尤推定をしたパラメータ数は $\beta_{1}, \beta_{2}, s$ の3つなので, 自由度は $100 - 3 = 97$ となる 288 | 289 | GLMMから得られた予測結果を以下に図示する. $q_{i}$ の $x_{i}$ 依存性, 生存種子数 $y_{i}$ の分布が改善されている. 290 | 291 | 292 | ```{r fig.show="hold", out.width="50%", out.height="100%", fig.align="default"} 293 | beta.glmm <- fit.glmm$coefficients 294 | col.glmm <- "#0205f5" 295 | 296 | par.glmm() 297 | plot.d(d) 298 | line.true(col = ) 299 | lines(xx, logistic(beta.glm[1] + beta.glm[2] * xx) * max(v.x), lwd = 2, lty = 3, col = col.glm) 300 | lines(xx, logistic(beta.glmm[1] + beta.glmm[2] * xx) * max(v.x), lwd = 3, col = col.glmm) 301 | legend("topleft", legend = c("True", "GLM", "GLMM"), lty = c(4, 3, 1), col = c(col.true, col.glm, col.glmm), title = "model") 302 | 303 | f.gaussian.binom <- function(alpha, x, size, fixed, sd) 304 | dbinom(x, size, logistic(fixed + alpha)) * dnorm(alpha, 0, sd) 305 | d.gaussian.binom <- function(v.x, size, fixed, sd) sapply( 306 | v.x, function(x) integrate( 307 | f = f.gaussian.binom, 308 | lower = -sd * 10, 309 | upper = sd * 10, 310 | # for f.gaussian.binom 311 | x = x, 312 | size = size, 313 | fixed = fixed, 314 | sd = sd 315 | )$value 316 | ) 317 | 318 | par.glmm() 319 | plot( 320 | v.x, 321 | nrow(d4) * d.gaussian.binom( 322 | v.x, 8, 323 | fixed = beta.glmm[1] + beta.glmm[2] * 4, 324 | sd = fit.glmm$sigma 325 | ), 326 | type = "b", 327 | ylim = c(0, 6), 328 | pch = 20, lwd = 2, col = col.glmm 329 | ) 330 | points(v.x, table(factor(d4$y, levels = v.x)), pch = 1, col = "#199a60") 331 | ``` 332 | 333 | 334 | 335 | # どのようなときにGLMMが必要か 336 | 337 | - GLMMを採用するかどうかの判断ポイント 338 | - 過分散の有無 339 | - **データのとり方から, 「個体差や場所差が識別できるかどうか」** 340 | - **反復** か **擬似反復** か 341 | 342 | ## 反復・擬似反復と統計モデルの関係 343 | 344 | - **反復(replication)**: 個体差や場所差のばらつきを考慮しないデータのとり方 345 | - e.g.) 各個体で1つだけ種子の生死を調べる(個体差なし) / 1つの植木鉢に1つの個体だけ植える(場所差なし) 346 | - GLMで推定して問題ない 347 | - 個体差や場所差の効果を除去して, 統計モデルを簡単にできる 348 | - **擬似反復(pseudo replication)**: 「それぞれの個体や場所から複数のデータをとる」 349 | - e.g.1) 別々の植木鉢に植えられた, それぞれの個体から採取した $N$ 個の種子の生死を調べた(個体差あり) 350 | - 個体差 $r_{i}$ を組み込んだGLMM: ${\rm logit}(q_{i}) = \beta_{1} + \beta_{2} + r_{i}$ 351 | - e.g.2) 1つの植木鉢に複数の個体を植えて, それぞれの個体で1つだけ種子の生死を調べる(場所差あり) 352 | - 場所差 $r_{j}$ を組み込んだGLMM: ${\rm logit}(q_{i}) = \beta_{1} + \beta_{2} + r_{j}$ 353 | - e.g.3) 1つの植木鉢に複数の個体を植えて, それぞれの個体から採取した $N$ 個の種子の生死を調べる(個体差, 場所差あり) 354 | - 個体差 $r_{i}$ と場所差 $r_{j}$ を組み込む: ${\rm logit}(q_{i}) = \beta_{1} + \beta_{2} + r_{i} + r_{j}$ 355 | - GLMMと最尤推定では厳しい: 階層ベイズモデルとMCMC 356 | 357 | 358 | 359 | ### いろいろな分布のGLMM 360 | 361 | - ポアソン分布 $\times$ 正規分布 のGLMM: `glmmML` 362 | - ポアソン分布 $\times$ ガンマ分布 のGLMM: `MASS::glm.nb` 363 | - **負の二項分布(negative binomial distribution)**: ポアソン分布とガンマ分布の無限混合分布 364 | - ポアソン分布: $p(y | \lambda)$ 365 | - $\lambda \sim$ ガンマ分布 366 | - 応答変数のばらつきが正規分布, ガンマ分布であるときは, 過分散を定義することはできない 367 | - => サンプリングが擬似反復ならば, GLMMのような個体差・場所差を考慮したモデルが必要 368 | - 正規分布やガンマ分布のGLMM: `lme4::glmer` 369 | --------------------------------------------------------------------------------