-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.html
5466 lines (5439 loc) · 958 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="generator" content="pandoc">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
<meta name="author" content="Stan Development Team">
<meta name="author" content="翻訳: stan-jaチーム">
<title>Stan モデリング言語: ユーザーガイド・リファレンスマニュアル</title>
<style type="text/css">code{white-space: pre;}</style>
<link href="data:text/css;charset=utf-8,%0A%0A%0Aarticle%2C%0Aaside%2C%0Adetails%2C%0Afigcaption%2C%0Afigure%2C%0Afooter%2C%0Aheader%2C%0Ahgroup%2C%0Amain%2C%0Anav%2C%0Asection%2C%0Asummary%20%7B%0Adisplay%3A%20block%3B%0A%7D%0A%0Aaudio%2C%0Acanvas%2C%0Avideo%20%7B%0Adisplay%3A%20inline%2Dblock%3B%0A%7D%0A%0Aaudio%3Anot%28%5Bcontrols%5D%29%20%7B%0Adisplay%3A%20none%3B%0Aheight%3A%200%3B%0A%7D%0A%0A%5Bhidden%5D%2C%0Atemplate%20%7B%0Adisplay%3A%20none%3B%0A%7D%0A%0A%0Ahtml%20%7B%0Afont%2Dfamily%3A%20sans%2Dserif%3B%20%0A%2Dms%2Dtext%2Dsize%2Dadjust%3A%20100%25%3B%20%0A%2Dwebkit%2Dtext%2Dsize%2Dadjust%3A%20100%25%3B%20%0A%7D%0A%0Abody%20%7B%0Amargin%3A%200%3B%0A%7D%0A%0A%0Aa%20%7B%0Abackground%3A%20transparent%3B%0A%7D%0A%0Aa%3Afocus%20%7B%0Aoutline%3A%20thin%20dotted%3B%0A%7D%0A%0Aa%3Aactive%2C%0Aa%3Ahover%20%7B%0Aoutline%3A%200%3B%0A%7D%0A%0A%0Ah1%20%7B%0Afont%2Dsize%3A%202em%3B%0Amargin%3A%200%2E67em%200%3B%0A%7D%0A%0Aabbr%5Btitle%5D%20%7B%0Aborder%2Dbottom%3A%201px%20dotted%3B%0A%7D%0A%0Ab%2C%0Astrong%20%7B%0Afont%2Dweight%3A%20bold%3B%0A%7D%0A%0Adfn%20%7B%0Afont%2Dstyle%3A%20italic%3B%0A%7D%0A%0Ahr%20%7B%0A%2Dmoz%2Dbox%2Dsizing%3A%20content%2Dbox%3B%0Abox%2Dsizing%3A%20content%2Dbox%3B%0Aheight%3A%200%3B%0A%7D%0A%0Amark%20%7B%0Abackground%3A%20%23ff0%3B%0Acolor%3A%20%23000%3B%0A%7D%0A%0Acode%2C%0Akbd%2C%0Apre%2C%0Asamp%20%7B%0Afont%2Dfamily%3A%20monospace%2C%20serif%3B%0Afont%2Dsize%3A%201em%3B%0A%7D%0A%0Apre%20%7B%0Awhite%2Dspace%3A%20pre%2Dwrap%3B%0A%7D%0A%0Aq%20%7B%0Aquotes%3A%20%22%5C201C%22%20%22%5C201D%22%20%22%5C2018%22%20%22%5C2019%22%3B%0A%7D%0A%0Asmall%20%7B%0Afont%2Dsize%3A%2080%25%3B%0A%7D%0A%0Asub%2C%0Asup%20%7B%0Afont%2Dsize%3A%2075%25%3B%0Aline%2Dheight%3A%200%3B%0Aposition%3A%20relative%3B%0Avertical%2Dalign%3A%20baseline%3B%0A%7D%0Asup%20%7B%0Atop%3A%20%2D0%2E5em%3B%0A%7D%0Asub%20%7B%0Abottom%3A%20%2D0%2E25em%3B%0A%7D%0A%0A%0Aimg%20%7B%0Aborder%3A%200%3B%0A%7D%0A%0Asvg%3Anot%28%3Aroot%29%20%7B%0Aoverflow%3A%20hidden%3B%0A%7D%0A%0A%0Afigure%20%7B%0Amargin%3A%200%3B%0A%7D%0A%0A%0Afieldset%20%7B%0Aborder%3A%201px%20solid%20%23c0c0c0%3B%0Amargin%3A%200%202px%3B%0Apadding%3A%200%2E35em%200%2E625em%200%2E75em%3B%0A%7D%0A%0Alegend%20%7B%0Aborder%3A%200%3B%20%0Apadding%3A%200%3B%20%0A%7D%0A%0Abutton%2C%0Ainput%2C%0Aselect%2C%0Atextarea%20%7B%0Afont%2Dfamily%3A%20inherit%3B%20%0Afont%2Dsize%3A%20100%25%3B%20%0Amargin%3A%200%3B%20%0A%7D%0A%0Abutton%2C%0Ainput%20%7B%0Aline%2Dheight%3A%20normal%3B%0A%7D%0A%0Abutton%2C%0Aselect%20%7B%0Atext%2Dtransform%3A%20none%3B%0A%7D%0A%0Abutton%2C%0Ahtml%20input%5Btype%3D%22button%22%5D%2C%20%0Ainput%5Btype%3D%22reset%22%5D%2C%0Ainput%5Btype%3D%22submit%22%5D%20%7B%0A%2Dwebkit%2Dappearance%3A%20button%3B%20%0Acursor%3A%20pointer%3B%20%0A%7D%0A%0Abutton%5Bdisabled%5D%2C%0Ahtml%20input%5Bdisabled%5D%20%7B%0Acursor%3A%20default%3B%0A%7D%0A%0Ainput%5Btype%3D%22checkbox%22%5D%2C%0Ainput%5Btype%3D%22radio%22%5D%20%7B%0Abox%2Dsizing%3A%20border%2Dbox%3B%20%0Apadding%3A%200%3B%20%0A%7D%0A%0Ainput%5Btype%3D%22search%22%5D%20%7B%0A%2Dwebkit%2Dappearance%3A%20textfield%3B%20%0A%2Dmoz%2Dbox%2Dsizing%3A%20content%2Dbox%3B%0A%2Dwebkit%2Dbox%2Dsizing%3A%20content%2Dbox%3B%20%0Abox%2Dsizing%3A%20content%2Dbox%3B%0A%7D%0A%0Ainput%5Btype%3D%22search%22%5D%3A%3A%2Dwebkit%2Dsearch%2Dcancel%2Dbutton%2C%0Ainput%5Btype%3D%22search%22%5D%3A%3A%2Dwebkit%2Dsearch%2Ddecoration%20%7B%0A%2Dwebkit%2Dappearance%3A%20none%3B%0A%7D%0A%0Abutton%3A%3A%2Dmoz%2Dfocus%2Dinner%2C%0Ainput%3A%3A%2Dmoz%2Dfocus%2Dinner%20%7B%0Aborder%3A%200%3B%0Apadding%3A%200%3B%0A%7D%0A%0Atextarea%20%7B%0Aoverflow%3A%20auto%3B%20%0Avertical%2Dalign%3A%20top%3B%20%0A%7D%0A%0A%0Atable%20%7B%0Aborder%2Dcollapse%3A%20collapse%3B%0Aborder%2Dspacing%3A%200%3B%0A%7D%0A%2Ego%2Dtop%20%7B%0Aposition%3A%20fixed%3B%0Abottom%3A%202em%3B%0Aright%3A%202em%3B%0Atext%2Ddecoration%3A%20none%3B%0Abackground%2Dcolor%3A%20%23E0E0E0%3B%0Afont%2Dsize%3A%2012px%3B%0Apadding%3A%201em%3B%0Adisplay%3A%20inline%3B%0A%7D%0A%0Ahtml%2Cbody%7B%20margin%3A%20auto%3B%0Apadding%2Dright%3A%201em%3B%0Apadding%2Dleft%3A%201em%3B%0Amax%2Dwidth%3A%2044em%3B%20color%3Ablack%3B%7D%2A%3Anot%28%27%23mkdbuttons%27%29%7Bmargin%3A0%3Bpadding%3A0%7Dbody%7Bfont%3A13%2E34px%20helvetica%2Carial%2Cfreesans%2Cclean%2Csans%2Dserif%3B%2Dwebkit%2Dfont%2Dsmoothing%3Asubpixel%2Dantialiased%3Bline%2Dheight%3A1%2E4%3Bpadding%3A3px%3Bbackground%3A%23fff%3Bborder%2Dradius%3A3px%3B%2Dmoz%2Dborder%2Dradius%3A3px%3B%2Dwebkit%2Dborder%2Dradius%3A3px%7Dp%7Bmargin%3A1em%200%7Da%7Bcolor%3A%234183c4%3Btext%2Ddecoration%3Anone%7Dbody%7Bbackground%2Dcolor%3A%23fff%3Bpadding%3A30px%3Bmargin%3A15px%3Bfont%2Dsize%3A14px%3Bline%2Dheight%3A1%2E6%7Dbody%3E%2A%3Afirst%2Dchild%7Bmargin%2Dtop%3A0%21important%7Dbody%3E%2A%3Alast%2Dchild%7Bmargin%2Dbottom%3A0%21important%7D%40media%20screen%7Bbody%7Bbox%2Dshadow%3A0%200%200%201px%20%23cacaca%2C0%200%200%204px%20%23eee%7D%7Dh1%2Ch2%2Ch3%2Ch4%2Ch5%2Ch6%7Bmargin%3A20px%200%2010px%3Bpadding%3A0%3Bfont%2Dweight%3Abold%3B%2Dwebkit%2Dfont%2Dsmoothing%3Asubpixel%2Dantialiased%3Bcursor%3Atext%7Dh1%7Bfont%2Dsize%3A28px%3Bcolor%3A%23000%7Dh2%7Bfont%2Dsize%3A24px%3Bborder%2Dbottom%3A1px%20solid%20%23ccc%3Bcolor%3A%23000%7Dh3%7Bfont%2Dsize%3A18px%3Bcolor%3A%23333%7Dh4%7Bfont%2Dsize%3A16px%3Bcolor%3A%23333%7Dh5%7Bfont%2Dsize%3A14px%3Bcolor%3A%23333%7Dh6%7Bcolor%3A%23777%3Bfont%2Dsize%3A14px%7Dp%2Cblockquote%2Ctable%2Cpre%7Bmargin%3A15px%200%7Dul%7Bpadding%2Dleft%3A30px%7Dol%7Bpadding%2Dleft%3A30px%7Dol%20li%20ul%3Afirst%2Dof%2Dtype%7Bmargin%2Dtop%3A0%7Dhr%7Bbackground%3Atransparent%20url%28data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAAYAAAAECAYAAACtBE5DAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw%2FeHBhY2tldCBiZWdpbj0i77u%2FIiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8%2BIDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OENDRjNBN0E2NTZBMTFFMEI3QjRBODM4NzJDMjlGNDgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OENDRjNBN0I2NTZBMTFFMEI3QjRBODM4NzJDMjlGNDgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4Q0NGM0E3ODY1NkExMUUwQjdCNEE4Mzg3MkMyOUY0OCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo4Q0NGM0E3OTY1NkExMUUwQjdCNEE4Mzg3MkMyOUY0OCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI%2FPqqezsUAAAAfSURBVHjaYmRABcYwBiM2QSA4y4hNEKYDQxAEAAIMAHNGAzhkPOlYAAAAAElFTkSuQmCC%29%20repeat%2Dx%200%200%3Bborder%3A0%20none%3Bcolor%3A%23ccc%3Bheight%3A4px%3Bpadding%3A0%7Dbody%3Eh2%3Afirst%2Dchild%7Bmargin%2Dtop%3A0%3Bpadding%2Dtop%3A0%7Dbody%3Eh1%3Afirst%2Dchild%7Bmargin%2Dtop%3A0%3Bpadding%2Dtop%3A0%7Dbody%3Eh1%3Afirst%2Dchild%2Bh2%7Bmargin%2Dtop%3A0%3Bpadding%2Dtop%3A0%7Dbody%3Eh3%3Afirst%2Dchild%2Cbody%3Eh4%3Afirst%2Dchild%2Cbody%3Eh5%3Afirst%2Dchild%2Cbody%3Eh6%3Afirst%2Dchild%7Bmargin%2Dtop%3A0%3Bpadding%2Dtop%3A0%7Da%3Afirst%2Dchild%20h1%2Ca%3Afirst%2Dchild%20h2%2Ca%3Afirst%2Dchild%20h3%2Ca%3Afirst%2Dchild%20h4%2Ca%3Afirst%2Dchild%20h5%2Ca%3Afirst%2Dchild%20h6%7Bmargin%2Dtop%3A0%3Bpadding%2Dtop%3A0%7Dh1%2Bp%2Ch2%2Bp%2Ch3%2Bp%2Ch4%2Bp%2Ch5%2Bp%2Ch6%2Bp%2Cul%20li%3E%3Afirst%2Dchild%2Col%20li%3E%3Afirst%2Dchild%7Bmargin%2Dtop%3A0%7Ddl%7Bpadding%3A0%7Ddl%20dt%7Bfont%2Dsize%3A14px%3Bfont%2Dweight%3Abold%3Bfont%2Dstyle%3Aitalic%3Bpadding%3A0%3Bmargin%3A15px%200%205px%7Ddl%20dt%3Afirst%2Dchild%7Bpadding%3A0%7Ddl%20dt%3E%3Afirst%2Dchild%7Bmargin%2Dtop%3A0%7Ddl%20dt%3E%3Alast%2Dchild%7Bmargin%2Dbottom%3A0%7Ddl%20dd%7Bmargin%3A0%200%2015px%3Bpadding%3A0%2015px%7Ddl%20dd%3E%3Afirst%2Dchild%7Bmargin%2Dtop%3A0%7Ddl%20dd%3E%3Alast%2Dchild%7Bmargin%2Dbottom%3A0%7Dblockquote%7Bborder%2Dleft%3A4px%20solid%20%23DDD%3Bpadding%3A0%2015px%3Bcolor%3A%23777%7Dblockquote%3E%3Afirst%2Dchild%7Bmargin%2Dtop%3A0%7Dblockquote%3E%3Alast%2Dchild%7Bmargin%2Dbottom%3A0%7Dtable%7Bborder%2Dcollapse%3Acollapse%3Bborder%2Dspacing%3A0%3Bfont%2Dsize%3A100%25%3Bfont%3Ainherit%7Dtable%20th%7Bfont%2Dweight%3Abold%3Bborder%3A1px%20solid%20%23ccc%3Bpadding%3A6px%2013px%7Dtable%20td%7Bborder%3A1px%20solid%20%23ccc%3Bpadding%3A6px%2013px%7Dtable%20tr%7Bborder%2Dtop%3A1px%20solid%20%23ccc%3Bbackground%2Dcolor%3A%23fff%7Dtable%20tr%3Anth%2Dchild%282n%29%7Bbackground%2Dcolor%3A%23f8f8f8%7Dimg%7Bmax%2Dwidth%3A100%25%7Dcode%2Ctt%7Bmargin%3A0%202px%3Bpadding%3A0%205px%3Bwhite%2Dspace%3Anowrap%3Bborder%3A1px%20solid%20%23eaeaea%3Bbackground%2Dcolor%3A%23f8f8f8%3Bborder%2Dradius%3A3px%3Bfont%2Dfamily%3AConsolas%2C%27Liberation%20Mono%27%2CCourier%2Cmonospace%3Bfont%2Dsize%3A12px%3Bcolor%3A%23333%7Dpre%3Ecode%7Bmargin%3A0%3Bpadding%3A0%3Bwhite%2Dspace%3Apre%3Bborder%3A0%3Bbackground%3Atransparent%7D%2Ehighlight%20pre%7Bbackground%2Dcolor%3A%23f8f8f8%3Bborder%3A1px%20solid%20%23ccc%3Bfont%2Dsize%3A13px%3Bline%2Dheight%3A19px%3Boverflow%3Aauto%3Bpadding%3A6px%2010px%3Bborder%2Dradius%3A3px%7Dpre%7Bbackground%2Dcolor%3A%23f8f8f8%3Bborder%3A1px%20solid%20%23ccc%3Bfont%2Dsize%3A13px%3Bline%2Dheight%3A19px%3Boverflow%3Aauto%3Bpadding%3A6px%2010px%3Bborder%2Dradius%3A3px%7Dpre%20code%2Cpre%20tt%7Bbackground%2Dcolor%3Atransparent%3Bborder%3A0%7D%2Epoetry%20pre%7Bfont%2Dfamily%3AGeorgia%2CGaramond%2Cserif%21important%3Bfont%2Dstyle%3Aitalic%3Bfont%2Dsize%3A110%25%21important%3Bline%2Dheight%3A1%2E6em%3Bdisplay%3Ablock%3Bmargin%2Dleft%3A1em%7D%2Epoetry%20pre%20code%7Bfont%2Dfamily%3AGeorgia%2CGaramond%2Cserif%21important%3Bword%2Dbreak%3Abreak%2Dall%3Bword%2Dbreak%3Abreak%2Dword%3B%2Dwebkit%2Dhyphens%3Aauto%3B%2Dmoz%2Dhyphens%3Aauto%3Bhyphens%3Aauto%3Bwhite%2Dspace%3Apre%2Dwrap%7Dsup%2Csub%2Ca%2Efootnote%7Bfont%2Dsize%3A1%2E4ex%3Bheight%3A0%3Bline%2Dheight%3A1%3Bvertical%2Dalign%3Asuper%3Bposition%3Arelative%7Dsub%7Bvertical%2Dalign%3Asub%3Btop%3A%2D1px%7D%40media%20print%7Bbody%7Bbackground%3A%23fff%7Dimg%2Cpre%2Cblockquote%2Ctable%2Cfigure%7Bpage%2Dbreak%2Dinside%3Aavoid%7Dbody%7Bbackground%3A%23fff%3Bborder%3A0%7Dcode%7Bbackground%2Dcolor%3A%23fff%3Bcolor%3A%23333%21important%3Bpadding%3A0%20%2E2em%3Bborder%3A1px%20solid%20%23dedede%7Dpre%7Bbackground%3A%23fff%7Dpre%20code%7Bbackground%2Dcolor%3Awhite%21important%3Boverflow%3Avisible%7D%7D%40media%20screen%7Bbody%2Einverted%7Bcolor%3A%23eee%21important%3Bborder%2Dcolor%3A%23555%3Bbox%2Dshadow%3Anone%7D%2Einverted%20body%2C%2Einverted%20hr%20%2Einverted%20p%2C%2Einverted%20td%2C%2Einverted%20li%2C%2Einverted%20h1%2C%2Einverted%20h2%2C%2Einverted%20h3%2C%2Einverted%20h4%2C%2Einverted%20h5%2C%2Einverted%20h6%2C%2Einverted%20th%2C%2Einverted%20%2Emath%2C%2Einverted%20caption%2C%2Einverted%20dd%2C%2Einverted%20dt%2C%2Einverted%20blockquote%7Bcolor%3A%23eee%21important%3Bborder%2Dcolor%3A%23555%3Bbox%2Dshadow%3Anone%7D%2Einverted%20td%2C%2Einverted%20th%7Bbackground%3A%23333%7D%2Einverted%20h2%7Bborder%2Dcolor%3A%23555%7D%2Einverted%20hr%7Bborder%2Dcolor%3A%23777%3Bborder%2Dwidth%3A1px%21important%7D%3A%3Aselection%7Bbackground%3Argba%28157%2C193%2C200%2C0%2E5%29%7Dh1%3A%3Aselection%7Bbackground%2Dcolor%3Argba%2845%2C156%2C208%2C0%2E3%29%7Dh2%3A%3Aselection%7Bbackground%2Dcolor%3Argba%2890%2C182%2C224%2C0%2E3%29%7Dh3%3A%3Aselection%2Ch4%3A%3Aselection%2Ch5%3A%3Aselection%2Ch6%3A%3Aselection%2Cli%3A%3Aselection%2Col%3A%3Aselection%7Bbackground%2Dcolor%3Argba%28133%2C201%2C232%2C0%2E3%29%7Dcode%3A%3Aselection%7Bbackground%2Dcolor%3Argba%280%2C0%2C0%2C0%2E7%29%3Bcolor%3A%23eee%7Dcode%20span%3A%3Aselection%7Bbackground%2Dcolor%3Argba%280%2C0%2C0%2C0%2E7%29%21important%3Bcolor%3A%23eee%21important%7Da%3A%3Aselection%7Bbackground%2Dcolor%3Argba%28255%2C230%2C102%2C0%2E2%29%7D%2Einverted%20a%3A%3Aselection%7Bbackground%2Dcolor%3Argba%28255%2C230%2C102%2C0%2E6%29%7Dtd%3A%3Aselection%2Cth%3A%3Aselection%2Ccaption%3A%3Aselection%7Bbackground%2Dcolor%3Argba%28180%2C237%2C95%2C0%2E5%29%7D%2Einverted%7Bbackground%3A%230b2531%3Bbackground%3A%23252a2a%7D%2Einverted%20body%7Bbackground%3A%23252a2a%7D%2Einverted%20a%7Bcolor%3A%23acd1d5%7D%7D%2Ehighlight%20%2Ec%7Bcolor%3A%23998%3Bfont%2Dstyle%3Aitalic%7D%2Ehighlight%20%2Eerr%7Bcolor%3A%23a61717%3Bbackground%2Dcolor%3A%23e3d2d2%7D%2Ehighlight%20%2Ek%2C%2Ehighlight%20%2Eo%7Bfont%2Dweight%3Abold%7D%2Ehighlight%20%2Ecm%7Bcolor%3A%23998%3Bfont%2Dstyle%3Aitalic%7D%2Ehighlight%20%2Ecp%7Bcolor%3A%23999%3Bfont%2Dweight%3Abold%7D%2Ehighlight%20%2Ec1%7Bcolor%3A%23998%3Bfont%2Dstyle%3Aitalic%7D%2Ehighlight%20%2Ecs%7Bcolor%3A%23999%3Bfont%2Dweight%3Abold%3Bfont%2Dstyle%3Aitalic%7D%2Ehighlight%20%2Egd%7Bcolor%3A%23000%3Bbackground%2Dcolor%3A%23fdd%7D%2Ehighlight%20%2Egd%20%2Ex%7Bcolor%3A%23000%3Bbackground%2Dcolor%3A%23faa%7D%2Ehighlight%20%2Ege%7Bfont%2Dstyle%3Aitalic%7D%2Ehighlight%20%2Egr%7Bcolor%3A%23a00%7D%2Ehighlight%20%2Egh%7Bcolor%3A%23999%7D%2Ehighlight%20%2Egi%7Bcolor%3A%23000%3Bbackground%2Dcolor%3A%23dfd%7D%2Ehighlight%20%2Egi%20%2Ex%7Bcolor%3A%23000%3Bbackground%2Dcolor%3A%23afa%7D%2Ehighlight%20%2Ego%7Bcolor%3A%23888%7D%2Ehighlight%20%2Egp%7Bcolor%3A%23555%7D%2Ehighlight%20%2Egs%7Bfont%2Dweight%3Abold%7D%2Ehighlight%20%2Egu%7Bcolor%3A%23800080%3Bfont%2Dweight%3Abold%7D%2Ehighlight%20%2Egt%7Bcolor%3A%23a00%7D%2Ehighlight%20%2Ekc%2C%2Ehighlight%20%2Ekd%2C%2Ehighlight%20%2Ekn%2C%2Ehighlight%20%2Ekp%2C%2Ehighlight%20%2Ekr%7Bfont%2Dweight%3Abold%7D%2Ehighlight%20%2Ekt%7Bcolor%3A%23458%3Bfont%2Dweight%3Abold%7D%2Ehighlight%20%2Em%7Bcolor%3A%23099%7D%2Ehighlight%20%2Es%7Bcolor%3A%23d14%7D%2Ehighlight%20%2Ena%7Bcolor%3A%23008080%7D%2Ehighlight%20%2Enb%7Bcolor%3A%230086b3%7D%2Ehighlight%20%2Enc%7Bcolor%3A%23458%3Bfont%2Dweight%3Abold%7D%2Ehighlight%20%2Eno%7Bcolor%3A%23008080%7D%2Ehighlight%20%2Eni%7Bcolor%3A%23800080%7D%2Ehighlight%20%2Ene%2C%2Ehighlight%20%2Enf%7Bcolor%3A%23900%3Bfont%2Dweight%3Abold%7D%2Ehighlight%20%2Enn%7Bcolor%3A%23555%7D%2Ehighlight%20%2Ent%7Bcolor%3A%23000080%7D%2Ehighlight%20%2Env%7Bcolor%3A%23008080%7D%2Ehighlight%20%2Eow%7Bfont%2Dweight%3Abold%7D%2Ehighlight%20%2Ew%7Bcolor%3A%23bbb%7D%2Ehighlight%20%2Emf%2C%2Ehighlight%20%2Emh%2C%2Ehighlight%20%2Emi%2C%2Ehighlight%20%2Emo%7Bcolor%3A%23099%7D%2Ehighlight%20%2Esb%2C%2Ehighlight%20%2Esc%2C%2Ehighlight%20%2Esd%2C%2Ehighlight%20%2Es2%2C%2Ehighlight%20%2Ese%2C%2Ehighlight%20%2Esh%2C%2Ehighlight%20%2Esi%2C%2Ehighlight%20%2Esx%7Bcolor%3A%23d14%7D%2Ehighlight%20%2Esr%7Bcolor%3A%23009926%7D%2Ehighlight%20%2Es1%7Bcolor%3A%23d14%7D%2Ehighlight%20%2Ess%7Bcolor%3A%23990073%7D%2Ehighlight%20%2Ebp%7Bcolor%3A%23999%7D%2Ehighlight%20%2Evc%2C%2Ehighlight%20%2Evg%2C%2Ehighlight%20%2Evi%7Bcolor%3A%23008080%7D%2Ehighlight%20%2Eil%7Bcolor%3A%23099%7D%2Ehighlight%20%2Egc%7Bcolor%3A%23999%3Bbackground%2Dcolor%3A%23eaf2f5%7D%2Etype%2Dcsharp%20%2Ehighlight%20%2Ek%2C%2Etype%2Dcsharp%20%2Ehighlight%20%2Ekt%7Bcolor%3A%2300F%7D%2Etype%2Dcsharp%20%2Ehighlight%20%2Enf%7Bcolor%3A%23000%3Bfont%2Dweight%3Anormal%7D%2Etype%2Dcsharp%20%2Ehighlight%20%2Enc%7Bcolor%3A%232b91af%7D%2Etype%2Dcsharp%20%2Ehighlight%20%2Enn%7Bcolor%3A%23000%7D%2Etype%2Dcsharp%20%2Ehighlight%20%2Es%2C%2Etype%2Dcsharp%20%2Ehighlight%20%2Esc%7Bcolor%3A%23a31515%7D%0A" rel="stylesheet">
<script src="data:text/plain; charset=utf-8,var%20fileref%3Ddocument%2EcreateElement%28%27script%27%29%0Afileref%2EsetAttribute%28%22type%22%2C%22text%2Fjavascript%22%29%0Afileref%2EsetAttribute%28%22src%22%2C%20%22https%3A%2F%2Fcdn%2Emathjax%2Eorg%2Fmathjax%2Flatest%2FMathJax%2Ejs%3Fconfig%3DTeX%2DAMS%2DMML%5FHTMLorMML%22%29%0Adocument%2EgetElementsByTagName%28%22head%22%29%5B0%5D%2EappendChild%28fileref%29%0A" type="text/javascript"></script>
</head>
<body>
<header>
<h1 class="title">Stan モデリング言語: ユーザーガイド・リファレンスマニュアル</h1>
<h2 class="author">Stan Development Team</h2>
<h2 class="author">翻訳: stan-jaチーム</h2>
<p>なお最新のpdfは<a href="https://github.com/stan-ja/stan-ja/releases">こちら</a>からダウンロードできます.</p>
<h3 class="date">Stan Version 2.16.0</h3>
</header>
<nav id="TOC">
<ul>
<li><a href="#overview">1. Overview</a><ul>
<li><a href="#stan-home-page">1.1 Stan Home Page</a></li>
<li><a href="#stanのインターフェース">1.2 Stanのインターフェース</a></li>
<li><a href="#stanのプログラム">1.3 Stanのプログラム</a></li>
<li><a href="#コンパイルとstanプログラムの実行">1.4 コンパイルとStanプログラムの実行</a></li>
<li><a href="#サンプリング">1.5 サンプリング</a></li>
<li><a href="#最適化">1.6 最適化</a></li>
<li><a href="#変分推論">1.7 変分推論</a></li>
</ul></li>
<li><a href="#文字のエンコーディング-ファイルをincludeするメカニズム-コメントの文法">2.文字のエンコーディング, ファイルをincludeするメカニズム, コメントの文法</a><ul>
<li><a href="#文字のエンコーディング">2.1. 文字のエンコーディング</a></li>
<li><a href="#include">2.2. Include</a></li>
<li><a href="#コメント-1">2.3. コメント</a></li>
<li><a href="#空白">2.4.空白</a></li>
</ul></li>
<li><a href="#データ型">3.データ型</a><ul>
<li><a href="#基本データ型">3.1. 基本データ型</a></li>
<li><a href="#制約付きデータ型">3.2. 制約付きデータ型</a></li>
<li><a href="#代入引数の受け渡し">3.3. 代入・引数の受け渡し</a></li>
</ul></li>
<li><a href="#式">4. 式</a><ul>
<li><a href="#数値リテラル">4.1. 数値リテラル</a></li>
<li><a href="#変数">4.2. 変数</a></li>
<li><a href="#配列式">4.3. 配列式</a></li>
<li><a href="#グルーピングのための括弧">4.4. グルーピングのための括弧</a></li>
<li><a href="#算術および行列の式">4.5. 算術および行列の式</a></li>
<li><a href="#条件演算子">4.6. 条件演算子</a></li>
<li><a href="#インデックス操作">4.7. インデックス操作</a></li>
<li><a href="#複数インデックス操作と範囲インデックス操作">4.8. 複数インデックス操作と範囲インデックス操作</a></li>
<li><a href="#関数適用">4.9. 関数適用</a></li>
<li><a href="#型の推定">4.10 型の推定</a></li>
<li><a href="#連鎖律と導関数">4.11. 連鎖律と導関数</a></li>
</ul></li>
<li><a href="#ステートメント-文">5. ステートメント (文)</a><ul>
<li><a href="#代入ステートメント">5.1. 代入ステートメント</a></li>
</ul></li>
<li><a href="#回帰モデル">9. 回帰モデル</a><ul>
<li><a href="#線形回帰">9.1. 線形回帰</a></li>
<li><a href="#係数とスケールの事前分布">9.2. 係数とスケールの事前分布</a></li>
<li><a href="#ロバストノイズモデル">9.3. ロバストノイズモデル</a></li>
<li><a href="#ロジスティック回帰とプロビット回帰">9.4. ロジスティック回帰とプロビット回帰</a></li>
<li><a href="#多項ロジット回帰">9.5. 多項ロジット回帰</a></li>
<li><a href="#中央化されたベクトルへのパラメータ化">9.6. 中央化されたベクトルへのパラメータ化</a></li>
<li><a href="#順序ロジスティック回帰と順序プロビット回帰">9.7. 順序ロジスティック回帰と順序プロビット回帰</a></li>
<li><a href="#階層ロジスティック回帰">9.8. 階層ロジスティック回帰</a></li>
<li><a href="#階層事前分布">9.9. 階層事前分布</a></li>
<li><a href="#項目反応理論モデル">9.10. 項目反応理論モデル</a></li>
<li><a href="#識別可能性のための事前分布">9.11. 識別可能性のための事前分布</a></li>
<li><a href="#階層モデルにおける多変量の事前分布">9.12. 階層モデルにおける多変量の事前分布</a></li>
<li><a href="#予測-フォアキャストとバックキャスト">9.13. 予測, フォアキャストとバックキャスト</a></li>
<li><a href="#多変量の結果変数">9.14. 多変量の結果変数</a></li>
</ul></li>
<li><a href="#時系列モデル">10. 時系列モデル</a><ul>
<li><a href="#自己回帰モデル">10.1. 自己回帰モデル</a></li>
<li><a href="#時間的不等分散性のモデリング">10.2. 時間的不等分散性のモデリング</a></li>
<li><a href="#移動平均モデル">10.3. 移動平均モデル</a></li>
<li><a href="#自己回帰移動平均モデル">10.4. 自己回帰移動平均モデル</a></li>
<li><a href="#確率的ボラティリティモデル">10.5. 確率的ボラティリティモデル</a></li>
<li><a href="#隠れマルコフモデル">10.6. 隠れマルコフモデル</a></li>
</ul></li>
<li><a href="#欠測データと部分的に既知のパラメータ">11. 欠測データと部分的に既知のパラメータ</a><ul>
<li><a href="#欠測データ">11.1. 欠測データ</a></li>
<li><a href="#部分的に既知のパラメータ">11.2. 部分的に既知のパラメータ</a></li>
<li><a href="#効率性についての注意">11.3. 効率性についての注意</a></li>
<li><a href="#因子分析の負荷行列">11.4. 因子分析の負荷行列</a></li>
</ul></li>
<li><a href="#切断あるいは打ち切りデータ">12. 切断あるいは打ち切りデータ</a><ul>
<li><a href="#切断分布">12.1. 切断分布</a></li>
<li><a href="#切断データ">12.2. 切断データ</a></li>
<li><a href="#打ち切りデータ">12.3 打ち切りデータ</a></li>
</ul></li>
<li><a href="#有限混合分布">13. 有限混合分布</a><ul>
<li><a href="#潜在離散値のパラメータ化">13.1. 潜在離散値のパラメータ化</a></li>
<li><a href="#負担率パラメータを総和で消去">13.2. 負担率パラメータを総和で消去</a></li>
<li><a href="#指数の和の対数-対数軸での線形の和">13.3. 指数の和の対数: 対数軸での線形の和</a></li>
<li><a href="#混合分布のベクトル化">13.4. 混合分布のベクトル化</a></li>
<li><a href="#ゼロ過剰モデルとハードルモデル">13.5. ゼロ過剰モデルとハードルモデル</a></li>
</ul></li>
<li><a href="#測定誤差とメタアナリシス">14. 測定誤差とメタアナリシス</a><ul>
<li><a href="#ベイズ測定誤差モデル">14.1. ベイズ測定誤差モデル</a></li>
<li><a href="#メタアナリシス">14.2. メタアナリシス</a></li>
</ul></li>
<li><a href="#潜在離散パラメータ">15. 潜在離散パラメータ</a><ul>
<li><a href="#周辺化の利点">15.1 周辺化の利点</a></li>
<li><a href="#変化点モデル">15.2 変化点モデル</a></li>
<li><a href="#標識再捕獲モデル">15.3 標識再捕獲モデル</a></li>
<li><a href="#データ符号化と診断正答率のモデル">15.4 データ符号化と診断正答率のモデル</a></li>
</ul></li>
<li><a href="#まばらなデータ構造と不ぞろいなデータ構造">16. まばらなデータ構造と不ぞろいなデータ構造</a><ul>
<li><a href="#まばらなデータ構造">16.1 まばらなデータ構造</a></li>
<li><a href="#不ぞろいなデータ構造">16.2. 不ぞろいなデータ構造</a></li>
</ul></li>
<li><a href="#クラスタリングモデル">17. クラスタリングモデル</a><ul>
<li><a href="#ソフトk-means法">17.1. ソフト<span class="math inline">\(K\)</span>-Means法</a></li>
<li><a href="#クラスタリングにおけるベイズ推定のむずかしさ">17.2. クラスタリングにおけるベイズ推定のむずかしさ</a></li>
<li><a href="#ナイーブベイズ分類法およびクラスタリング法">17.3. ナイーブベイズ分類法およびクラスタリング法</a></li>
<li><a href="#潜在ディリクレ配分法">17.4. 潜在ディリクレ配分法</a></li>
</ul></li>
<li><a href="#方向-回転-超球面">19. 方向, 回転, 超球面</a><ul>
<li><a href="#単位ベクトル">19.1. 単位ベクトル</a></li>
<li><a href="#円-球面-超球面">19.2. 円, 球面, 超球面</a></li>
<li><a href="#制約のないパラメータへの変換">19.3. 制約のないパラメータへの変換</a></li>
<li><a href="#単位ベクトルと回転">19.4. 単位ベクトルと回転</a></li>
<li><a href="#日と年の円周表現">19.5. 日と年の円周表現</a></li>
</ul></li>
<li><a href="#微分方程式を解く">20. 微分方程式を解く</a><ul>
<li><a href="#例単純な調和振動子">20.1. 例:単純な調和振動子</a></li>
<li><a href="#常微分方程式の系をコーディングする">20.2. 常微分方程式の系をコーディングする</a></li>
<li><a href="#測定エラーモデル">20.3. 測定エラーモデル</a></li>
<li><a href="#stiffなode">20.4. stiffなODE</a></li>
<li><a href="#odeソルバーの制御パラメータ">20.5. ODEソルバーの制御パラメータ</a></li>
</ul></li>
<li><a href="#再パラメータ化と変数変換">21. 再パラメータ化と変数変換</a><ul>
<li><a href="#理論的かつ実践的な背景">21.1. 理論的かつ実践的な背景</a></li>
<li><a href="#再パラメータ化">21.2. 再パラメータ化</a></li>
<li><a href="#変数変換">21.3. 変数変換</a></li>
<li><a href="#変化する境界をもつvector">21.4. 変化する境界をもつ<code>vector</code></a></li>
</ul></li>
<li><a href="#自作の確率分布関数">22. 自作の確率分布関数</a><ul>
<li><a href="#例">22.1. 例</a></li>
</ul></li>
<li><a href="#ユーザー定義関数">23. ユーザー定義関数</a><ul>
<li><a href="#基本的な関数">23.1. 基本的な関数</a></li>
<li><a href="#ステートメント文としての関数">23.2. ステートメント(文)としての関数</a></li>
<li><a href="#対数確率を累積する機能にアクセスする関数">23.3. 対数確率を累積する機能にアクセスする関数</a></li>
<li><a href="#乱数生成器として振る舞う関数">23.4. 乱数生成器として振る舞う関数</a></li>
<li><a href="#ユーザー定義の確率分布関数">23.5. ユーザー定義の確率分布関数</a></li>
<li><a href="#多重定義の関数">23.6. 多重定義の関数</a></li>
<li><a href="#関数にドキュメントをつける">23.7. 関数にドキュメントをつける</a></li>
<li><a href="#関数の型の要約">23.8. 関数の型の要約</a></li>
<li><a href="#再帰関数">23.9. 再帰関数</a></li>
</ul></li>
<li><a href="#問題のある事後分布">24. 問題のある事後分布</a><ul>
<li><a href="#回帰での予測変数の共線性">24.1. 回帰での予測変数の共線性</a></li>
<li><a href="#混合分布モデルでのラベルスイッチング">24.2. 混合分布モデルでのラベルスイッチング</a></li>
<li><a href="#混合分布モデルで成分がつぶれる">24.3. 混合分布モデルで成分がつぶれる</a></li>
<li><a href="#上下限のない密度での事後分布">24.4. 上下限のない密度での事後分布</a></li>
<li><a href="#上下限のないパラメータでの事後分布">24.5. 上下限のないパラメータでの事後分布</a></li>
<li><a href="#一様な事後分布">24.6. 一様な事後分布</a></li>
<li><a href="#問題のある事前分布によるサンプリングの難しさ">24.7. 問題のある事前分布によるサンプリングの難しさ</a></li>
</ul></li>
<li><a href="#コンテナ値の入れ物-配列-vector-and-matrix">25. コンテナ(値の入れ物): 配列, <code>vector</code>, and <code>matrix</code></a><ul>
<li><a href="#vector-and-matrix">25.1. <code>vector</code> and <code>matrix</code></a></li>
<li><a href="#配列-1">25.2. 配列</a></li>
<li><a href="#効率についての考察">25.3. 効率についての考察</a></li>
</ul></li>
<li><a href="#multiple-indexingとrange-indexing">26. multiple indexingとrange indexing</a><ul>
<li><a href="#multiple-indexing">26.1. Multiple Indexing</a></li>
<li><a href="#range-indexを使ったアクセスslicing">26.2. range indexを使ったアクセス(slicing)</a></li>
<li><a href="#代入文の左辺でmultiple-indexingを使う">26.3. 代入文の左辺でmultiple indexingを使う</a></li>
<li><a href="#vectorやmatrixに対するmultiple-index">26.4. <code>vector</code>や<code>matrix</code>に対するmultiple index</a></li>
<li><a href="#パラメータと固定値を含んだmatrix">26.5. パラメータと固定値を含んだ<code>matrix</code></a></li>
</ul></li>
<li><a href="#ベイズデータ解析">28. ベイズデータ解析</a><ul>
<li><a href="#ベイズモデリング">28.1 ベイズモデリング</a></li>
<li><a href="#ベイズ推定">28.2 ベイズ推定</a></li>
</ul></li>
<li><a href="#マルコフ連鎖モンテカルロサンプリング">29. マルコフ連鎖モンテカルロサンプリング</a><ul>
<li><a href="#モンテカルロサンプリング">29.1. モンテカルロサンプリング</a></li>
<li><a href="#マルコフ連鎖モンテカルロサンプリング-1">29.2. マルコフ連鎖モンテカルロサンプリング</a></li>
<li><a href="#初期化と収束モニタリング">29.3. 初期化と収束モニタリング</a></li>
<li><a href="#有効サンプルサイズ">29.4. 有効サンプルサイズ</a></li>
</ul></li>
<li><a href="#点推定">30. 点推定</a><ul>
<li><a href="#最尤推定">30.1. 最尤推定</a></li>
<li><a href="#罰則付き最尤推定">30.2. 罰則付き最尤推定</a></li>
<li><a href="#事後最頻値の推定">30.3. 事後最頻値の推定</a></li>
<li><a href="#事後平均値の推定">30.4. 事後平均値の推定</a></li>
<li><a href="#事後中央値の推定">30.5. 事後中央値の推定</a></li>
<li><a href="#推定値の誤差-バイアス偏り-分散">30.6 推定値の誤差, バイアス(偏り), 分散</a></li>
</ul></li>
<li><a href="#点推定-1">31. 点推定</a><ul>
<li><a href="#最尤推定-1">31.1. 最尤推定</a></li>
<li><a href="#罰則付き最尤推定-1">31.2. 罰則付き最尤推定</a></li>
<li><a href="#事後最頻値の推定-1">31.3. 事後最頻値の推定</a></li>
<li><a href="#事後平均値の推定-1">31.4. 事後平均値の推定</a></li>
<li><a href="#事後中央値の推定-1">31.5. 事後中央値の推定</a></li>
<li><a href="#推定値の誤差-バイアス偏り-分散-1">31.6 推定値の誤差, バイアス(偏り), 分散</a></li>
</ul></li>
<li><a href="#ハミルトニアンモンテカルロサンプリング">33. ハミルトニアンモンテカルロサンプリング</a><ul>
<li><a href="#ハミルトニアンモンテカルロ">33.1 ハミルトニアンモンテカルロ</a></li>
<li><a href="#hmcアルゴリズムのパラメータ">33.2 HMCアルゴリズムのパラメータ</a></li>
</ul></li>
<li><a href="#配列の演算">41. 配列の演算</a><ul>
<li><a href="#配列から1つの値の作成">41.1 配列から1つの値の作成</a></li>
</ul></li>
<li><a href="#ソフトウェア開発としてのモデル構築">62. ソフトウェア開発としてのモデル構築</a><ul>
<li><a href="#バージョン管理を使う">62.1. バージョン管理を使う</a></li>
<li><a href="#再現可能にする">62.2 再現可能にする</a></li>
<li><a href="#可読性を高める">62.3. 可読性を高める</a></li>
<li><a href="#データを探検する">62.4. データを探検する</a></li>
<li><a href="#トップダウンでデザインし-ボトムアップでコーディングする">62.5. トップダウンでデザインし, ボトムアップでコーディングする</a></li>
<li><a href="#シミュレートされたデータでフィットさせる">62.6. シミュレートされたデータでフィットさせる</a></li>
<li><a href="#表示することでデバッグする">62.7. 表示することでデバッグする</a></li>
<li><a href="#コメント-2">62.8. コメント</a></li>
</ul></li>
<li><a href="#再現性reproducibilityについて">64.再現性(Reproducibility)について</a></li>
</ul>
</nav>
<h2 id="overview">1. Overview</h2>
<p>このドキュメントは統計モデリング言語であるStanのユーザーガイド兼リファレンスマニュアルです. この導入の章ではStanの全体像について紹介しますが, 残りの章ではモデルの実際のプログラミングや, Stanのモデリング言語としての詳細な解説を, コードやデータの型も含めて, 実践的な解説を行います.</p>
<h3 id="stan-home-page">1.1 Stan Home Page</h3>
<p>最新のコード, 例, マニュアル, バグレポート, 機能追加の要望など, Stanに関する情報は下記のリンクにあるStanのホームページから参照できます.</p>
<p><a href="http://mc-stan.org" class="uri">http://mc-stan.org</a></p>
<h3 id="stanのインターフェース">1.2 Stanのインターフェース</h3>
<p>Stan Projectでは3つのインターフェースをプロジェクトの一部としてサポートしています. モデリング部分やその使い方に関しては3つのインターフェースで共通していてるので, このマニュアルはその3つに共通するモデリング言語としてのマニュアルとなります. 初期化やサンプリング, チューニング方法についてはすべてのインターフェースで共通していて, また事後分布を分析する機能についてもおおむね共通しています.</p>
<p>提供されているすべてのインターフェースについて, getting-started guideやドキュメントが完全なソースコードと共に提供されています.</p>
<h4 id="cmdstan">CmdStan</h4>
<p>CmdStanはコマンドラインからStanを利用することを可能にします. ある意味でCmdStanはStanのリファレンス実装ともいえます. もともとCmdStanのドキュメントはこのドキュメントの一部でしたが, 今では独立したドキュメントとなっています. CmdStanのホームページは以下になります.</p>
<p><a href="http://mc-stan.org/cmdstan.html" class="uri">http://mc-stan.org/cmdstan.html</a></p>
<h4 id="rstan">RStan</h4>
<p>RStanはRにおけるStanのインターフェースです. R2WinBUGSやR2jagsでは, Rから外部のソフトウェアとしてWinBUGSやJAGSを呼び出していました. RStanではそうではなく, むしろRのメモリを通じたインターフェースになっています. RStanのホームページは以下になります.</p>
<p><a href="http://mc-stan.org/cmdstan.html">http://mc-stan.org/rstan.html</a></p>
<h4 id="pystan">PyStan</h4>
<p>PyStanはPythonにおけるStanのインターフェースです. 外側のStanを呼び出すというよりは, RStanと同様にPythonのメモリレベルのインターフェースです. PyStanのホームページは以下になります.</p>
<p><a href="http://mc-stan.org/pystan.html" class="uri">http://mc-stan.org/pystan.html</a></p>
<h5 id="matlabstan">MatlabStan</h5>
<p>MatlabStanはMATLABにおけるStanへのインターフェースです. RstanやPyStanとは異なり, 現状MatlabStanはCmdStanのラッパーです. MatlabStanのホームページは以下になります.</p>
<p><a href="http://mc-stan.org/matlab-stan.html" class="uri">http://mc-stan.org/matlab-stan.html</a></p>
<h5 id="stan.jl">Stan.jl</h5>
<p>Stan.jlはJuliaにおけるStanのインターフェースです. これもMatlabStanと同様に, CmdStanのラッパーです. Stan.jlのホームページは以下になります.</p>
<p><a href="http://mc-stan.org/julia-stan.html" class="uri">http://mc-stan.org/julia-stan.html</a></p>
<h5 id="statastan">StataStan</h5>
<p>StataStanはStataにおけるStanのインターフェースです. MatlabStan, Stan.jl と同様にこれもCmdStanのラッパーです. StataStanのホームページは以下になります.</p>
<p><a href="http://mc-stan.org/stata-stan.html" class="uri">http://mc-stan.org/stata-stan.html</a></p>
<h3 id="stanのプログラム">1.3 Stanのプログラム</h3>
<p>Stanのプログラムでは条件付き確率分布 <span class="math inline">\(p(\theta \mid y, x)\)</span> を通して統計モデルが定義されます. ここで<span class="math inline">\(\theta\)</span>はモデルに組み込まれる, 一連の未知の変数(例: モデルのパラメータ, 隠れ変数, 欠測データ, 将来の予測値)です. <span class="math inline">\(y\)</span>はモデルに組み込まれる, 一連の値が得られている変数です. <span class="math inline">\(x\)</span>はモデルに組み込まれない, 一連の説明変数と定数です(例:サイズ, ハイパーパラメータ).</p>
<p>Stanのプログラムは, 変数の型宣言と文(ステートメント)からなります. 変数の型には整数, 実数, ベクトル, 行列はもちろん, その他の型の(多次元な)配列があり, それぞれ値を制約することもできます. 変数は, その役割に応じて, <code>data</code>・<code>transformed data</code>・<code>parameters</code>・<code>transformed parameters</code>・<code>generated quantities</code>というブロックの中で宣言されます. また制約のないローカル変数を各ブロックで定義することもできます.</p>
<p><code>transformed data</code>, <code>transformed parameters</code>, <code>generated quantities</code>ブロックは, そのブロックで宣言された変数を定義する文を含んでいます. 特別な<code>model</code>ブロックはモデルの対数尤度を定義する文で構成されています.</p>
<p>また<code>model</code>ブロックの中では, Stanが内部で持っている対数確率をインクリメントするための略記として, BUGS風のサンプリング記法を利用できます. 対数確率の変数には直接アクセスすることもでき, ユーザによる確率関数の定義や変数変換のヤコビアンの調整を可能にします.</p>
<h4 id="変数の制約">変数の制約</h4>
<p>変数の制約はStanにおいて, 特にパラメータについて重要です. Stanが効率的にサンプリングをするためには, 宣言時の制約を満たすパラメータの値が, <code>model</code>ブロックにおいて台(サポート)を持つ必要があります(言い換えると, ゼロでない事後密度をもつ必要があります).</p>
<p><code>data</code>ブロックと<code>transformed data</code>ブロックにおける制約は, データの入力および変換のエラーチェックのために使われるだけです. <code>transformed parameters</code>ブロックにおける制約は, <code>parameters</code>ブロックにおける制約と同じように満たされなければなりません. さもなくばサンプリングが完全にランダムウォークになってしまうか, 失敗することでしょう. <code>generated quantities</code>における制約は必ず満たされる必要があり, さもなくばサンプリングが完全に停止することでしょう. なぜなら<code>generated quantities</code>ブロックが評価される時点で抽出されたサンプルを棄却するのは遅すぎるからです.</p>
<h4 id="実行順序">実行順序</h4>
<p>Stanの文は手続きとして解釈されるため, 順序が重要です. 文は最低でも変数に対する値の代入を伴います. 一連の文(と必要に応じたローカル変数の定義)によりブロックが構成されます. そしてStanもまたRやBUGSで使われている有限なfor-eachのループを提供しています.</p>
<h4 id="確率的プログラミング言語">確率的プログラミング言語</h4>
<p>Stanは手続き型の確率的プログラミング言語です. DSL(domain-specific language, ドメイン固有言語)の一種です. それは統計的な推論という特定の目的のために開発されたという意味です.</p>
<p>Stanは確率変数を正真正銘の第一級オブジェクトとして扱うという意味で確率的プログラミング言語です. Stanでは変数を確率変数として扱いますが, あるものは観測されていたり, またあるものは未知で推定の必要がある(もしくは事後の予測推論に使う必要がある)ものです. 観測された確率変数は<code>data</code>ブロックの中で宣言され, 観測されていない変数はパラメータとして宣言されます(<code>parameters</code>ブロックで宣言された変数や, それに依存する, <code>transformed parameters</code>ブロック内の変数・<code>generated quantities</code>ブロック内の変数・ローカル変数も含みます). また観測されていない確率変数の周辺分布や同時分布からサンプリングすることもできますし, 確率変数の平均や分散を推定することもできますし, 二次的な事後の予測推論ではそれらの値をプラグインすることもできます.</p>
<p>StanはCやFortranと同様(C++, R, PythonやJavaなどと部分的に同じ)の手続き型プログラミング言語です. これは, 代入, ループ, 条件分岐, ローカル変数, オブジェクトレベルの関数や配列のようなデータ構造に基づいているという意味です. 関数型言語と比較すれば, 関数型言語では典型的には高階関数(汎関数)が許可され, しばしばリフレクション(プログラムの中でそのプログラムに含まれる型や変数/メソッドの情報を参照/操作できるようにする仕組み)が許可されています. 一方で純粋な関数型言語では代入が全く許可されていません. またオブジェクト指向言語はより一般的なデータ型を取り入れており, 動的に関数などが選ばれて実行されます.</p>
<p>Stan言語は, CやRと同様に, チャーチ=チューリング完全 [Church (1936); Turing (1936); Hopcroft and Motwani (2006)]です. それはチューリングマシン(もしくはC)で計算可能ないかなるプログラムもStanで実装できることを意味しています(もちろんその道は険しいですが). ちなみにチューリング完全であるために求められるのは, ループと条件分岐, そしてループの中でサイズが変更できる配列のみです.</p>
<h3 id="コンパイルとstanプログラムの実行">1.4 コンパイルとStanプログラムの実行</h3>
<p>Stanのコードはまず最初にStanのコンパイラ<code>stanc</code>によってC++の言語へと変換され, そしてそのC++はプラットフォーム依存の単独で実行可能な形式に変換されます. またStanはWindows, Mac OS X, Linuxなど様々な実行可能形式を出力することができます. <a href="#fn1" class="footnoteRef" id="fnref1"><sup>1</sup></a> Stanの実行ファイルを実行すると, まず既知の <span class="math inline">\(y\)</span> と <span class="math inline">\(x\)</span> を読み込み, その妥当性を評価します. そして(独立ではない)同一分布に従うサンプルの列 <span class="math inline">\(\theta^{(1)},\theta^{(2)},\dots\)</span> を生成します. これらは各々, 周辺分布 <span class="math inline">\(p(\theta \mid y, x)\)</span> に従います.</p>
<h3 id="サンプリング">1.5 サンプリング</h3>
<p>連続値をとるパラメータに対してStanは Hamiltonian Monte Carlo (HMC) Sampling (Duane et al., 1987; Neal, 1994, 2011) というある種のマルコフ連鎖モンテカルロ(MCMC)サンプリング(Metropolis et al., 1953)を用います. Stanは離散値をとるパラメータのサンプリングは提供していません. 観測値としては離散値を直接利用することができますが, 離散値をとるパラメータはモデルから周辺化消去されている必要があります. 10章と12章では, いかにして有限の離散値をとるパラメータを和をとってモデルから消去するか, そしてその消去がもたらすサンプリング効率の大幅な向上について議論します.</p>
<p>HMCは対数確率関数の勾配を使うことで, 定常分布への収束とパラメタの探索の効率化を促進しています. 推定すべき量のベクトル<span class="math inline">\(\theta\)</span>は仮想的な粒子の位置と解釈されます. それぞれのiterationにおいて, ランダムな運動量を生成し, (負の)対数確率関数を決めているポテンシャルエネルギー内の粒子の経路をシミュレーションします. ハミルトンの分解からこのポテンシャルの勾配が運動量の変化を与え, この運動量が位置の変化を与えることが分かります. この時間的に連続な変化は, 時間をシミュレーションが容易な離散値とみなすleapfrogアルゴリズムによって近似されます. 続けて, 様々なシミュレーションエラーを直し, マルコフ連鎖の遷移において詳細釣り合い条件を満たすようにするために, メトロポリス法の棄却ステップが適用されます (Metropolis et al., 1953; Hastings, 1970).</p>
<p>基本的なユークリッド空間上のHamiltonian Monte Carlo法には, 振る舞いに対して大きな影響を与える3つの「チューニングすべき」パラメータがあります. Stanのサンプラーはそれらを手動で設定する方法と, ユーザを介さずに自動で設定する方法の両方を提供しています.</p>
<p>1つ目のチューニングパラメータはステップサイズで, ハミルトニアンが測定される時間的な単位(すなわち, 離散化の単位)です. Stanではユーザが指定したステップサイズに設定することもできますが, 双対平均化法(Nesterov, 2009; Hoffman and Gelman, 2011, 2014)によってwarmupの段階で最適なステップサイズを推定することができます. どちらの場合もとり得るステップサイズの区間からステップサイズを抽出するために, 追加のランダム化が適用されます(Neal, 2011).</p>
<p>2つ目のチューニングパラメータはiterationごとのステップ数で, このステップ数と先ほどのステップサイズの積によりハミルトニアンに関する全シミュレーション時間が決まります. Stanはこのステップ数も特定のステップ数を指定することができますが, No-U-Turn (NUTS) sampler (Hoffman and Gelman, 2011, 2014)を使うと, このステップ数をサンプリング中に自動的に決定することができます.</p>
<p>3つ目のチューニングパラメータは仮想粒子の質量行列です. Stanはwarmupの間に対角行列となる質量行列や完全な質量行列を推定するように設定できます. また, 将来的にはユーザが指定した質量行列をサポートする予定です. 対角行列となる質量行列を推定すると, 未知パラメータ系列<span class="math inline">\(\theta\)</span>の各要素<span class="math inline">\(\theta_k\)</span>のスケールは正規化されます. 一方, 完全な質量行列を推定すると, スケーリングと回転の両方を考慮することができますが, <a href="#fn2" class="footnoteRef" id="fnref2"><sup>2</sup></a>行列演算のためにleapfrogの各ステップにおいて, より多くのメモリと計算を要します.</p>
<h4 id="収束のモニタリングと有効サンプルサイズ">収束のモニタリングと有効サンプルサイズ</h4>
<p>マルコフ連鎖から得られるサンプルは, その連鎖が定常分布に収束したあとに, 周辺分布 <span class="math inline">\(p(\theta \mid y, x)\)</span> から抽出されます. MCMCが収束したかどうかを判定する方法は複数ありますが, 残念ながら, そうしたテストをパスしたからといって収束が保証されるものではありません. Stanにおいておすすめの方法は, いくつか異なるパラメータの初期値を用いてランダムに初期化した複数のマルコフ連鎖を走らせ, warmup/adaptationの期間のサンプルを捨て, 各チェーンの残りのサンプルを半分に分割することで, 潜在的なスケールの逓減に関する統計量 <span class="math inline">\(\hat{R}\)</span> (Gelman and Rubin, 1992)を計算することです. もしその結果, 十分なサイズの有効サンプルが得られなければ, iterationの数を2倍にして再びやり直します. warmupなど全て含めてやり直しです. <a href="#fn3" class="footnoteRef" id="fnref3"><sup>3</sup></a></p>
<p><span class="math inline">\(M\)</span> 個の独立に抽出されたサンプルに基づいて母平均を推定する場合, その推定誤差は <span class="math inline">\(\frac{1}{\sqrt{M}}\)</span> に比例します. もしMCMCを使って抽出されたサンプルのように典型的にサンプル間に正の相関があれば, その推定誤差は <span class="math inline">\(\frac{1}{\sqrt{\text{N\_EFF}}}\)</span> に比例します. ここで<span class="math inline">\(\text{N\_EFF}\)</span> は有効サンプルサイズです. したがって, 目下の推定や推論のタスクに対し十分な大きさになるまで, 有効サンプルサイズ(やその推定値)をモニターするのは標準的な習慣です.</p>
<h4 id="ベイズ推定とモンテカルロ法">ベイズ推定とモンテカルロ法</h4>
<p>Stanはフルベイズの推定をサポートするために開発されました. ベイズ推定は下記の正規化されていないベイズ則</p>
<p><span class="math display">\[p(\theta \mid y, x) \propto p(y \mid \theta, x)p(\theta, x)\]</span></p>
<p>に基づいています. これは, データ <span class="math inline">\(y\)</span>(と定数<span class="math inline">\(x\)</span>)が与えられたもとでのパラメータ <span class="math inline">\(\theta\)</span> の事後分布 <span class="math inline">\(p(\theta \mid y, x)\)</span> が尤度 <span class="math inline">\(p(y \mid \theta, x)\)</span> と事前分布 <span class="math inline">\(p(\theta, x)\)</span> の積に比例することを表します.</p>
<p>Stanでは, ベイズモデリングは定係数を除いて事後確率関数のコーディングを伴います. ベイズ則から事後確率分布は定係数を除いて尤度関数と事前確率の積と等価です.</p>
<p>フルベイズ推定では, 事後分布<span class="math inline">\(p(\theta|y, x)\)</span>によるモデル化において, パラメータ<span class="math inline">\(\theta\)</span>の値に関する不確実性が含まれ伝搬されてゆくことになります. このことは, 事後分布からの一連のサンプルについて推定を行うことで実現できます. その際には, 事後平均や事後確率区間等を関心のある量のためにプラグイン推定値として利用したり, 事後分布に基づいて事象の結果や未観測のデータ値を予測したりします.</p>
<h3 id="最適化">1.6 最適化</h3>
<p>Stanは最適化に基づく推論もサポートしています. 与えられた事後分布 <span class="math inline">\(p(\theta \mid y)\)</span> に対して, Stanは以下で定義される事後分布の最頻値 <span class="math inline">\(\theta^\ast\)</span> を見つけることができます.</p>
<p><span class="math display">\[\theta^\ast = \text{argmax}_\theta p(\theta \mid y)\]</span></p>
<p>ここで <span class="math inline">\(\text{argmax}_v f(v)\)</span> という記法は 関数 <span class="math inline">\(f(v)\)</span> を最大化する <span class="math inline">\(v\)</span> の値を選ぶことを意味します.</p>
<p>もし事前分布が一様分布ならば, 事後分布の最頻値は, パラメータの最尤推定値(maximum likelifood estimate, MLE)に対応します. また, 事前分布が一様分布でなければ, この事後分布の最頻値はしばしばMAP(maximum a posterior)推定値と呼ばれます.</p>
<p>最適化においては, 変数の制約に由来するいかなる変換のヤコビアンも無視されます. 多くの最適化問題でより効率的に計算するには, 変数宣言時における上下限の制約を取り除いて, 代わりに台の範囲外となる無効な解を許さないように<code>model</code>ブロックで棄却するようにします.</p>
<h4 id="点推定値による推論">点推定値による推論</h4>
<p>推定値<span class="math inline">\(\theta^\ast\)</span> はいわゆる「点推定値」と呼ばれています. これは事後分布を分布と言うよりむしろ一つの点として要約することを意味します. もちろん点推定値それ自体は推定のばらつきを考慮しません. 事後予測確率<span class="math inline">\(p(\tilde{y} \mid y)\)</span>は, データ <span class="math inline">\(y\)</span> が与えられた場合の事後最頻値を用いて, <span class="math inline">\(p(\tilde{y} | \theta^\ast)\)</span> のように作ることができます. しかし, これらは事後確率に不確実性を考慮しないため, たとえ事前分布を持っていたとしてもベイズ推定ではありません. もし, 事後分布の分散が小さく, その平均が最頻値に近ければ, 点推定の結果はフルベイズの推定結果と非常に近くなります.</p>
<h3 id="変分推論">1.7 変分推論</h3>
<p>Stanはベイズ推定を近似する変分推論もサポートしています(Jordan et al., 1999; Wainwright and Jordan, 2008). 変分推論では近似した事後分布を用いて, 事後分布の平均値と不確実性を推定することができます. 近似した事後分布は, パラメトリックな分布が真の事後分布にあてはまるように最適化して求めます. 変分推論は, 特に機械学習の分野においてベイズ推定の計算にすさまじい影響を与えてきました. 典型的には変分推論は従来のサンプリングによる推定に比べて速く, 巨大なデータにスケールしやすいという特徴があります(Hoffman et al., 2013).</p>
<p>変分推論は事後分布 <span class="math inline">\(p(\theta \mid y)\)</span> をシンプルなパラメトリックな分布 <span class="math inline">\(q(\theta \mid \phi)\)</span> で近似します. このことは真の事後分布との以下で与えられるKullback-Leibler情報量を最小化することに対応します.</p>
<p><span class="math display">\[\phi^\ast = \text{argmin}_\phi \text{KL}[q(\theta \mid \phi) \Vert p(\theta \mid y)]\]</span></p>
<p>これはベイズ推定の問題を, 解がwell-definedな計量をもつ最適化問題に帰着できることを意味します. 変分推論では, サンプリングに比べてオーダーが異なるほど収束が速いです. 近似の精度はモデルによって異なります. 変分推論が点推定のテクニックではないことに注意すると, 結果は事後分布を近似した分布だということができます.</p>
<p>Stanでは自動微分変分推論(Automatic Differentiation Variational Inference, ADVI)というアルゴリズムが実装されています. このアルゴリズムはStanの変数変換ライブラリや自動微分に関するツールボックスを活用するようにデザインされています(Kucukelbir et al., 2015). ADVIは変分推論のアルゴリズムを導出するのに典型的に必要となるすべての数学を回避し, いかなるStanのモデルにおいても動作します.</p>
<h2 id="文字のエンコーディング-ファイルをincludeするメカニズム-コメントの文法">2.文字のエンコーディング, ファイルをincludeするメカニズム, コメントの文法</h2>
<p>この短い章では, Stan言語における文字のエンコーディング, ファイルを組み込むメカニズム, コメントする文法について説明しています.</p>
<h3 id="文字のエンコーディング">2.1. 文字のエンコーディング</h3>
<h4 id="stanのプログラム-1">Stanのプログラム</h4>
<p>Stanプログラムの内容は, ASCII(半角英数字)でなければなりません. UTF-8でエンコードされたUnicodeのような拡張文字セットは,ファイル中の識別子や他の文字として使ってはいけません.</p>
<h4 id="コメント">コメント</h4>
<p>コメントの中身はコンパイラに無視されるので, どのような文字コード(例えばASCII, UTF-8, Latin1やBig5)を使って書いても構いません. コメント区切り文字自体は, ASCIIで書く必要があります.</p>
<h3 id="include">2.2. Include</h3>
<p>Stanは以下の書き方で, あるファイルに別のファイルを含めることができます. 例えば, <code>std-normal.stan</code>というファイルが標準正規分布の(規格化定数を除いた)確率密度関数の対数を定義していたとしましょう.</p>
<pre><code>functions {
real std_normal_lpdf(vector y) {
return -0.5 * y' * y;
}
}</code></pre>
<p>さらにまた, include文を使った以下のStanプログラムも持っているとしましょう.</p>
<pre><code>#include std-normal.stan
parameters {
real y;
}
model {
y ~ std_normal();
}</code></pre>
<p>このStanプログラムは, <code>#include</code>文が書かれた行を<code>std-normal.stan</code>ファイルの中身で置き換えたかのように振る舞います. すなわち, 以下の単一のStanプログラムが与えられたかのように振る舞います.</p>
<pre><code>functions {
real std_normal_lpdf(vector y) {
return -0.5 * y' * y;
}
}
parameters {
real y;
}
model {
y ~ std_normal();
}</code></pre>
<p>読み込み側ファイルのどこにinclude文が置かれるか, また置き換えられるファイルの中身が何であるかについては, 制限はありません. 読み込む側のファイルに空白が追加されることもありません.</p>
<h4 id="再帰的include">再帰的include</h4>
<p>再帰的includeは無視されます. 例えば, <code>a.stan</code>というファイルが次のようなものだったとします.</p>
<pre><code>#include b.stan</code></pre>
<p>そして<code>b.stan</code>の中身が</p>
<pre><code>#include a.stan</code></pre>
<p>だったとします. このファイルを処理すると空になります. というのも, <code>a.stan</code>が<code>b.stan</code>をincludeし, それが読もうとする<code>a.stan</code>は無視されるからで, 警告が表示されます.</p>
<h4 id="include-path">include path</h4>
<p>Stanは, システムで定義された一連のPATH(複数のディレクトリ・フォルダ)を特定し, includeで指定されたファイルを探すメカニズムを提供しています. そのPATHの場所を先頭から順に探していき, 最初に見つかったファイルがincludeされます.</p>
<h3 id="コメント-1">2.3. コメント</h3>
<p>StanはC++スタイルの行ごとのコメント, あるいはカッコ付きコメントをサポートしています. Stanプログラムで空白が許されているところであれば, どこにコメントを入れても構いません.</p>
<h4 id="行ごとのコメント">行ごとのコメント</h4>
<p>二つのフォワードスラッシュ(<code>//</code>)の後に続くいかなる文字列も, スラッシュとともに無視されます. これは例えば, 変数名に説明をつけるために使われたりします.</p>
<pre><code>data {
int<lower=0> N; // 観測されたデータの数
real y[N]; // 観測されたデータ
}</code></pre>
<h4 id="カッコ付きコメント">カッコ付きコメント</h4>
<p>フォワードスラッシュとアスタリスクのペア(<code>\*</code>)と, アスタリスクとフォワードスラッシュのペア(<code>*/</code>)で囲まれたあらゆるテキストは, カッコ付きコメントとして無視されます.</p>
<h3 id="空白">2.4.空白</h3>
<h4 id="空白の文字">空白の文字</h4>
<p>空白文字(そしてそのアスキーコード)は空白(0x20),タブ(0x09), キャリッジリターン(0x0D),そしてラインフィード(0x0A)です<a href="#fn4" class="footnoteRef" id="fnref4"><sup>4</sup></a>.</p>
<h4 id="空白の中立性">空白の中立性</h4>
<p>Stanはこれらの空白文字を同じように扱います. 特に, タブ, キャリッジリターン, ラインフィード, その他スペースなどでテキストを縦方向に揃えることは実行結果に影響しません.</p>
<h4 id="空白の位置">空白の位置</h4>
<p>Stanプログラムでは, 文字の間に0以上の空白文字を置くことができます. 例えば <code>a \* b</code> のようなバイナリ演算子の前後に, 文の終わりを示すセミコロンの前に, 丸カッコまたは角カッコの周辺に, 関数の引数を区切るコンマの前後などに, いろいろな種類の空白文字を置くことができます.</p>
<p>識別子とリテラルは空白で区切ることができません. つまり, 数字の<code>10000</code>を<code>10 000</code>と書いたり, 識別子の<code>normal_lpdf</code>を<code>normal _ lpdf</code>と書くことは不適切です.</p>
<h2 id="データ型">3.データ型</h2>
<p>本章ではStanで変数の宣言や, 式の値に使われるデータ型について議論します. 変数の型はパラメータの宣言, データの一貫性のチェック, 関数の呼び出し, 変数に値を代入する場合のすべてにおいて重要な要素となります. Stanにおいて, すべての式と変数の宣言は, 静的に定められたデータ型と関係しています(すなわちプログラムがコンパイルされた時). 一方, <code>vector</code>,<code>matrix</code>, 配列の大きさは動的に決定されます(プログラムが動作する際). これは動的に変数に文字列を代入し, 後から変数に行列を代入することができる, Rのような言語とは大きく異なっています. 式は変数, 定数のような基礎要素, もしくは引数に適用される関数や演算子のような要素から構成されているでしょう. 本章では基本的なデータ型に話題を絞り, それらがどのように宣言, 代入, 使用されるかについて解説します. 配列, <code>vector</code>,<code>matrix</code>などのコンテナ型の詳細な比較については次章に譲ります.</p>
<h3 id="基本データ型">3.1. 基本データ型</h3>
<p>組み込み型関数やユーザ定義が定義した関数の引数, ローカル変数はいずれも基本データ型である必要があります. 基本データ型とは, 制約のないプリミティブ型, <code>vector</code>型, <code>matrix</code>型, およびそれらを並べた配列のことです.</p>
<h4 id="プリミティブ型">プリミティブ型</h4>
<p>Stanには連続値に対応した<code>real</code>と, 整数に対応した<code>int</code>の2種のプリミティブ型が用意されています.</p>
<h4 id="vector-matrix型"><code>vector</code>, <code>matrix</code>型</h4>
<p>Stanには列ベクトルに対応した<code>vector</code>, 行ベクトルに対応した<code>row_vector</code>, 行列に対応した<code>matrix</code>の3種の行列ベースのデータ型が用意されています.</p>
<h4 id="配列">配列</h4>
<p>添え字をつけて宣言することで, 任意の型(次節で紹介する制約付き型も含む)を配列とすることができます. 以下に具体例を示します.</p>
<pre><code>real x[10];
matrix[3,3] m[6,7];</code></pre>
<p>上記のように記述すると, <code>x</code>は1次元で10個の実数が含まれた値として宣言することになります. <code>m</code>は同様に, 3 × 3行列を6 × 7個並べた2次元配列を宣言したことになります.</p>
<h3 id="制約付きデータ型">3.2. 制約付きデータ型</h3>
<p>ローカル変数以外の変数を宣言する際には, 制約をつけても構いません. この際, それぞれの制約付きデータ型は, 制約付きの基本データ型と対応しています. 制約は<code>data</code>, <code>transformed data</code>, <code>transformed parameters</code>, <code>generated quantities</code>ブロックで宣言された変数のエラーをチェックします. そのため, 制約は, <code>parameters</code>ブロック内で宣言された変数を扱う際に重要になります. ここでは, <code>parameters</code>ブロックで, 制約付き変数(宣言された制約を満たすもの)を制約のない変数(実数全体)にどのように変換するかを決めています. これは, "モデルは宣言された制約を満たしているパラメータすべての値に対応 (密度がNon-zero)する必要がある" という, 制約付きデータ型の最も重要な側面を示しています.</p>
<p>もし宣言されたパラメータの制約が対応よりも厳格でない場合, サンプラーやオプティマイザはさまざまな問題を抱えることになるでしょう. このような例として, プログラムが動作しない, 初期化の失敗, 過剰なMetropolis rejection, 分布の裾をサンプリングできないことに起因するサンプリングのバイアスなどが問題として挙げられます.</p>
<h4 id="上限-下限の設定">上限, 下限の設定</h4>
<p>以下のようにすべての基本データ型に制約を宣言する構文を使うことで, 変数の上限, 下限を与えることができます.</p>
<pre><code>int<lower=1> N;
real<upper=0> log_p;
vector<lower=-1,upper=1>[3,3] corr;</code></pre>
<h4 id="構造化ベクトル">構造化ベクトル</h4>
<p>Stanには構造化された<code>vector</code>を扱うためのデータ型が用意されています. 昇順で並べた値の<code>vector</code>に使われる<code>ordered</code>と, 昇順に並べた正の値の<code>vector</code>について使われる<code>positive_ordered</code>がそれにあたります. また, 合計すると1になる非負の値のベクトルに対するデータ型として<code>simplex</code>が, 2乗の合計が1になるベクトルに対するデータ型として<code>unit_vector</code>が用意されています. </p>
<h4 id="構造化マトリクス">構造化マトリクス</h4>
<p>対称な正定値行列を表すために, <code>cov_matrix</code>が, 対角成分が1である対称な正定値行列, すなわち相関行列を表すために, <code>corr_matrix</code>が用意されています. また, コレスキー因子の型も用意されています. <code>cholesky_factor_cov</code>型は対称な正定値行列のコレスキー因子, すなわち正の対角成分を持つ下三角行列を表します. <code>cholesky_factor_corr</code>型は相関行列のコレスキー因子, すなわち正の対角成分を持つ下三角行列で, さらに各々の行が単位ベクトル(つまり2乗して合計すると1)であるような下三角行列を表すために使用できます. 因子分解, スケーリングが容易なコレスキー因子型を使うことで, すべての相関行列, 分散共分散行列を計算するよりもはるかに効率よく計算を行うことができます.</p>
<h3 id="代入引数の受け渡し">3.3. 代入・引数の受け渡し</h3>
<h4 id="代入">代入</h4>
<p>制約付けられたデータの値は基本型にマッチする制約付けられていない変数に代入されるかもしれないし, その逆の, 制約付けられていないデータの値が基本型にマッチする制約付けられた変数に代入されることもあるかもしれません. マッチングに際しては配列の次元数, 基本型が同じであるか, 厳密に解釈されます. 制約付けは考慮されませんが, 基本データ型については考慮されます. 配列, <code>vector</code>はお互いに代入することはできません. 同様に, たとえ次元が一致していても, <code>vector</code>, <code>matrix</code>はお互いに代入することはできません. 第4章では<code>vector</code>, 配列をどのように使い分けるのが適切かについて, 詳細を示します.</p>
<h4 id="関数の呼び出し">関数の呼び出し</h4>
<p>Stanの関数に引数を渡すと, 基本型への代入のように動作します. Stanの関数は配列の次元(<code>real a[10,10,10]</code>なら3)を含む, 引数の基本データ型だけからどの関数が呼ばれるかが決まります(配列の大きさ, 制約は含まない). もちろん, 関数はしばしばそれらの動作の一部として制約を確認することがあります.</p>
<h2 id="式">4. 式</h2>
<p>式は, Stanのプログラムで値を示す基本文法単位です. 整形式のStanのプログラムでは式はすべて, 静的に(コンパイル時に)決定される型を持ちます. 式の型を静的に決定できないときには, Stanのコンパイラは, この問題がある位置を報告します.</p>
<p>この章では, Stanにおける式の文法, 型決定, さまざまな形での使い方について扱います.</p>
<h3 id="数値リテラル">4.1. 数値リテラル</h3>
<p>最も単純な形式の式は, プリミティブな数値を示すリテラルです.</p>
<h4 id="整数リテラル">整数リテラル</h4>
<p>整数リテラルは<code>int</code>型の整数を表します. 整数リテラルは, セパレータなしで10進基数で書かれます. 整数リテラルには, 単一の負符号を含めることができます(<code>--1</code>という式は, リテラル<code>-1</code>を負にしたものと解釈されます).</p>
<p>以下は, 整形式の整数リテラルです.</p>
<pre><code>0, 1, -1, 256, -127098, 24567898765</code></pre>
<p>整数リテラルは, 整数値の上下限の間に収まる値をとる必要があります(2.2節を参照).</p>
<p>整数リテラルには, 小数点(<code>.</code>)を含めることができません. したがって, <code>1.</code>も<code>1.0</code>も<code>real</code>型の式であり, <code>int</code>型の値が必要な場所で使うことはできません.</p>
<h4 id="実数リテラル">実数リテラル</h4>
<p>ピリオドあるいは科学記法を含めて書かれた数は, 連続値の数値型である<code>real</code>型に割り当てられます. 実数リテラルは, ピリオド(<code>.</code>)をセパレータとする10進数で書かれます. 以下は, 整形式の実数リテラルの例です.</p>
<pre><code>0.0, 1.0, 3.14, -217.9387, 2.7e3, -2E-5</code></pre>
<p><code>e</code>または<code>E</code>の後に正あるいは負の整数を続けた記法は10の累乗をかけることを示します. 例えば, <code>2.7e3</code>は<span class="math inline">\(2.7 \times 10^3\)</span>を示し, <code>-2E-5</code>は<span class="math inline">\(-2 \times 10^{-5}\)</span>を示します.</p>
<h3 id="変数">4.2. 変数</h3>
<p>変数はそれ自身が, その変数と同じ型を持つ整形式の式です. Stanの変数はASCIIの文字列からなり, 含めることができるのは, 基本的な小文字と大文字のローマ文字, 数字, アンダースコア(<code>_</code>)文字のみです. 変数は, 文字(<code>a-z</code>と<code>A-Z</code>)で始めなくてはならず, 2個のアンダースコア(<code>__</code>)で終わってはなりません.</p>
<p>以下は, 正しい変数識別子の例です.</p>
<pre><code>a, a3, a_3, Sigma, my_cpp_style_variable, myCamelCaseVariable</code></pre>
<p>RおよびBUGSとは異なり, Stanの変数識別子はピリオド文字を含めることができません.</p>
<h4 id="予約語">予約語</h4>
<p>Stanは, 内部用に多くの文字列を予約しており, 同じ名前の変数を使うことはできません. 内部用の文字列と同じ名前を変数につけようとすると, <code>stanc</code>トランスレーターはエラーメッセージを出して止まり, 使われようとした予約名と, モデルコード中の位置を示します.</p>
<h5 id="モデルの名前">モデルの名前</h5>
<p>モデルの名前を, そのモデル内で変数に使うことはできません. これは普通は問題にはなりません. デフォルトでは<code>bin/stanc</code>が, モデル指定を含むファイルの名前の後に<code>__model</code>を加えるからです. 例えば, モデルが<code>foo.stan</code>というファイルにあるとき, <code>bin/stanc</code>によるデフォルトのモデル名を使うなら, <code>foo_model</code>という名前の変数は使えません. ユーザーがモデルの名前を指定するときは, 変数はモデルの名前と同じにはできません.</p>
<h5 id="ユーザー定義関数の名前">ユーザー定義関数の名前</h5>
<p>ユーザー定義関数の名前をモデル中の変数に使うことはできません.</p>
<h5 id="stan言語由来の予約語">Stan言語由来の予約語</h5>
<p>以下のリストは, Stanのプログラミング言語に予約されているワードです. Stanではまだ実装されていないものもありますが, これらトークンは将来の使用のために予約されています.</p>
<pre><code>for, in, while, repeat, until, if, then, else, true, false</code></pre>
<p>変数には, 型と同じ名前もつけてはいけません. したがって, 以下のいずれも使えません.</p>
<pre><code>int, real, vector, simplex, unit_vector, ordered,
positive_ordered, row_vector, matrix, cholesky_factor_corr,
cholesky_factor_cov, corr_matrix, cov_matrix.</code></pre>
<p>変数名は, 以下のブロック識別子と衝突は<strong>しません</strong>.</p>
<pre><code>functions, model, data, parameters, quantities, transformed,
generated</code></pre>
<h5 id="stanの実装による予約語">Stanの実装による予約語</h5>
<p>StanのC++実装で使われているために予約されている変数名もあります.</p>
<pre><code>var, fvar, STAN_MAJOR, STAN_MINOR, STAN_PATCH, STAN_MATH_MAJOR,
STAN_MATH_MINOR, STAN_MATH_PATCH</code></pre>
<h5 id="予約されている関数名と分布名">予約されている関数名と分布名</h5>
<p>あらかじめ定義されている関数の名前と変数名とは衝突します. 定数とは衝突しません. したがって, 変数に<code>logit</code>や<code>add</code>という名前を付けることができませんが, <code>pi</code>や<code>e</code>という名前を付けることはできます.</p>
<p>変数名はまた, <code>_lpdf</code>, <code>_lpmf</code>, <code>_lcdf</code>, <code>_lccdf</code>, <code>_cdf</code>, <code>_ccdf</code>という接尾辞の分布名, たとえば<code>normal_lcdf</code>(訳注: 原文の<code>normal_lcdf_log</code>は誤り)とも衝突します. これは, 非推奨となった<code>_log</code>, <code>_cdf</code>, <code>_cdf_log</code>, <code>_ccdf_log</code>についても同様です.</p>
<p>こうした変数名のいずれかを使うと, <code>stanc</code>トランスレーターは停止し, 衝突を起こした変数の名前と位置を報告することになります.</p>
<h5 id="c由来の予約語">C++由来の予約語</h5>
<p>最後に, モデル名を含む変数名は, C++のキーワードのいずれとも衝突してはいけません.</p>
<pre><code>alignas, alignof, and, and_eq, asm, auto, bitand, bitor, bool,
break, case, catch, char, char16_t, char32_t, class, compl,
const, constexpr, const_cast, continue, decltype, default, delete,
do, double, dynamic_cast, else, enum, explicit, export, extern,
false, float, for, friend, goto, if, inline, int, long, mutable,
namespace, new, noexcept, not, not_eq, nullptr, operator, or, or_eq,
private, protected, public, register, reinterpret_cast, return,
short, signed, sizeof, static, static_assert, static_cast, struct,
switch, template, this, thread_local, throw, true, try, typedef,
typeid, typename, union, unsigned, using, virtual, void, volatile,
wchar_t, while, xor, xor_eq</code></pre>
<h4 id="使用可能な文字">使用可能な文字</h4>
<p>変数に使用可能な文字は, 0--127の範囲のASCIIコードポイントのもので, これはユニコードでも同じです.</p>
<table>
<thead>
<tr class="header">
<th style="text-align: center;">文字</th>
<th style="text-align: center;">ASCII(ユニコード)コードポイント</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="text-align: center;">a -- z</td>
<td style="text-align: center;">97 -- 122</td>
</tr>
<tr class="even">
<td style="text-align: center;">A -- Z</td>
<td style="text-align: center;">65 -- 90</td>
</tr>
<tr class="odd">
<td style="text-align: center;">0 -- 9</td>
<td style="text-align: center;">48 -- 57</td>
</tr>
<tr class="even">
<td style="text-align: center;">_</td>
<td style="text-align: center;">95</td>
</tr>
</tbody>
</table>
<p>もっとも表現力豊かな文字セットとは言えませんが, ASCIIはもっとも広く利用可能で, 不適切な文字エンコーディングやデコーディングをされてももっとも文字化けしにくいのです.</p>
<h5 id="コメントではascii互換のエンコーディングを使用可能">コメントではASCII互換のエンコーディングを使用可能</h5>
<p>コメント内では, ASCIIと互換性のある文字エンコーディングを使用することができます. これには, ASCII自身やUTF-8, Latin1が含まれます. そのような文字を正しく表示できるかは, ユーザーのシェルやエディターに依存します.</p>
<h3 id="配列式">4.3. 配列式</h3>
<p>式の列を波括弧で囲むと, 配列式となります. 例えば, <code>{ 1, 10, 100 }</code>という式は, 1, 10, 100という3つの要素からなる整数配列を表します. この文法は, 以下のように, 小さな配列を1行で定義するのにとくに便利です.</p>
<pre><code>int a[3] = { 1, 10, 100 };</code></pre>
<p>値は, 複合式でも構いません. つまり, <code>{ 2 * 3, 1 + 4}</code>と書いても正しい式です. また, 以下の例のように, 2次元配列を直接書くこともできます.</p>
<pre><code>int b[2, 3] = { { 1, 2, 3 }, { 4, 5, 6 } };</code></pre>
<p>このとき, <code>b[1]</code>は<code>{ 1, 2, 3 }</code>で, <code>b[2]</code>は<code>{ 4, 5, 6 }</code>です.</p>
<p>Stanでは, ホワイトスペースはどれも同じ扱いですから, 上の例は, 以下のように並べる方が, 行と列の構造で2次元配列になっていることをよりはっきりさせることができます.</p>
<pre><code>int b[2, 3] = { { 1, 2, 3 },
{ 4, 5, 6 } };</code></pre>
<h4 id="配列式の型">配列式の型</h4>
<p>式の型がどんなものであっても, 括弧で囲めば配列式となります. もっとも単純な場合では, 要素のすべてが同じ型で, その型の要素からなる配列が結果となるというものでしょう. 例えば, 配列の要素がベクトルのこともあります. その場合, 結果はベクトルの配列となります.</p>
<pre><code>vector[3] b;
vector[3] c;
...
vector[3] d[2] = { b, c };</code></pre>
<p>また要素には, <code>int</code>型と<code>real</code>型の式が混ざっていても構いません. この場合, 結果は実数値の配列となります.</p>
<pre><code>real b[2] = { 1, 1.9 };</code></pre>
<h4 id="値の制限">値の制限</h4>
<p>配列式は使い方にいくつか制限があります. これは, 型がボトムアップで計算されることと, Stanの基本データ型および代入規則から生じます.</p>
<h5 id="配列式は矩形型だけ">配列式は矩形型だけ</h5>
<p>不ぞろいな配列式を定義したくなることもありますが, Stanのデータ型はすべて矩形(あるいは直方体や, それを高次に一般化したもの)です. したがって, 以下のようなネストした配列式は, 矩形ではない配列をつくろうとしたところでエラーとなります.</p>
<pre><code>{ { 1, 2, 3 }, { 4, 5 } } // コンパイル時エラー: サイズのミスマッチ</code></pre>
<p>これは, 1次元の整数配列(<code>int[ ]</code>)2個からなる2次元の整数配列(<code>int[ , ]</code>)をつくるものなので, 大丈夫に見えるかもしれません. しかし, 2個の1次元配列が同じサイズではないので, 許されません. 要素が配列式のときは, これはコンパイル時に検査されます. 一方あるいは両方の式が変数のときは, 実行時までエラーにならないでしょう.</p>
<pre><code>{ { 1, 2, 3 }, m } // mのサイズが3でなければ実行時エラー</code></pre>
<h5 id="空の配列式はありません">空の配列式はありません</h5>
<p>結果の型を推測する方法がないことから, 空の配列式(<code>{ }</code>)は許されません. これは表現力を犠牲にするものではありません. なぜなら, 要素数がゼロの配列として初期化するように宣言すれば十分だからです.</p>
<pre><code>int a[0]; // aは要素数がゼロの配列として完全に定義されます</code></pre>
<h5 id="整数のみの配列式">整数のみの配列式</h5>
<p>配列式の要素が, <code>{ 1, 2, 3 }</code>のように整数のみであれば, 結果の型は整数配列<code>int[]</code>となります. これは, 以下のように書くのは<strong>正しくない</strong>ことを意味します.</p>
<pre><code>real a[2] = { -3, 12 }; // エラー: int[]はreal[]に代入できません</code></pre>
<p>整数配列は実数値に代入できません. しかし, 実数リテラルの式を使えば, この問題は簡単に回避できます.</p>
<pre><code>real a[2] = { -3.0, 12.0 };</code></pre>
<p>これで型が合い, 代入できるようになります.</p>
<h3 id="グルーピングのための括弧">4.4. グルーピングのための括弧</h3>
<p>式を括弧で囲んだものもすべて式です. C++と同様に, しかしRとは異なり, 丸括弧<code>(</code>および<code>)</code>が使用可能です. 角括弧<code>[</code>および<code>]</code>は, 配列のインデックス操作に予約されており, 波括弧<code>{</code>および<code>}</code>は, 文のグルーピングに予約されています.</p>
<p>括弧を使うと, 部分式と演算子を明示的にグルーピングできます. 括弧なしの場合, 式<code>1 + 2 * 3</code>は, 部分式<code>2 * 3</code>を持ち, <code>7</code>と評価されます. 括弧を使った場合, 式<code>1 + (2 * 3)</code>というふうに明示的にグルーピングできます. もっと大事なことは, 式<code>(1 + 2) * 3</code>は, <code>1 + 2</code>を部分式として<code>9</code>と評価されるということです.</p>
<h3 id="算術および行列の式">4.5. 算術および行列の式</h3>
<p>整数値と実数値の式に対しStanでは, 加算(<code>+</code>), 減算(<code>-</code>), 乗算(<code>*</code>), 除算(<code>/</code>)の基本2項算術演算子を普通に使うことができます.</p>
<p>整数式に関してはStanには剰余(<code>%</code>)の2項算術演算子があります. Stanにはまた, 整数値と実数値の式に対する負の単項演算子があります. 例えば, <code>n</code>と<code>m</code>を整数の変数とし, <code>x</code>と<code>y</code>を実数の変数とするとき, 以下は正しい式です.</p>
<pre><code>3.0 + 0.14, -15, 2 * 3 + 1, (x - y) / 2.0,
(n * (n + 1)) / 2, x / n, m % n</code></pre>
<p>符号反転・加算・減算・乗算の演算子は, 行列およびベクトル・行ベクトルにも拡張されています. アポストロフィ(<code>'</code>)として書かれる転値演算子もベクトル・行ベクトル・行列に使用可能です. 行列演算の戻り値の型は, 結果を格納できることが静的に保証できるもっとも小さな型となります. 許容される入力の型と対応する戻り値の型の組み合わせについての詳細は, 41章にすべて挙げてあります.</p>
<p>例えば, <code>y</code>と<code>mu</code>が<code>vector</code>型の変数で, <code>Sigma</code>が<code>matrix</code>型の変数のとき, 以下の式は, 整形式の<code>real</code>型の式です.</p>
<pre><code>(y - mu)’ * Sigma * (y - mu)</code></pre>
<p>式全体の型は, 部分式から外側へ向かって推測されます. 部分式<code>y - mu</code>は, 変数<code>y</code>と<code>mu</code>が<code>vector</code>型の式なので<code>vector</code>型です. この式を転値した部分式<code>(y - mu)'</code>は<code>row_vector</code>型です. 乗算は左から結合し, 転値は乗算よりも優先順位が高いので, 上の式は, 以下の指定を完全に行った整形式のものと同じです.</p>
<pre><code>(((y - mu)’) * Sigma) * (y - mu)</code></pre>
<p>部分式<code>(y - mu)' * Sigma</code>の型は<code>row_vector</code>と推測されます. 行ベクトルに行列を掛けた結果だからです. したがって, この式全体の型は, 行ベクトルに(列)ベクトルを掛けた型, つまり<code>real</code>型となります.</p>
<p>Stanには, 行列の要素ごとの乗算および除算演算子, <code>a .* b</code>および<code>a ./ b</code>があります. ループを置き換えて簡略化できますが, 効率性の面では, ループ内で要素ごとに計算して代入するようプログラミングしたものと本質的には変わりません. 例えば, 以下のように宣言して,</p>
<pre><code>vector[N] a;
vector[N] b;
vector[N] c;</code></pre>
<p>このように代入するのと,</p>
<pre><code>c = a .* b;</code></pre>
<p>ループとでは同じ結果となり, 効率もほぼ同じです.</p>
<pre><code>for (n in 1:N)
c[n] = a[n] * b[n];</code></pre>
<p>Stanでは, 整数と実数値の式の累乗(<code>^</code>)を使えます. 累乗の戻り値の型は常に実数値です. たとえば, <code>n</code>と<code>m</code>が整数の変数で, <code>x</code>と<code>y</code>が実数の変数とすると, 以下は正しい式です.</p>
<pre><code>3^2, 3.0^-2, 3.0^0.14,
x^n, n^x, n^m, x^y</code></pre>
<p>累乗は右から結合します. ですから, 下の式は,</p>
<pre><code>2 ^ 3 ^ 4</code></pre>
<p>以下の, 指定を完全に行った整形式と同じものです.</p>
<pre><code>2 ^ (3 ^ 4)</code></pre>
<h4 id="演算の優先順位と結合性">演算の優先順位と結合性</h4>
<p>演算子の優先順位と結合性は, 配列のインデックス操作や関数の適用といった組込みの文法と合わせて図4.1に表形式で示しました. その他の式形式の演算(関数の適用と添え字の指定)はどの算術演算よりも強く結合します.</p>
<p>優先順位と結合性は, 式がどのように解釈されるかを決定します. 加算は左結合ですから, 式<code>a+b+c</code>は<code>(a+b)+c</code>と解釈されます. 同様に, <code>a/b*c</code>は<code>(a/b)*c</code>と解釈されます.</p>
<p>乗算は加算よりも優先順位が高いので, 式<code>a*b+c</code>は<code>(a*b)+c</code>と解釈されますし, 式<code>a+b*c</code>は<code>a+(b*c)</code>と解釈されます. 同様に, <code>2*x+3*-y</code>は<code>(2*x)+(3*(-y))</code>と解釈されます.</p>
<p>転値と累乗は, ほかの算術あるいは論理演算よりも強く結合します. ベクトルと行ベクトル・行列に関しては, <code>-u'</code>は<code>-(u')</code>と, <code>u*v'</code>は<code>u*(v')</code>と, <code>u'*v</code>は<code>(u')*v</code>と解釈されます. 整数と実数に関しては, <code>-n ^ 3</code>は<code>-(n ^ 3)</code>と解釈されます.</p>
<table>
<thead>
<tr class="header">
<th style="text-align: center;">演算子</th>
<th style="text-align: center;">優先</th>
<th style="text-align: center;">結合</th>
<th style="text-align: left;">位置</th>
<th style="text-align: left;">説明</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="text-align: center;"><code>? :</code></td>
<td style="text-align: center;">10</td>
<td style="text-align: center;">右</td>
<td style="text-align: left;">3項間に入る</td>
<td style="text-align: left;">条件</td>
</tr>
<tr class="even">
<td style="text-align: center;"><code>\|\|</code></td>
<td style="text-align: center;">9</td>
<td style="text-align: center;">左</td>
<td style="text-align: left;">2項間に入る</td>
<td style="text-align: left;">論理和</td>
</tr>
<tr class="odd">
<td style="text-align: center;"><code>&&</code></td>
<td style="text-align: center;">8</td>
<td style="text-align: center;">左</td>
<td style="text-align: left;">2項間に入る</td>
<td style="text-align: left;">論理積</td>
</tr>
<tr class="even">
<td style="text-align: center;"><code>==</code></td>
<td style="text-align: center;">7</td>
<td style="text-align: center;">左</td>
<td style="text-align: left;">2項間に入る</td>
<td style="text-align: left;">等しい</td>
</tr>
<tr class="odd">
<td style="text-align: center;"><code>!=</code></td>
<td style="text-align: center;">7</td>
<td style="text-align: center;">左</td>
<td style="text-align: left;">2項間に入る</td>
<td style="text-align: left;">等しくない</td>
</tr>
<tr class="even">
<td style="text-align: center;"><code><</code></td>
<td style="text-align: center;">6</td>
<td style="text-align: center;">左</td>
<td style="text-align: left;">2項間に入る</td>
<td style="text-align: left;">より小さい</td>
</tr>
<tr class="odd">
<td style="text-align: center;"><code><=</code></td>
<td style="text-align: center;">6</td>
<td style="text-align: center;">左</td>
<td style="text-align: left;">2項間に入る</td>
<td style="text-align: left;">より小さいか等しい</td>
</tr>
<tr class="even">
<td style="text-align: center;"><code>></code></td>
<td style="text-align: center;">6</td>
<td style="text-align: center;">左</td>
<td style="text-align: left;">2項間に入る</td>
<td style="text-align: left;">より大きい</td>
</tr>
<tr class="odd">
<td style="text-align: center;"><code>>=</code></td>
<td style="text-align: center;">6</td>
<td style="text-align: center;">左</td>
<td style="text-align: left;">2項間に入る</td>
<td style="text-align: left;">より大きいか等しい</td>
</tr>
<tr class="even">
<td style="text-align: center;"><code>+</code></td>
<td style="text-align: center;">5</td>
<td style="text-align: center;">左</td>
<td style="text-align: left;">2項間に入る</td>
<td style="text-align: left;">加算</td>
</tr>
<tr class="odd">
<td style="text-align: center;"><code>-</code></td>
<td style="text-align: center;">5</td>
<td style="text-align: center;">左</td>
<td style="text-align: left;">2項間に入る</td>
<td style="text-align: left;">減算</td>
</tr>
<tr class="even">
<td style="text-align: center;"><code>*</code></td>
<td style="text-align: center;">4</td>
<td style="text-align: center;">左</td>
<td style="text-align: left;">2項間に入る</td>
<td style="text-align: left;">乗算</td>
</tr>
<tr class="odd">
<td style="text-align: center;"><code>/</code></td>
<td style="text-align: center;">4</td>
<td style="text-align: center;">左</td>
<td style="text-align: left;">2項間に入る</td>
<td style="text-align: left;">(右)除算</td>
</tr>
<tr class="even">
<td style="text-align: center;"><code>%</code></td>
<td style="text-align: center;">4</td>
<td style="text-align: center;">左</td>
<td style="text-align: left;">2項間に入る</td>
<td style="text-align: left;">剰余</td>
</tr>
<tr class="odd">
<td style="text-align: center;"><code>\\</code></td>
<td style="text-align: center;">3</td>
<td style="text-align: center;">左</td>
<td style="text-align: left;">2項間に入る</td>
<td style="text-align: left;">左除算</td>
</tr>
<tr class="even">
<td style="text-align: center;"><code>.*</code></td>
<td style="text-align: center;">2</td>
<td style="text-align: center;">左</td>
<td style="text-align: left;">2項間に入る</td>
<td style="text-align: left;">要素ごとの乗算</td>
</tr>
<tr class="odd">
<td style="text-align: center;"><code>./</code></td>
<td style="text-align: center;">2</td>
<td style="text-align: center;">左</td>
<td style="text-align: left;">2項間に入る</td>
<td style="text-align: left;">要素ごとの除算</td>
</tr>
<tr class="even">
<td style="text-align: center;"><code>!</code></td>
<td style="text-align: center;">1</td>
<td style="text-align: center;">n/a</td>
<td style="text-align: left;">単項接頭</td>
<td style="text-align: left;">論理否定</td>
</tr>
<tr class="odd">
<td style="text-align: center;"><code>-</code></td>
<td style="text-align: center;">1</td>
<td style="text-align: center;">n/a</td>
<td style="text-align: left;">単項接頭</td>
<td style="text-align: left;">負</td>
</tr>
<tr class="even">
<td style="text-align: center;"><code>+</code></td>
<td style="text-align: center;">1</td>
<td style="text-align: center;">n/a</td>
<td style="text-align: left;">単項接頭</td>
<td style="text-align: left;">正(Stanでは演算しない)</td>
</tr>
<tr class="odd">
<td style="text-align: center;"><code>^</code></td>
<td style="text-align: center;">0.5</td>
<td style="text-align: center;">右</td>
<td style="text-align: left;">2項間に入る</td>
<td style="text-align: left;">累乗</td>
</tr>
<tr class="even">
<td style="text-align: center;"><code>'</code></td>
<td style="text-align: center;">0</td>
<td style="text-align: center;">n/a</td>
<td style="text-align: left;">単項接尾</td>
<td style="text-align: left;">転値</td>
</tr>
<tr class="odd">
<td style="text-align: center;"><code>()</code></td>
<td style="text-align: center;">0</td>
<td style="text-align: center;">n/a</td>
<td style="text-align: left;">接頭,前後</td>
<td style="text-align: left;">関数の適用</td>
</tr>
<tr class="even">
<td style="text-align: center;"><code>[]</code></td>
<td style="text-align: center;">0</td>
<td style="text-align: center;">左</td>
<td style="text-align: left;">接頭,前後</td>
<td style="text-align: left;">配列・行列のインデックス操作</td>
</tr>
</tbody>
</table>
<p>図4.1: Stanの単項・2項・3項演算子における, 優先順位, 結合性, 式中の位置と説明. 最後の2行は関数適用と, 配列・行列・ベクトルのインデックス操作です. 演算子は, 優先順位にしたがって載せており, 上の方がより弱く, 下の方がより強く結合します. 正しい引数と, 対応する戻り値の組み合わせ全体は, 第7部の関数の説明のうち, <code>operator</code>が前にあるものを見てください(たとえば<code>operator*(int, int):int</code>は, 乗算演算子を2つの整数に適用し, 整数を返すことを示しています). 括弧は, 優先順位と結合性に依存せず, 明示的に式をグルーピングするのにも使われます.</p>
<h3 id="条件演算子">4.6. 条件演算子</h3>
<h4 id="条件演算子の文法">条件演算子の文法</h4>
<p>3項条件演算子は, 3つの引数をとるところと, 複合構文をつかうというところで独特です. <code>a</code>が<code>int</code>型の式で, <code>b</code>と<code>c</code>が互いに変換できる(すなわち<code>==</code>で比較できる)式のとき,</p>
<pre><code>a ? b : c</code></pre>
<p>上の式は<code>b</code>と<code>c</code>とで昇格した型の式になります. Stanで認められている昇格は, 整数から実数のみです. 一方が<code>int</code>型で他方が<code>real</code>型のとき, 条件式は全体として<code>real</code>型になります. その他の場合はすべて, これら引数は同じStanの基本型である必要があり(この際重要なのは, 制約ではなく形式です), 条件式はその型となります.</p>
<h5 id="条件演算子の優先順位">条件演算子の優先順位</h5>
<p>条件演算子はもっとも優先順位が低い演算子です. そのため, あいまいさを避けるために引数に括弧を使う必要があることは稀です. 例えば,</p>
<pre><code>a > 0 || b < 0 ? c + d : e - f</code></pre>
<p>は, 明示的にグルーピングした以下の式と等価です.</p>
<pre><code>(a > 0 || b < 0) ? (c + d) : (e - f)</code></pre>
<p>括弧は厳密には必要ないとしても, 後者の方が読みやすいでしょう.</p>
<h5 id="条件演算子の結合性">条件演算子の結合性</h5>
<p>条件演算子は右から結合します. つまり,</p>
<pre><code>a ? b : c ? d : e</code></pre>
<p>は, 明示的にグルーピングすると以下のようになります.</p>
<pre><code>a ? b : (c ? d : e)</code></pre>
<p>前と同じく, 明示的にグルーピングした方が読みやすいでしょう.</p>
<h4 id="条件演算子の意味">条件演算子の意味</h4>
<p>Stanの条件演算子は, C++にあるものとほとんど同様に動作します. 最初の引数は, 整数となる式でなくてはなりません. 普通ここは, 上の例の<code>a</code>のように変数または関係演算子です. 次に2つの結果の引数があり, 1番目は条件が真(すなわち非零)の場合, 2番目は条件が偽(すなわち零)の場合のものです. 上の例では, 条件が非零値と評価されれば<code>b</code>の値が返され, 条件が例と評価されれば<code>c</code>が返されます.</p>
<h5 id="結果の遅延評価">結果の遅延評価</h5>
<p>なぜ高性能計算で条件演算子がとても有用かというと, 戻り値となる部分式のみが評価され, そうでない式は評価されないという特性が鍵です. 言い換えると, 通常の関数とは違って, 関数に値を渡すために引数の式を残らず評価するということをしません. とくに, 組込みの<code>if_else</code>関数よりも条件演算子の方がかなり高速になります. <code>if_else</code>関数はほかの関数と同様, 呼び出されたときに3つの引数をすべて評価するのです. ほかの例と同じく, この節約のほとんどは, 基本的な関数評価そのものではなく, 導関数を計算しないことによります.</p>
<h5 id="パラメータへの昇格">パラメータへの昇格</h5>
<p>一方の戻り値の式がデータ値(定数と, <code>data</code>あるいは<code>transformed data</code>ブロックで定義される変数のみからなる式)であり, 他方がそうではない場合, 3項演算子は, データ値をパラメータ値に昇格させます. これにより, 必要のない導関数の計算が起こる場合があり, 完全な<code>if</code>-<code>then</code>条件文より効率的でなくなることがあります. 以下はその例です.</p>
<pre><code>data {
real x[10];
...
parameters {
real z[10];
...
model {
y ~ normal(cond ? x : z, sigma);
...</code></pre>
<p>上のコードはより効率的に(より明快ではなくとも)下のように書けます.</p>
<pre><code>if (cond)
y ~ normal(x, sigma);
else
y ~ normal(z, sigma);</code></pre>
<p>条件文は, 条件演算子と同様, 結果の文のひとつしか評価しません. この場合, 変数<code>x</code>はパラメータには昇格せず, そのため, 導関数の計算の間に連鎖律を伝播するとき, 不要な計算はまったく行なわれません.</p>
<h3 id="インデックス操作">4.7. インデックス操作</h3>
<p>Stanの配列・行列・ベクトルと行ベクトルはすべて, 配列と同様の記法でアクセスします. 例えば, <code>x</code>が<code>real[]</code>型(1次元の実数配列)なら, <code>x[1]</code>はその配列の1番目の要素の値です.</p>
<p>添え字は, ほかの算術演算子より高い優先順位にあります. 例えば, <code>alpha*x[1]</code>は<code>alpha*(x[1])</code>と等価です.</p>
<p>複数の添え字は, 1対の角括弧内の中で使用できます. <code>x</code>が, <code>real[ , ]</code>型, つまり2次元配列なら, x[2,501]は<code>real</code>型です.</p>
<h4 id="部分配列へのアクセス">部分配列へのアクセス</h4>
<p>添え字演算子は配列の部分配列も返します. 例えば, <code>x</code>が<code>real[ , , ]</code>型のとき, <code>x[2]</code>は<code>real[ , ]</code>型で, <code>x[2,3]</code>は<code>real[]</code>型です. 結果として, 式<code>x[2,3]</code>は<code>x[2][3]</code>と同じ意味になります.</p>
<h4 id="行列の行へのアクセス">行列の行へのアクセス</h4>
<p><code>Sigma</code>が<code>matrix</code>型の変数のとき, <code>Sigma[1]</code>は<code>Sigma</code>の1番目の行を指し, <code>row_vector</code>型になります</p>
<h4 id="配列とベクトル行列のインデックスを混ぜる">配列とベクトル/行列のインデックスを混ぜる</h4>
<p>Stanでは, 配列と, そのベクトル・行ベクトル・行列の値のインデックス操作とを混ぜることができます. 例えば, <code>m</code>が<code>matrix[ , ]</code>型, つまり行列の2次元配列のとき, <code>m[1]</code>はこの配列の1番目の行を示し, その型は行列の1次元配列となります. 2つ以上のインデックスも使うことができます. <code>m[1,2]</code>は<code>matrix</code>型で, この配列の1番目の行と2番目の列にある行列を示します. インデックスをさらに増やすと, <code>m[1,2,3]</code>は<code>row_vector</code>型で, <code>m[1,2]</code>が指す行列の3行目を示します. 最後に, <code>m[1,2,3,4]</code>は<code>real</code>型で, 配列<code>m</code>の1行2列にある行列の3行4列の値を示します.</p>
<h3 id="複数インデックス操作と範囲インデックス操作">4.8. 複数インデックス操作と範囲インデックス操作</h3>
<p>4.7節で述べた整数の単一インデックスに加え, Stanでは複数インデックス操作が使えます. 複数インデックスには, インデックスの整数配列や, 下限, 上限, 上下限, あるいはインデックス全体を簡略化したものがあります. インデックスの種別を全部しめした表は図4.2になります.</p>
<table>
<thead>
<tr class="header">
<th style="text-align: center;">インデックス型</th>
<th style="text-align: center;">例</th>
<th style="text-align: center;">値</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="text-align: center;">整数</td>
<td style="text-align: center;"><code>a[11]</code></td>
<td style="text-align: center;">11番目のインデックスの値</td>
</tr>
<tr class="even">
<td style="text-align: center;">整数配列</td>
<td style="text-align: center;"><code>a[ii]</code></td>
<td style="text-align: center;"><code>a[ii[1]], ..., a[ii[K]]</code></td>
</tr>
<tr class="odd">
<td style="text-align: center;">下限</td>
<td style="text-align: center;"><code>a[3:]</code></td>
<td style="text-align: center;"><code>a[3], ..., a[N]</code></td>
</tr>
<tr class="even">
<td style="text-align: center;">上限</td>
<td style="text-align: center;"><code>a[:5]</code></td>
<td style="text-align: center;"><code>a[1], ..., a[5]</code></td>
</tr>
<tr class="odd">
<td style="text-align: center;">範囲</td>
<td style="text-align: center;"><code>a[2:7]</code></td>
<td style="text-align: center;"><code>a[2], ..., a[7]</code></td>
</tr>
<tr class="even">
<td style="text-align: center;">全体</td>
<td style="text-align: center;"><code>a[:]</code></td>
<td style="text-align: center;"><code>a[1], ..., a[N]</code></td>
</tr>
<tr class="odd">
<td style="text-align: center;">全体</td>
<td style="text-align: center;"><code>a[]</code></td>
<td style="text-align: center;"><code>a[1], ..., a[N]</code></td>
</tr>
</tbody>
</table>
<p>図4.2: インデックスの型および, サイズ<code>N</code>の1次元コンテナと, サイズ<code>K</code>の<code>int[]</code>型整数配列<code>ii</code>の場合の例</p>
<h4 id="複数インデックス操作の意味">複数インデックス操作の意味</h4>
<p>複数インデックス操作を扱う場合の意味について, その基本則は次の通りです. <code>idxs</code>が複数インデックスの場合, 結果にはインデックス操作が可能な位置が生成されます. つまり, 結果のインデックス位置を評価する際, まず複数インデックスに添え字が渡され, その結果得られるインデックスが使われることになります.</p>
<pre><code>a[idxs, ...][i, ...] = a[idxs[i], ...][...]</code></pre>
<p>一方, <code>idx</code>が単一インデックスとのときには, 出力の次元が削減されます.</p>
<pre><code>a[idx, ...] = a[idx][...]</code></pre>
<p>問題となるのは, 行列とベクトルのときどうなるかだけです. ベクトルは配列とまったく同様です. 行に複数インデックスにつけ, 列にも複数インデックスをつけた行列は, 行列になります. 行に複数インデックスをつけ, 列に単一インデックスをつけた行列は, (列)ベクトルになります. 行に単一インデックスをつけ, 列に複数インデックスをつけた行列は, 行ベクトルになります. これらの型は図4.3にまとめてあります.</p>
<table>
<thead>
<tr class="header">
<th style="text-align: center;">式</th>
<th style="text-align: center;">行インデックス</th>
<th style="text-align: center;">列インデックス</th>
<th style="text-align: center;">結果の型</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="text-align: center;">a[i]</td>
<td style="text-align: center;">単一</td>
<td style="text-align: center;">n/a</td>
<td style="text-align: center;">行ベクトル</td>
</tr>
<tr class="even">
<td style="text-align: center;">a[is]</td>
<td style="text-align: center;">複数</td>
<td style="text-align: center;">n/a</td>
<td style="text-align: center;">行列</td>
</tr>
<tr class="odd">
<td style="text-align: center;">a[i, j]</td>
<td style="text-align: center;">単一</td>
<td style="text-align: center;">単一</td>
<td style="text-align: center;">実数</td>
</tr>
<tr class="even">
<td style="text-align: center;">a[i, js]</td>
<td style="text-align: center;">単一</td>
<td style="text-align: center;">複数</td>
<td style="text-align: center;">行ベクトル</td>
</tr>
<tr class="odd">
<td style="text-align: center;">a[is, j]</td>
<td style="text-align: center;">複数</td>
<td style="text-align: center;">単一</td>
<td style="text-align: center;">ベクトル</td>
</tr>
<tr class="even">
<td style="text-align: center;">a[is, js]</td>
<td style="text-align: center;">複数</td>
<td style="text-align: center;">複数</td>
<td style="text-align: center;">行列</td>
</tr>
</tbody>
</table>
<p>図4.3: 引数が単一か複数かによって行列の次元が削減される特別な規則. この例では, <code>a</code>が行列, <code>i</code>と<code>j</code>が整数の単一インデックス, <code>is</code>と<code>js</code>が整数配列の複数インデックス. 同じ型の規則がすべての複数インデックスに適用されます.</p>
<p>複数インデックスをつけた行列の評価は, 以下の分配条件にしたがって定義されます.</p>
<pre><code>m[idxs1, idxs2][i, j] = m[idxs1[i], idxs2[j]]
m[idxs, idx][j] = m[idxs[j], idx]
m[idx, idxs][j] = m[idx, idxs[j]]</code></pre>
<p>行列の配列およびベクトル・行ベクトルの配列の評価は, 配列の次元からはじまり, 再帰的に定義されます.</p>
<h3 id="関数適用">4.9. 関数適用</h3>
<p>Stanには, 幅広い種類の数学および統計関数が組み込まれており, それについては第7部で説明しています.</p>
<p>Stanの式には, 関数名と, その後に続く0個以上の引数の式からなっているものもあります. 例えば, <code>log(2.0)</code>は<code>real</code>型の式で, 実数リテラル<code>2.0</code>の値を自然対数に適用した結果を示しています.</p>
<p>文法的には, 関数適用はほかのどの演算子よりも高い優先順位を持ちますから, <code>y + log(x)</code>は<code>y + (log(x))</code>と解釈されます.</p>
<h4 id="型のシグネチャと結果の型の推測">型のシグネチャと結果の型の推測</h4>
<p>関数はおのおの, 引数と戻り値にとりうる型を決めている型のシグネチャがあります. 例えば, 対数関数のシグネチャは以下のように表されます.</p>
<pre><code>real log(real);</code></pre>
<p><code>lmultiply</code>関数のシグネチャは以下です.</p>
<pre><code>real lmultiply(real,real);</code></pre>
<p>関数は, その名前と, 引数の型の並びとによって, ただひとつに決定されます. たとえば, 以下の2つの関数は別々の関数です.</p>
<pre><code>real mean(real[]);
real mean(vector);</code></pre>
<p>1番目は, 実数値の1次元配列に適用され, 2番目はベクトルに適用されます.</p>
<p>関数の同一性条件により, 同じ名前と引数の型を持ちながら戻り値の型が異なる2つの関数をつくることは明示的に禁止されています. この制限により, 関数の式の型を構成から推測するのに, その部分式の型を調べればよくなってもいます.</p>
<h4 id="定数">定数</h4>
<p>Stanの定数は, 引数なしの関数に過ぎません. 例えば, 数学定数<span class="math inline">\(\pi\)</span>と<span class="math inline">\(e\)</span>は引数なし関数<code>pi()</code>と<code>e()</code>です. 組込み定数の一覧は39.2節を参照してください.</p>
<h4 id="型の昇格と関数の多重定義の解決">型の昇格と関数の多重定義の解決</h4>
<p>整数型は実数型に昇格するので, 一連の引数の型が与えられた場合, どの関数が呼ばれるのか, 規則を決めておく必要があります. Stanで採用されているのは, C++で使われているものと同じやり方です. すなわち, 必要とする型の昇格の数を最小にする関数を呼び出すように解決しています.</p>
<p>例えば, 以下の2つの関数シグネチャが<code>foo</code>に登録されているとします.</p>
<pre><code>real foo(real,real);
int foo(int,int);</code></pre>
<p>式<code>foo(1.0,1.0)</code>で<code>foo</code>を使うと, <code>foo(real,real)</code>と解決されます. したがって, 式<code>foo(1.0,1.0)</code>自体には<code>real</code>型が割り当てられます.</p>
<p>整数は実数に昇格することがありますから, 式<code>foo(1,1)</code>は潜在的には<code>foo(real,real)</code>と<code>foo(int,int)</code>のいずれにも当てはまります. 前者では型の昇格が2回必要ですが, 後者ではその必要がありません. したがって, <code>foo(1,1)</code>は関数<code>foo(int,int)</code>と解決され, <code>int</code>型が割り当てられます.</p>
<p>式<code>foo(1,1,0)</code>は引数の型が<code>(int,real)</code>なので, 明示的にはどの関数シグネチャにも当てはまりません. 整数式<code>1</code>が<code>real</code>型に昇格することにより, <code>foo(real,real)</code>に当てはめることができ, したがって関数式<code>foo(1,1.0)</code>の型は<code>real</code>です.</p>
<p>(Stanの組込み関数にはありませんが)式からはどの関数が参照されるのか多義的で決められないという状況もありえます. 例えば, 以下のシグネチャをもつ, まさに2つの関数があるという場合を考えましょう.</p>
<pre><code>real bar(real,int);
real bar(int,real);</code></pre>
<p>シグネチャからは, 式<code>bar(1.0,1)</code>と<code>bar(1,1.0)</code>は, それぞれ上の関数の1番目と2番目と解決されます. 実数値は整数に降格できませんから, 式<code>bar(1.0,1.0)</code>は誤りです. 式<code>bar(1,1)</code>は別の理由で誤りです. 1番目の引数が実数値に昇格すれば, 1番目のシグネチャに当てはまりますが, 2番目の引数が実数値に昇格すれば, 2番目のシグネチャに当てはまります. 問題は, 両方とも1回の昇格を必要とするということにあり, したがって関数<code>bar</code>は多義的となります. 上の<code>bar(1, 1)</code>のように二つを超える解釈が存在する場合, ほかの関数よりもより少ない回数の昇格を必要とする関数がただ1つでないときには, Stanのコンパイラは式が誤りであるというフラグを立てます.</p>
<h4 id="乱数発生関数">乱数発生関数</h4>
<p>Stanにある分布のほとんどには, 対応する乱数発生関数があります. これら乱数発生器は, 分布に<code>_rng</code>という接尾辞をつけた名前となっています. 例えば, 1変量正規乱数は<code>normal_rng(0,1)</code>で生成できます. 変量は生成されますから, 分布のパラメータ, ここでは位置(0)とスケール(1)のみを指定します.</p>
<h5 id="乱数発生器の場所">乱数発生器の場所</h5>
<p>乱数発生関数の使用は, <code>transformed data</code>あるいは<code>generated quantities</code>ブロックに限られます. ほかの場所で使おうとすると, パースエラーとなり診断メッセージが出力されます. このほか, 名前が<code>_rng</code>で終わるユーザー定義関数の本体でも使うことができます.</p>
<p>これにより, 乱数生成関数は一般にシミュレーションのために利用することができますが, 特にベイジアン事後予測のチェックのために使えます.</p>
<h5 id="事後予測チェック">事後予測チェック</h5>
<p>事後予測チェックは通常, モデルのパラメータを使って, (個体レベルで, 階層モデルでは群レベルでも)シミュレートしたデータを生成します. これにより, 見た目ならグラフにプロットして, 正式には検定統計量を使って, 実際のデータと比較することにより, モデルの適合性を調べることができます. 事後予測チェックについてさらに知るにはGelman et al. (2013)の6章を参照してください.</p>
<h3 id="型の推定">4.10 型の推定</h3>
<p>Stanは強い静的型付けをします. これは, 式の実装の型がコンパイル時に解決できることを意味します.</p>
<h4 id="実装の型">実装の型</h4>
<p>Stanでは, プリミティブな実装の型は, <code>int</code>, <code>real</code>, <code>vector</code>, <code>row_vector</code>, <code>matrix</code>です. 基本的な型宣言はすべて, プリミティブな型と対応しています. 型と, そのプリミティブな型との対応は図4.4を参照してください. 実装の型は完全には, プリミティブな実装の型と, 0以上の整数配列の次元数からなります. これらを記述する際には, 配列としての特徴が強調されることになるでしょう. 例えば, <code>int[]</code>は次元数1の配列で, <code>int</code>は次元数0の配列で, <code>int[ , , ]</code>は次元数3の配列です. <code>matrix[ , , ]</code>という実装型は全部で5の次元数を持ち, そのうちの3つは配列のもので, 2つは行列のものです.</p>
<p>式では, 配列の次元は, 行列やベクトルの次元の前に来るということを思い出してください. 以下の宣言は, 行列の3次元配列の例です.</p>
<pre><code>matrix[M, N] a[I, J, K];</code></pre>
<p>この行列は<code>a[i, j, k, m, n]</code>と添え字が付きます(配列のインデックスが先で, その後が行列のインデックスです)ので, <code>a[i, j, k]</code>は行列で, <code>a[i, j, k, m]</code>は行ベクトルとなります.</p>
<table>
<thead>
<tr class="header">
<th style="text-align: center;">型</th>
<th style="text-align: center;">プリミティブな型</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="text-align: center;"><code>int</code></td>
<td style="text-align: center;"><code>int</code></td>
</tr>
<tr class="even">
<td style="text-align: center;"><code>real</code></td>
<td style="text-align: center;"><code>real</code></td>
</tr>
<tr class="odd">
<td style="text-align: center;"><code>matrix</code></td>
<td style="text-align: center;"><code>matrix</code></td>
</tr>
<tr class="even">
<td style="text-align: center;"><code>cov_matrix</code></td>
<td style="text-align: center;"><code>matrix</code></td>
</tr>
<tr class="odd">
<td style="text-align: center;"><code>corr_matrix</code></td>
<td style="text-align: center;"><code>matrix</code></td>
</tr>
<tr class="even">
<td style="text-align: center;"><code>cholesky_factor_cov</code></td>
<td style="text-align: center;"><code>matrix</code></td>
</tr>
<tr class="odd">
<td style="text-align: center;"><code>cholesky_factor_corr</code></td>
<td style="text-align: center;"><code>matrix</code></td>
</tr>
<tr class="even">
<td style="text-align: center;"><code>vector</code></td>
<td style="text-align: center;"><code>vector</code></td>
</tr>
<tr class="odd">
<td style="text-align: center;"><code>simplex</code></td>
<td style="text-align: center;"><code>vector</code></td>
</tr>
<tr class="even">
<td style="text-align: center;"><code>unit_vector</code></td>
<td style="text-align: center;"><code>vector</code></td>
</tr>
<tr class="odd">
<td style="text-align: center;"><code>ordered</code></td>
<td style="text-align: center;"><code>vector</code></td>
</tr>
<tr class="even">
<td style="text-align: center;"><code>positive_ordered</code></td>
<td style="text-align: center;"><code>vector</code></td>
</tr>
<tr class="odd">
<td style="text-align: center;"><code>row_vector</code></td>
<td style="text-align: center;"><code>row_vector</code></td>
</tr>
</tbody>
</table>
<p>図4.4: Stanの変数宣言の型と対応するプリミティブな実装の型の表. Stanの関数・演算子・確率関数は引数と戻り値の型を持ち, それらはプリミティブな型と配列次元数によって宣言されます.</p>
<h4 id="型推定の規則">型推定の規則</h4>
<p>Stanの型推定規則は, 変数宣言の背後にある組み合わせに基づいて, ある式の実装の型を定義します. この規則は, プリミティブなリテラルと変数の式から, 複合した式へとボトムアップに作用します.</p>