-
Notifications
You must be signed in to change notification settings - Fork 26
Expand file tree
/
Copy pathcha-algos-provided.html
More file actions
986 lines (948 loc) · 106 KB
/
cha-algos-provided.html
File metadata and controls
986 lines (948 loc) · 106 KB
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
<!DOCTYPE html>
<html lang="" xml:lang="">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title>Chapter 8 Particle Filters, PMCMC, and MCEM | NimbleUserManual.knit</title>
<meta name="description" content="This is the NIMBLE User Manual." />
<meta name="generator" content="bookdown 0.37 and GitBook 2.6.7" />
<meta property="og:title" content="Chapter 8 Particle Filters, PMCMC, and MCEM | NimbleUserManual.knit" />
<meta property="og:type" content="book" />
<meta property="og:image" content="/nimble-icon.png" />
<meta property="og:description" content="This is the NIMBLE User Manual." />
<meta name="github-repo" content="nimble-dev/nimble" />
<meta name="twitter:card" content="summary" />
<meta name="twitter:title" content="Chapter 8 Particle Filters, PMCMC, and MCEM | NimbleUserManual.knit" />
<meta name="twitter:description" content="This is the NIMBLE User Manual." />
<meta name="twitter:image" content="/nimble-icon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
<link rel="prev" href="cha-mcmc.html"/>
<link rel="next" href="cha-laplace.html"/>
<script src="libs/jquery-3.6.0/jquery-3.6.0.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/fuse.js@6.4.6/dist/fuse.min.js"></script>
<link href="libs/gitbook-2.6.7/css/style.css" rel="stylesheet" />
<link href="libs/gitbook-2.6.7/css/plugin-table.css" rel="stylesheet" />
<link href="libs/gitbook-2.6.7/css/plugin-bookdown.css" rel="stylesheet" />
<link href="libs/gitbook-2.6.7/css/plugin-highlight.css" rel="stylesheet" />
<link href="libs/gitbook-2.6.7/css/plugin-search.css" rel="stylesheet" />
<link href="libs/gitbook-2.6.7/css/plugin-fontsettings.css" rel="stylesheet" />
<link href="libs/gitbook-2.6.7/css/plugin-clipboard.css" rel="stylesheet" />
<link href="libs/anchor-sections-1.1.0/anchor-sections.css" rel="stylesheet" />
<link href="libs/anchor-sections-1.1.0/anchor-sections-hash.css" rel="stylesheet" />
<script src="libs/anchor-sections-1.1.0/anchor-sections.js"></script>
<style type="text/css">
pre > code.sourceCode { white-space: pre; position: relative; }
pre > code.sourceCode > span { line-height: 1.25; }
pre > code.sourceCode > span:empty { height: 1.2em; }
.sourceCode { overflow: visible; }
code.sourceCode > span { color: inherit; text-decoration: inherit; }
pre.sourceCode { margin: 0; }
@media screen {
div.sourceCode { overflow: auto; }
}
@media print {
pre > code.sourceCode { white-space: pre-wrap; }
pre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }
}
pre.numberSource code
{ counter-reset: source-line 0; }
pre.numberSource code > span
{ position: relative; left: -4em; counter-increment: source-line; }
pre.numberSource code > span > a:first-child::before
{ content: counter(source-line);
position: relative; left: -1em; text-align: right; vertical-align: baseline;
border: none; display: inline-block;
-webkit-touch-callout: none; -webkit-user-select: none;
-khtml-user-select: none; -moz-user-select: none;
-ms-user-select: none; user-select: none;
padding: 0 4px; width: 4em;
color: #aaaaaa;
}
pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }
div.sourceCode
{ }
@media screen {
pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
}
code span.al { color: #ff0000; font-weight: bold; } /* Alert */
code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
code span.at { color: #7d9029; } /* Attribute */
code span.bn { color: #40a070; } /* BaseN */
code span.bu { color: #008000; } /* BuiltIn */
code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
code span.ch { color: #4070a0; } /* Char */
code span.cn { color: #880000; } /* Constant */
code span.co { color: #60a0b0; font-style: italic; } /* Comment */
code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
code span.do { color: #ba2121; font-style: italic; } /* Documentation */
code span.dt { color: #902000; } /* DataType */
code span.dv { color: #40a070; } /* DecVal */
code span.er { color: #ff0000; font-weight: bold; } /* Error */
code span.ex { } /* Extension */
code span.fl { color: #40a070; } /* Float */
code span.fu { color: #06287e; } /* Function */
code span.im { color: #008000; font-weight: bold; } /* Import */
code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
code span.kw { color: #007020; font-weight: bold; } /* Keyword */
code span.op { color: #666666; } /* Operator */
code span.ot { color: #007020; } /* Other */
code span.pp { color: #bc7a00; } /* Preprocessor */
code span.sc { color: #4070a0; } /* SpecialChar */
code span.ss { color: #bb6688; } /* SpecialString */
code span.st { color: #4070a0; } /* String */
code span.va { color: #19177c; } /* Variable */
code span.vs { color: #4070a0; } /* VerbatimString */
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
</style>
<style type="text/css">
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
</style>
<style type="text/css">
/* Used with Pandoc 2.11+ new --citeproc when CSL is used */
div.csl-bib-body { }
div.csl-entry {
clear: both;
}
.hanging div.csl-entry {
margin-left:2em;
text-indent:-2em;
}
div.csl-left-margin {
min-width:2em;
float:left;
}
div.csl-right-inline {
margin-left:2em;
padding-left:1em;
}
div.csl-indent {
margin-left: 2em;
}
</style>
<link rel="stylesheet" href="style.css" type="text/css" />
</head>
<body>
<div class="book without-animation with-summary font-size-2 font-family-1" data-basepath=".">
<div class="book-summary">
<nav role="navigation">
<ul class="summary">
<img src="./nimble-icon.png"
width=100>
<li><a href="./cha-welcome-nimble.html">NIMBLE User Manual, Version 1.4.2</a></li>
<li><a href="https://github.com/nimble-dev/nimble">NIMBLE Development Team</a></li>
<li><a href="https://R-nimble.org">https://R-nimble.org</a></li>
<li class="divider"></li>
<li class="part"><span><b>I Introduction</b></span></li>
<li class="chapter" data-level="1" data-path="cha-welcome-nimble.html"><a href="cha-welcome-nimble.html"><i class="fa fa-check"></i><b>1</b> Welcome to NIMBLE</a>
<ul>
<li class="chapter" data-level="1.1" data-path="cha-welcome-nimble.html"><a href="cha-welcome-nimble.html#sec:what-is-nimble"><i class="fa fa-check"></i><b>1.1</b> What does NIMBLE do?</a></li>
<li class="chapter" data-level="1.2" data-path="cha-welcome-nimble.html"><a href="cha-welcome-nimble.html#how-to-use-this-manual"><i class="fa fa-check"></i><b>1.2</b> How to use this manual</a></li>
</ul></li>
<li class="chapter" data-level="2" data-path="cha-lightning-intro.html"><a href="cha-lightning-intro.html"><i class="fa fa-check"></i><b>2</b> Lightning introduction</a>
<ul>
<li class="chapter" data-level="2.1" data-path="cha-lightning-intro.html"><a href="cha-lightning-intro.html#sec:brief-example"><i class="fa fa-check"></i><b>2.1</b> A brief example</a></li>
<li class="chapter" data-level="2.2" data-path="cha-lightning-intro.html"><a href="cha-lightning-intro.html#sec:creating-model"><i class="fa fa-check"></i><b>2.2</b> Creating a model</a></li>
<li class="chapter" data-level="2.3" data-path="cha-lightning-intro.html"><a href="cha-lightning-intro.html#sec:compiling-model"><i class="fa fa-check"></i><b>2.3</b> Compiling the model</a></li>
<li class="chapter" data-level="2.4" data-path="cha-lightning-intro.html"><a href="cha-lightning-intro.html#sec:intro-runMCMC"><i class="fa fa-check"></i><b>2.4</b> One-line invocation of MCMC</a></li>
<li class="chapter" data-level="2.5" data-path="cha-lightning-intro.html"><a href="cha-lightning-intro.html#sec:creating-mcmc"><i class="fa fa-check"></i><b>2.5</b> Creating, compiling and running a basic MCMC configuration</a></li>
<li class="chapter" data-level="2.6" data-path="cha-lightning-intro.html"><a href="cha-lightning-intro.html#sec:customizing-mcmc"><i class="fa fa-check"></i><b>2.6</b> Customizing the MCMC</a></li>
<li class="chapter" data-level="2.7" data-path="cha-lightning-intro.html"><a href="cha-lightning-intro.html#sec:running-mcem"><i class="fa fa-check"></i><b>2.7</b> Running MCEM</a></li>
<li class="chapter" data-level="2.8" data-path="cha-lightning-intro.html"><a href="cha-lightning-intro.html#sec:creating-your-own"><i class="fa fa-check"></i><b>2.8</b> Creating your own functions</a></li>
</ul></li>
<li class="chapter" data-level="3" data-path="cha-more-introduction.html"><a href="cha-more-introduction.html"><i class="fa fa-check"></i><b>3</b> More introduction</a>
<ul>
<li class="chapter" data-level="3.1" data-path="cha-more-introduction.html"><a href="cha-more-introduction.html#nimble-adopts-and-extends-the-bugs-language-for-specifying-models"><i class="fa fa-check"></i><b>3.1</b> NIMBLE adopts and extends the BUGS language for specifying models</a></li>
<li class="chapter" data-level="3.2" data-path="cha-more-introduction.html"><a href="cha-more-introduction.html#sec:nimble-lang-writ"><i class="fa fa-check"></i><b>3.2</b> nimbleFunctions for writing algorithms</a></li>
<li class="chapter" data-level="3.3" data-path="cha-more-introduction.html"><a href="cha-more-introduction.html#sec:nimble-algor-libr"><i class="fa fa-check"></i><b>3.3</b> The NIMBLE algorithm library</a></li>
</ul></li>
<li class="chapter" data-level="4" data-path="cha-installing-nimble.html"><a href="cha-installing-nimble.html"><i class="fa fa-check"></i><b>4</b> Installing NIMBLE</a>
<ul>
<li class="chapter" data-level="4.1" data-path="cha-installing-nimble.html"><a href="cha-installing-nimble.html#sec:requ-run-nimble"><i class="fa fa-check"></i><b>4.1</b> Requirements to run NIMBLE</a></li>
<li class="chapter" data-level="4.2" data-path="cha-installing-nimble.html"><a href="cha-installing-nimble.html#sec:compiler"><i class="fa fa-check"></i><b>4.2</b> Installing a C++ compiler for NIMBLE to use</a>
<ul>
<li class="chapter" data-level="4.2.1" data-path="cha-installing-nimble.html"><a href="cha-installing-nimble.html#macos"><i class="fa fa-check"></i><b>4.2.1</b> MacOS</a></li>
<li class="chapter" data-level="4.2.2" data-path="cha-installing-nimble.html"><a href="cha-installing-nimble.html#linux"><i class="fa fa-check"></i><b>4.2.2</b> Linux</a></li>
<li class="chapter" data-level="4.2.3" data-path="cha-installing-nimble.html"><a href="cha-installing-nimble.html#windows"><i class="fa fa-check"></i><b>4.2.3</b> Windows</a></li>
</ul></li>
<li class="chapter" data-level="4.3" data-path="cha-installing-nimble.html"><a href="cha-installing-nimble.html#installing-the-nimble-package"><i class="fa fa-check"></i><b>4.3</b> Installing the NIMBLE package</a></li>
<li class="chapter" data-level="4.4" data-path="cha-installing-nimble.html"><a href="cha-installing-nimble.html#troubleshooting-installation-problems"><i class="fa fa-check"></i><b>4.4</b> Troubleshooting installation problems</a></li>
<li class="chapter" data-level="4.5" data-path="cha-installing-nimble.html"><a href="cha-installing-nimble.html#customizing-your-installation"><i class="fa fa-check"></i><b>4.5</b> Customizing your installation</a>
<ul>
<li class="chapter" data-level="4.5.1" data-path="cha-installing-nimble.html"><a href="cha-installing-nimble.html#using-your-own-copy-of-eigen"><i class="fa fa-check"></i><b>4.5.1</b> Using your own copy of Eigen</a></li>
<li class="chapter" data-level="4.5.2" data-path="cha-installing-nimble.html"><a href="cha-installing-nimble.html#using-libnimble"><i class="fa fa-check"></i><b>4.5.2</b> Using libnimble</a></li>
<li class="chapter" data-level="4.5.3" data-path="cha-installing-nimble.html"><a href="cha-installing-nimble.html#sec:blas"><i class="fa fa-check"></i><b>4.5.3</b> BLAS and LAPACK</a></li>
<li class="chapter" data-level="4.5.4" data-path="cha-installing-nimble.html"><a href="cha-installing-nimble.html#customizing-compilation-of-the-nimble-generated-c"><i class="fa fa-check"></i><b>4.5.4</b> Customizing compilation of the NIMBLE-generated C++</a></li>
</ul></li>
</ul></li>
<li class="part"><span><b>II Models in NIMBLE</b></span></li>
<li class="chapter" data-level="5" data-path="cha-writing-models.html"><a href="cha-writing-models.html"><i class="fa fa-check"></i><b>5</b> Writing models in NIMBLE’s dialect of BUGS</a>
<ul>
<li class="chapter" data-level="5.1" data-path="cha-writing-models.html"><a href="cha-writing-models.html#sec:supp-feat-bugs"><i class="fa fa-check"></i><b>5.1</b> Comparison to BUGS dialects supported by WinBUGS, OpenBUGS and JAGS</a>
<ul>
<li class="chapter" data-level="5.1.1" data-path="cha-writing-models.html"><a href="cha-writing-models.html#supported-features-of-bugs-and-jags"><i class="fa fa-check"></i><b>5.1.1</b> Supported features of BUGS and JAGS</a></li>
<li class="chapter" data-level="5.1.2" data-path="cha-writing-models.html"><a href="cha-writing-models.html#sec:extensions-bugs"><i class="fa fa-check"></i><b>5.1.2</b> NIMBLE’s Extensions to BUGS and JAGS</a></li>
<li class="chapter" data-level="5.1.3" data-path="cha-writing-models.html"><a href="cha-writing-models.html#sec:not-yet-supported"><i class="fa fa-check"></i><b>5.1.3</b> Not-supported features of BUGS and JAGS</a></li>
</ul></li>
<li class="chapter" data-level="5.2" data-path="cha-writing-models.html"><a href="cha-writing-models.html#writing-models"><i class="fa fa-check"></i><b>5.2</b> Writing models</a>
<ul>
<li class="chapter" data-level="5.2.1" data-path="cha-writing-models.html"><a href="cha-writing-models.html#declaring-stochastic-and-deterministic-nodes"><i class="fa fa-check"></i><b>5.2.1</b> Declaring stochastic and deterministic nodes</a></li>
<li class="chapter" data-level="5.2.2" data-path="cha-writing-models.html"><a href="cha-writing-models.html#sec:more-kinds-bugs"><i class="fa fa-check"></i><b>5.2.2</b> More kinds of BUGS declarations</a></li>
<li class="chapter" data-level="5.2.3" data-path="cha-writing-models.html"><a href="cha-writing-models.html#subsec:vectorized-versus-scalar-declarations"><i class="fa fa-check"></i><b>5.2.3</b> Vectorized versus scalar declarations</a></li>
<li class="chapter" data-level="5.2.4" data-path="cha-writing-models.html"><a href="cha-writing-models.html#subsec:dists-and-functions"><i class="fa fa-check"></i><b>5.2.4</b> Available distributions</a></li>
<li class="chapter" data-level="5.2.5" data-path="cha-writing-models.html"><a href="cha-writing-models.html#subsec:BUGS-lang-fxns"><i class="fa fa-check"></i><b>5.2.5</b> Available BUGS language functions</a></li>
<li class="chapter" data-level="5.2.6" data-path="cha-writing-models.html"><a href="cha-writing-models.html#subsec:BUGS-link"><i class="fa fa-check"></i><b>5.2.6</b> Available link functions</a></li>
<li class="chapter" data-level="5.2.7" data-path="cha-writing-models.html"><a href="cha-writing-models.html#subsec:trunc"><i class="fa fa-check"></i><b>5.2.7</b> Truncation, censoring, and constraints</a></li>
<li class="chapter" data-level="5.2.8" data-path="cha-writing-models.html"><a href="cha-writing-models.html#subsec:macros"><i class="fa fa-check"></i><b>5.2.8</b> Model macros</a></li>
</ul></li>
</ul></li>
<li class="chapter" data-level="6" data-path="cha-building-models.html"><a href="cha-building-models.html"><i class="fa fa-check"></i><b>6</b> Building and using models</a>
<ul>
<li class="chapter" data-level="6.1" data-path="cha-building-models.html"><a href="cha-building-models.html#creating-model-objects"><i class="fa fa-check"></i><b>6.1</b> Creating model objects</a>
<ul>
<li class="chapter" data-level="6.1.1" data-path="cha-building-models.html"><a href="cha-building-models.html#using-nimblemodel-to-create-a-model"><i class="fa fa-check"></i><b>6.1.1</b> Using <em>nimbleModel</em> to create a model</a></li>
<li class="chapter" data-level="6.1.2" data-path="cha-building-models.html"><a href="cha-building-models.html#sec:readBUGSmodel"><i class="fa fa-check"></i><b>6.1.2</b> Creating a model from standard BUGS and JAGS input files</a></li>
<li class="chapter" data-level="6.1.3" data-path="cha-building-models.html"><a href="cha-building-models.html#sub:multiple-instances"><i class="fa fa-check"></i><b>6.1.3</b> Making multiple instances from the same model definition</a></li>
</ul></li>
<li class="chapter" data-level="6.2" data-path="cha-building-models.html"><a href="cha-building-models.html#sec:nodes-and-variables"><i class="fa fa-check"></i><b>6.2</b> NIMBLE models are objects you can query and manipulate</a>
<ul>
<li class="chapter" data-level="6.2.1" data-path="cha-building-models.html"><a href="cha-building-models.html#sec:what-are-nodes-and-variables"><i class="fa fa-check"></i><b>6.2.1</b> What are variables and nodes?</a></li>
<li class="chapter" data-level="6.2.2" data-path="cha-building-models.html"><a href="cha-building-models.html#determining-the-nodes-and-variables-in-a-model"><i class="fa fa-check"></i><b>6.2.2</b> Determining the nodes and variables in a model</a></li>
<li class="chapter" data-level="6.2.3" data-path="cha-building-models.html"><a href="cha-building-models.html#sec:accessing-nodes"><i class="fa fa-check"></i><b>6.2.3</b> Accessing nodes</a></li>
<li class="chapter" data-level="6.2.4" data-path="cha-building-models.html"><a href="cha-building-models.html#sec:how-nodes-are"><i class="fa fa-check"></i><b>6.2.4</b> How nodes are named</a></li>
<li class="chapter" data-level="6.2.5" data-path="cha-building-models.html"><a href="cha-building-models.html#sec:why-use-node"><i class="fa fa-check"></i><b>6.2.5</b> Why use node names?</a></li>
<li class="chapter" data-level="6.2.6" data-path="cha-building-models.html"><a href="cha-building-models.html#sec:cdisdata"><i class="fa fa-check"></i><b>6.2.6</b> Checking if a node holds data</a></li>
</ul></li>
<li class="chapter" data-level="6.3" data-path="cha-building-models.html"><a href="cha-building-models.html#using-models-in-parallel"><i class="fa fa-check"></i><b>6.3</b> Using models in parallel</a></li>
</ul></li>
<li class="part"><span><b>III Algorithms in NIMBLE</b></span></li>
<li class="chapter" data-level="7" data-path="cha-mcmc.html"><a href="cha-mcmc.html"><i class="fa fa-check"></i><b>7</b> MCMC</a>
<ul>
<li class="chapter" data-level="7.1" data-path="cha-mcmc.html"><a href="cha-mcmc.html#sec:nimbleMCMC"><i class="fa fa-check"></i><b>7.1</b> One-line invocation of MCMC: <em>nimbleMCMC</em></a></li>
<li class="chapter" data-level="7.2" data-path="cha-mcmc.html"><a href="cha-mcmc.html#sec:mcmc-configuration"><i class="fa fa-check"></i><b>7.2</b> The MCMC configuration</a>
<ul>
<li class="chapter" data-level="7.2.1" data-path="cha-mcmc.html"><a href="cha-mcmc.html#sec:default-mcmc-conf"><i class="fa fa-check"></i><b>7.2.1</b> Default MCMC configuration</a></li>
<li class="chapter" data-level="7.2.2" data-path="cha-mcmc.html"><a href="cha-mcmc.html#sec:customizing-mcmc-conf"><i class="fa fa-check"></i><b>7.2.2</b> Customizing the MCMC configuration</a></li>
<li class="chapter" data-level="7.2.3" data-path="cha-mcmc.html"><a href="cha-mcmc.html#sec:derived-quantities"><i class="fa fa-check"></i><b>7.2.3</b> Setting up derived quantities for additional quantities of interest</a></li>
</ul></li>
<li class="chapter" data-level="7.3" data-path="cha-mcmc.html"><a href="cha-mcmc.html#sec:build-compile-mcmc"><i class="fa fa-check"></i><b>7.3</b> Building and compiling the MCMC</a></li>
<li class="chapter" data-level="7.4" data-path="cha-mcmc.html"><a href="cha-mcmc.html#sec:initMCMC"><i class="fa fa-check"></i><b>7.4</b> Initializing MCMC</a></li>
<li class="chapter" data-level="7.5" data-path="cha-mcmc.html"><a href="cha-mcmc.html#sec:runMCMC"><i class="fa fa-check"></i><b>7.5</b> User-friendly execution of MCMC algorithms: <em>runMCMC</em></a></li>
<li class="chapter" data-level="7.6" data-path="cha-mcmc.html"><a href="cha-mcmc.html#sec:executing-the-mcmc-algorithm"><i class="fa fa-check"></i><b>7.6</b> Running the MCMC</a>
<ul>
<li class="chapter" data-level="7.6.1" data-path="cha-mcmc.html"><a href="cha-mcmc.html#sec:mcmc-rerun"><i class="fa fa-check"></i><b>7.6.1</b> Rerunning versus restarting an MCMC</a></li>
<li class="chapter" data-level="7.6.2" data-path="cha-mcmc.html"><a href="cha-mcmc.html#sec:sampler-time"><i class="fa fa-check"></i><b>7.6.2</b> Measuring sampler computation times: <em>getTimes</em></a></li>
<li class="chapter" data-level="7.6.3" data-path="cha-mcmc.html"><a href="cha-mcmc.html#assessing-the-adaption-process-of-rw-and-rw_block-samplers"><i class="fa fa-check"></i><b>7.6.3</b> Assessing the adaption process of <em>RW</em> and <em>RW_block</em> samplers</a></li>
</ul></li>
<li class="chapter" data-level="7.7" data-path="cha-mcmc.html"><a href="cha-mcmc.html#sec:extracting-samples"><i class="fa fa-check"></i><b>7.7</b> Extracting MCMC samples</a></li>
<li class="chapter" data-level="7.8" data-path="cha-mcmc.html"><a href="cha-mcmc.html#sec:WAIC"><i class="fa fa-check"></i><b>7.8</b> Calculating WAIC</a></li>
<li class="chapter" data-level="7.9" data-path="cha-mcmc.html"><a href="cha-mcmc.html#k-fold-cross-validation"><i class="fa fa-check"></i><b>7.9</b> k-fold cross-validation</a></li>
<li class="chapter" data-level="7.10" data-path="cha-mcmc.html"><a href="cha-mcmc.html#sec:rjmcmc"><i class="fa fa-check"></i><b>7.10</b> Variable selection using Reversible Jump MCMC</a>
<ul>
<li class="chapter" data-level="7.10.1" data-path="cha-mcmc.html"><a href="cha-mcmc.html#sec:rjmcmc-indicator"><i class="fa fa-check"></i><b>7.10.1</b> Using indicator variables</a></li>
<li class="chapter" data-level="7.10.2" data-path="cha-mcmc.html"><a href="cha-mcmc.html#sec:rjmcmc-no-indicator"><i class="fa fa-check"></i><b>7.10.2</b> Without indicator variables</a></li>
</ul></li>
<li class="chapter" data-level="7.11" data-path="cha-mcmc.html"><a href="cha-mcmc.html#sec:samplers-provided"><i class="fa fa-check"></i><b>7.11</b> Samplers provided with NIMBLE</a>
<ul>
<li class="chapter" data-level="7.11.1" data-path="cha-mcmc.html"><a href="cha-mcmc.html#conjugate-gibbs-samplers"><i class="fa fa-check"></i><b>7.11.1</b> Conjugate (‘Gibbs’) samplers</a></li>
<li class="chapter" data-level="7.11.2" data-path="cha-mcmc.html"><a href="cha-mcmc.html#subsec:HMC"><i class="fa fa-check"></i><b>7.11.2</b> Hamiltonian Monte Carlo (HMC)</a></li>
<li class="chapter" data-level="7.11.3" data-path="cha-mcmc.html"><a href="cha-mcmc.html#particle-filter-samplers"><i class="fa fa-check"></i><b>7.11.3</b> Particle filter samplers</a></li>
<li class="chapter" data-level="7.11.4" data-path="cha-mcmc.html"><a href="cha-mcmc.html#customized-log-likelihood-evaluations-rw_llfunction-sampler"><i class="fa fa-check"></i><b>7.11.4</b> Customized log-likelihood evaluations: <em>RW_llFunction sampler</em></a></li>
</ul></li>
<li class="chapter" data-level="7.12" data-path="cha-mcmc.html"><a href="cha-mcmc.html#sec:mcmc-example-litters"><i class="fa fa-check"></i><b>7.12</b> Detailed MCMC example: <em>litters</em></a></li>
<li class="chapter" data-level="7.13" data-path="cha-mcmc.html"><a href="cha-mcmc.html#mcmc-suite-compare-mcmcs"><i class="fa fa-check"></i><b>7.13</b> Comparing different MCMCs with <em>compareMCMCs</em></a></li>
<li class="chapter" data-level="7.14" data-path="cha-mcmc.html"><a href="cha-mcmc.html#running-mcmc-chains-in-parallel"><i class="fa fa-check"></i><b>7.14</b> Running MCMC chains in parallel</a></li>
</ul></li>
<li class="chapter" data-level="8" data-path="cha-algos-provided.html"><a href="cha-algos-provided.html"><i class="fa fa-check"></i><b>8</b> Particle Filters, PMCMC, and MCEM</a>
<ul>
<li class="chapter" data-level="8.1" data-path="cha-algos-provided.html"><a href="cha-algos-provided.html#particle-filters-sequential-monte-carlo-and-iterated-filtering"><i class="fa fa-check"></i><b>8.1</b> Particle filters / sequential Monte Carlo and iterated filtering</a>
<ul>
<li class="chapter" data-level="8.1.1" data-path="cha-algos-provided.html"><a href="cha-algos-provided.html#filtering-algorithms"><i class="fa fa-check"></i><b>8.1.1</b> Filtering algorithms</a></li>
<li class="chapter" data-level="8.1.2" data-path="cha-algos-provided.html"><a href="cha-algos-provided.html#sec:particle-mcmc"><i class="fa fa-check"></i><b>8.1.2</b> Particle MCMC (PMCMC)</a></li>
</ul></li>
<li class="chapter" data-level="8.2" data-path="cha-algos-provided.html"><a href="cha-algos-provided.html#monte-carlo-expectation-maximization-mcem"><i class="fa fa-check"></i><b>8.2</b> Monte Carlo Expectation Maximization (MCEM)</a>
<ul>
<li class="chapter" data-level="8.2.1" data-path="cha-algos-provided.html"><a href="cha-algos-provided.html#sec:estimate-mcem-cov"><i class="fa fa-check"></i><b>8.2.1</b> Estimating the asymptotic covariance From MCEM</a></li>
</ul></li>
</ul></li>
<li class="chapter" data-level="9" data-path="cha-laplace.html"><a href="cha-laplace.html"><i class="fa fa-check"></i><b>9</b> Laplace, AGHQ, and nested approximations</a>
<ul>
<li class="chapter" data-level="9.1" data-path="cha-laplace.html"><a href="cha-laplace.html#sec:AD-laplace"><i class="fa fa-check"></i><b>9.1</b> Laplace approximation and adaptive Gauss-Hermite quadrature (AGHQ)</a>
<ul>
<li class="chapter" data-level="9.1.1" data-path="cha-laplace.html"><a href="cha-laplace.html#glmm-example"><i class="fa fa-check"></i><b>9.1.1</b> GLMM example</a></li>
<li class="chapter" data-level="9.1.2" data-path="cha-laplace.html"><a href="cha-laplace.html#using-laplace-approximation"><i class="fa fa-check"></i><b>9.1.2</b> Using Laplace approximation</a></li>
<li class="chapter" data-level="9.1.3" data-path="cha-laplace.html"><a href="cha-laplace.html#using-the-laplace-approximation-methods-directly"><i class="fa fa-check"></i><b>9.1.3</b> Using the Laplace approximation methods directly</a></li>
<li class="chapter" data-level="9.1.4" data-path="cha-laplace.html"><a href="cha-laplace.html#changing-the-optimization-methods"><i class="fa fa-check"></i><b>9.1.4</b> Changing the optimization methods</a></li>
</ul></li>
<li class="chapter" data-level="9.2" data-path="cha-laplace.html"><a href="cha-laplace.html#sec:nested-approx"><i class="fa fa-check"></i><b>9.2</b> Nested approximation (INLA-like) methods</a>
<ul>
<li class="chapter" data-level="9.2.1" data-path="cha-laplace.html"><a href="cha-laplace.html#overview-of-the-methodology"><i class="fa fa-check"></i><b>9.2.1</b> Overview of the methodology</a></li>
<li class="chapter" data-level="9.2.2" data-path="cha-laplace.html"><a href="cha-laplace.html#using-nimbles-nested-approximation"><i class="fa fa-check"></i><b>9.2.2</b> Using NIMBLE’s nested approximation</a></li>
</ul></li>
</ul></li>
<li class="chapter" data-level="10" data-path="cha-spatial.html"><a href="cha-spatial.html"><i class="fa fa-check"></i><b>10</b> Spatial models</a>
<ul>
<li class="chapter" data-level="10.1" data-path="cha-spatial.html"><a href="cha-spatial.html#intrinsic-gaussian-car-model-dcar_normal"><i class="fa fa-check"></i><b>10.1</b> Intrinsic Gaussian CAR model: <em>dcar_normal</em></a>
<ul>
<li class="chapter" data-level="10.1.1" data-path="cha-spatial.html"><a href="cha-spatial.html#specification-and-density"><i class="fa fa-check"></i><b>10.1.1</b> Specification and density</a></li>
<li class="chapter" data-level="10.1.2" data-path="cha-spatial.html"><a href="cha-spatial.html#example"><i class="fa fa-check"></i><b>10.1.2</b> Example</a></li>
</ul></li>
<li class="chapter" data-level="10.2" data-path="cha-spatial.html"><a href="cha-spatial.html#proper-gaussian-car-model-dcar_proper"><i class="fa fa-check"></i><b>10.2</b> Proper Gaussian CAR model: <em>dcar_proper</em></a>
<ul>
<li class="chapter" data-level="10.2.1" data-path="cha-spatial.html"><a href="cha-spatial.html#specification-and-density-1"><i class="fa fa-check"></i><b>10.2.1</b> Specification and density</a></li>
<li class="chapter" data-level="10.2.2" data-path="cha-spatial.html"><a href="cha-spatial.html#example-1"><i class="fa fa-check"></i><b>10.2.2</b> Example</a></li>
</ul></li>
<li class="chapter" data-level="10.3" data-path="cha-spatial.html"><a href="cha-spatial.html#sec:spatial-mcmc-sampling-car"><i class="fa fa-check"></i><b>10.3</b> MCMC Sampling of CAR models</a>
<ul>
<li class="chapter" data-level="10.3.1" data-path="cha-spatial.html"><a href="cha-spatial.html#initial-values"><i class="fa fa-check"></i><b>10.3.1</b> Initial values</a></li>
<li class="chapter" data-level="10.3.2" data-path="cha-spatial.html"><a href="cha-spatial.html#zero-neighbor-regions"><i class="fa fa-check"></i><b>10.3.2</b> Zero-neighbor regions</a></li>
<li class="chapter" data-level="10.3.3" data-path="cha-spatial.html"><a href="cha-spatial.html#zero-mean-constraint"><i class="fa fa-check"></i><b>10.3.3</b> Zero-mean constraint</a></li>
</ul></li>
</ul></li>
<li class="chapter" data-level="11" data-path="cha-bnp.html"><a href="cha-bnp.html"><i class="fa fa-check"></i><b>11</b> Bayesian nonparametric models</a>
<ul>
<li class="chapter" data-level="11.1" data-path="cha-bnp.html"><a href="cha-bnp.html#sec:bnpmixtures"><i class="fa fa-check"></i><b>11.1</b> Bayesian nonparametric mixture models</a></li>
<li class="chapter" data-level="11.2" data-path="cha-bnp.html"><a href="cha-bnp.html#sec:crp"><i class="fa fa-check"></i><b>11.2</b> Chinese Restaurant Process model</a>
<ul>
<li class="chapter" data-level="11.2.1" data-path="cha-bnp.html"><a href="cha-bnp.html#specification-and-density-2"><i class="fa fa-check"></i><b>11.2.1</b> Specification and density</a></li>
<li class="chapter" data-level="11.2.2" data-path="cha-bnp.html"><a href="cha-bnp.html#sec:excrp"><i class="fa fa-check"></i><b>11.2.2</b> Example</a></li>
<li class="chapter" data-level="11.2.3" data-path="cha-bnp.html"><a href="cha-bnp.html#sec:extensionscrp"><i class="fa fa-check"></i><b>11.2.3</b> Extensions</a></li>
</ul></li>
<li class="chapter" data-level="11.3" data-path="cha-bnp.html"><a href="cha-bnp.html#sec:sb"><i class="fa fa-check"></i><b>11.3</b> Stick-breaking model</a>
<ul>
<li class="chapter" data-level="11.3.1" data-path="cha-bnp.html"><a href="cha-bnp.html#specification-and-function"><i class="fa fa-check"></i><b>11.3.1</b> Specification and function</a></li>
<li class="chapter" data-level="11.3.2" data-path="cha-bnp.html"><a href="cha-bnp.html#sec:exsb"><i class="fa fa-check"></i><b>11.3.2</b> Example</a></li>
</ul></li>
<li class="chapter" data-level="11.4" data-path="cha-bnp.html"><a href="cha-bnp.html#mcmc-sampling-of-bnp-models"><i class="fa fa-check"></i><b>11.4</b> MCMC sampling of BNP models</a>
<ul>
<li class="chapter" data-level="11.4.1" data-path="cha-bnp.html"><a href="cha-bnp.html#sec:mcmcdcrp"><i class="fa fa-check"></i><b>11.4.1</b> Sampling CRP models</a></li>
<li class="chapter" data-level="11.4.2" data-path="cha-bnp.html"><a href="cha-bnp.html#sec:mcmcsb"><i class="fa fa-check"></i><b>11.4.2</b> Sampling stick-breaking models</a></li>
</ul></li>
</ul></li>
<li class="part"><span><b>IV Programming with NIMBLE</b></span></li>
<li class="chapter" data-level="" data-path="overview.html"><a href="overview.html"><i class="fa fa-check"></i>Overview</a></li>
<li class="chapter" data-level="12" data-path="cha-RCfunctions.html"><a href="cha-RCfunctions.html"><i class="fa fa-check"></i><b>12</b> Writing simple nimbleFunctions</a>
<ul>
<li class="chapter" data-level="12.1" data-path="cha-RCfunctions.html"><a href="cha-RCfunctions.html#sec:RC-intro"><i class="fa fa-check"></i><b>12.1</b> Introduction to simple nimbleFunctions</a></li>
<li class="chapter" data-level="12.2" data-path="cha-RCfunctions.html"><a href="cha-RCfunctions.html#sec:r-fiunctions-implemented"><i class="fa fa-check"></i><b>12.2</b> R functions (or variants) implemented in NIMBLE</a>
<ul>
<li class="chapter" data-level="12.2.1" data-path="cha-RCfunctions.html"><a href="cha-RCfunctions.html#finding-help-for-nimbles-versions-of-r-functions"><i class="fa fa-check"></i><b>12.2.1</b> Finding help for NIMBLE’s versions of R functions</a></li>
<li class="chapter" data-level="12.2.2" data-path="cha-RCfunctions.html"><a href="cha-RCfunctions.html#basic-operations"><i class="fa fa-check"></i><b>12.2.2</b> Basic operations</a></li>
<li class="chapter" data-level="12.2.3" data-path="cha-RCfunctions.html"><a href="cha-RCfunctions.html#sec:basic-math-linear"><i class="fa fa-check"></i><b>12.2.3</b> Math and linear algebra</a></li>
<li class="chapter" data-level="12.2.4" data-path="cha-RCfunctions.html"><a href="cha-RCfunctions.html#sec:nimble-dist-funs"><i class="fa fa-check"></i><b>12.2.4</b> Distribution functions</a></li>
<li class="chapter" data-level="12.2.5" data-path="cha-RCfunctions.html"><a href="cha-RCfunctions.html#sec:basic-flow-control"><i class="fa fa-check"></i><b>12.2.5</b> Flow control: <em>if-then-else</em>, <em>for</em>, <em>while</em>, and <em>stop</em></a></li>
<li class="chapter" data-level="12.2.6" data-path="cha-RCfunctions.html"><a href="cha-RCfunctions.html#sec:print"><i class="fa fa-check"></i><b>12.2.6</b> <em>print</em> and <em>cat</em></a></li>
<li class="chapter" data-level="12.2.7" data-path="cha-RCfunctions.html"><a href="cha-RCfunctions.html#sec:check-user-interr"><i class="fa fa-check"></i><b>12.2.7</b> Checking for user interrupts: <em>checkInterrupt</em></a></li>
<li class="chapter" data-level="12.2.8" data-path="cha-RCfunctions.html"><a href="cha-RCfunctions.html#optimization-optim-and-nimoptim"><i class="fa fa-check"></i><b>12.2.8</b> Optimization: <em>optim</em> and <em>nimOptim</em></a></li>
<li class="chapter" data-level="12.2.9" data-path="cha-RCfunctions.html"><a href="cha-RCfunctions.html#integration-integrate-and-nimintegrate"><i class="fa fa-check"></i><b>12.2.9</b> Integration: <em>integrate</em> and <em>nimIntegrate</em></a></li>
<li class="chapter" data-level="12.2.10" data-path="cha-RCfunctions.html"><a href="cha-RCfunctions.html#sec:altern-keyw-some"><i class="fa fa-check"></i><b>12.2.10</b> ‘nim’ synonyms for some functions</a></li>
</ul></li>
<li class="chapter" data-level="12.3" data-path="cha-RCfunctions.html"><a href="cha-RCfunctions.html#sec:how-nimble-handles"><i class="fa fa-check"></i><b>12.3</b> How NIMBLE handles types of variables</a>
<ul>
<li class="chapter" data-level="12.3.1" data-path="cha-RCfunctions.html"><a href="cha-RCfunctions.html#sec:nimbleList-RCFuns"><i class="fa fa-check"></i><b>12.3.1</b> nimbleList data structures</a></li>
<li class="chapter" data-level="12.3.2" data-path="cha-RCfunctions.html"><a href="cha-RCfunctions.html#sec:how-types-work"><i class="fa fa-check"></i><b>12.3.2</b> How numeric types work</a></li>
</ul></li>
<li class="chapter" data-level="12.4" data-path="cha-RCfunctions.html"><a href="cha-RCfunctions.html#sec:decl-argum-return"><i class="fa fa-check"></i><b>12.4</b> Declaring argument and return types</a></li>
<li class="chapter" data-level="12.5" data-path="cha-RCfunctions.html"><a href="cha-RCfunctions.html#sec:comp-nimbl-pass"><i class="fa fa-check"></i><b>12.5</b> Compiled nimbleFunctions pass arguments by reference</a></li>
<li class="chapter" data-level="12.6" data-path="cha-RCfunctions.html"><a href="cha-RCfunctions.html#sec:calling-external-code"><i class="fa fa-check"></i><b>12.6</b> Calling external compiled code</a></li>
<li class="chapter" data-level="12.7" data-path="cha-RCfunctions.html"><a href="cha-RCfunctions.html#sec:calling-R-code"><i class="fa fa-check"></i><b>12.7</b> Calling uncompiled R functions from compiled nimbleFunctions</a></li>
</ul></li>
<li class="chapter" data-level="13" data-path="cha-user-defined.html"><a href="cha-user-defined.html"><i class="fa fa-check"></i><b>13</b> Creating user-defined distributions and functions for models</a>
<ul>
<li class="chapter" data-level="13.1" data-path="cha-user-defined.html"><a href="cha-user-defined.html#sec:user-functions"><i class="fa fa-check"></i><b>13.1</b> User-defined functions</a></li>
<li class="chapter" data-level="13.2" data-path="cha-user-defined.html"><a href="cha-user-defined.html#sec:user-distributions"><i class="fa fa-check"></i><b>13.2</b> User-defined distributions</a>
<ul>
<li class="chapter" data-level="13.2.1" data-path="cha-user-defined.html"><a href="cha-user-defined.html#sec:registerDistributions"><i class="fa fa-check"></i><b>13.2.1</b> Using <em>registerDistributions</em> for alternative parameterizations and providing other information</a></li>
</ul></li>
<li class="chapter" data-level="13.3" data-path="cha-user-defined.html"><a href="cha-user-defined.html#sec:adv-user-def"><i class="fa fa-check"></i><b>13.3</b> Advanced user-defined functions and distributions</a></li>
<li class="chapter" data-level="13.4" data-path="cha-user-defined.html"><a href="cha-user-defined.html#sec:user-macros"><i class="fa fa-check"></i><b>13.4</b> User-defined model macros</a></li>
</ul></li>
<li class="chapter" data-level="14" data-path="cha-using-models.html"><a href="cha-using-models.html"><i class="fa fa-check"></i><b>14</b> Working with NIMBLE models</a>
<ul>
<li class="chapter" data-level="14.1" data-path="cha-using-models.html"><a href="cha-using-models.html#sec:accessing-variables"><i class="fa fa-check"></i><b>14.1</b> The variables and nodes in a NIMBLE model</a>
<ul>
<li class="chapter" data-level="14.1.1" data-path="cha-using-models.html"><a href="cha-using-models.html#sec:get-nodes"><i class="fa fa-check"></i><b>14.1.1</b> Determining the nodes in a model</a></li>
<li class="chapter" data-level="14.1.2" data-path="cha-using-models.html"><a href="cha-using-models.html#sec:introduced-nodes"><i class="fa fa-check"></i><b>14.1.2</b> Understanding lifted nodes</a></li>
<li class="chapter" data-level="14.1.3" data-path="cha-using-models.html"><a href="cha-using-models.html#sec:cdgetdependencies"><i class="fa fa-check"></i><b>14.1.3</b> Determining dependencies in a model</a></li>
</ul></li>
<li class="chapter" data-level="14.2" data-path="cha-using-models.html"><a href="cha-using-models.html#sec:nodeInfo"><i class="fa fa-check"></i><b>14.2</b> Accessing information about nodes and variables</a>
<ul>
<li class="chapter" data-level="14.2.1" data-path="cha-using-models.html"><a href="cha-using-models.html#getting-distributional-information-about-a-node"><i class="fa fa-check"></i><b>14.2.1</b> Getting distributional information about a node</a></li>
<li class="chapter" data-level="14.2.2" data-path="cha-using-models.html"><a href="cha-using-models.html#getting-information-about-a-distribution"><i class="fa fa-check"></i><b>14.2.2</b> Getting information about a distribution</a></li>
<li class="chapter" data-level="14.2.3" data-path="cha-using-models.html"><a href="cha-using-models.html#sec:getParam"><i class="fa fa-check"></i><b>14.2.3</b> Getting distribution parameter values for a node</a></li>
<li class="chapter" data-level="14.2.4" data-path="cha-using-models.html"><a href="cha-using-models.html#sec:getBound"><i class="fa fa-check"></i><b>14.2.4</b> Getting distribution bounds for a node</a></li>
</ul></li>
<li class="chapter" data-level="14.3" data-path="cha-using-models.html"><a href="cha-using-models.html#sec:cdcalc-cdsim-cdgetl"><i class="fa fa-check"></i><b>14.3</b> Carrying out model calculations</a>
<ul>
<li class="chapter" data-level="14.3.1" data-path="cha-using-models.html"><a href="cha-using-models.html#core-model-operations-calculation-and-simulation"><i class="fa fa-check"></i><b>14.3.1</b> Core model operations: calculation and simulation</a></li>
<li class="chapter" data-level="14.3.2" data-path="cha-using-models.html"><a href="cha-using-models.html#sec:cdsimn-cdcalcn-cdget"><i class="fa fa-check"></i><b>14.3.2</b> Pre-defined nimbleFunctions for operating on model nodes: <em>simNodes</em>, <em>calcNodes</em>, and <em>getLogProbNodes</em></a></li>
<li class="chapter" data-level="14.3.3" data-path="cha-using-models.html"><a href="cha-using-models.html#sec:access-log-prob"><i class="fa fa-check"></i><b>14.3.3</b> Accessing log probabilities via <em>logProb</em> variables</a></li>
</ul></li>
</ul></li>
<li class="chapter" data-level="15" data-path="cha-data-structures.html"><a href="cha-data-structures.html"><i class="fa fa-check"></i><b>15</b> Data structures in NIMBLE</a>
<ul>
<li class="chapter" data-level="15.1" data-path="cha-data-structures.html"><a href="cha-data-structures.html#sec:modelValues-struct"><i class="fa fa-check"></i><b>15.1</b> The modelValues data structure</a>
<ul>
<li class="chapter" data-level="15.1.1" data-path="cha-data-structures.html"><a href="cha-data-structures.html#creating-modelvalues-objects"><i class="fa fa-check"></i><b>15.1.1</b> Creating modelValues objects</a></li>
<li class="chapter" data-level="15.1.2" data-path="cha-data-structures.html"><a href="cha-data-structures.html#sec:access-cont-modelv"><i class="fa fa-check"></i><b>15.1.2</b> Accessing contents of modelValues</a></li>
</ul></li>
<li class="chapter" data-level="15.2" data-path="cha-data-structures.html"><a href="cha-data-structures.html#sec:nimbleLists"><i class="fa fa-check"></i><b>15.2</b> The nimbleList data structure</a>
<ul>
<li class="chapter" data-level="15.2.1" data-path="cha-data-structures.html"><a href="cha-data-structures.html#sec:predef-nimbleLists"><i class="fa fa-check"></i><b>15.2.1</b> Pre-defined nimbleList types</a></li>
<li class="chapter" data-level="15.2.2" data-path="cha-data-structures.html"><a href="cha-data-structures.html#sec:eigen-nimFunctions"><i class="fa fa-check"></i><b>15.2.2</b> Using <em>eigen</em> and <em>svd</em> in nimbleFunctions</a></li>
</ul></li>
</ul></li>
<li class="chapter" data-level="16" data-path="cha-progr-with-models.html"><a href="cha-progr-with-models.html"><i class="fa fa-check"></i><b>16</b> Writing nimbleFunctions to interact with models</a>
<ul>
<li class="chapter" data-level="16.1" data-path="cha-progr-with-models.html"><a href="cha-progr-with-models.html#sec:writ-nimble-funct"><i class="fa fa-check"></i><b>16.1</b> Overview</a></li>
<li class="chapter" data-level="16.2" data-path="cha-progr-with-models.html"><a href="cha-progr-with-models.html#sec:using-comp-nimbl"><i class="fa fa-check"></i><b>16.2</b> Using and compiling nimbleFunctions</a></li>
<li class="chapter" data-level="16.3" data-path="cha-progr-with-models.html"><a href="cha-progr-with-models.html#writing-setup-code"><i class="fa fa-check"></i><b>16.3</b> Writing setup code</a>
<ul>
<li class="chapter" data-level="16.3.1" data-path="cha-progr-with-models.html"><a href="cha-progr-with-models.html#useful-tools-for-setup-functions"><i class="fa fa-check"></i><b>16.3.1</b> Useful tools for setup functions</a></li>
<li class="chapter" data-level="16.3.2" data-path="cha-progr-with-models.html"><a href="cha-progr-with-models.html#sec:access-modify-numer"><i class="fa fa-check"></i><b>16.3.2</b> Accessing and modifying numeric values from setup</a></li>
<li class="chapter" data-level="16.3.3" data-path="cha-progr-with-models.html"><a href="cha-progr-with-models.html#determining-numeric-types-in-nimblefunctions"><i class="fa fa-check"></i><b>16.3.3</b> Determining numeric types in nimbleFunctions</a></li>
<li class="chapter" data-level="16.3.4" data-path="cha-progr-with-models.html"><a href="cha-progr-with-models.html#sec:determ-pers-texttts"><i class="fa fa-check"></i><b>16.3.4</b> Control of setup outputs</a></li>
</ul></li>
<li class="chapter" data-level="16.4" data-path="cha-progr-with-models.html"><a href="cha-progr-with-models.html#sec:nimble-lang-comp"><i class="fa fa-check"></i><b>16.4</b> Writing run code</a>
<ul>
<li class="chapter" data-level="16.4.1" data-path="cha-progr-with-models.html"><a href="cha-progr-with-models.html#sec:driv-models:-calc"><i class="fa fa-check"></i><b>16.4.1</b> Driving models: <em>calculate</em>, <em>calculateDiff</em>, <em>simulate</em>, <em>getLogProb</em></a></li>
<li class="chapter" data-level="16.4.2" data-path="cha-progr-with-models.html"><a href="cha-progr-with-models.html#getting-and-setting-variable-and-node-values"><i class="fa fa-check"></i><b>16.4.2</b> Getting and setting variable and node values</a></li>
<li class="chapter" data-level="16.4.3" data-path="cha-progr-with-models.html"><a href="cha-progr-with-models.html#getting-parameter-values-and-node-bounds"><i class="fa fa-check"></i><b>16.4.3</b> Getting parameter values and node bounds</a></li>
<li class="chapter" data-level="16.4.4" data-path="cha-progr-with-models.html"><a href="cha-progr-with-models.html#sec:access-model-modelv"><i class="fa fa-check"></i><b>16.4.4</b> Using modelValues objects</a></li>
<li class="chapter" data-level="16.4.5" data-path="cha-progr-with-models.html"><a href="cha-progr-with-models.html#sec:using-model-variable"><i class="fa fa-check"></i><b>16.4.5</b> Using model variables and modelValues in expressions</a></li>
<li class="chapter" data-level="16.4.6" data-path="cha-progr-with-models.html"><a href="cha-progr-with-models.html#sec:incl-other-meth"><i class="fa fa-check"></i><b>16.4.6</b> Including other methods in a nimbleFunction</a></li>
<li class="chapter" data-level="16.4.7" data-path="cha-progr-with-models.html"><a href="cha-progr-with-models.html#sec:using-other-nimbl"><i class="fa fa-check"></i><b>16.4.7</b> Using other nimbleFunctions</a></li>
<li class="chapter" data-level="16.4.8" data-path="cha-progr-with-models.html"><a href="cha-progr-with-models.html#sec:virt-nimbl-nimbl"><i class="fa fa-check"></i><b>16.4.8</b> Virtual nimbleFunctions and nimbleFunctionLists</a></li>
<li class="chapter" data-level="16.4.9" data-path="cha-progr-with-models.html"><a href="cha-progr-with-models.html#character-objects"><i class="fa fa-check"></i><b>16.4.9</b> Character objects</a></li>
<li class="chapter" data-level="16.4.10" data-path="cha-progr-with-models.html"><a href="cha-progr-with-models.html#sec:user-defined-data"><i class="fa fa-check"></i><b>16.4.10</b> User-defined data structures</a></li>
</ul></li>
<li class="chapter" data-level="16.5" data-path="cha-progr-with-models.html"><a href="cha-progr-with-models.html#sec:user-samplers"><i class="fa fa-check"></i><b>16.5</b> Example: writing user-defined samplers to extend NIMBLE’s MCMC engine</a>
<ul>
<li class="chapter" data-level="16.5.1" data-path="cha-progr-with-models.html"><a href="cha-progr-with-models.html#user-defined-samplers-and-posterior-predictive-nodes"><i class="fa fa-check"></i><b>16.5.1</b> User-defined samplers and posterior predictive nodes</a></li>
</ul></li>
<li class="chapter" data-level="16.6" data-path="cha-progr-with-models.html"><a href="cha-progr-with-models.html#copying-nimblefunctions-and-nimble-models"><i class="fa fa-check"></i><b>16.6</b> Copying nimbleFunctions (and NIMBLE models)</a></li>
<li class="chapter" data-level="16.7" data-path="cha-progr-with-models.html"><a href="cha-progr-with-models.html#sec:debugging"><i class="fa fa-check"></i><b>16.7</b> Debugging nimbleFunctions</a></li>
<li class="chapter" data-level="16.8" data-path="cha-progr-with-models.html"><a href="cha-progr-with-models.html#timing-nimblefunctions-with-run.time"><i class="fa fa-check"></i><b>16.8</b> Timing nimbleFunctions with <em>run.time</em></a></li>
<li class="chapter" data-level="16.9" data-path="cha-progr-with-models.html"><a href="cha-progr-with-models.html#clearing-and-unloading-compiled-objects"><i class="fa fa-check"></i><b>16.9</b> Clearing and unloading compiled objects</a></li>
<li class="chapter" data-level="16.10" data-path="cha-progr-with-models.html"><a href="cha-progr-with-models.html#reducing-memory-usage"><i class="fa fa-check"></i><b>16.10</b> Reducing memory usage</a></li>
</ul></li>
<li class="part"><span><b>V Automatic Derivatives in NIMBLE</b></span></li>
<li class="chapter" data-level="17" data-path="cha-AD.html"><a href="cha-AD.html"><i class="fa fa-check"></i><b>17</b> Automatic Derivatives</a>
<ul>
<li class="chapter" data-level="17.1" data-path="cha-AD.html"><a href="cha-AD.html#sec:use-derivs"><i class="fa fa-check"></i><b>17.1</b> How to turn on derivatives in a model</a></li>
<li class="chapter" data-level="17.2" data-path="cha-AD.html"><a href="cha-AD.html#sec:AD-user-def"><i class="fa fa-check"></i><b>17.2</b> How to support derivatives in user-defined functions and distributions</a></li>
<li class="chapter" data-level="17.3" data-path="cha-AD.html"><a href="cha-AD.html#what-operations-are-and-arent-supported-for-ad"><i class="fa fa-check"></i><b>17.3</b> What operations are and aren’t supported for AD</a></li>
<li class="chapter" data-level="17.4" data-path="cha-AD.html"><a href="cha-AD.html#basics-of-obtaining-derivatives-in-nimblefunctions"><i class="fa fa-check"></i><b>17.4</b> Basics of obtaining derivatives in <code>nimbleFunctions</code></a>
<ul>
<li class="chapter" data-level="17.4.1" data-path="cha-AD.html"><a href="cha-AD.html#checking-derivatives-with-uncompiled-execution"><i class="fa fa-check"></i><b>17.4.1</b> Checking derivatives with uncompiled execution</a></li>
<li class="chapter" data-level="17.4.2" data-path="cha-AD.html"><a href="cha-AD.html#sec:AD-holding-out"><i class="fa fa-check"></i><b>17.4.2</b> Holding some local variables out of derivative tracking</a></li>
<li class="chapter" data-level="17.4.3" data-path="cha-AD.html"><a href="cha-AD.html#sec:AD-multiple-NF"><i class="fa fa-check"></i><b>17.4.3</b> Using AD with multiple nimbleFunctions</a></li>
<li class="chapter" data-level="17.4.4" data-path="cha-AD.html"><a href="cha-AD.html#sec:understanding-more-AD"><i class="fa fa-check"></i><b>17.4.4</b> Understanding more about how AD works: <em>taping</em> of operations</a></li>
<li class="chapter" data-level="17.4.5" data-path="cha-AD.html"><a href="cha-AD.html#resetting-a-nimderivs-call"><i class="fa fa-check"></i><b>17.4.5</b> Resetting a <code>nimDerivs</code> call</a></li>
<li class="chapter" data-level="17.4.6" data-path="cha-AD.html"><a href="cha-AD.html#a-note-on-performance-benchmarking"><i class="fa fa-check"></i><b>17.4.6</b> A note on performance benchmarking</a></li>
</ul></li>
<li class="chapter" data-level="17.5" data-path="cha-AD.html"><a href="cha-AD.html#advanced-uses-double-taping"><i class="fa fa-check"></i><b>17.5</b> Advanced uses: double taping</a></li>
<li class="chapter" data-level="17.6" data-path="cha-AD.html"><a href="cha-AD.html#derivatives-involving-model-calculations"><i class="fa fa-check"></i><b>17.6</b> Derivatives involving model calculations</a>
<ul>
<li class="chapter" data-level="17.6.1" data-path="cha-AD.html"><a href="cha-AD.html#method-1-nimderivs-of-modelcalculate"><i class="fa fa-check"></i><b>17.6.1</b> Method 1: <code>nimDerivs</code> of <code>model$calculate</code></a></li>
<li class="chapter" data-level="17.6.2" data-path="cha-AD.html"><a href="cha-AD.html#method-2-nimderivs-of-a-method-that-calls-modelcalculate"><i class="fa fa-check"></i><b>17.6.2</b> Method 2: <code>nimDerivs</code> of a method that calls <code>model$calculate</code></a></li>
</ul></li>
<li class="chapter" data-level="17.7" data-path="cha-AD.html"><a href="cha-AD.html#sec:parameter-transform"><i class="fa fa-check"></i><b>17.7</b> Parameter transformations</a></li>
</ul></li>
<li class="chapter" data-level="18" data-path="example-maximum-likelihood-estimation-using-optim-with-gradients-from-nimderivs..html"><a href="example-maximum-likelihood-estimation-using-optim-with-gradients-from-nimderivs..html"><i class="fa fa-check"></i><b>18</b> Example: maximum likelihood estimation using <code>optim</code> with gradients from <code>nimDerivs</code>.</a></li>
<li class="chapter" data-level="" data-path="references.html"><a href="references.html"><i class="fa fa-check"></i>References</a></li>
</ul>
</nav>
</div>
<div class="book-body">
<div class="body-inner">
<div class="book-header" role="navigation">
<h1>
<i class="fa fa-circle-o-notch fa-spin"></i><a href="./"></a>
</h1>
</div>
<div class="page-wrapper" tabindex="-1" role="main">
<div class="page-inner">
<section class="normal" id="section-">
<div id="cha-algos-provided" class="section level1 hasAnchor" number="8">
<h1><span class="header-section-number">Chapter 8</span> Particle Filters, PMCMC, and MCEM<a href="cha-algos-provided.html#cha-algos-provided" class="anchor-section" aria-label="Anchor link to header"></a></h1>
<p>The NIMBLE algorithm library includes a growing set of non-MCMC algorithms, including likelihood-based algorithms. These include:</p>
<ul>
<li>A suite of sequential Monte Carlo (particle filtering) algorithms (particle filters, particle MCMC, iterated particle filter, and ensemble Kalman filter);</li>
<li>Monte Carlo expectation maximization (MCEM) for maximum likelihood estimation;</li>
<li>Laplace approximation and adaptive Gauss-Hermite quadrature (AGHQ) for maximum likelihood estimation of Laplace/AGHQ-approximated marginal likelihood; and</li>
<li>nested approximation of Bayesian models using INLA-like methods.</li>
</ul>
<p>In this chapter we discuss sequential Monte Carlo methods and MCEM and in the next chapter we discuss methods related to Laplace approximation.</p>
<div id="particle-filters-sequential-monte-carlo-and-iterated-filtering" class="section level2 hasAnchor" number="8.1">
<h2><span class="header-section-number">8.1</span> Particle filters / sequential Monte Carlo and iterated filtering<a href="cha-algos-provided.html#particle-filters-sequential-monte-carlo-and-iterated-filtering" class="anchor-section" aria-label="Anchor link to header"></a></h2>
<p>As of Version 0.10.0 of NIMBLE, all of NIMBLE’s sequential Monte Carlo/particle filtering functionality lives in the <code>nimbleSMC</code> package, described in <span class="citation">Michaud et al. (<a href="references.html#ref-Michaud_etal_2021">2021</a>)</span>. Please load this package before trying to use these algorithms.</p>
<div id="filtering-algorithms" class="section level3 hasAnchor" number="8.1.1">
<h3><span class="header-section-number">8.1.1</span> Filtering algorithms<a href="cha-algos-provided.html#filtering-algorithms" class="anchor-section" aria-label="Anchor link to header"></a></h3>
<p>NIMBLE includes algorithms for four different types of sequential Monte Carlo (also known as particle filters), which can be used to sample from the latent states and approximate the log likelihood of a state-space model. These include the bootstrap filter, the auxiliary particle filter, the Liu-West filter, and the ensemble Kalman filter. The iterated filtering version 2 (IF2) is a related method for maximum-likelihood estimation. Each of these is built with the eponymous functions <code>buildBootstrapFilter</code>, <code>buildAuxiliaryFilter</code>, <code>buildLiuWestFilter</code>, <code>buildEnsembleKF</code>, and <code>buildIteratedFilter2</code>. Each method requires setup arguments <code>model</code> and <code>nodes</code>; the latter should be a character vector specifying latent model nodes. In addition, each method can be customized using a <code>control</code> list argument. Details on the control options and specifics of the algorithms can be found in the help pages for the functions.</p>
<p>Once built, each filter can be run by specifying the number of particles. Each filter has a modelValues object named <code>mvEWSamples</code> that is populated with equally-weighted samples from the posterior distribution of the latent states (and in the case of the Liu-West filter, the posterior distribution of the top level parameters as well) as the filter is run. The bootstrap, auxiliary, and Liu-West filters, as well as the IF2 method, also have another modelValues object, <code>mvWSamples</code>. This has unequally-weighted samples from the posterior distribution of the latent states, along with weights for each particle. In addition, the bootstrap and auxiliary particle filters return estimates of the log-likelihood of the given state-space model.</p>
<p>We first create a linear state-space model to use as an example for our particle filter algorithms.</p>
<div class="sourceCode" id="cb249"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb249-1"><a href="cha-algos-provided.html#cb249-1" tabindex="-1"></a><span class="co"># Building a simple linear state-space model. </span></span>
<span id="cb249-2"><a href="cha-algos-provided.html#cb249-2" tabindex="-1"></a><span class="co"># x is latent space, y is observed data</span></span>
<span id="cb249-3"><a href="cha-algos-provided.html#cb249-3" tabindex="-1"></a>timeModelCode <span class="ot"><-</span> <span class="fu">nimbleCode</span>({</span>
<span id="cb249-4"><a href="cha-algos-provided.html#cb249-4" tabindex="-1"></a> x[<span class="dv">1</span>] <span class="sc">~</span> <span class="fu">dnorm</span>(mu_0, <span class="dv">1</span>)</span>
<span id="cb249-5"><a href="cha-algos-provided.html#cb249-5" tabindex="-1"></a> y[<span class="dv">1</span>] <span class="sc">~</span> <span class="fu">dnorm</span>(x[<span class="dv">1</span>], <span class="dv">1</span>)</span>
<span id="cb249-6"><a href="cha-algos-provided.html#cb249-6" tabindex="-1"></a> <span class="cf">for</span>(i <span class="cf">in</span> <span class="dv">2</span><span class="sc">:</span>t){</span>
<span id="cb249-7"><a href="cha-algos-provided.html#cb249-7" tabindex="-1"></a> x[i] <span class="sc">~</span> <span class="fu">dnorm</span>(x[i<span class="dv">-1</span>] <span class="sc">*</span> a <span class="sc">+</span> b, <span class="dv">1</span>)</span>
<span id="cb249-8"><a href="cha-algos-provided.html#cb249-8" tabindex="-1"></a> y[i] <span class="sc">~</span> <span class="fu">dnorm</span>(x[i] <span class="sc">*</span> c, <span class="dv">1</span>)</span>
<span id="cb249-9"><a href="cha-algos-provided.html#cb249-9" tabindex="-1"></a> }</span>
<span id="cb249-10"><a href="cha-algos-provided.html#cb249-10" tabindex="-1"></a> </span>
<span id="cb249-11"><a href="cha-algos-provided.html#cb249-11" tabindex="-1"></a> a <span class="sc">~</span> <span class="fu">dunif</span>(<span class="dv">0</span>, <span class="dv">1</span>)</span>
<span id="cb249-12"><a href="cha-algos-provided.html#cb249-12" tabindex="-1"></a> b <span class="sc">~</span> <span class="fu">dnorm</span>(<span class="dv">0</span>, <span class="dv">1</span>)</span>
<span id="cb249-13"><a href="cha-algos-provided.html#cb249-13" tabindex="-1"></a> c <span class="sc">~</span> <span class="fu">dnorm</span>(<span class="dv">1</span>,<span class="dv">1</span>)</span>
<span id="cb249-14"><a href="cha-algos-provided.html#cb249-14" tabindex="-1"></a> mu_0 <span class="sc">~</span> <span class="fu">dnorm</span>(<span class="dv">0</span>, <span class="dv">1</span>)</span>
<span id="cb249-15"><a href="cha-algos-provided.html#cb249-15" tabindex="-1"></a>})</span>
<span id="cb249-16"><a href="cha-algos-provided.html#cb249-16" tabindex="-1"></a></span>
<span id="cb249-17"><a href="cha-algos-provided.html#cb249-17" tabindex="-1"></a><span class="co"># simulate some data</span></span>
<span id="cb249-18"><a href="cha-algos-provided.html#cb249-18" tabindex="-1"></a>t <span class="ot"><-</span> <span class="dv">25</span>; mu_0 <span class="ot"><-</span> <span class="dv">1</span></span>
<span id="cb249-19"><a href="cha-algos-provided.html#cb249-19" tabindex="-1"></a>x <span class="ot"><-</span> <span class="fu">rnorm</span>(<span class="dv">1</span> ,mu_0, <span class="dv">1</span>)</span>
<span id="cb249-20"><a href="cha-algos-provided.html#cb249-20" tabindex="-1"></a>y <span class="ot"><-</span> <span class="fu">rnorm</span>(<span class="dv">1</span>, x, <span class="dv">1</span>)</span>
<span id="cb249-21"><a href="cha-algos-provided.html#cb249-21" tabindex="-1"></a>a <span class="ot"><-</span> <span class="fl">0.5</span>; b <span class="ot"><-</span> <span class="dv">1</span>; c <span class="ot"><-</span> <span class="dv">1</span></span>
<span id="cb249-22"><a href="cha-algos-provided.html#cb249-22" tabindex="-1"></a><span class="cf">for</span>(i <span class="cf">in</span> <span class="dv">2</span><span class="sc">:</span>t){</span>
<span id="cb249-23"><a href="cha-algos-provided.html#cb249-23" tabindex="-1"></a> x[i] <span class="ot"><-</span> <span class="fu">rnorm</span>(<span class="dv">1</span>, x[i<span class="dv">-1</span>] <span class="sc">*</span> a <span class="sc">+</span> b, <span class="dv">1</span>)</span>
<span id="cb249-24"><a href="cha-algos-provided.html#cb249-24" tabindex="-1"></a> y[i] <span class="ot"><-</span> <span class="fu">rnorm</span>(<span class="dv">1</span>, x[i] <span class="sc">*</span> c, <span class="dv">1</span>)</span>
<span id="cb249-25"><a href="cha-algos-provided.html#cb249-25" tabindex="-1"></a>}</span>
<span id="cb249-26"><a href="cha-algos-provided.html#cb249-26" tabindex="-1"></a></span>
<span id="cb249-27"><a href="cha-algos-provided.html#cb249-27" tabindex="-1"></a><span class="co"># build the model</span></span>
<span id="cb249-28"><a href="cha-algos-provided.html#cb249-28" tabindex="-1"></a>rTimeModel <span class="ot"><-</span> <span class="fu">nimbleModel</span>(timeModelCode, <span class="at">constants =</span> <span class="fu">list</span>(<span class="at">t =</span> t), </span>
<span id="cb249-29"><a href="cha-algos-provided.html#cb249-29" tabindex="-1"></a> data <span class="ot"><-</span> <span class="fu">list</span>(<span class="at">y =</span> y), <span class="at">check =</span> <span class="cn">FALSE</span> )</span>
<span id="cb249-30"><a href="cha-algos-provided.html#cb249-30" tabindex="-1"></a></span>
<span id="cb249-31"><a href="cha-algos-provided.html#cb249-31" tabindex="-1"></a><span class="co"># Set parameter values and compile the model</span></span>
<span id="cb249-32"><a href="cha-algos-provided.html#cb249-32" tabindex="-1"></a>rTimeModel<span class="sc">$</span>a <span class="ot"><-</span> <span class="fl">0.5</span></span>
<span id="cb249-33"><a href="cha-algos-provided.html#cb249-33" tabindex="-1"></a>rTimeModel<span class="sc">$</span>b <span class="ot"><-</span> <span class="dv">1</span></span>
<span id="cb249-34"><a href="cha-algos-provided.html#cb249-34" tabindex="-1"></a>rTimeModel<span class="sc">$</span>c <span class="ot"><-</span> <span class="dv">1</span></span>
<span id="cb249-35"><a href="cha-algos-provided.html#cb249-35" tabindex="-1"></a>rTimeModel<span class="sc">$</span>mu_0 <span class="ot"><-</span> <span class="dv">1</span></span>
<span id="cb249-36"><a href="cha-algos-provided.html#cb249-36" tabindex="-1"></a></span>
<span id="cb249-37"><a href="cha-algos-provided.html#cb249-37" tabindex="-1"></a>cTimeModel <span class="ot"><-</span> <span class="fu">compileNimble</span>(rTimeModel)</span></code></pre></div>
<div id="bootstrap-filter" class="section level4 hasAnchor" number="8.1.1.1">
<h4><span class="header-section-number">8.1.1.1</span> Bootstrap filter<a href="cha-algos-provided.html#bootstrap-filter" class="anchor-section" aria-label="Anchor link to header"></a></h4>
<p>Here is an example of building and running the bootstrap filter.</p>
<div class="sourceCode" id="cb250"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb250-1"><a href="cha-algos-provided.html#cb250-1" tabindex="-1"></a><span class="co"># Build bootstrap filter</span></span>
<span id="cb250-2"><a href="cha-algos-provided.html#cb250-2" tabindex="-1"></a>rBootF <span class="ot"><-</span> <span class="fu">buildBootstrapFilter</span>(rTimeModel, <span class="st">"x"</span>, </span>
<span id="cb250-3"><a href="cha-algos-provided.html#cb250-3" tabindex="-1"></a> <span class="at">control =</span> <span class="fu">list</span>(<span class="at">thresh =</span> <span class="fl">0.8</span>, <span class="at">saveAll =</span> <span class="cn">TRUE</span>, </span>
<span id="cb250-4"><a href="cha-algos-provided.html#cb250-4" tabindex="-1"></a> <span class="at">smoothing =</span> <span class="cn">FALSE</span>))</span>
<span id="cb250-5"><a href="cha-algos-provided.html#cb250-5" tabindex="-1"></a><span class="co"># Compile filter </span></span>
<span id="cb250-6"><a href="cha-algos-provided.html#cb250-6" tabindex="-1"></a>cBootF <span class="ot"><-</span> <span class="fu">compileNimble</span>(rBootF,<span class="at">project =</span> rTimeModel)</span>
<span id="cb250-7"><a href="cha-algos-provided.html#cb250-7" tabindex="-1"></a><span class="co"># Set number of particles</span></span>
<span id="cb250-8"><a href="cha-algos-provided.html#cb250-8" tabindex="-1"></a>parNum <span class="ot"><-</span> <span class="dv">5000</span></span>
<span id="cb250-9"><a href="cha-algos-provided.html#cb250-9" tabindex="-1"></a><span class="co"># Run bootstrap filter, which returns estimate of model log-likelihood</span></span>
<span id="cb250-10"><a href="cha-algos-provided.html#cb250-10" tabindex="-1"></a>bootLLEst <span class="ot"><-</span> cBootF<span class="sc">$</span><span class="fu">run</span>(parNum)</span>
<span id="cb250-11"><a href="cha-algos-provided.html#cb250-11" tabindex="-1"></a><span class="co"># The bootstrap filter can also return an estimate of the effective </span></span>
<span id="cb250-12"><a href="cha-algos-provided.html#cb250-12" tabindex="-1"></a><span class="co"># sample size (ESS) at each time point</span></span>
<span id="cb250-13"><a href="cha-algos-provided.html#cb250-13" tabindex="-1"></a>bootESS <span class="ot"><-</span> cBootF<span class="sc">$</span><span class="fu">returnESS</span>()</span></code></pre></div>
</div>
<div id="auxiliary-particle-filter" class="section level4 hasAnchor" number="8.1.1.2">
<h4><span class="header-section-number">8.1.1.2</span> Auxiliary particle filter<a href="cha-algos-provided.html#auxiliary-particle-filter" class="anchor-section" aria-label="Anchor link to header"></a></h4>
<p>Next, we provide an example of building and running the auxiliary particle filter. Note that a filter cannot be built on a model that already has a filter specialized to it, so we create a new copy of our state space model first.</p>
<div class="sourceCode" id="cb251"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb251-1"><a href="cha-algos-provided.html#cb251-1" tabindex="-1"></a><span class="co"># Copy our state-space model for use with the auxiliary filter</span></span>
<span id="cb251-2"><a href="cha-algos-provided.html#cb251-2" tabindex="-1"></a>auxTimeModel <span class="ot"><-</span> rTimeModel<span class="sc">$</span><span class="fu">newModel</span>(<span class="at">replicate =</span> <span class="cn">TRUE</span>)</span>
<span id="cb251-3"><a href="cha-algos-provided.html#cb251-3" tabindex="-1"></a><span class="fu">compileNimble</span>(auxTimeModel)</span>
<span id="cb251-4"><a href="cha-algos-provided.html#cb251-4" tabindex="-1"></a><span class="co"># Build auxiliary filter</span></span>
<span id="cb251-5"><a href="cha-algos-provided.html#cb251-5" tabindex="-1"></a>rAuxF <span class="ot"><-</span> <span class="fu">buildAuxiliaryFilter</span>(auxTimeModel, <span class="st">"x"</span>, </span>
<span id="cb251-6"><a href="cha-algos-provided.html#cb251-6" tabindex="-1"></a> <span class="at">control =</span> <span class="fu">list</span>(<span class="at">thresh =</span> <span class="fl">0.5</span>, <span class="at">saveAll =</span> <span class="cn">TRUE</span>))</span>
<span id="cb251-7"><a href="cha-algos-provided.html#cb251-7" tabindex="-1"></a><span class="co"># Compile filter </span></span>
<span id="cb251-8"><a href="cha-algos-provided.html#cb251-8" tabindex="-1"></a>cAuxF <span class="ot"><-</span> <span class="fu">compileNimble</span>(rAuxF,<span class="at">project =</span> auxTimeModel)</span>
<span id="cb251-9"><a href="cha-algos-provided.html#cb251-9" tabindex="-1"></a><span class="co"># Run auxiliary filter, which returns estimate of model log-likelihood</span></span>
<span id="cb251-10"><a href="cha-algos-provided.html#cb251-10" tabindex="-1"></a>auxLLEst <span class="ot"><-</span> cAuxF<span class="sc">$</span><span class="fu">run</span>(parNum)</span>
<span id="cb251-11"><a href="cha-algos-provided.html#cb251-11" tabindex="-1"></a><span class="co"># The auxiliary filter can also return an estimate of the effective </span></span>
<span id="cb251-12"><a href="cha-algos-provided.html#cb251-12" tabindex="-1"></a><span class="co"># sample size (ESS) at each time point</span></span>
<span id="cb251-13"><a href="cha-algos-provided.html#cb251-13" tabindex="-1"></a>auxESS <span class="ot"><-</span> cAuxF<span class="sc">$</span><span class="fu">returnESS</span>()</span></code></pre></div>
</div>
<div id="liu-and-west-filter" class="section level4 hasAnchor" number="8.1.1.3">
<h4><span class="header-section-number">8.1.1.3</span> Liu and West filter<a href="cha-algos-provided.html#liu-and-west-filter" class="anchor-section" aria-label="Anchor link to header"></a></h4>
<p>Now we give an example of building and running the Liu and West filter, which can sample from the posterior distribution of top-level parameters as well as latent states. Note that the Liu-West filter ofen performs poorly and is provided primarily for didactic purposes. The Liu and West filter accepts an additional <code>params</code> argument, specifying the top-level parameters to be sampled.</p>
<div class="sourceCode" id="cb252"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb252-1"><a href="cha-algos-provided.html#cb252-1" tabindex="-1"></a><span class="co"># Copy model</span></span>
<span id="cb252-2"><a href="cha-algos-provided.html#cb252-2" tabindex="-1"></a>LWTimeModel <span class="ot"><-</span> rTimeModel<span class="sc">$</span><span class="fu">newModel</span>(<span class="at">replicate =</span> <span class="cn">TRUE</span>)</span>
<span id="cb252-3"><a href="cha-algos-provided.html#cb252-3" tabindex="-1"></a><span class="fu">compileNimble</span>(LWTimeModel)</span>
<span id="cb252-4"><a href="cha-algos-provided.html#cb252-4" tabindex="-1"></a><span class="co"># Build Liu-West filter, also </span></span>
<span id="cb252-5"><a href="cha-algos-provided.html#cb252-5" tabindex="-1"></a><span class="co"># specifying which top level parameters to estimate</span></span>
<span id="cb252-6"><a href="cha-algos-provided.html#cb252-6" tabindex="-1"></a>rLWF <span class="ot"><-</span> <span class="fu">buildLiuWestFilter</span>(LWTimeModel, <span class="st">"x"</span>, <span class="at">params =</span> <span class="fu">c</span>(<span class="st">"a"</span>, <span class="st">"b"</span>, <span class="st">"c"</span>),</span>
<span id="cb252-7"><a href="cha-algos-provided.html#cb252-7" tabindex="-1"></a> <span class="at">control =</span> <span class="fu">list</span>(<span class="at">saveAll =</span> <span class="cn">FALSE</span>)) </span></code></pre></div>
<pre><code>## Warning in buildLiuWestFilter(LWTimeModel, "x", params = c("a", "b", "c"), :
## The Liu-West filter ofen performs poorly and is provided primarily for didactic
## purposes.</code></pre>
<div class="sourceCode" id="cb254"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb254-1"><a href="cha-algos-provided.html#cb254-1" tabindex="-1"></a><span class="co"># Compile filter </span></span>
<span id="cb254-2"><a href="cha-algos-provided.html#cb254-2" tabindex="-1"></a>cLWF <span class="ot"><-</span> <span class="fu">compileNimble</span>(rLWF,<span class="at">project =</span> LWTimeModel)</span>
<span id="cb254-3"><a href="cha-algos-provided.html#cb254-3" tabindex="-1"></a><span class="co"># Run Liu-West filter</span></span>
<span id="cb254-4"><a href="cha-algos-provided.html#cb254-4" tabindex="-1"></a>cLWF<span class="sc">$</span><span class="fu">run</span>(parNum)</span></code></pre></div>
</div>
<div id="ensemble-kalman-filter" class="section level4 hasAnchor" number="8.1.1.4">
<h4><span class="header-section-number">8.1.1.4</span> Ensemble Kalman filter<a href="cha-algos-provided.html#ensemble-kalman-filter" class="anchor-section" aria-label="Anchor link to header"></a></h4>
<p>Next we give an example of building and running the ensemble Kalman filter, which can sample from the posterior distribution of latent states.</p>
<div class="sourceCode" id="cb255"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb255-1"><a href="cha-algos-provided.html#cb255-1" tabindex="-1"></a><span class="co"># Copy model</span></span>
<span id="cb255-2"><a href="cha-algos-provided.html#cb255-2" tabindex="-1"></a>ENKFTimeModel <span class="ot"><-</span> rTimeModel<span class="sc">$</span><span class="fu">newModel</span>(<span class="at">replicate =</span> <span class="cn">TRUE</span>)</span>
<span id="cb255-3"><a href="cha-algos-provided.html#cb255-3" tabindex="-1"></a><span class="fu">compileNimble</span>(ENKFTimeModel)</span>
<span id="cb255-4"><a href="cha-algos-provided.html#cb255-4" tabindex="-1"></a><span class="co"># Build and compile ensemble Kalman filter</span></span>
<span id="cb255-5"><a href="cha-algos-provided.html#cb255-5" tabindex="-1"></a>rENKF <span class="ot"><-</span> <span class="fu">buildEnsembleKF</span>(ENKFTimeModel, <span class="st">"x"</span>,</span>
<span id="cb255-6"><a href="cha-algos-provided.html#cb255-6" tabindex="-1"></a> <span class="at">control =</span> <span class="fu">list</span>(<span class="at">saveAll =</span> <span class="cn">FALSE</span>)) </span>
<span id="cb255-7"><a href="cha-algos-provided.html#cb255-7" tabindex="-1"></a>cENKF <span class="ot"><-</span> <span class="fu">compileNimble</span>(rENKF,<span class="at">project =</span> ENKFTimeModel)</span>
<span id="cb255-8"><a href="cha-algos-provided.html#cb255-8" tabindex="-1"></a><span class="co"># Run ensemble Kalman filter</span></span>
<span id="cb255-9"><a href="cha-algos-provided.html#cb255-9" tabindex="-1"></a>cENKF<span class="sc">$</span><span class="fu">run</span>(parNum)</span></code></pre></div>
<p>Once each filter has been run, we can extract samples from the posterior distribution of our latent states as follows:</p>
<div class="sourceCode" id="cb256"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb256-1"><a href="cha-algos-provided.html#cb256-1" tabindex="-1"></a><span class="co"># Equally-weighted samples (available from all filters)</span></span>
<span id="cb256-2"><a href="cha-algos-provided.html#cb256-2" tabindex="-1"></a>bootEWSamp <span class="ot"><-</span> <span class="fu">as.matrix</span>(cBootF<span class="sc">$</span>mvEWSamples) <span class="co"># alternative: as.list</span></span>
<span id="cb256-3"><a href="cha-algos-provided.html#cb256-3" tabindex="-1"></a>auxEWSamp <span class="ot"><-</span> <span class="fu">as.matrix</span>(cAuxF<span class="sc">$</span>mvEWSamples)</span>
<span id="cb256-4"><a href="cha-algos-provided.html#cb256-4" tabindex="-1"></a>LWFEWSamp <span class="ot"><-</span> <span class="fu">as.matrix</span>(cLWF<span class="sc">$</span>mvEWSamples)</span>
<span id="cb256-5"><a href="cha-algos-provided.html#cb256-5" tabindex="-1"></a>ENKFEWSamp <span class="ot"><-</span> <span class="fu">as.matrix</span>(cENKF<span class="sc">$</span>mvEWSamples)</span>
<span id="cb256-6"><a href="cha-algos-provided.html#cb256-6" tabindex="-1"></a></span>
<span id="cb256-7"><a href="cha-algos-provided.html#cb256-7" tabindex="-1"></a><span class="co"># Unequally-weighted samples, along with weights (available </span></span>
<span id="cb256-8"><a href="cha-algos-provided.html#cb256-8" tabindex="-1"></a><span class="co"># from bootstrap, auxiliary, and Liu and West filters)</span></span>
<span id="cb256-9"><a href="cha-algos-provided.html#cb256-9" tabindex="-1"></a>bootWSamp <span class="ot"><-</span> <span class="fu">as.matrix</span>(cBootF<span class="sc">$</span>mvWSamples, <span class="st">"x"</span>)</span>
<span id="cb256-10"><a href="cha-algos-provided.html#cb256-10" tabindex="-1"></a>bootWts <span class="ot"><-</span> <span class="fu">as.matrix</span>(cBootF<span class="sc">$</span>mvWSamples, <span class="st">"wts"</span>)</span>
<span id="cb256-11"><a href="cha-algos-provided.html#cb256-11" tabindex="-1"></a>auxWSamp <span class="ot"><-</span> <span class="fu">as.matrix</span>(xAuxF<span class="sc">$</span>mvWSamples, <span class="st">"x"</span>)</span>
<span id="cb256-12"><a href="cha-algos-provided.html#cb256-12" tabindex="-1"></a>auxWts <span class="ot"><-</span> <span class="fu">as.matrix</span>(cAuxF<span class="sc">$</span>mvWSamples, <span class="st">"wts"</span>)</span>
<span id="cb256-13"><a href="cha-algos-provided.html#cb256-13" tabindex="-1"></a></span>
<span id="cb256-14"><a href="cha-algos-provided.html#cb256-14" tabindex="-1"></a><span class="co"># Liu and West filter also returns samples </span></span>
<span id="cb256-15"><a href="cha-algos-provided.html#cb256-15" tabindex="-1"></a><span class="co"># from posterior distribution of top-level parameters:</span></span>
<span id="cb256-16"><a href="cha-algos-provided.html#cb256-16" tabindex="-1"></a>aEWSamp <span class="ot"><-</span> <span class="fu">as.matrix</span>(cLWF<span class="sc">$</span>mvEWSamples, <span class="st">"a"</span>)</span></code></pre></div>
</div>
<div id="iterated-filtering-2-if2" class="section level4 hasAnchor" number="8.1.1.5">
<h4><span class="header-section-number">8.1.1.5</span> Iterated filtering 2 (IF2)<a href="cha-algos-provided.html#iterated-filtering-2-if2" class="anchor-section" aria-label="Anchor link to header"></a></h4>
<p>The IF2 method <span class="citation">(<a href="references.html#ref-Ionides_etal_2015">Ionides et al. 2015</a>)</span> accomplishes maximum likelihood estimation using a scheme wherein both latent states and parameters are represented by particles that are weighted and resampled during the iterations. Iterations include perturbations to the parameter particles following a schedule of decreasing magnitude to yield convergence to the MLE.</p>
<p>Here we apply IF2 to Nile River flow data, specifying a changepoint in the year the Aswan Dam was constructed, as the dam altered river flows.</p>
<div class="sourceCode" id="cb257"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb257-1"><a href="cha-algos-provided.html#cb257-1" tabindex="-1"></a><span class="fu">library</span>(FKF)</span>
<span id="cb257-2"><a href="cha-algos-provided.html#cb257-2" tabindex="-1"></a></span>
<span id="cb257-3"><a href="cha-algos-provided.html#cb257-3" tabindex="-1"></a>flowCode <span class="ot"><-</span> <span class="fu">nimbleCode</span>({</span>
<span id="cb257-4"><a href="cha-algos-provided.html#cb257-4" tabindex="-1"></a> <span class="cf">for</span>(t <span class="cf">in</span> <span class="dv">1</span><span class="sc">:</span>n)</span>
<span id="cb257-5"><a href="cha-algos-provided.html#cb257-5" tabindex="-1"></a> y[t] <span class="sc">~</span> <span class="fu">dnorm</span>(x[t], <span class="at">sd =</span> sigmaMeasurements)</span>
<span id="cb257-6"><a href="cha-algos-provided.html#cb257-6" tabindex="-1"></a> x[<span class="dv">1</span>] <span class="sc">~</span> <span class="fu">dnorm</span>(x0, <span class="at">sd =</span> sigmaInnovations) </span>
<span id="cb257-7"><a href="cha-algos-provided.html#cb257-7" tabindex="-1"></a> <span class="cf">for</span>(t <span class="cf">in</span> <span class="dv">2</span><span class="sc">:</span>n)</span>
<span id="cb257-8"><a href="cha-algos-provided.html#cb257-8" tabindex="-1"></a> x[t] <span class="sc">~</span> <span class="fu">dnorm</span>((t<span class="dv">-1</span><span class="sc">==</span><span class="dv">28</span>)<span class="sc">*</span>meanShift1899 <span class="sc">+</span> x[t<span class="dv">-1</span>], <span class="at">sd =</span> sigmaInnovations)</span>
<span id="cb257-9"><a href="cha-algos-provided.html#cb257-9" tabindex="-1"></a> logSigmaInnovations <span class="sc">~</span> <span class="fu">dnorm</span>(<span class="dv">0</span>, <span class="at">sd =</span> <span class="dv">100</span>)</span>
<span id="cb257-10"><a href="cha-algos-provided.html#cb257-10" tabindex="-1"></a> logSigmaMeasurements <span class="sc">~</span> <span class="fu">dnorm</span>(<span class="dv">0</span>, <span class="at">sd =</span> <span class="dv">100</span>)</span>
<span id="cb257-11"><a href="cha-algos-provided.html#cb257-11" tabindex="-1"></a> sigmaInnovations <span class="ot"><-</span> <span class="fu">exp</span>(logSigmaInnovations)</span>
<span id="cb257-12"><a href="cha-algos-provided.html#cb257-12" tabindex="-1"></a> sigmaMeasurements <span class="ot"><-</span> <span class="fu">exp</span>(logSigmaMeasurements)</span>
<span id="cb257-13"><a href="cha-algos-provided.html#cb257-13" tabindex="-1"></a> x0 <span class="sc">~</span> <span class="fu">dnorm</span>(<span class="dv">1120</span>, <span class="at">var =</span> <span class="dv">100</span>)</span>
<span id="cb257-14"><a href="cha-algos-provided.html#cb257-14" tabindex="-1"></a> meanShift1899 <span class="sc">~</span> <span class="fu">dnorm</span>(<span class="dv">0</span>, <span class="at">sd =</span> <span class="dv">100</span>)</span>
<span id="cb257-15"><a href="cha-algos-provided.html#cb257-15" tabindex="-1"></a>})</span>
<span id="cb257-16"><a href="cha-algos-provided.html#cb257-16" tabindex="-1"></a></span>
<span id="cb257-17"><a href="cha-algos-provided.html#cb257-17" tabindex="-1"></a>flowModel <span class="ot"><-</span> <span class="fu">nimbleModel</span>(flowCode, <span class="at">data =</span> <span class="fu">list</span>(<span class="at">y =</span> Nile),</span>
<span id="cb257-18"><a href="cha-algos-provided.html#cb257-18" tabindex="-1"></a> <span class="at">constants =</span> <span class="fu">list</span>(<span class="at">n =</span> <span class="fu">length</span>(Nile)),</span>
<span id="cb257-19"><a href="cha-algos-provided.html#cb257-19" tabindex="-1"></a> <span class="at">inits =</span> <span class="fu">list</span>(<span class="at">logSigmaInnovations =</span> <span class="fu">log</span>(<span class="fu">sd</span>(Nile)),</span>
<span id="cb257-20"><a href="cha-algos-provided.html#cb257-20" tabindex="-1"></a> <span class="at">logSigmaMeasurements =</span> <span class="fu">log</span>(<span class="fu">sd</span>(Nile)),</span>
<span id="cb257-21"><a href="cha-algos-provided.html#cb257-21" tabindex="-1"></a> <span class="at">meanShift1899 =</span> <span class="sc">-</span><span class="dv">100</span>))</span></code></pre></div>
<p>Note that the prior distributions for the parameters are not used by IF2, except possibly to obtain boundaries of valid parameter values (not the case here).</p>
<p>Now we build the filter, specifying user-controlled standard deviations (in this case the same as the perturbation <code>sigma</code> values) for use in generating the initial particles for the parameters via the <code>control</code> list.</p>
<div class="sourceCode" id="cb258"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb258-1"><a href="cha-algos-provided.html#cb258-1" tabindex="-1"></a>filter <span class="ot"><-</span> <span class="fu">buildIteratedFilter2</span>(<span class="at">model =</span> flowModel,</span>
<span id="cb258-2"><a href="cha-algos-provided.html#cb258-2" tabindex="-1"></a> <span class="at">nodes =</span> <span class="st">'x'</span>,</span>
<span id="cb258-3"><a href="cha-algos-provided.html#cb258-3" tabindex="-1"></a> <span class="at">params =</span> <span class="fu">c</span>(<span class="st">'logSigmaInnovations'</span>,</span>
<span id="cb258-4"><a href="cha-algos-provided.html#cb258-4" tabindex="-1"></a> <span class="st">'logSigmaMeasurements'</span>,</span>
<span id="cb258-5"><a href="cha-algos-provided.html#cb258-5" tabindex="-1"></a> <span class="st">'meanShift1899'</span>),</span>
<span id="cb258-6"><a href="cha-algos-provided.html#cb258-6" tabindex="-1"></a> <span class="at">baselineNode =</span> <span class="st">'x0'</span>,</span>
<span id="cb258-7"><a href="cha-algos-provided.html#cb258-7" tabindex="-1"></a> <span class="at">control =</span> <span class="fu">list</span>(<span class="at">sigma =</span> <span class="fu">c</span>(<span class="fl">0.1</span>, <span class="fl">0.1</span>, <span class="dv">5</span>),</span>
<span id="cb258-8"><a href="cha-algos-provided.html#cb258-8" tabindex="-1"></a> <span class="at">initParamSigma =</span> <span class="fu">c</span>(<span class="fl">0.1</span>, <span class="fl">0.1</span>, <span class="dv">5</span>)))</span>
<span id="cb258-9"><a href="cha-algos-provided.html#cb258-9" tabindex="-1"></a>cFlowModel <span class="ot"><-</span> <span class="fu">compileNimble</span>(flowModel)</span>
<span id="cb258-10"><a href="cha-algos-provided.html#cb258-10" tabindex="-1"></a>cFilter <span class="ot"><-</span> <span class="fu">compileNimble</span>(filter, <span class="at">project =</span> flowModel)</span></code></pre></div>
<p>We now run the algorithm with 1000 particles for 100 iterations with the schedule parameter equal to 0.2.</p>
<p>In addition to the estimates, we can extract the values of the log-likelihood, the estimates and the standard deviation of the parameter particles as they evolve over the iterations, in order to assess convergence.</p>
<div class="sourceCode" id="cb259"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb259-1"><a href="cha-algos-provided.html#cb259-1" tabindex="-1"></a><span class="fu">set.seed</span>(<span class="dv">1</span>)</span>
<span id="cb259-2"><a href="cha-algos-provided.html#cb259-2" tabindex="-1"></a>est <span class="ot"><-</span> cFilter<span class="sc">$</span><span class="fu">run</span>(<span class="at">m =</span> <span class="dv">1000</span>, <span class="at">niter =</span> <span class="dv">100</span>, <span class="at">alpha =</span> <span class="fl">0.2</span>)</span>
<span id="cb259-3"><a href="cha-algos-provided.html#cb259-3" tabindex="-1"></a></span>
<span id="cb259-4"><a href="cha-algos-provided.html#cb259-4" tabindex="-1"></a>cFilter<span class="sc">$</span>estimates[<span class="dv">95</span><span class="sc">:</span><span class="dv">100</span>,] <span class="do">## Last 5 iterations of parameter values</span></span></code></pre></div>
<pre><code>## [,1] [,2] [,3]
## [1,] 0.013306153 4.822613 -269.7837
## [2,] -0.013961938 4.857470 -271.4965
## [3,] 0.002183997 4.850475 -271.1919
## [4,] 0.015598044 4.851961 -272.3889
## [5,] -0.005571944 4.842719 -272.6390
## [6,] 0.042982317 4.837347 -271.1800</code></pre>
<div class="sourceCode" id="cb261"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb261-1"><a href="cha-algos-provided.html#cb261-1" tabindex="-1"></a>cFilter<span class="sc">$</span>logLik[<span class="dv">90</span><span class="sc">:</span><span class="dv">100</span>] <span class="do">## Last 5 iterations of log likelihood values</span></span></code></pre></div>
<pre><code>## [1] -627.0497 -626.9570 -626.9856 -626.9954 -626.7448 -626.7521 -626.8472
## [8] -626.7398 -626.9869 -627.1354 -626.6648</code></pre>
<p>Comparing to use of the the Kalman Filter from the FKF package, we see the log-likelihood is fairly similar:</p>
<div class="sourceCode" id="cb263"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb263-1"><a href="cha-algos-provided.html#cb263-1" tabindex="-1"></a>dtpred <span class="ot"><-</span> <span class="fu">matrix</span>(<span class="dv">0</span>, <span class="at">ncol =</span> <span class="fu">length</span>(Nile))</span>
<span id="cb263-2"><a href="cha-algos-provided.html#cb263-2" tabindex="-1"></a>dtpred[<span class="dv">28</span>] <span class="ot"><-</span> est[<span class="dv">3</span>]</span>
<span id="cb263-3"><a href="cha-algos-provided.html#cb263-3" tabindex="-1"></a>ct <span class="ot"><-</span> <span class="fu">matrix</span>(<span class="dv">0</span>)</span>
<span id="cb263-4"><a href="cha-algos-provided.html#cb263-4" tabindex="-1"></a>Zt <span class="ot"><-</span> Tt <span class="ot"><-</span> <span class="fu">matrix</span>(<span class="dv">1</span>)</span>
<span id="cb263-5"><a href="cha-algos-provided.html#cb263-5" tabindex="-1"></a></span>
<span id="cb263-6"><a href="cha-algos-provided.html#cb263-6" tabindex="-1"></a>fkfResult <span class="ot"><-</span> <span class="fu">fkf</span>(<span class="at">HHt =</span> <span class="fu">matrix</span>(<span class="fu">exp</span>(<span class="dv">2</span><span class="sc">*</span>est[<span class="dv">1</span>])),</span>
<span id="cb263-7"><a href="cha-algos-provided.html#cb263-7" tabindex="-1"></a> <span class="at">GGt =</span> <span class="fu">matrix</span>(<span class="fu">exp</span>(<span class="dv">2</span><span class="sc">*</span>est[<span class="dv">2</span>])),</span>
<span id="cb263-8"><a href="cha-algos-provided.html#cb263-8" tabindex="-1"></a> <span class="at">yt =</span> <span class="fu">rbind</span>(Nile),</span>
<span id="cb263-9"><a href="cha-algos-provided.html#cb263-9" tabindex="-1"></a> <span class="at">a0 =</span> <span class="dv">1120</span>,</span>
<span id="cb263-10"><a href="cha-algos-provided.html#cb263-10" tabindex="-1"></a> <span class="at">P0 =</span> <span class="fu">matrix</span>(<span class="dv">100</span>),</span>
<span id="cb263-11"><a href="cha-algos-provided.html#cb263-11" tabindex="-1"></a> <span class="at">dt =</span> dtpred, <span class="at">ct =</span> ct, <span class="at">Zt =</span> Zt, <span class="at">Tt =</span> Tt)</span>
<span id="cb263-12"><a href="cha-algos-provided.html#cb263-12" tabindex="-1"></a>fkfResult<span class="sc">$</span>logLik</span></code></pre></div>
<pre><code>## [1] -626.5521</code></pre>
</div>
</div>
<div id="sec:particle-mcmc" class="section level3 hasAnchor" number="8.1.2">
<h3><span class="header-section-number">8.1.2</span> Particle MCMC (PMCMC)<a href="cha-algos-provided.html#sec:particle-mcmc" class="anchor-section" aria-label="Anchor link to header"></a></h3>
<p>Particle MCMC (PMCMC) is a method that uses MCMC for top-level model
parameters and uses a particle filter to approximate the time-series
likelihood for use in determining MCMC acceptance probabilities
<span class="citation">(<a href="references.html#ref-Andrieu_Doucet_Holenstein_2010">Andrieu, Doucet, and Holenstein 2010</a>)</span>. NIMBLE implements PMCMC by
providing random-walk Metropolis-Hastings samplers for model
parameters that make use of particle filters in this way. These
samplers can use NIMBLE’s bootstrap filter or auxiliary particle
filter, or they can use a user-defined filter. Whichever filter is
specified will be used to obtain estimates of the likelihood of the
state-space model (marginalizing over the latent states), which is
used for calculation of the Metropolis-Hastings acceptance
probability. The <code>RW_PF</code> sampler uses a univariate normal
proposal distribution, and can be used to sample scalar top-level
parameters. The <code>RW_PF_block</code> sampler uses a multivariate normal
proposal distribution and can be used to jointly sample vectors of
top-level parameters. The PMCMC samplers can be specified with a call
to <code>addSampler</code> with <code>type = "RW_PF"</code> or <code>type = "RW_PF_block"</code>,
a syntax similar to the other MCMC samplers listed
in Section <a href="cha-mcmc.html#sec:samplers-provided">7.11</a>.</p>
<p>The <code>RW_PF</code> sampler and <code>RW_PF_block</code> sampler can be
customized using the <code>control</code> list argument to set the adaptive
properties of the sampler and options for the particle filter
algorithm to be used. In addition, providing
<code>pfOptimizeNparticles=TRUE</code> in the <code>control</code> list will use an
experimental algorithm to estimate the optimal number of particles to
use in the particle filter. See <code>help(samplers)</code> for details. The
MCMC configuration for the <code>timeModel</code> in the previous section will
serve as an example for the use of our PMCMC sampler. Here we use the
identity matrix as our proposal covariance matrix.</p>
<div class="sourceCode" id="cb265"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb265-1"><a href="cha-algos-provided.html#cb265-1" tabindex="-1"></a>timeConf <span class="ot"><-</span> <span class="fu">configureMCMC</span>(rTimeModel, <span class="at">nodes =</span> <span class="cn">NULL</span>) <span class="co"># empty MCMC configuration</span></span>
<span id="cb265-2"><a href="cha-algos-provided.html#cb265-2" tabindex="-1"></a></span>
<span id="cb265-3"><a href="cha-algos-provided.html#cb265-3" tabindex="-1"></a><span class="co"># Add random walk PMCMC sampler with particle number optimization.</span></span>
<span id="cb265-4"><a href="cha-algos-provided.html#cb265-4" tabindex="-1"></a>timeConf<span class="sc">$</span><span class="fu">addSampler</span>(<span class="at">target =</span> <span class="fu">c</span>(<span class="st">"a"</span>, <span class="st">"b"</span>, <span class="st">"c"</span>, <span class="st">"mu_0"</span>), <span class="at">type =</span> <span class="st">"RW_PF_block"</span>,</span>
<span id="cb265-5"><a href="cha-algos-provided.html#cb265-5" tabindex="-1"></a> <span class="at">control =</span> <span class="fu">list</span>(<span class="at">propCov=</span> <span class="fu">diag</span>(<span class="dv">4</span>), <span class="at">adaptScaleOnly =</span> <span class="cn">FALSE</span>,</span>
<span id="cb265-6"><a href="cha-algos-provided.html#cb265-6" tabindex="-1"></a> <span class="at">latents =</span> <span class="st">"x"</span>, <span class="at">pfOptimizeNparticles =</span> <span class="cn">TRUE</span>))</span></code></pre></div>
<p>The <code>type = "RW_PF"</code> and <code>type = "RW_PF_block"</code> samplers
default to using a bootstrap filter. The adaptation control
parameters <code>adaptive</code>, <code>adaptInterval</code>, and
<code>adaptScaleOnly</code> work in the same way as for an <code>RW</code> and <code>RW*block</code> samplers.
However, it is not clear if the same approach to adaptation works well
for PMCMC, so one should consider turning off adaptation and using
a well-chosen proposal covariance.</p>
<p>It is also possible that more efficient results
can be obtained by using a custom filtering algorithm. Choice
of filtering algorithm can be controlled by the <code>pfType</code> control
list entry. The <code>pfType</code> entry can be set either to
<code>'bootstrap'</code> (the default), <code>'auxiliary'</code>, or the name of a
user-defined nimbleFunction that returns a likelihood approximation.</p>
<p>Any user-defined filtering nimbleFunction named in the <code>pfType</code>
control list entry must satsify the following:</p>
<ol style="list-style-type: decimal">
<li><p>The nimbleFunction must be the result of a call to
<code>nimbleFunction()</code>.</p></li>
<li><p>The <code>nimbleFunction</code> must have setup code that accepts the
following (and only the following) arguments:</p>
<ul>
<li><code>model</code>, the NIMBLE model object that the MCMC algorithm is
defined on.</li>
<li><code>latents</code>, a character vector specifying the latent model
nodes over which the particle filter will stochastically integrate
over to estimate the log-likelihood function.</li>
<li><code>control</code>, an <code>R</code> <code>list</code> object. Note that the
<code>control</code> list can be used to pass in any additional information
or arguments that the custom filter may require.</li>
</ul></li>
<li><p>The <code>nimbleFunction</code> must have a <code>run</code> function that
accepts a single integer arugment (the number of particles to use),
and returns a scalar double (the log-likelihood estimate).</p></li>
<li><p>The <code>nimbleFunction</code> must define, in setup code, a
<code>modelValues</code> object named <code>mvEWSamples</code> that is used to
contain equally weighted samples of the latent states (that is, the
<code>latents</code> argument to the setup function). Each time the
<code>run()</code> method of the <code>nimbleFunction</code> is called with number
of particles <code>m</code>, the <code>mvEWSamples</code> <code>modelValues</code> object
should be resized to be of size <code>m</code> via a call to
<code>resize(mvEWSamples, m)</code>.</p></li>
</ol>
</div>
</div>
<div id="monte-carlo-expectation-maximization-mcem" class="section level2 hasAnchor" number="8.2">
<h2><span class="header-section-number">8.2</span> Monte Carlo Expectation Maximization (MCEM)<a href="cha-algos-provided.html#monte-carlo-expectation-maximization-mcem" class="anchor-section" aria-label="Anchor link to header"></a></h2>
<p>Suppose we have a model with missing data – or latent variables or random
effects, which can be viewed as missing data – and we would like to maximize
the marginal likelihood of the model, integrating over the missing data. A
brute-force method for doing this is MCEM. This is an EM algorithm in which
the missing data are simulated via Monte Carlo (often MCMC, when the full
conditional distributions cannot be directly sampled from) at each iteration.
MCEM can be slow but is also a general workhorse method that is applicable to
a wide range of problems.</p>
<p><code>buildMCEM</code> provides an (optionally) ascent-based MCEM algorithm based on
<span class="citation">Caffo, Jank, and Jones (<a href="references.html#ref-Caffo_etal_2005">2005</a>)</span>. <code>buildMCEM</code> was re-written for nimble version 1.2.0 and is
not compatible with previous versions. For the E (expectation) step,
<code>buildMCEM</code> uses an MCMC for the latent states given the data and current
parameters. For the M (maximization) step, <code>buildMCEM</code> uses <code>optim</code>.</p>
<p>The ascent-based feature uses an estimate of the standard error of the move in
one iteration to determine if that move is clearly uphill or is swamped by
noise due to using a Monte Carlo (MCMC) sample. In the latter case, the MCMC
sample size is increased until there is a clear uphill move. In a similar
manner, convergence is determined based on whether the uphill move is
confidently less than a tolerance level taken to indicate that the algorithm
is at the MLE. The associated tuning parameters, along with details on control
over each step, are described at <code>help(buildMCEM)</code>.</p>
<p>The maximization part of each MCEM iteration will use gradients from automatic
differentiation if they are supported for the model and <code>buildDerivs=TRUE</code>
when <code>nimbleModel</code> was called to create the model. If any parameters have
constraints on valid values (e.g. greater than 0), by default a parameter
transformation will be set up (see <code>help(parameterTransform)</code>) and
optimization will be done in the transformed (unconstrained) space.</p>
<p>Additionally, the MCEM algorithm can provide an estimate of the asymptotic
covariance matrix of the parameters. See <a href="cha-algos-provided.html#sec:estimate-mcem-cov">8.2.1</a>.</p>
<p>We will revisit the <em>pump</em> example to illustrate the use of
NIMBLE’s MCEM algorithm.
<!--- % newPump didn't exist so I'm creating it in some non-echoed code. --></p>
<div class="sourceCode" id="cb266"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb266-1"><a href="cha-algos-provided.html#cb266-1" tabindex="-1"></a>pump <span class="ot"><-</span> <span class="fu">nimbleModel</span>(<span class="at">code =</span> pumpCode, <span class="at">name =</span> <span class="st">"pump"</span>, <span class="at">constants =</span> pumpConsts,</span>
<span id="cb266-2"><a href="cha-algos-provided.html#cb266-2" tabindex="-1"></a> <span class="at">data =</span> pumpData, <span class="at">inits =</span> pumpInits, <span class="at">check =</span> <span class="cn">FALSE</span>,</span>
<span id="cb266-3"><a href="cha-algos-provided.html#cb266-3" tabindex="-1"></a> <span class="at">buildDerivs=</span><span class="cn">TRUE</span>)</span>
<span id="cb266-4"><a href="cha-algos-provided.html#cb266-4" tabindex="-1"></a></span>
<span id="cb266-5"><a href="cha-algos-provided.html#cb266-5" tabindex="-1"></a>Cpump <span class="ot"><-</span> <span class="fu">compileNimble</span>(pump)</span>
<span id="cb266-6"><a href="cha-algos-provided.html#cb266-6" tabindex="-1"></a></span>
<span id="cb266-7"><a href="cha-algos-provided.html#cb266-7" tabindex="-1"></a><span class="co"># build an MCEM algorithm with ascent-based convergence criterion</span></span>
<span id="cb266-8"><a href="cha-algos-provided.html#cb266-8" tabindex="-1"></a>pumpMCEM <span class="ot"><-</span> <span class="fu">buildMCEM</span>(<span class="at">model =</span> pump,</span>
<span id="cb266-9"><a href="cha-algos-provided.html#cb266-9" tabindex="-1"></a> <span class="at">latentNodes =</span> <span class="st">"theta"</span>)</span>
<span id="cb266-10"><a href="cha-algos-provided.html#cb266-10" tabindex="-1"></a><span class="co"># The latentNodes="theta" would be determined by default but is shown for clarity.</span></span>
<span id="cb266-11"><a href="cha-algos-provided.html#cb266-11" tabindex="-1"></a>CpumpMCEM <span class="ot"><-</span> <span class="fu">compileNimble</span>(pumpMCEM, <span class="at">project=</span>pump)</span></code></pre></div>
<p>The first argument to <code>buildMCEM</code>, <code>model</code>, is a NIMBLE model. At the moment, the
model provided cannot be part of another MCMC sampler.</p>
<div class="sourceCode" id="cb267"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb267-1"><a href="cha-algos-provided.html#cb267-1" tabindex="-1"></a>pumpMLE <span class="ot"><-</span> CpumpMCEM<span class="sc">$</span><span class="fu">findMLE</span>(<span class="at">initM =</span> <span class="dv">1000</span>)</span></code></pre></div>
<pre><code>## [Note] Iteration Number: 1.
## [Note] Current number of MCMC iterations: 1000.
## [Note] Parameter Estimates:
## 0.818983
## 1.14746
## [Note] Convergence Criterion: 0.684673.
## [Note] Iteration Number: 2.
## [Note] Current number of MCMC iterations: 1000.
## [Note] Parameter Estimates:
## 0.818793
## 1.21849
## [Note] Convergence Criterion: 0.0209188.
## [Note] Iteration Number: 3.
## [Note] Current number of MCMC iterations: 1000.
## [Note] Parameter Estimates:
## 0.819104
## 1.24505
## [Note] Convergence Criterion: 0.00392522.
## [Note] Iteration Number: 4.
## [Note] Current number of MCMC iterations: 1000.
## [Note] Parameter Estimates:
## 0.838402
## 1.29963
## [Note] Convergence Criterion: 0.00657192.
## [Note] Iteration Number: 5.
## [Note] Current number of MCMC iterations: 1000.
## [Note] Parameter Estimates:
## 0.821287
## 1.26525
## [Note] Convergence Criterion: 0.00361366.
## [Note] Iteration Number: 6.
## [Note] Current number of MCMC iterations: 1000.
## [Note] Parameter Estimates:
## 0.835258
## 1.29028
## [Note] Convergence Criterion: 0.00249731.
## Monte Carlo error too big: increasing MCMC sample size.
## [Note] Iteration Number: 7.
## [Note] Current number of MCMC iterations: 1167.
## [Note] Parameter Estimates:
## 0.829425
## 1.28862
## [Note] Convergence Criterion: 0.000876073.</code></pre>
<div class="sourceCode" id="cb269"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb269-1"><a href="cha-algos-provided.html#cb269-1" tabindex="-1"></a>pumpMLE<span class="sc">$</span>par</span></code></pre></div>
<pre><code>## [1] 0.8294246 1.2886152</code></pre>
<p>For this model, we can check the result by analytically integrating over the
latent nodes (possible for this model but often not feasible), which gives
maximum likelihood estimates of <span class="math inline">\(\hat\alpha=0.823\)</span> and <span class="math inline">\(\hat\beta = 1.261\)</span>. Thus
the MCEM seems to do pretty well, though tightening the convergence criteria may
be warranted in actual usage.</p>
<p>For more complicated models, it is worth exploring the tuning parameters (see
<code>help(buildMCEM)</code>). MCEM inherits from the EM algorithm the difficulty that the
convergence path can be slow, depending on the model. This can depend on the
parameterization, such as whether random effects are centered or uncentered, so
it can also be worth exploring different ways to write a model.</p>
<div id="sec:estimate-mcem-cov" class="section level3 hasAnchor" number="8.2.1">
<h3><span class="header-section-number">8.2.1</span> Estimating the asymptotic covariance From MCEM<a href="cha-algos-provided.html#sec:estimate-mcem-cov" class="anchor-section" aria-label="Anchor link to header"></a></h3>
<p>The <code>vcov</code> method of an MCEM nimbleFunction calculates a Monte Carlo estimate of
the asymptotic covariance of the parameters based on the Hessian matrix at the
MLE, using the method of <span class="citation">Louis (<a href="references.html#ref-Louis_1982">1982</a>)</span>. Arguments to this method allow control over
whether to generate a new MCMC sample for this purpose and other details.</p>
<p>Continuing the above example, here is the covariance matrix:</p>
<div class="sourceCode" id="cb271"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb271-1"><a href="cha-algos-provided.html#cb271-1" tabindex="-1"></a>pumpCov <span class="ot"><-</span> CpumpMCEM<span class="sc">$</span><span class="fu">vcov</span>(pumpMLE<span class="sc">$</span>par)</span>
<span id="cb271-2"><a href="cha-algos-provided.html#cb271-2" tabindex="-1"></a>pumpCov</span></code></pre></div>
<pre><code>## [,1] [,2]
## [1,] 0.1296189 0.2264549
## [2,] 0.2264549 0.6759756</code></pre>
<!--- % See http://yihui.name/knitr/demo/child/ for documentation on the parent/child document system of knitr -->
</div>
</div>
</div>
</section>
</div>
</div>
</div>
<a href="cha-mcmc.html" class="navigation navigation-prev " aria-label="Previous page"><i class="fa fa-angle-left"></i></a>
<a href="cha-laplace.html" class="navigation navigation-next " aria-label="Next page"><i class="fa fa-angle-right"></i></a>
</div>
</div>
<script src="libs/gitbook-2.6.7/js/app.min.js"></script>
<script src="libs/gitbook-2.6.7/js/clipboard.min.js"></script>
<script src="libs/gitbook-2.6.7/js/plugin-search.js"></script>
<script src="libs/gitbook-2.6.7/js/plugin-sharing.js"></script>
<script src="libs/gitbook-2.6.7/js/plugin-fontsettings.js"></script>
<script src="libs/gitbook-2.6.7/js/plugin-bookdown.js"></script>
<script src="libs/gitbook-2.6.7/js/jquery.highlight.js"></script>
<script src="libs/gitbook-2.6.7/js/plugin-clipboard.js"></script>
<script>
gitbook.require(["gitbook"], function(gitbook) {
gitbook.start({
"sharing": {
"github": false,
"facebook": true,
"twitter": true,
"linkedin": false,
"weibo": false,
"instapaper": false,
"vk": false,
"whatsapp": false,
"all": ["facebook", "twitter", "linkedin", "weibo", "instapaper"]
},
"fontsettings": {
"theme": "white",
"family": "sans",
"size": 2
},
"edit": {
"link": null,
"text": null
},
"history": {
"link": null,
"text": null
},
"view": {
"link": null,
"text": null
},
"download": ["NimbleUserManual.pdf", "NimbleUserManual.epub"],
"search": {
"engine": "fuse",
"options": null
},
"toc": {
"collapse": "subsection"
},
"toc_depth": 3
});
});
</script>
<!-- dynamically load mathjax for compatibility with self-contained -->
<script>
(function () {
var script = document.createElement("script");
script.type = "text/javascript";
var src = "true";
if (src === "" || src === "true") src = "https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.9/latest.js?config=TeX-MML-AM_CHTML";
if (location.protocol !== "file:")
if (/^https?:/.test(src))
src = src.replace(/^https?:/, '');
script.src = src;
document.getElementsByTagName("head")[0].appendChild(script);
})();
</script>
</body>
</html>