-
Notifications
You must be signed in to change notification settings - Fork 24
/
Copy pathcha-user-defined.html
856 lines (818 loc) · 101 KB
/
cha-user-defined.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
<!DOCTYPE html>
<html lang="" xml:lang="">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title>Chapter 12 Creating user-defined distributions and functions for models | NimbleUserManual.knit</title>
<meta name="description" content="This is the NIMBLE User Manual." />
<meta name="generator" content="bookdown 0.39 and GitBook 2.6.7" />
<meta property="og:title" content="Chapter 12 Creating user-defined distributions and functions for models | 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 12 Creating user-defined distributions and functions for models | 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-RCfunctions.html"/>
<link rel="next" href="cha-using-models.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 { display: inline-block; 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;
margin-bottom: 0em;
}
.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.3.0</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>
</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>MCMCsuite</em> and <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, MCEM, Laplace approximation and quadrature</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>
<li class="chapter" data-level="8.3" data-path="cha-algos-provided.html"><a href="cha-algos-provided.html#laplace-approximation-and-adaptive-gauss-hermite-quadrature"><i class="fa fa-check"></i><b>8.3</b> Laplace approximation and adaptive Gauss-Hermite quadrature</a></li>
</ul></li>
<li class="chapter" data-level="9" data-path="cha-spatial.html"><a href="cha-spatial.html"><i class="fa fa-check"></i><b>9</b> Spatial models</a>
<ul>
<li class="chapter" data-level="9.1" data-path="cha-spatial.html"><a href="cha-spatial.html#intrinsic-gaussian-car-model-dcar_normal"><i class="fa fa-check"></i><b>9.1</b> Intrinsic Gaussian CAR model: <em>dcar_normal</em></a>
<ul>
<li class="chapter" data-level="9.1.1" data-path="cha-spatial.html"><a href="cha-spatial.html#specification-and-density"><i class="fa fa-check"></i><b>9.1.1</b> Specification and density</a></li>
<li class="chapter" data-level="9.1.2" data-path="cha-spatial.html"><a href="cha-spatial.html#example"><i class="fa fa-check"></i><b>9.1.2</b> Example</a></li>
</ul></li>
<li class="chapter" data-level="9.2" data-path="cha-spatial.html"><a href="cha-spatial.html#proper-gaussian-car-model-dcar_proper"><i class="fa fa-check"></i><b>9.2</b> Proper Gaussian CAR model: <em>dcar_proper</em></a>
<ul>
<li class="chapter" data-level="9.2.1" data-path="cha-spatial.html"><a href="cha-spatial.html#specification-and-density-1"><i class="fa fa-check"></i><b>9.2.1</b> Specification and density</a></li>
<li class="chapter" data-level="9.2.2" data-path="cha-spatial.html"><a href="cha-spatial.html#example-1"><i class="fa fa-check"></i><b>9.2.2</b> Example</a></li>
</ul></li>
<li class="chapter" data-level="9.3" data-path="cha-spatial.html"><a href="cha-spatial.html#sec:spatial-mcmc-sampling-car"><i class="fa fa-check"></i><b>9.3</b> MCMC Sampling of CAR models</a>
<ul>
<li class="chapter" data-level="9.3.1" data-path="cha-spatial.html"><a href="cha-spatial.html#initial-values"><i class="fa fa-check"></i><b>9.3.1</b> Initial values</a></li>
<li class="chapter" data-level="9.3.2" data-path="cha-spatial.html"><a href="cha-spatial.html#zero-neighbor-regions"><i class="fa fa-check"></i><b>9.3.2</b> Zero-neighbor regions</a></li>
<li class="chapter" data-level="9.3.3" data-path="cha-spatial.html"><a href="cha-spatial.html#zero-mean-constraint"><i class="fa fa-check"></i><b>9.3.3</b> Zero-mean constraint</a></li>
</ul></li>
</ul></li>
<li class="chapter" data-level="10" data-path="cha-bnp.html"><a href="cha-bnp.html"><i class="fa fa-check"></i><b>10</b> Bayesian nonparametric models</a>
<ul>
<li class="chapter" data-level="10.1" data-path="cha-bnp.html"><a href="cha-bnp.html#sec:bnpmixtures"><i class="fa fa-check"></i><b>10.1</b> Bayesian nonparametric mixture models</a></li>
<li class="chapter" data-level="10.2" data-path="cha-bnp.html"><a href="cha-bnp.html#sec:crp"><i class="fa fa-check"></i><b>10.2</b> Chinese Restaurant Process model</a>
<ul>
<li class="chapter" data-level="10.2.1" data-path="cha-bnp.html"><a href="cha-bnp.html#specification-and-density-2"><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-bnp.html"><a href="cha-bnp.html#sec:excrp"><i class="fa fa-check"></i><b>10.2.2</b> Example</a></li>
<li class="chapter" data-level="10.2.3" data-path="cha-bnp.html"><a href="cha-bnp.html#sec:extensionscrp"><i class="fa fa-check"></i><b>10.2.3</b> Extensions</a></li>
</ul></li>
<li class="chapter" data-level="10.3" data-path="cha-bnp.html"><a href="cha-bnp.html#sec:sb"><i class="fa fa-check"></i><b>10.3</b> Stick-breaking model</a>
<ul>
<li class="chapter" data-level="10.3.1" data-path="cha-bnp.html"><a href="cha-bnp.html#specification-and-function"><i class="fa fa-check"></i><b>10.3.1</b> Specification and function</a></li>
<li class="chapter" data-level="10.3.2" data-path="cha-bnp.html"><a href="cha-bnp.html#sec:exsb"><i class="fa fa-check"></i><b>10.3.2</b> Example</a></li>
</ul></li>
<li class="chapter" data-level="10.4" data-path="cha-bnp.html"><a href="cha-bnp.html#mcmc-sampling-of-bnp-models"><i class="fa fa-check"></i><b>10.4</b> MCMC sampling of BNP models</a>
<ul>
<li class="chapter" data-level="10.4.1" data-path="cha-bnp.html"><a href="cha-bnp.html#sec:mcmcdcrp"><i class="fa fa-check"></i><b>10.4.1</b> Sampling CRP models</a></li>
<li class="chapter" data-level="10.4.2" data-path="cha-bnp.html"><a href="cha-bnp.html#sec:mcmcsb"><i class="fa fa-check"></i><b>10.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="11" data-path="cha-RCfunctions.html"><a href="cha-RCfunctions.html"><i class="fa fa-check"></i><b>11</b> Writing simple nimbleFunctions</a>
<ul>
<li class="chapter" data-level="11.1" data-path="cha-RCfunctions.html"><a href="cha-RCfunctions.html#sec:RC-intro"><i class="fa fa-check"></i><b>11.1</b> Introduction to simple nimbleFunctions</a></li>
<li class="chapter" data-level="11.2" data-path="cha-RCfunctions.html"><a href="cha-RCfunctions.html#sec:r-fiunctions-implemented"><i class="fa fa-check"></i><b>11.2</b> R functions (or variants) implemented in NIMBLE</a>
<ul>
<li class="chapter" data-level="11.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>11.2.1</b> Finding help for NIMBLE’s versions of R functions</a></li>
<li class="chapter" data-level="11.2.2" data-path="cha-RCfunctions.html"><a href="cha-RCfunctions.html#basic-operations"><i class="fa fa-check"></i><b>11.2.2</b> Basic operations</a></li>
<li class="chapter" data-level="11.2.3" data-path="cha-RCfunctions.html"><a href="cha-RCfunctions.html#sec:basic-math-linear"><i class="fa fa-check"></i><b>11.2.3</b> Math and linear algebra</a></li>
<li class="chapter" data-level="11.2.4" data-path="cha-RCfunctions.html"><a href="cha-RCfunctions.html#sec:nimble-dist-funs"><i class="fa fa-check"></i><b>11.2.4</b> Distribution functions</a></li>
<li class="chapter" data-level="11.2.5" data-path="cha-RCfunctions.html"><a href="cha-RCfunctions.html#sec:basic-flow-control"><i class="fa fa-check"></i><b>11.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="11.2.6" data-path="cha-RCfunctions.html"><a href="cha-RCfunctions.html#sec:print"><i class="fa fa-check"></i><b>11.2.6</b> <em>print</em> and <em>cat</em></a></li>
<li class="chapter" data-level="11.2.7" data-path="cha-RCfunctions.html"><a href="cha-RCfunctions.html#sec:check-user-interr"><i class="fa fa-check"></i><b>11.2.7</b> Checking for user interrupts: <em>checkInterrupt</em></a></li>
<li class="chapter" data-level="11.2.8" data-path="cha-RCfunctions.html"><a href="cha-RCfunctions.html#optimization-optim-and-nimoptim"><i class="fa fa-check"></i><b>11.2.8</b> Optimization: <em>optim</em> and <em>nimOptim</em></a></li>
<li class="chapter" data-level="11.2.9" data-path="cha-RCfunctions.html"><a href="cha-RCfunctions.html#integration-integrate-and-nimintegrate"><i class="fa fa-check"></i><b>11.2.9</b> Integration: <em>integrate</em> and <em>nimIntegrate</em></a></li>
<li class="chapter" data-level="11.2.10" data-path="cha-RCfunctions.html"><a href="cha-RCfunctions.html#sec:altern-keyw-some"><i class="fa fa-check"></i><b>11.2.10</b> ‘nim’ synonyms for some functions</a></li>
</ul></li>
<li class="chapter" data-level="11.3" data-path="cha-RCfunctions.html"><a href="cha-RCfunctions.html#sec:how-nimble-handles"><i class="fa fa-check"></i><b>11.3</b> How NIMBLE handles types of variables</a>
<ul>
<li class="chapter" data-level="11.3.1" data-path="cha-RCfunctions.html"><a href="cha-RCfunctions.html#sec:nimbleList-RCFuns"><i class="fa fa-check"></i><b>11.3.1</b> nimbleList data structures</a></li>
<li class="chapter" data-level="11.3.2" data-path="cha-RCfunctions.html"><a href="cha-RCfunctions.html#sec:how-types-work"><i class="fa fa-check"></i><b>11.3.2</b> How numeric types work</a></li>
</ul></li>
<li class="chapter" data-level="11.4" data-path="cha-RCfunctions.html"><a href="cha-RCfunctions.html#sec:decl-argum-return"><i class="fa fa-check"></i><b>11.4</b> Declaring argument and return types</a></li>
<li class="chapter" data-level="11.5" data-path="cha-RCfunctions.html"><a href="cha-RCfunctions.html#sec:comp-nimbl-pass"><i class="fa fa-check"></i><b>11.5</b> Compiled nimbleFunctions pass arguments by reference</a></li>
<li class="chapter" data-level="11.6" data-path="cha-RCfunctions.html"><a href="cha-RCfunctions.html#sec:calling-external-code"><i class="fa fa-check"></i><b>11.6</b> Calling external compiled code</a></li>
<li class="chapter" data-level="11.7" data-path="cha-RCfunctions.html"><a href="cha-RCfunctions.html#sec:calling-R-code"><i class="fa fa-check"></i><b>11.7</b> Calling uncompiled R functions from compiled nimbleFunctions</a></li>
</ul></li>
<li class="chapter" data-level="12" data-path="cha-user-defined.html"><a href="cha-user-defined.html"><i class="fa fa-check"></i><b>12</b> Creating user-defined distributions and functions for models</a>
<ul>
<li class="chapter" data-level="12.1" data-path="cha-user-defined.html"><a href="cha-user-defined.html#sec:user-functions"><i class="fa fa-check"></i><b>12.1</b> User-defined functions</a></li>
<li class="chapter" data-level="12.2" data-path="cha-user-defined.html"><a href="cha-user-defined.html#sec:user-distributions"><i class="fa fa-check"></i><b>12.2</b> User-defined distributions</a>
<ul>
<li class="chapter" data-level="12.2.1" data-path="cha-user-defined.html"><a href="cha-user-defined.html#sec:registerDistributions"><i class="fa fa-check"></i><b>12.2.1</b> Using <em>registerDistributions</em> for alternative parameterizations and providing other information</a></li>
</ul></li>
<li class="chapter" data-level="12.3" data-path="cha-user-defined.html"><a href="cha-user-defined.html#sec:adv-user-def"><i class="fa fa-check"></i><b>12.3</b> Advanced user-defined functions and distributions</a></li>
<li class="chapter" data-level="12.4" data-path="cha-user-defined.html"><a href="cha-user-defined.html#sec:user-macros"><i class="fa fa-check"></i><b>12.4</b> User-defined model macros</a></li>
</ul></li>
<li class="chapter" data-level="13" data-path="cha-using-models.html"><a href="cha-using-models.html"><i class="fa fa-check"></i><b>13</b> Working with NIMBLE models</a>
<ul>
<li class="chapter" data-level="13.1" data-path="cha-using-models.html"><a href="cha-using-models.html#sec:accessing-variables"><i class="fa fa-check"></i><b>13.1</b> The variables and nodes in a NIMBLE model</a>
<ul>
<li class="chapter" data-level="13.1.1" data-path="cha-using-models.html"><a href="cha-using-models.html#sec:get-nodes"><i class="fa fa-check"></i><b>13.1.1</b> Determining the nodes in a model</a></li>
<li class="chapter" data-level="13.1.2" data-path="cha-using-models.html"><a href="cha-using-models.html#sec:introduced-nodes"><i class="fa fa-check"></i><b>13.1.2</b> Understanding lifted nodes</a></li>
<li class="chapter" data-level="13.1.3" data-path="cha-using-models.html"><a href="cha-using-models.html#sec:cdgetdependencies"><i class="fa fa-check"></i><b>13.1.3</b> Determining dependencies in a model</a></li>
</ul></li>
<li class="chapter" data-level="13.2" data-path="cha-using-models.html"><a href="cha-using-models.html#sec:nodeInfo"><i class="fa fa-check"></i><b>13.2</b> Accessing information about nodes and variables</a>
<ul>
<li class="chapter" data-level="13.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>13.2.1</b> Getting distributional information about a node</a></li>
<li class="chapter" data-level="13.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>13.2.2</b> Getting information about a distribution</a></li>
<li class="chapter" data-level="13.2.3" data-path="cha-using-models.html"><a href="cha-using-models.html#sec:getParam"><i class="fa fa-check"></i><b>13.2.3</b> Getting distribution parameter values for a node</a></li>
<li class="chapter" data-level="13.2.4" data-path="cha-using-models.html"><a href="cha-using-models.html#sec:getBound"><i class="fa fa-check"></i><b>13.2.4</b> Getting distribution bounds for a node</a></li>
</ul></li>
<li class="chapter" data-level="13.3" data-path="cha-using-models.html"><a href="cha-using-models.html#sec:cdcalc-cdsim-cdgetl"><i class="fa fa-check"></i><b>13.3</b> Carrying out model calculations</a>
<ul>
<li class="chapter" data-level="13.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>13.3.1</b> Core model operations: calculation and simulation</a></li>
<li class="chapter" data-level="13.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>13.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="13.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>13.3.3</b> Accessing log probabilities via <em>logProb</em> variables</a></li>
</ul></li>
</ul></li>
<li class="chapter" data-level="14" data-path="cha-data-structures.html"><a href="cha-data-structures.html"><i class="fa fa-check"></i><b>14</b> Data structures in NIMBLE</a>
<ul>
<li class="chapter" data-level="14.1" data-path="cha-data-structures.html"><a href="cha-data-structures.html#sec:modelValues-struct"><i class="fa fa-check"></i><b>14.1</b> The modelValues data structure</a>
<ul>
<li class="chapter" data-level="14.1.1" data-path="cha-data-structures.html"><a href="cha-data-structures.html#creating-modelvalues-objects"><i class="fa fa-check"></i><b>14.1.1</b> Creating modelValues objects</a></li>
<li class="chapter" data-level="14.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>14.1.2</b> Accessing contents of modelValues</a></li>
</ul></li>
<li class="chapter" data-level="14.2" data-path="cha-data-structures.html"><a href="cha-data-structures.html#sec:nimbleLists"><i class="fa fa-check"></i><b>14.2</b> The nimbleList data structure</a>
<ul>
<li class="chapter" data-level="14.2.1" data-path="cha-data-structures.html"><a href="cha-data-structures.html#sec:predef-nimbleLists"><i class="fa fa-check"></i><b>14.2.1</b> Pre-defined nimbleList types</a></li>
<li class="chapter" data-level="14.2.2" data-path="cha-data-structures.html"><a href="cha-data-structures.html#sec:eigen-nimFunctions"><i class="fa fa-check"></i><b>14.2.2</b> Using <em>eigen</em> and <em>svd</em> in nimbleFunctions</a></li>
</ul></li>
</ul></li>
<li class="chapter" data-level="15" data-path="cha-progr-with-models.html"><a href="cha-progr-with-models.html"><i class="fa fa-check"></i><b>15</b> Writing nimbleFunctions to interact with models</a>
<ul>
<li class="chapter" data-level="15.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>15.1</b> Overview</a></li>
<li class="chapter" data-level="15.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>15.2</b> Using and compiling nimbleFunctions</a></li>
<li class="chapter" data-level="15.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>15.3</b> Writing setup code</a>
<ul>
<li class="chapter" data-level="15.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>15.3.1</b> Useful tools for setup functions</a></li>
<li class="chapter" data-level="15.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>15.3.2</b> Accessing and modifying numeric values from setup</a></li>
<li class="chapter" data-level="15.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>15.3.3</b> Determining numeric types in nimbleFunctions</a></li>
<li class="chapter" data-level="15.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>15.3.4</b> Control of setup outputs</a></li>
</ul></li>
<li class="chapter" data-level="15.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>15.4</b> Writing run code</a>
<ul>
<li class="chapter" data-level="15.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>15.4.1</b> Driving models: <em>calculate</em>, <em>calculateDiff</em>, <em>simulate</em>, <em>getLogProb</em></a></li>
<li class="chapter" data-level="15.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>15.4.2</b> Getting and setting variable and node values</a></li>
<li class="chapter" data-level="15.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>15.4.3</b> Getting parameter values and node bounds</a></li>
<li class="chapter" data-level="15.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>15.4.4</b> Using modelValues objects</a></li>
<li class="chapter" data-level="15.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>15.4.5</b> Using model variables and modelValues in expressions</a></li>
<li class="chapter" data-level="15.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>15.4.6</b> Including other methods in a nimbleFunction</a></li>
<li class="chapter" data-level="15.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>15.4.7</b> Using other nimbleFunctions</a></li>
<li class="chapter" data-level="15.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>15.4.8</b> Virtual nimbleFunctions and nimbleFunctionLists</a></li>
<li class="chapter" data-level="15.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>15.4.9</b> Character objects</a></li>
<li class="chapter" data-level="15.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>15.4.10</b> User-defined data structures</a></li>
</ul></li>
<li class="chapter" data-level="15.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>15.5</b> Example: writing user-defined samplers to extend NIMBLE’s MCMC engine</a>
<ul>
<li class="chapter" data-level="15.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>15.5.1</b> User-defined samplers and posterior predictive nodes</a></li>
</ul></li>
<li class="chapter" data-level="15.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>15.6</b> Copying nimbleFunctions (and NIMBLE models)</a></li>
<li class="chapter" data-level="15.7" data-path="cha-progr-with-models.html"><a href="cha-progr-with-models.html#sec:debugging"><i class="fa fa-check"></i><b>15.7</b> Debugging nimbleFunctions</a></li>
<li class="chapter" data-level="15.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>15.8</b> Timing nimbleFunctions with <em>run.time</em></a></li>
<li class="chapter" data-level="15.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>15.9</b> Clearing and unloading compiled objects</a></li>
<li class="chapter" data-level="15.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>15.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="16" data-path="cha-AD.html"><a href="cha-AD.html"><i class="fa fa-check"></i><b>16</b> Automatic Derivatives</a>
<ul>
<li class="chapter" data-level="16.1" data-path="cha-AD.html"><a href="cha-AD.html#sec:use-derivs"><i class="fa fa-check"></i><b>16.1</b> How to turn on derivatives in a model</a>
<ul>
<li class="chapter" data-level="16.1.1" data-path="cha-AD.html"><a href="cha-AD.html#finish-setting-up-the-glmm-example"><i class="fa fa-check"></i><b>16.1.1</b> Finish setting up the GLMM example</a></li>
</ul></li>
<li class="chapter" data-level="16.2" data-path="cha-AD.html"><a href="cha-AD.html#sec:AD-laplace"><i class="fa fa-check"></i><b>16.2</b> How to use Laplace approximation and adaptive Gauss-Hermite quadrature</a>
<ul>
<li class="chapter" data-level="16.2.1" data-path="cha-AD.html"><a href="cha-AD.html#using-the-laplace-approximation-methods-directly"><i class="fa fa-check"></i><b>16.2.1</b> Using the Laplace approximation methods directly</a></li>
<li class="chapter" data-level="16.2.2" data-path="cha-AD.html"><a href="cha-AD.html#changing-the-optimization-methods"><i class="fa fa-check"></i><b>16.2.2</b> Changing the optimization methods</a></li>
</ul></li>
<li class="chapter" data-level="16.3" data-path="cha-AD.html"><a href="cha-AD.html#sec:AD-user-def"><i class="fa fa-check"></i><b>16.3</b> How to support derivatives in user-defined functions and distributions</a></li>
<li class="chapter" data-level="16.4" 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>16.4</b> What operations are and aren’t supported for AD</a></li>
<li class="chapter" data-level="16.5" data-path="cha-AD.html"><a href="cha-AD.html#basics-of-obtaining-derivatives-in-nimblefunctions"><i class="fa fa-check"></i><b>16.5</b> Basics of obtaining derivatives in <code>nimbleFunctions</code></a>
<ul>
<li class="chapter" data-level="16.5.1" data-path="cha-AD.html"><a href="cha-AD.html#checking-derivatives-with-uncompiled-execution"><i class="fa fa-check"></i><b>16.5.1</b> Checking derivatives with uncompiled execution</a></li>
<li class="chapter" data-level="16.5.2" data-path="cha-AD.html"><a href="cha-AD.html#sec:AD-holding-out"><i class="fa fa-check"></i><b>16.5.2</b> Holding some local variables out of derivative tracking</a></li>
<li class="chapter" data-level="16.5.3" data-path="cha-AD.html"><a href="cha-AD.html#sec:AD-multiple-NF"><i class="fa fa-check"></i><b>16.5.3</b> Using AD with multiple nimbleFunctions</a></li>
<li class="chapter" data-level="16.5.4" data-path="cha-AD.html"><a href="cha-AD.html#sec:understanding-more-AD"><i class="fa fa-check"></i><b>16.5.4</b> Understanding more about how AD works: <em>taping</em> of operations</a></li>
<li class="chapter" data-level="16.5.5" data-path="cha-AD.html"><a href="cha-AD.html#resetting-a-nimderivs-call"><i class="fa fa-check"></i><b>16.5.5</b> Resetting a <code>nimDerivs</code> call</a></li>
<li class="chapter" data-level="16.5.6" data-path="cha-AD.html"><a href="cha-AD.html#a-note-on-performance-benchmarking"><i class="fa fa-check"></i><b>16.5.6</b> A note on performance benchmarking</a></li>
</ul></li>
<li class="chapter" data-level="16.6" data-path="cha-AD.html"><a href="cha-AD.html#advanced-uses-double-taping"><i class="fa fa-check"></i><b>16.6</b> Advanced uses: double taping</a></li>
<li class="chapter" data-level="16.7" data-path="cha-AD.html"><a href="cha-AD.html#derivatives-involving-model-calculations"><i class="fa fa-check"></i><b>16.7</b> Derivatives involving model calculations</a>
<ul>
<li class="chapter" data-level="16.7.1" data-path="cha-AD.html"><a href="cha-AD.html#method-1-nimderivs-of-modelcalculate"><i class="fa fa-check"></i><b>16.7.1</b> Method 1: <code>nimDerivs</code> of <code>model$calculate</code></a></li>
<li class="chapter" data-level="16.7.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>16.7.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="16.8" data-path="cha-AD.html"><a href="cha-AD.html#sec:parameter-transform"><i class="fa fa-check"></i><b>16.8</b> Parameter transformations</a></li>
</ul></li>
<li class="chapter" data-level="17" 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>17</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-user-defined" class="section level1 hasAnchor" number="12">
<h1><span class="header-section-number">Chapter 12</span> Creating user-defined distributions and functions for models<a href="cha-user-defined.html#cha-user-defined" class="anchor-section" aria-label="Anchor link to header"></a></h1>
<p>NIMBLE allows you to define your own functions and distributions as <em>nimbleFunction</em>s for use in model code. As a result, NIMBLE frees you from being constrained to the functions and distributions discussed in Chapter <a href="cha-writing-models.html#cha-writing-models">5</a>. For example, instead of setting up a Dirichlet prior with multinomial data and needing to use MCMC, one could recognize that this results in a Dirichlet-multinomial distribution for the data and provide that as a user-defined distribution instead.</p>
<p>Since NIMBLE allows you to wrap calls to external compiled code or arbitrary R functions as nimbleFunctions, and since you can define model functions and distributions as nimbleFunctions, you can combine these features to build external compiled code or arbitrary R functions into a model. See Sections <a href="cha-RCfunctions.html#sec:calling-external-code">11.6</a>-<a href="cha-RCfunctions.html#sec:calling-R-code">11.7</a>.</p>
<p>As of version 1.2.0, NIMBLE also supports using more advanced nimbleFunctions, those with <code>setup</code> code and possibly multiple methods (see Chapter <a href="cha-progr-with-models.html#cha-progr-with-models">15</a>), to provide functions and/or distributions for use in models. This allows the functions and/or distributions to store information internally. See section <a href="cha-user-defined.html#sec:adv-user-def">12.3</a> below.</p>
<p>Note that NIMBLE generally expects user-defined distributions or functions to be defined in the global environment.
If you define them in a function (which would generally be the case if you are using them in the context of parallelization), one approach would be to assign them to the global environment in your function:</p>
<div class="sourceCode" id="cb250"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb250-1"><a href="cha-user-defined.html#cb250-1" tabindex="-1"></a><span class="do">## for a user-defined function</span></span>
<span id="cb250-2"><a href="cha-user-defined.html#cb250-2" tabindex="-1"></a><span class="fu">assign</span>(<span class="st">'myfun'</span>, myfun, <span class="at">envir =</span> .GlobalEnv)</span>
<span id="cb250-3"><a href="cha-user-defined.html#cb250-3" tabindex="-1"></a><span class="do">## for a user-defined distribution</span></span>
<span id="cb250-4"><a href="cha-user-defined.html#cb250-4" tabindex="-1"></a><span class="fu">assign</span>(<span class="st">'dfoo'</span>, dfoo, <span class="at">envir =</span> .GlobalEnv)</span>
<span id="cb250-5"><a href="cha-user-defined.html#cb250-5" tabindex="-1"></a><span class="fu">assign</span>(<span class="st">'rfoo'</span>, rfoo, <span class="at">envir =</span> .GlobalEnv)</span>
<span id="cb250-6"><a href="cha-user-defined.html#cb250-6" tabindex="-1"></a><span class="do">## similarly for 'p' and 'q' functions if you define them</span></span></code></pre></div>
<div id="sec:user-functions" class="section level2 hasAnchor" number="12.1">
<h2><span class="header-section-number">12.1</span> User-defined functions<a href="cha-user-defined.html#sec:user-functions" class="anchor-section" aria-label="Anchor link to header"></a></h2>
<p>To provide a new function for use in BUGS code, simply create a nimbleFunction as discussed in Chapter <a href="cha-RCfunctions.html#cha-RCfunctions">11</a>. Then use it in your BUGS code. That’s it.</p>
<p>Writing nimbleFunctions requires that you declare the dimensionality of arguments and the returned object (Section <a href="cha-RCfunctions.html#sec:decl-argum-return">11.4</a>). Make sure that the dimensionality specified in your nimbleFunction matches how you use it in BUGS code. For example, if you define scalar parameters in your BUGS code you will want to define nimbleFunctions that take scalar arguments. Here is an example that returns twice its input argument:</p>
<div class="sourceCode" id="cb251"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb251-1"><a href="cha-user-defined.html#cb251-1" tabindex="-1"></a>timesTwo <span class="ot"><-</span> <span class="fu">nimbleFunction</span>( </span>
<span id="cb251-2"><a href="cha-user-defined.html#cb251-2" tabindex="-1"></a> <span class="at">run =</span> <span class="cf">function</span>(<span class="at">x =</span> <span class="fu">double</span>(<span class="dv">0</span>)) {</span>
<span id="cb251-3"><a href="cha-user-defined.html#cb251-3" tabindex="-1"></a> <span class="fu">returnType</span>(<span class="fu">double</span>(<span class="dv">0</span>))</span>
<span id="cb251-4"><a href="cha-user-defined.html#cb251-4" tabindex="-1"></a> <span class="fu">return</span>(<span class="dv">2</span><span class="sc">*</span>x)</span>
<span id="cb251-5"><a href="cha-user-defined.html#cb251-5" tabindex="-1"></a> })</span>
<span id="cb251-6"><a href="cha-user-defined.html#cb251-6" tabindex="-1"></a></span>
<span id="cb251-7"><a href="cha-user-defined.html#cb251-7" tabindex="-1"></a>code <span class="ot"><-</span> <span class="fu">nimbleCode</span>({</span>
<span id="cb251-8"><a href="cha-user-defined.html#cb251-8" tabindex="-1"></a> <span class="cf">for</span>(i <span class="cf">in</span> <span class="dv">1</span><span class="sc">:</span><span class="dv">3</span>) {</span>
<span id="cb251-9"><a href="cha-user-defined.html#cb251-9" tabindex="-1"></a> mu[i] <span class="sc">~</span> <span class="fu">dnorm</span>(<span class="dv">0</span>, <span class="dv">1</span>)</span>
<span id="cb251-10"><a href="cha-user-defined.html#cb251-10" tabindex="-1"></a> mu_times_two[i] <span class="ot"><-</span> <span class="fu">timesTwo</span>(mu[i])</span>
<span id="cb251-11"><a href="cha-user-defined.html#cb251-11" tabindex="-1"></a> }</span>
<span id="cb251-12"><a href="cha-user-defined.html#cb251-12" tabindex="-1"></a>})</span></code></pre></div>
<p>The <code>x = double(0)</code> argument and <code>returnType(double(0))</code>
establish that the input and output will both be zero-dimensional
(scalar) numbers.</p>
<p>You can define nimbleFunctions that take inputs and outputs with
more dimensions. Here is an example that takes a vector
(1-dimensional) as input and returns a vector with twice the input
values:</p>
<div class="sourceCode" id="cb252"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb252-1"><a href="cha-user-defined.html#cb252-1" tabindex="-1"></a>vectorTimesTwo <span class="ot"><-</span> <span class="fu">nimbleFunction</span>( </span>
<span id="cb252-2"><a href="cha-user-defined.html#cb252-2" tabindex="-1"></a> <span class="at">run =</span> <span class="cf">function</span>(<span class="at">x =</span> <span class="fu">double</span>(<span class="dv">1</span>)) {</span>
<span id="cb252-3"><a href="cha-user-defined.html#cb252-3" tabindex="-1"></a> <span class="fu">returnType</span>(<span class="fu">double</span>(<span class="dv">1</span>))</span>
<span id="cb252-4"><a href="cha-user-defined.html#cb252-4" tabindex="-1"></a> <span class="fu">return</span>(<span class="dv">2</span><span class="sc">*</span>x)</span>
<span id="cb252-5"><a href="cha-user-defined.html#cb252-5" tabindex="-1"></a> }</span>
<span id="cb252-6"><a href="cha-user-defined.html#cb252-6" tabindex="-1"></a> )</span>
<span id="cb252-7"><a href="cha-user-defined.html#cb252-7" tabindex="-1"></a>code <span class="ot"><-</span> <span class="fu">nimbleCode</span>({</span>
<span id="cb252-8"><a href="cha-user-defined.html#cb252-8" tabindex="-1"></a> <span class="cf">for</span>(i <span class="cf">in</span> <span class="dv">1</span><span class="sc">:</span><span class="dv">3</span>) {</span>
<span id="cb252-9"><a href="cha-user-defined.html#cb252-9" tabindex="-1"></a> mu[i] <span class="sc">~</span> <span class="fu">dnorm</span>(<span class="dv">0</span>, <span class="dv">1</span>)</span>
<span id="cb252-10"><a href="cha-user-defined.html#cb252-10" tabindex="-1"></a> }</span>
<span id="cb252-11"><a href="cha-user-defined.html#cb252-11" tabindex="-1"></a> mu_times_two[<span class="dv">1</span><span class="sc">:</span><span class="dv">3</span>] <span class="ot"><-</span> <span class="fu">vectorTimesTwo</span>(mu[<span class="dv">1</span><span class="sc">:</span><span class="dv">3</span>])</span>
<span id="cb252-12"><a href="cha-user-defined.html#cb252-12" tabindex="-1"></a>})</span></code></pre></div>
<p>There is a subtle difference between the <code>mu_times_two</code> variables in the two examples. In the first example, there are individual nodes for each <code>mu_times_two[i]</code>. In the second example, there is a single multivariate node, <code>mu_times_two[1:3]</code>. Each implementation could be more efficient for different needs. For example, suppose an algorithm modifies the value of <code>mu[2]</code> and then updates nodes that depend on it. In the first example, <code>mu_times_two[2]</code> would be updated. In the second example <code>mu_times_two[1:3]</code> would be updated because it is a single, vector node.</p>
<p>At present in compiled use of a model, you cannot provide a scalar argument where the user-defined nimbleFunction expects a vector; unlike in R, scalars are not simply vectors of length 1.</p>
</div>
<div id="sec:user-distributions" class="section level2 hasAnchor" number="12.2">
<h2><span class="header-section-number">12.2</span> User-defined distributions<a href="cha-user-defined.html#sec:user-distributions" class="anchor-section" aria-label="Anchor link to header"></a></h2>
<p>To provide a user-defined distribution, you need to define density
(‘d’) and (optionally)
simulation (‘r’) <code>nimbleFunctions</code> for your distribution. In many cases you can then
simply use your distribution in BUGS code as you would any
distribution already provided by NIMBLE, while in a few special cases<a href="#fn24" class="footnote-ref" id="fnref24"><sup>24</sup></a>
you need to explicitly register your distribution as described in Section <a href="cha-user-defined.html#sec:registerDistributions">12.2.1</a>.</p>
<p>You need to provide the simulation (‘r’) function if any algorithm used with a model
that uses the distribution needs to simulate from the distribution. This is not the case for NIMBLE’s built-in
MCMC sampler functions, and therefore the simulation function is not generally required for standard MCMC in NIMBLE.
However, the ‘r’ function is necessary for initialization of nodes that are assigned the user-defined distribution if no initial value is provided, and for sampling posterior predictive nodes (those nodes with no downstream data dependencies) that are assigned the user-defined distribution.</p>
<p>You can optionally provide distribution (‘p’) and quantile (‘q’)
functions, which will allow truncation to be applied to a user-defined
distribution. You can also provide a list of alternative
parameterizations, but only if you explicitly register the distribution.</p>
<p>Here is an extended example of providing a univariate exponential
distribution (solely for illustration as this is already provided by NIMBLE) and a
multivariate Dirichlet-multinomial distribution.</p>
<div class="sourceCode" id="cb253"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb253-1"><a href="cha-user-defined.html#cb253-1" tabindex="-1"></a>dmyexp <span class="ot"><-</span> <span class="fu">nimbleFunction</span>(</span>
<span id="cb253-2"><a href="cha-user-defined.html#cb253-2" tabindex="-1"></a> <span class="at">run =</span> <span class="cf">function</span>(<span class="at">x =</span> <span class="fu">double</span>(<span class="dv">0</span>), <span class="at">rate =</span> <span class="fu">double</span>(<span class="dv">0</span>, <span class="at">default =</span> <span class="dv">1</span>), </span>
<span id="cb253-3"><a href="cha-user-defined.html#cb253-3" tabindex="-1"></a> <span class="at">log =</span> <span class="fu">integer</span>(<span class="dv">0</span>, <span class="at">default =</span> <span class="dv">0</span>)) {</span>
<span id="cb253-4"><a href="cha-user-defined.html#cb253-4" tabindex="-1"></a> <span class="fu">returnType</span>(<span class="fu">double</span>(<span class="dv">0</span>))</span>
<span id="cb253-5"><a href="cha-user-defined.html#cb253-5" tabindex="-1"></a> logProb <span class="ot"><-</span> <span class="fu">log</span>(rate) <span class="sc">-</span> x<span class="sc">*</span>rate</span>
<span id="cb253-6"><a href="cha-user-defined.html#cb253-6" tabindex="-1"></a> <span class="cf">if</span>(log) <span class="fu">return</span>(logProb)</span>
<span id="cb253-7"><a href="cha-user-defined.html#cb253-7" tabindex="-1"></a> <span class="cf">else</span> <span class="fu">return</span>(<span class="fu">exp</span>(logProb)) </span>
<span id="cb253-8"><a href="cha-user-defined.html#cb253-8" tabindex="-1"></a> })</span>
<span id="cb253-9"><a href="cha-user-defined.html#cb253-9" tabindex="-1"></a></span>
<span id="cb253-10"><a href="cha-user-defined.html#cb253-10" tabindex="-1"></a>rmyexp <span class="ot"><-</span> <span class="fu">nimbleFunction</span>(</span>
<span id="cb253-11"><a href="cha-user-defined.html#cb253-11" tabindex="-1"></a> <span class="at">run =</span> <span class="cf">function</span>(<span class="at">n =</span> <span class="fu">integer</span>(<span class="dv">0</span>), <span class="at">rate =</span> <span class="fu">double</span>(<span class="dv">0</span>, <span class="at">default =</span> <span class="dv">1</span>)) {</span>
<span id="cb253-12"><a href="cha-user-defined.html#cb253-12" tabindex="-1"></a> <span class="fu">returnType</span>(<span class="fu">double</span>(<span class="dv">0</span>))</span>
<span id="cb253-13"><a href="cha-user-defined.html#cb253-13" tabindex="-1"></a> <span class="cf">if</span>(n <span class="sc">!=</span> <span class="dv">1</span>) <span class="fu">print</span>(<span class="st">"rmyexp only allows n = 1; using n = 1."</span>)</span>
<span id="cb253-14"><a href="cha-user-defined.html#cb253-14" tabindex="-1"></a> dev <span class="ot"><-</span> <span class="fu">runif</span>(<span class="dv">1</span>, <span class="dv">0</span>, <span class="dv">1</span>)</span>
<span id="cb253-15"><a href="cha-user-defined.html#cb253-15" tabindex="-1"></a> <span class="fu">return</span>(<span class="sc">-</span><span class="fu">log</span>(<span class="dv">1</span><span class="sc">-</span>dev) <span class="sc">/</span> rate)</span>
<span id="cb253-16"><a href="cha-user-defined.html#cb253-16" tabindex="-1"></a> })</span>
<span id="cb253-17"><a href="cha-user-defined.html#cb253-17" tabindex="-1"></a></span>
<span id="cb253-18"><a href="cha-user-defined.html#cb253-18" tabindex="-1"></a>pmyexp <span class="ot"><-</span> <span class="fu">nimbleFunction</span>(</span>
<span id="cb253-19"><a href="cha-user-defined.html#cb253-19" tabindex="-1"></a> <span class="at">run =</span> <span class="cf">function</span>(<span class="at">q =</span> <span class="fu">double</span>(<span class="dv">0</span>), <span class="at">rate =</span> <span class="fu">double</span>(<span class="dv">0</span>, <span class="at">default =</span> <span class="dv">1</span>), </span>
<span id="cb253-20"><a href="cha-user-defined.html#cb253-20" tabindex="-1"></a> <span class="at">lower.tail =</span> <span class="fu">integer</span>(<span class="dv">0</span>, <span class="at">default =</span> <span class="dv">1</span>), </span>
<span id="cb253-21"><a href="cha-user-defined.html#cb253-21" tabindex="-1"></a> <span class="at">log.p =</span> <span class="fu">integer</span>(<span class="dv">0</span>, <span class="at">default =</span> <span class="dv">0</span>)) {</span>
<span id="cb253-22"><a href="cha-user-defined.html#cb253-22" tabindex="-1"></a> <span class="fu">returnType</span>(<span class="fu">double</span>(<span class="dv">0</span>))</span>
<span id="cb253-23"><a href="cha-user-defined.html#cb253-23" tabindex="-1"></a> <span class="cf">if</span>(<span class="sc">!</span>lower.tail) { </span>
<span id="cb253-24"><a href="cha-user-defined.html#cb253-24" tabindex="-1"></a> logp <span class="ot"><-</span> <span class="sc">-</span>rate <span class="sc">*</span> q</span>
<span id="cb253-25"><a href="cha-user-defined.html#cb253-25" tabindex="-1"></a> <span class="cf">if</span>(log.p) <span class="fu">return</span>(logp)</span>
<span id="cb253-26"><a href="cha-user-defined.html#cb253-26" tabindex="-1"></a> <span class="cf">else</span> <span class="fu">return</span>(<span class="fu">exp</span>(logp))</span>
<span id="cb253-27"><a href="cha-user-defined.html#cb253-27" tabindex="-1"></a> } <span class="cf">else</span> {</span>
<span id="cb253-28"><a href="cha-user-defined.html#cb253-28" tabindex="-1"></a> p <span class="ot"><-</span> <span class="dv">1</span> <span class="sc">-</span> <span class="fu">exp</span>(<span class="sc">-</span>rate <span class="sc">*</span> q)</span>
<span id="cb253-29"><a href="cha-user-defined.html#cb253-29" tabindex="-1"></a> <span class="cf">if</span>(<span class="sc">!</span>log.p) <span class="fu">return</span>(p)</span>
<span id="cb253-30"><a href="cha-user-defined.html#cb253-30" tabindex="-1"></a> <span class="cf">else</span> <span class="fu">return</span>(<span class="fu">log</span>(p))</span>
<span id="cb253-31"><a href="cha-user-defined.html#cb253-31" tabindex="-1"></a> }</span>
<span id="cb253-32"><a href="cha-user-defined.html#cb253-32" tabindex="-1"></a> })</span>
<span id="cb253-33"><a href="cha-user-defined.html#cb253-33" tabindex="-1"></a></span>
<span id="cb253-34"><a href="cha-user-defined.html#cb253-34" tabindex="-1"></a>qmyexp <span class="ot"><-</span> <span class="fu">nimbleFunction</span>(</span>
<span id="cb253-35"><a href="cha-user-defined.html#cb253-35" tabindex="-1"></a> <span class="at">run =</span> <span class="cf">function</span>(<span class="at">p =</span> <span class="fu">double</span>(<span class="dv">0</span>), <span class="at">rate =</span> <span class="fu">double</span>(<span class="dv">0</span>, <span class="at">default =</span> <span class="dv">1</span>), </span>
<span id="cb253-36"><a href="cha-user-defined.html#cb253-36" tabindex="-1"></a> <span class="at">lower.tail =</span> <span class="fu">integer</span>(<span class="dv">0</span>, <span class="at">default =</span> <span class="dv">1</span>), </span>
<span id="cb253-37"><a href="cha-user-defined.html#cb253-37" tabindex="-1"></a> <span class="at">log.p =</span> <span class="fu">integer</span>(<span class="dv">0</span>, <span class="at">default =</span> <span class="dv">0</span>)) {</span>
<span id="cb253-38"><a href="cha-user-defined.html#cb253-38" tabindex="-1"></a> <span class="fu">returnType</span>(<span class="fu">double</span>(<span class="dv">0</span>))</span>
<span id="cb253-39"><a href="cha-user-defined.html#cb253-39" tabindex="-1"></a> <span class="cf">if</span>(log.p) p <span class="ot"><-</span> <span class="fu">exp</span>(p)</span>
<span id="cb253-40"><a href="cha-user-defined.html#cb253-40" tabindex="-1"></a> <span class="cf">if</span>(<span class="sc">!</span>lower.tail) p <span class="ot"><-</span> <span class="dv">1</span> <span class="sc">-</span> p</span>
<span id="cb253-41"><a href="cha-user-defined.html#cb253-41" tabindex="-1"></a> <span class="fu">return</span>(<span class="sc">-</span><span class="fu">log</span>(<span class="dv">1</span> <span class="sc">-</span> p) <span class="sc">/</span> rate)</span>
<span id="cb253-42"><a href="cha-user-defined.html#cb253-42" tabindex="-1"></a> })</span>
<span id="cb253-43"><a href="cha-user-defined.html#cb253-43" tabindex="-1"></a></span>
<span id="cb253-44"><a href="cha-user-defined.html#cb253-44" tabindex="-1"></a>ddirchmulti <span class="ot"><-</span> <span class="fu">nimbleFunction</span>(</span>
<span id="cb253-45"><a href="cha-user-defined.html#cb253-45" tabindex="-1"></a> <span class="at">run =</span> <span class="cf">function</span>(<span class="at">x =</span> <span class="fu">double</span>(<span class="dv">1</span>), <span class="at">alpha =</span> <span class="fu">double</span>(<span class="dv">1</span>), <span class="at">size =</span> <span class="fu">double</span>(<span class="dv">0</span>), </span>
<span id="cb253-46"><a href="cha-user-defined.html#cb253-46" tabindex="-1"></a> <span class="at">log =</span> <span class="fu">integer</span>(<span class="dv">0</span>, <span class="at">default =</span> <span class="dv">0</span>)) {</span>
<span id="cb253-47"><a href="cha-user-defined.html#cb253-47" tabindex="-1"></a> <span class="fu">returnType</span>(<span class="fu">double</span>(<span class="dv">0</span>))</span>
<span id="cb253-48"><a href="cha-user-defined.html#cb253-48" tabindex="-1"></a> logProb <span class="ot"><-</span> <span class="fu">lgamma</span>(size<span class="sc">+</span><span class="dv">1</span>) <span class="sc">-</span> <span class="fu">sum</span>(<span class="fu">lgamma</span>(x<span class="sc">+</span><span class="dv">1</span>)) <span class="sc">+</span> <span class="fu">lgamma</span>(<span class="fu">sum</span>(alpha)) <span class="sc">-</span></span>
<span id="cb253-49"><a href="cha-user-defined.html#cb253-49" tabindex="-1"></a> <span class="fu">sum</span>(<span class="fu">lgamma</span>(alpha)) <span class="sc">+</span> <span class="fu">sum</span>(<span class="fu">lgamma</span>(alpha <span class="sc">+</span> x)) <span class="sc">-</span></span>
<span id="cb253-50"><a href="cha-user-defined.html#cb253-50" tabindex="-1"></a> <span class="fu">lgamma</span>(<span class="fu">sum</span>(alpha) <span class="sc">+</span> size)</span>
<span id="cb253-51"><a href="cha-user-defined.html#cb253-51" tabindex="-1"></a> <span class="cf">if</span>(log) <span class="fu">return</span>(logProb)</span>
<span id="cb253-52"><a href="cha-user-defined.html#cb253-52" tabindex="-1"></a> <span class="cf">else</span> <span class="fu">return</span>(<span class="fu">exp</span>(logProb))</span>
<span id="cb253-53"><a href="cha-user-defined.html#cb253-53" tabindex="-1"></a> })</span>
<span id="cb253-54"><a href="cha-user-defined.html#cb253-54" tabindex="-1"></a></span>
<span id="cb253-55"><a href="cha-user-defined.html#cb253-55" tabindex="-1"></a>rdirchmulti <span class="ot"><-</span> <span class="fu">nimbleFunction</span>(</span>
<span id="cb253-56"><a href="cha-user-defined.html#cb253-56" tabindex="-1"></a> <span class="at">run =</span> <span class="cf">function</span>(<span class="at">n =</span> <span class="fu">integer</span>(<span class="dv">0</span>), <span class="at">alpha =</span> <span class="fu">double</span>(<span class="dv">1</span>), <span class="at">size =</span> <span class="fu">double</span>(<span class="dv">0</span>)) {</span>
<span id="cb253-57"><a href="cha-user-defined.html#cb253-57" tabindex="-1"></a> <span class="fu">returnType</span>(<span class="fu">double</span>(<span class="dv">1</span>))</span>
<span id="cb253-58"><a href="cha-user-defined.html#cb253-58" tabindex="-1"></a> <span class="cf">if</span>(n <span class="sc">!=</span> <span class="dv">1</span>) <span class="fu">print</span>(<span class="st">"rdirchmulti only allows n = 1; using n = 1."</span>)</span>
<span id="cb253-59"><a href="cha-user-defined.html#cb253-59" tabindex="-1"></a> p <span class="ot"><-</span> <span class="fu">rdirch</span>(<span class="dv">1</span>, alpha)</span>
<span id="cb253-60"><a href="cha-user-defined.html#cb253-60" tabindex="-1"></a> <span class="fu">return</span>(<span class="fu">rmulti</span>(<span class="dv">1</span>, <span class="at">size =</span> size, <span class="at">prob =</span> p))</span>
<span id="cb253-61"><a href="cha-user-defined.html#cb253-61" tabindex="-1"></a> })</span>
<span id="cb253-62"><a href="cha-user-defined.html#cb253-62" tabindex="-1"></a></span>
<span id="cb253-63"><a href="cha-user-defined.html#cb253-63" tabindex="-1"></a>code <span class="ot"><-</span> <span class="fu">nimbleCode</span>({</span>
<span id="cb253-64"><a href="cha-user-defined.html#cb253-64" tabindex="-1"></a> y[<span class="dv">1</span><span class="sc">:</span>K] <span class="sc">~</span> <span class="fu">ddirchmulti</span>(alpha[<span class="dv">1</span><span class="sc">:</span>K], n)</span>
<span id="cb253-65"><a href="cha-user-defined.html#cb253-65" tabindex="-1"></a> <span class="cf">for</span>(i <span class="cf">in</span> <span class="dv">1</span><span class="sc">:</span>K) {</span>
<span id="cb253-66"><a href="cha-user-defined.html#cb253-66" tabindex="-1"></a> alpha[i] <span class="sc">~</span> <span class="fu">dmyexp</span>(<span class="dv">1</span><span class="sc">/</span><span class="dv">3</span>)</span>
<span id="cb253-67"><a href="cha-user-defined.html#cb253-67" tabindex="-1"></a> }</span>
<span id="cb253-68"><a href="cha-user-defined.html#cb253-68" tabindex="-1"></a> })</span>
<span id="cb253-69"><a href="cha-user-defined.html#cb253-69" tabindex="-1"></a></span>
<span id="cb253-70"><a href="cha-user-defined.html#cb253-70" tabindex="-1"></a>model <span class="ot"><-</span> <span class="fu">nimbleModel</span>(code, <span class="at">constants =</span> <span class="fu">list</span>(<span class="at">K =</span> <span class="dv">5</span>, <span class="at">n =</span> <span class="dv">10</span>))</span></code></pre></div>
<p>The distribution-related functions should take as input the parameters
for a single parameterization, which will be the canonical
parameterization that NIMBLE will use.</p>
<p>Here are more details on the requirements for distribution-related nimbleFunctions, which follow R’s conventions:</p>
<ul>
<li>Your distribution-related functions must have names that begin with ‘d’, ‘r’, ‘p’ and ‘q’. The name of the distribution must not be identical to any of the NIMBLE-provided distributions.</li>
<li>All simulation (‘r’) functions must take <code>n</code> as their first argument. Note that you may simply have your function only handle <code>n=1</code> and return an warning for other values of <code>n</code>.</li>
<li>NIMBLE uses doubles for numerical calculations, so we suggest simply using doubles in general, even for integer-valued parameters or values of random variables. In fact, non-scalars <em>must</em> be declared as doubles.</li>
<li>All density functions must have as their last argument <code>log</code> and implement return of the log probability density. NIMBLE algorithms typically use only <code>log = 1</code> (i.e., TRUE), but we recommend you implement the <code>log = 0</code> (i.e., FALSE) case for completeness.</li>
<li>All distribution and quantile functions must have their last two arguments be (in order) <code>lower.tail</code> and <code>log.p</code>. These functions must work for <code>lower.tail = 1</code> (i.e., TRUE) and <code>log.p = 0</code> (i.e., FALSE), as these are the inputs we use when working with truncated distributions. It is your choice whether you implement the necessary calculations for other combinations of these inputs, but again we recommend doing so for completeness.</li>
<li>Define the nimbleFunctions in R’s global environment. Don’t expect R’s standard scoping to work<a href="#fn25" class="footnote-ref" id="fnref25"><sup>25</sup></a>.</li>
</ul>
<div id="sec:registerDistributions" class="section level3 hasAnchor" number="12.2.1">
<h3><span class="header-section-number">12.2.1</span> Using <em>registerDistributions</em> for alternative parameterizations and providing other information<a href="cha-user-defined.html#sec:registerDistributions" class="anchor-section" aria-label="Anchor link to header"></a></h3>
<p>Behind the scenes, NIMBLE uses the function
<code>registerDistributions</code> to set up new distributions for use in BUGS
code. In some circumstances, you will need to call
<code>registerDistributions</code> directly to provide information that NIMBLE
can’t obtain automatically from the nimbleFunctions you write.</p>
<p>The cases in which you’ll need to explicitly call
<code>registerDistributions</code> are when you want to do any of the following:</p>
<ul>
<li>provide alternative parameterizations,</li>
<li>indicate a distribution is discrete, and</li>
<li>provide the range of possible values for a distribution.</li>
</ul>
<p>If you would like to allow for
multiple parameterizations, you can do this via the <code>Rdist</code> element
of the list provided to <code>registerDistributions</code> as illustrated below. If
you provide CDF (‘p’) and inverse CDF (quantile, i.e. ‘q’)
functions, be sure to specify <code>pqAvail = TRUE</code> when you call
<code>registerDistributions</code>. Here’s an example of using <code>registerDistributions</code>
to provide an alternative parameterization (scale instead of rate) and to provide the range
for the user-defined exponential distribution. We can then use
the alternative parameterization in our BUGS code.</p>
<div class="sourceCode" id="cb254"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb254-1"><a href="cha-user-defined.html#cb254-1" tabindex="-1"></a><span class="fu">registerDistributions</span>(<span class="fu">list</span>(</span>
<span id="cb254-2"><a href="cha-user-defined.html#cb254-2" tabindex="-1"></a> <span class="at">dmyexp =</span> <span class="fu">list</span>(</span>
<span id="cb254-3"><a href="cha-user-defined.html#cb254-3" tabindex="-1"></a> <span class="at">BUGSdist =</span> <span class="st">"dmyexp(rate, scale)"</span>,</span>
<span id="cb254-4"><a href="cha-user-defined.html#cb254-4" tabindex="-1"></a> <span class="at">Rdist =</span> <span class="st">"dmyexp(rate = 1/scale)"</span>,</span>
<span id="cb254-5"><a href="cha-user-defined.html#cb254-5" tabindex="-1"></a> <span class="at">altParams =</span> <span class="fu">c</span>(<span class="st">"scale = 1/rate"</span>, <span class="st">"mean = 1/rate"</span>),</span>
<span id="cb254-6"><a href="cha-user-defined.html#cb254-6" tabindex="-1"></a> <span class="at">pqAvail =</span> <span class="cn">TRUE</span>, </span>
<span id="cb254-7"><a href="cha-user-defined.html#cb254-7" tabindex="-1"></a> <span class="at">range =</span> <span class="fu">c</span>(<span class="dv">0</span>, <span class="cn">Inf</span>)</span>
<span id="cb254-8"><a href="cha-user-defined.html#cb254-8" tabindex="-1"></a> )</span>
<span id="cb254-9"><a href="cha-user-defined.html#cb254-9" tabindex="-1"></a> ))</span>
<span id="cb254-10"><a href="cha-user-defined.html#cb254-10" tabindex="-1"></a></span>
<span id="cb254-11"><a href="cha-user-defined.html#cb254-11" tabindex="-1"></a>code <span class="ot"><-</span> <span class="fu">nimbleCode</span>({</span>
<span id="cb254-12"><a href="cha-user-defined.html#cb254-12" tabindex="-1"></a> y[<span class="dv">1</span><span class="sc">:</span>K] <span class="sc">~</span> <span class="fu">ddirchmulti</span>(alpha[<span class="dv">1</span><span class="sc">:</span>K], n)</span>
<span id="cb254-13"><a href="cha-user-defined.html#cb254-13" tabindex="-1"></a> <span class="cf">for</span>(i <span class="cf">in</span> <span class="dv">1</span><span class="sc">:</span>K) {</span>
<span id="cb254-14"><a href="cha-user-defined.html#cb254-14" tabindex="-1"></a> alpha[i] <span class="sc">~</span> <span class="fu">T</span>(<span class="fu">dmyexp</span>(<span class="at">scale =</span> <span class="dv">3</span>), <span class="dv">0</span>, <span class="dv">100</span>)</span>
<span id="cb254-15"><a href="cha-user-defined.html#cb254-15" tabindex="-1"></a> }</span>
<span id="cb254-16"><a href="cha-user-defined.html#cb254-16" tabindex="-1"></a> })</span>
<span id="cb254-17"><a href="cha-user-defined.html#cb254-17" tabindex="-1"></a></span>
<span id="cb254-18"><a href="cha-user-defined.html#cb254-18" tabindex="-1"></a>model <span class="ot"><-</span> <span class="fu">nimbleModel</span>(code, <span class="at">constants =</span> <span class="fu">list</span>(<span class="at">K =</span> <span class="dv">5</span>, <span class="at">n =</span> <span class="dv">10</span>), </span>
<span id="cb254-19"><a href="cha-user-defined.html#cb254-19" tabindex="-1"></a> <span class="at">inits =</span> <span class="fu">list</span>(<span class="at">alpha =</span> <span class="fu">rep</span>(<span class="dv">1</span>, <span class="dv">5</span>)))</span></code></pre></div>
<p>There are a few rules for how you specify the information about a
distribution that you provide to <code>registerDistributions</code>:</p>
<ul>
<li>The function name in the <code>BUGSdist</code> entry in the list provided to <code>registerDistributions</code> will be the name you can use in BUGS code.</li>
<li>The names of your nimbleFunctions must match the function name in the <code>Rdist</code> entry. If missing, the <code>Rdist</code> entry defaults to be the same as the <code>BUGSdist</code> entry.</li>
<li>Your distribution-related functions must take as arguments the
parameters in default order, starting as the second argument and in the order used in the parameterizations in the <code>Rdist</code> argument to <code>registerDistributions</code> or the <code>BUGSdist</code> argument if there are no alternative parameterizations.</li>
<li>You must specify a <code>types</code> entry in the list provided to <code>registerDistributions</code> if the distribution is multivariate or if any parameter is non-scalar.</li>
</ul>
<p>Further details on using <code>registerDistributions</code> can be found via R help on <code>registerDistributions</code>. NIMBLE uses the same list format as <code>registerDistributions</code> to define its distributions. This list can be found in the <code>R/distributions_inputList.R</code> file in the package source code directory or as the R list <code>nimble:::distributionsInputList</code>.</p>
</div>
</div>
<div id="sec:adv-user-def" class="section level2 hasAnchor" number="12.3">
<h2><span class="header-section-number">12.3</span> Advanced user-defined functions and distributions<a href="cha-user-defined.html#sec:adv-user-def" class="anchor-section" aria-label="Anchor link to header"></a></h2>
<p>Sometimes it is useful for a user-defined function or distribution to use
external information and/or hold variables that persist between calls. One can
do this by creating nimbleFunctions that use <code>setup</code> code and have one or more
methods. If you are familiar with object-oriented programming, this variety of
nimbleFunction defines a class. Here we will give a toy example that is not
fully explained because the NIMBLE programming concepts are covered in Chapter
<a href="cha-progr-with-models.html#cha-progr-with-models">15</a>. After studying that chapter, the example here
should make more sense.</p>
<p>As a toy example, consider this basic linear regression model with one explanatory variable:</p>
<div class="sourceCode" id="cb255"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb255-1"><a href="cha-user-defined.html#cb255-1" tabindex="-1"></a>code <span class="ot"><-</span> <span class="fu">nimbleCode</span>({</span>
<span id="cb255-2"><a href="cha-user-defined.html#cb255-2" tabindex="-1"></a> beta0 <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="cb255-3"><a href="cha-user-defined.html#cb255-3" tabindex="-1"></a> beta1 <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="cb255-4"><a href="cha-user-defined.html#cb255-4" tabindex="-1"></a> sigma <span class="sc">~</span> <span class="fu">dhalfflat</span>()</span>
<span id="cb255-5"><a href="cha-user-defined.html#cb255-5" tabindex="-1"></a> <span class="cf">for</span>(i <span class="cf">in</span> <span class="dv">1</span><span class="sc">:</span>n) {</span>
<span id="cb255-6"><a href="cha-user-defined.html#cb255-6" tabindex="-1"></a> y[i] <span class="sc">~</span> <span class="fu">dnorm</span>(beta0 <span class="sc">+</span> beta1<span class="sc">*</span>x[i], <span class="at">sd =</span> sigma)</span>
<span id="cb255-7"><a href="cha-user-defined.html#cb255-7" tabindex="-1"></a> }</span>
<span id="cb255-8"><a href="cha-user-defined.html#cb255-8" tabindex="-1"></a>})</span>
<span id="cb255-9"><a href="cha-user-defined.html#cb255-9" tabindex="-1"></a><span class="co"># Simulate some data:</span></span>
<span id="cb255-10"><a href="cha-user-defined.html#cb255-10" tabindex="-1"></a>x <span class="ot"><-</span> <span class="fu">runif</span>(<span class="dv">10</span>)</span>
<span id="cb255-11"><a href="cha-user-defined.html#cb255-11" tabindex="-1"></a>y <span class="ot"><-</span> <span class="fu">rnorm</span>(<span class="dv">10</span>, <span class="dv">3</span> <span class="sc">+</span> <span class="fl">0.5</span> <span class="sc">*</span> x, <span class="at">sd =</span> <span class="fl">0.2</span>)</span>
<span id="cb255-12"><a href="cha-user-defined.html#cb255-12" tabindex="-1"></a>model <span class="ot"><-</span> <span class="fu">nimbleModel</span>(code, <span class="at">constants =</span> <span class="fu">list</span>(<span class="at">n =</span> <span class="dv">10</span>, <span class="at">x =</span> x), </span>
<span id="cb255-13"><a href="cha-user-defined.html#cb255-13" tabindex="-1"></a> <span class="at">data =</span> <span class="fu">list</span>(<span class="at">y =</span> y),</span>
<span id="cb255-14"><a href="cha-user-defined.html#cb255-14" tabindex="-1"></a> <span class="at">inits =</span> <span class="fu">list</span>(<span class="at">beta0=</span><span class="fl">3.1</span>,<span class="at">beta1=</span><span class="fl">0.4</span>,<span class="at">sigma=</span><span class="fl">0.3</span>))</span></code></pre></div>
<p>Now suppose we want to rewrite this model in an equivalent way by providing a “distribution” that actually contains all the steps to calculate the log likelihood for the linear regression internally (for all of <code>y[1:10]</code> at once), including that it contains the explanatory variable <code>x</code>. We could do that as follows:</p>
<div class="sourceCode" id="cb256"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb256-1"><a href="cha-user-defined.html#cb256-1" tabindex="-1"></a><span class="fu">nimbleOptions</span>(<span class="at">allowNFobjInModel=</span><span class="cn">TRUE</span>) <span class="co"># This option should be TRUE by default,</span></span>
<span id="cb256-2"><a href="cha-user-defined.html#cb256-2" tabindex="-1"></a> <span class="co"># but we include this step to be sure.</span></span>
<span id="cb256-3"><a href="cha-user-defined.html#cb256-3" tabindex="-1"></a>linear_reg <span class="ot"><-</span> <span class="fu">nimbleFunction</span>(</span>
<span id="cb256-4"><a href="cha-user-defined.html#cb256-4" tabindex="-1"></a> <span class="at">setup =</span> <span class="cf">function</span>(predictor) {}, <span class="co"># Call x "predictor" here for clarity</span></span>
<span id="cb256-5"><a href="cha-user-defined.html#cb256-5" tabindex="-1"></a> <span class="at">methods =</span> <span class="fu">list</span>(</span>
<span id="cb256-6"><a href="cha-user-defined.html#cb256-6" tabindex="-1"></a> <span class="at">dcalc =</span> <span class="cf">function</span>(<span class="at">x =</span> <span class="fu">double</span>(<span class="dv">1</span>), <span class="co"># Note that this will be y!</span></span>
<span id="cb256-7"><a href="cha-user-defined.html#cb256-7" tabindex="-1"></a> <span class="at">beta0=</span><span class="fu">double</span>(), <span class="at">beta1=</span><span class="fu">double</span>(), <span class="at">sigma=</span><span class="fu">double</span>(),</span>
<span id="cb256-8"><a href="cha-user-defined.html#cb256-8" tabindex="-1"></a> <span class="at">log=</span><span class="fu">integer</span>(<span class="dv">0</span>, <span class="at">default=</span><span class="dv">0</span>)) {</span>
<span id="cb256-9"><a href="cha-user-defined.html#cb256-9" tabindex="-1"></a> llh <span class="ot"><-</span> <span class="fu">sum</span>(<span class="fu">dnorm</span>(x, beta0<span class="sc">+</span>beta1<span class="sc">*</span>predictor, <span class="at">sd=</span>sigma, <span class="at">log=</span><span class="cn">TRUE</span>))</span>
<span id="cb256-10"><a href="cha-user-defined.html#cb256-10" tabindex="-1"></a> <span class="cf">if</span>(log) <span class="fu">return</span>(llh)</span>
<span id="cb256-11"><a href="cha-user-defined.html#cb256-11" tabindex="-1"></a> <span class="fu">return</span>(<span class="fu">exp</span>(llh))</span>
<span id="cb256-12"><a href="cha-user-defined.html#cb256-12" tabindex="-1"></a> <span class="fu">returnType</span>(<span class="fu">double</span>())</span>
<span id="cb256-13"><a href="cha-user-defined.html#cb256-13" tabindex="-1"></a> }))</span>
<span id="cb256-14"><a href="cha-user-defined.html#cb256-14" tabindex="-1"></a>my_linear_reg <span class="ot"><-</span> <span class="fu">linear_reg</span>(x)</span>
<span id="cb256-15"><a href="cha-user-defined.html#cb256-15" tabindex="-1"></a>code2 <span class="ot"><-</span> <span class="fu">nimbleCode</span>({</span>
<span id="cb256-16"><a href="cha-user-defined.html#cb256-16" tabindex="-1"></a> beta0 <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="cb256-17"><a href="cha-user-defined.html#cb256-17" tabindex="-1"></a> beta1 <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="cb256-18"><a href="cha-user-defined.html#cb256-18" tabindex="-1"></a> sigma <span class="sc">~</span> <span class="fu">dhalfflat</span>()</span>
<span id="cb256-19"><a href="cha-user-defined.html#cb256-19" tabindex="-1"></a> y[<span class="dv">1</span><span class="sc">:</span>n] <span class="sc">~</span> my_linear_reg<span class="sc">$</span><span class="fu">dcalc</span>(beta0, beta1, sigma)</span>
<span id="cb256-20"><a href="cha-user-defined.html#cb256-20" tabindex="-1"></a>})</span>
<span id="cb256-21"><a href="cha-user-defined.html#cb256-21" tabindex="-1"></a>model <span class="ot"><-</span> <span class="fu">nimbleModel</span>(code2, <span class="at">constants =</span> <span class="fu">list</span>(<span class="at">n =</span> <span class="dv">10</span>), </span>
<span id="cb256-22"><a href="cha-user-defined.html#cb256-22" tabindex="-1"></a> <span class="at">data =</span> <span class="fu">list</span>(<span class="at">y =</span> y),</span>
<span id="cb256-23"><a href="cha-user-defined.html#cb256-23" tabindex="-1"></a> <span class="at">inits =</span> <span class="fu">list</span>(<span class="at">beta0=</span><span class="fl">3.1</span>,<span class="at">beta1=</span><span class="fl">0.4</span>,<span class="at">sigma=</span><span class="fl">0.3</span>))</span></code></pre></div>
<p>What is going on, and why would one even think of doing it this way? <code>linear_reg</code> here is defined as a nimbleFunction to create objects that will hold values of <code>x</code> internally and use them when the <code>dcalc</code> function (or “method”) is called. <code>my_linear_reg</code> is one instance of <code>linear_reg</code> that holds the specific values of <code>x</code> provided. The method <code>dcalc</code> has the format (arguments, return type, and prefix “d”) of a user-defined distribution, so it can be used that way via <code>my_linear_reg$dcalc</code>. One can provide a corresponding <code>rcalc</code> method, but as above this is only required if it will actually be needed by an algorithm. The suffix “calc” could be replaced with anything, but a user-defined distribution must have the prefix “d” (and can even be named just “<code>d</code>”), and a corresponding simulation must begin with “r”. Any method in an object like <code>my_linear_reg</code> can be used as a user-defined function, and the same nimbleFunction (<code>linear_reg</code>) can define multiple user-defined functions and/or distributions.</p>
<p>(Note the deliberate illustration of a potential confusion: The random variable argument to a user-defined distribution is always named “<code>x</code>”, which in this example will get the values of <code>y[1:10]</code>.)</p>
<p>Now, <em>why</em> would one want to do this? There are several reasons. First, sometimes instead of a short vector like <code>x</code>, there may be quite large data objects involved in some calculation. It can be wasteful (of time and memory when building and compiling models) to provide large objects in models for the sole purpose of passing them to user-defined functions or distributions. It can work well to access them internally as shown with <code>x</code> in this example. One can also consider caching intermediate values from costly calculations or other tricks to speed up calculations.</p>
<p>It is vital when using this approach to understand clearly how an algorithm will use a model, and there is potential to create problems. For example, NIMBLE’s MCMC system uses a set of samplers, each of which assumes the model is fully up-to-date when it begins its operations. “Up-to-date” means that model variables all have the correct current values and all deterministic and stochastic calculations are up-to-date with those values. Sometimes, samplers copy values around to achieve this. However, a sampler has no way to know what variables a nimbleFunction object (e.g. <code>my_linear_reg</code>) is managing internally, and thus has no way to keep them up to date, if necessary. Techniques such as caching or “memoization” should be careful in this regard.</p>
<p>One can also register a distribution in a nimbleFunction object manually, for the reasons given above. The name of the distribution is simply the string “my_linear_reg$dcalc”, to use the current example.</p>
</div>
<div id="sec:user-macros" class="section level2 hasAnchor" number="12.4">
<h2><span class="header-section-number">12.4</span> User-defined model macros<a href="cha-user-defined.html#sec:user-macros" class="anchor-section" aria-label="Anchor link to header"></a></h2>
<p>As discussed in Section <a href="cha-writing-models.html#subsec:macros">5.2.8</a>, users can use macros that provide a succinct syntax for expressing components of a model. The <code>nimbleMacros</code> package provides an initial set of macros, focused on the components of generalized linear (mixed) models.</p>
<p>In addition, NIMBLE users can write their own macros for use in model code.</p>
<p>As a toy example, suppose you wanted to create a macro called <code>MYDIST</code>, which creates a normal distribution with mean 0 and provided standard deviation. The macro would look like this in the NIMBLE model code:</p>
<div class="sourceCode" id="cb257"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb257-1"><a href="cha-user-defined.html#cb257-1" tabindex="-1"></a>y <span class="sc">~</span> <span class="fu">MYDIST</span>(<span class="at">sdev =</span> <span class="dv">2</span>)</span></code></pre></div>
<p>Note that by convention, we define the macro name in all capital letters.</p>
<p>We want the final, processed output to look like:</p>
<div class="sourceCode" id="cb258"><pre class="sourceCode r"><code class="sourceCode r"><span id="cb258-1"><a href="cha-user-defined.html#cb258-1" tabindex="-1"></a>y <span class="sc">~</span> <span class="fu">dnorm</span>(<span class="dv">0</span>, <span class="at">sd =</span> <span class="dv">2</span>)</span></code></pre></div>
<p>One would then need to create the <code>MYDIST</code> macro using <code>buildMacro</code>.</p>
<p>See the <a href="https://cran.r-project.org/web/packages/nimbleMacros">vignette for the <code>nimbleMacros</code> package</a> and <code>help(buildMacro)</code> for more information about how to use <code>buildMacro</code> to create a new macro.</p>
</div>
</div>
<div class="footnotes">
<hr />
<ol start="24">
<li id="fn24"><p>These include providing alternative parameterizations, specifying
the range of the distribution, or specifying that the distribution is a discrete distribution.<a href="cha-user-defined.html#fnref24" class="footnote-back">↩︎</a></p></li>
<li id="fn25"><p>NIMBLE can’t use R’s standard scoping because it doesn’t work for R reference classes, and nimbleFunctions are implemented as custom-generated reference classes.<a href="cha-user-defined.html#fnref25" class="footnote-back">↩︎</a></p></li>
</ol>
</div>
</section>
</div>
</div>
</div>
<a href="cha-RCfunctions.html" class="navigation navigation-prev " aria-label="Previous page"><i class="fa fa-angle-left"></i></a>
<a href="cha-using-models.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>