-
Notifications
You must be signed in to change notification settings - Fork 0
/
article_replication_short.html
1047 lines (1027 loc) · 157 KB
/
article_replication_short.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
<title></title>
<style type="text/css">
/**
* Prism.s theme ported from highlight.js's xcode style
*/
pre code {
padding: 1em;
}
.token.comment {
color: #007400;
}
.token.punctuation {
color: #999;
}
.token.tag,
.token.selector {
color: #aa0d91;
}
.token.boolean,
.token.number,
.token.constant,
.token.symbol {
color: #1c00cf;
}
.token.property,
.token.attr-name,
.token.string,
.token.char,
.token.builtin {
color: #c41a16;
}
.token.inserted {
background-color: #ccffd8;
}
.token.deleted {
background-color: #ffebe9;
}
.token.operator,
.token.entity,
.token.url,
.language-css .token.string,
.style .token.string {
color: #9a6e3a;
}
.token.atrule,
.token.attr-value,
.token.keyword {
color: #836c28;
}
.token.function,
.token.class-name {
color: #DD4A68;
}
.token.regex,
.token.important,
.token.variable {
color: #5c2699;
}
.token.important,
.token.bold {
font-weight: bold;
}
.token.italic {
font-style: italic;
}
</style>
<style type="text/css">
body {
font-family: sans-serif;
max-width: 800px;
margin: auto;
padding: 1em;
line-height: 1.5;
box-sizing: border-box;
}
body, .footnotes, code { font-size: .9em; }
li li { font-size: .95em; }
*, *:before, *:after {
box-sizing: inherit;
}
pre, img { max-width: 100%; }
pre, pre:hover {
white-space: pre-wrap;
word-break: break-all;
}
pre code {
display: block;
overflow-x: auto;
}
code { font-family: 'DejaVu Sans Mono', 'Droid Sans Mono', 'Lucida Console', Consolas, Monaco, monospace; }
:not(pre) > code, code[class] { background-color: #F8F8F8; }
code.language-undefined, pre > code:not([class]) {
background-color: inherit;
border: 1px solid #eee;
}
table {
margin: auto;
border-top: 1px solid #666;
}
table thead th { border-bottom: 1px solid #ddd; }
th, td { padding: 5px; }
thead, tfoot, tr:nth-child(even) { background: #eee; }
blockquote {
color: #666;
margin: 0;
padding-left: 1em;
border-left: 0.5em solid #eee;
}
hr, .footnotes::before { border: 1px dashed #ddd; }
.frontmatter { text-align: center; }
#TOC .numbered li { list-style: none; }
#TOC .numbered { padding-left: 0; }
#TOC .numbered ul { padding-left: 1em; }
table, .body h2 { border-bottom: 1px solid #666; }
.body .appendix, .appendix ~ h2 { border-bottom-style: dashed; }
.footnote-ref a::before { content: "["; }
.footnote-ref a::after { content: "]"; }
.footnotes::before {
content: "";
display: block;
max-width: 20em;
}
@media print {
body {
font-size: 12pt;
max-width: 100%;
}
tr, img { page-break-inside: avoid; }
}
@media only screen and (min-width: 992px) {
pre { white-space: pre; }
}
</style>
</head>
<body>
<div class="include-before">
</div>
<div class="frontmatter">
<div class="title"><h1></h1></div>
<div class="author"><h2></h2></div>
<div class="date"><h3></h3></div>
</div>
<div class="body">
<p>Replication output for article, “hermiter: R package for Sequential
Nonparametric Estimation”. The output below corresponds to the output
produced by running knitr::spin() on the article_replication.R script,
with short_run set to TRUE.</p>
<p>Load libraries.</p>
<pre><code class="language-r">options(dplyr.summarise.inform = F)
if(!require(benchden)) devtools::install_github("thmild/benchden")
library(hermiter)
library(tdigest)
library(microbenchmark)
library(dplyr)
library(randtoolbox)
library(ggplot2)
library(patchwork)
library(arrow)
library(colorspace)
</code></pre>
<p>Choose whether to run quick version of reproduction script i.e. under
an hour of processing time on hardware specified in manuscript versus
full version which would take several hours of run-time.</p>
<pre><code class="language-r">short_run <- TRUE
if (short_run == TRUE){
total_number_of_runs <- 10
} else {
total_number_of_runs <- 100
}
</code></pre>
<p>Set random seed for reproducibility.</p>
<pre><code class="language-r">set.seed(10)
</code></pre>
<p>Reproduce the output of the merge code blocks in section 8.5
First block with standardize = FALSE</p>
<pre><code class="language-r">observations_1 <- rlogis(n=1000)
observations_2 <- rlogis(n=1000)
hermite_est_1 <- hermite_estimator(N=50,standardize=FALSE,
observations = observations_1)
hermite_est_2 <- hermite_estimator(N=50,standardize=FALSE,
observations = observations_2)
hermite_est_merged <- merge_hermite(list(hermite_est_1,
hermite_est_2))
hermite_est_full <- hermite_estimator(N=50,standardize=FALSE,observations =
c(observations_1,observations_2))
all.equal(hermite_est_merged,hermite_est_full)
</code></pre>
<pre><code>## [1] TRUE
</code></pre>
<p>Second block with standardize = TRUE</p>
<pre><code class="language-r">observations_1 <- rlogis(n=1000)
observations_2 <- rlogis(n=1000)
hermite_est_1 <- hermite_estimator(N=50,standardize=TRUE,observations=observations_1)
hermite_est_2 <- hermite_estimator(N=50,standardize=TRUE,observations=observations_2)
hermite_est_merged <- merge_hermite(list(hermite_est_1,hermite_est_2))
hermite_est_full <- hermite_estimator(N=50,standardize=TRUE,observations =
c(observations_1,observations_2))
all.equal(hermite_est_merged,hermite_est_full)
</code></pre>
<pre><code>## [1] "Component \"coeff_vec\": Mean relative difference: 0.006074491"
</code></pre>
<p>Reproduce univariate PDF, CDF and Q-Q plot figures i.e. <strong>Figures 1, 2, 3</strong>
in the text respectively.</p>
<pre><code class="language-r">observations <- rlogis(n=5000)
hermite_est <- hermite_estimator(observations = observations)
x <- seq(-15,15,0.1)
pdf_est <- dens(hermite_est,x)
cdf_est <- cum_prob(hermite_est,x)
p <- seq(0.05,0.95,0.05)
quantile_est <- quant(hermite_est,p)
actual_pdf <- dlogis(x)
actual_cdf <- plogis(x)
df_pdf_cdf <- data.frame(x,pdf_est,cdf_est,actual_pdf,actual_cdf)
actual_quantiles <- qlogis(p)
df_quant <- data.frame(p,quantile_est,actual_quantiles)
pdf_comp_plot <- ggplot(df_pdf_cdf,aes(x=x)) +
geom_line(aes(y=pdf_est, colour="Estimated")) +
geom_line(aes(y=actual_pdf, colour="Actual")) +
scale_colour_manual("",
breaks = c("Estimated", "Actual"),
values = c("blue", "black")) + ylab("Probability Density")
pdf_comp_plot / (ggplot(df_pdf_cdf,aes(x=x,y=pdf_est-actual_pdf)) +
geom_line(color="red")+ ylab("Estimated - Actual"))
</code></pre>
<p><img src="data:image/png;base64,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" alt="plot of chunk reproduce_univar" /></p>
<pre><code class="language-r">cdf_comp_plot <- ggplot(df_pdf_cdf,aes(x=x)) +
geom_line(aes(y=cdf_est, colour="Estimated")) +
geom_line(aes(y=actual_cdf, colour="Actual")) +
scale_colour_manual("",
breaks = c("Estimated", "Actual"),
values = c("blue", "black")) +
ylab("Cumulative Probability")
cdf_comp_plot / (ggplot(df_pdf_cdf,aes(x=x,y=cdf_est-actual_cdf)) +
geom_line(color="red")+ ylab("Estimated - Actual"))
</code></pre>
<p><img src="data:image/png;base64,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" alt="plot of chunk reproduce_univar" /></p>
<pre><code class="language-r">quantile_comp_plot <-ggplot(df_quant,aes(x=actual_quantiles)) +
geom_point(aes(y=quantile_est), color="blue") +
geom_abline(slope=1,intercept = 0) +xlab("Theoretical Quantiles") +
ylab("Estimated Quantiles")
quantile_comp_plot / (ggplot(df_quant,aes(x=p,y=quantile_est-
actual_quantiles)) + geom_point(color="red") +
ylab("Estimated - Actual"))
</code></pre>
<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfgAAAH4CAMAAACR9g9NAAAA81BMVEUAAAAAADoAAGYAAP8AOmYAOpAAZmYAZrYzMzM6AAA6ADo6AGY6OmY6OpA6ZmY6kJA6kNtNTU1NTW5NTY5NbqtNjshmAABmADpmAGZmOgBmOjpmOpBmkJBmtttmtv9uTU1uTY5ujshuq+SOTU2OTY6ObquOjsiOq+SOyP+QOgCQOjqQOmaQtpCQ2/+rbk2rbo6r5P+2ZgC2Zjq2tma2ttu2/7a2///Ijk3Ijm7Ijo7Iq47IyP/I///bkDrbtmbb25Db/7bb/9vb///kq27kq47k///r6+v/AAD/tmb/yI7/25D/5Kv//7b//8j//9v//+T///9JJLujAAAACXBIWXMAAAsSAAALEgHS3X78AAAUyklEQVR4nO2dCXsbtxGGN1ZV+ohbMnYkp20YV7YTySlTM60lt5USx7It6iCz///XdA9eSy6WewyAGcw3z2PJIneID3g5WOxiMYhimEqLfAuA+TGAV2oAr9QAXqkBvFIDeKUG8EoN4JUawCu1tuA/b9jWC1vm5AjIqDwA4JXKAHidMqI12gCvRkYUIeIVykiwo6vXJyPDDvDaZMyxA7wuGUvsAK9Bxt5efsAadhLwMN62l1hCNzLyRcSHKSMFXwj23APgg5eRYsedO30y8sv2LQ+AD1vG4rJ9ywPgQ5axumzf8gD4YGVE65ftWx4AH6iM4kAe4JXI2Lx+A3gVMkou27deAPjgZGxjB3gFMsqwA3zwMsqxA3zYMiITdoAPWYaZetlHAHwgMiqxA3yoMnZgB/gwZURRcxkAL15GGu0Ar03GfCAP8LpkmGddd34EwMuVUTXruvMjAF6qjOLD0o0/AuCFyUgfkv+8df0G8KHLSJ+VLrlsB/jQZZQ/JA/w4cson4gB+MBl1J513XkAwAuS0WDWdecBAC9GRtVEjEPw0xeDJ+cA70xG9fybQ/CXx/HlEcA7krFr2tVtV399HMf3799v6gZraBVL22k+v+Hx01efst9tvsEOjghFRtkaZwIZ7cFPX+aneIC3+RHla5wJZLQGf/t8zh3g7X2EaY0zgYzW4M8GgwEGd1Zl1J9tx3V8ADLm02+NZtsBXr6MfPqt4Ww7wMuXkU+/NZxtB/gAZJSlJrMgA+CZyai1xplABsCzklFzjTOBDIBnJKP1bDvAS5bRYbYd4MXKqFjaDvDNjpAko+kaZwIZAO9fRvM1zgQyzOAnvbuDaAjwtmSU3Jp1KcMIfvZ6dNG7efwB4O3IWN2a9SPDCP7u2em4n/wAeDsyMvBUs+2kEf/j28MRIt6ejOWKGGbg40m0//5wtJs7wLc6IKKcbceoXoqM9REdN/DJmP7b14h4GzJ2ZBR3IsMIfnYyHA9xjrcgY2dGcScyjODTUf0Qo3pyGVZm28kjfrKPiCeVYWm2nfocH92rEfAAX+OA+c0aW7PtGNUzlWHIY+FaRuGFcvBpuKdWJ+S9VEQa+Io78qzAI+JJZUTRHgcZhRcMEf/s7QEinkiG/dl2PxEPqzTLa5wJbOs6fv5jl3n5BkuJeDez7XQRPzvJB3e4ju9yRORqtp34zt1u5gBffsTa8jeurWEEH19gcNf2iPXLdq6tYY74WnPxAF/24vplO9fWMINHV9/6iPXLdq6tYQQfj+s8YQvw2y95mG0njXjcwGl1hJfZdj83cLxUhCf4kvk3rq1hBo9RfdMj2iUU5wY+GdWPh5MeIr7WEYtn5D3LaHCAGfyz0wssqKh5hO/Zdkrws9ejSQ/g6x2RXL+Z5l25toYRfDzZ/+0k6u/mDvBJtBu5s20NM/ja5qUibMBXZjRwJ6PxAUbwuI6vc8TuWVeurVEd8ZM+Ir7caq9x5toa1eAxuDPYcv4tUPA3jwC+1OqvcebaGkbw+Tm+v5u7SvDL+bfwwNc3LxXx2uKd9u/2c0R98DcPouiL0UWNuVkvFfHX4sXrt+DA3zwcpfDxsOWGNZ515doaBvCzk2H2E+CXVrp9d3Dg8+u4yZ9xObcww7LHMMHjOn71373y9W+hgc+7+hjz8Qszzb+FBn4+uHuI5EepVUzEBAd+Z0KM338afK0DfOVETHjgd9n1UXx2HDj48oG8cxm8wH98k7IPejfpbCDvW4QDa1bHdzn4OOCINwzkXcvgGfEBg694kM6lDJojal/H70x+FPo53tr+3X6OaBDx6dq5iuv4oEf1Ud3Z9gDB60yFsrGhr0bw2b07bSlNNxMRagSfnebrcA8LPPkaZ66tYQZf27xUxE6Lb16/qQSvb6MCN/t3+zmi0Tle1UYFpRMxGsFr2aggv0ljb40z19aojvjwR/Wr7d+8yrB+RMNRffgbFVQlklcKvrZ5qQhZi3ebbQ8QvI47dx727/ZzRF3wOpIYe9m/288RDSO+lnmpSPcW35XRwJEMduDDTXe2nIhh8f1jBz7YdGeriRiALwUfarozxxnFubaGEXyw6c5WEzEAXwY+0HRn/vfv9nOE7hs4EflsO8C7rkiLqm5dvgF8KfhxMJdzGw/S+ZLh9QiNN3CMO/oCfGnE/xzKZkTG+TeALwUfzJ0740IogC8DH0pXz27/biYyzBEfQldfPRED8KURLz979a7pN4AvjXixtreX/VKxtJ3Eilmv3kqN+OzxySTauYYaExkG8E3MS0WqwTubbQ8QvNxn7lzOtgcHXvAzd9z372Yiozria5mXihiOiEjXtqsEH096yRVdnR2lvVSk9IhmCcUBvhT87PXooidq0eTGZTvXFmciwwg+XTQp6Zk7P7PtAYKf/fj2cMQ+4hcJyXzNtgcIPp5E++8PmSdGyG/WyNq/m4kMM/ja5qUiK/CmiRiuLc5EhmzwnyvWOHNtcSYyDODTUd14yP7OXdX8G9cWZyJDMvjqaVeuLc5EhlzwLGbbAd51ReTu381Ehgn8zuzVXsFL3r+biQwD+CbmuiKR7P27mcgQB772rCvXFmciQxj4BrOuXFuciQwp4LduzYptcSYyhIDfXv8mtsWZyBADPpj9u5nIkAE+2l7/JrbFmciQAL7drCvXFmcigz/4trOuXFuciQzu4NtnFOfa4kxk8AbfZY0z1xZnIqM1+OmLwZNzu+DD3L+biYzW4C+P40ure8uGun83ExmtwSd2fWxtG/EIi5zdWdOmnr76lP2m/36SrHHmGmpMZLQDfzZ4+mn6Mj/Fk4MnWuPMtcWZyGgd8bfP59yJwZOtceba4kxktAZ/NhgM6Ad3hGucubY4Exmtwa+MRKae/buZyGACfnNFTMAtzkQGF/Ab028BtzgTGTzAJ9jV7N/NRAYH8HbWOHNtcSYy/IO3tcaZa4szkeEbvL79u5nI8Ate4/7dTGR4BF+VWjrgFmciwxt462ucubY4ExmewDtY48y1xZnI8ALeyRpnri3ORIYH8I4yinNtcSYynINXv383ExluwUfYv5uLDJfgl6d21S3ORIY78GsjOtUtzkSGK/DuM4pzbXEmMtyA95FRnGuLM5HhAjz27/Z/hAfw2L+bwxGuwZdPxKhucSYyrII33ZpV3eJMZFgE7zmjONcWZyLDGnjvGcW5tjgTGXbAV+wfQFQRuS3ORIYV8FtPS9NXRG6LM5FBAH7D0tRke/OtvGESjCTi84Ti1QGvO9SYyKAFXy+huO4WZyKDEvx8RMe1qpBReIEMvNvZdrktzkQGFXjXs+1yW5yJDBrw2L9bnAwC8JsTMVyrChmFF0gi3n1F5LY4ExkE4DeNIuMhwWdARt2PAHgbnyFABsDb+AwBMpA9VqkBvFIDeKUG8EqNCPzvPw2+7voZq+0vOtjlcTd/iop0FkHSFjtqQgT++ih+96bjZ6y2v2hvZ4OObZ5U5Kwrts4iSNpiBxKyrv73f3aO1nz7iy42/V/XYPv4Jm0xzyIy69oWO5BQgZ++6N5DLre/6GBd2/xdd/AUXT1FW1QjoQCfbl0Rd2yvwvYXHWQwiHgS8B3bIreqmhBFfFLVzu212v6im5BORnGOJwBP0BY7kNCN6p927ZpW2190sEBG9QRtsQMJruOVGsArNYBXagCv1ABeqQG8Ugsc/M2DKLEv/vH4g/GQu79+uCm8Pf9rHEU94/G/VnygDAscfGIX/SXLUtt6L39h3Mv/lR9f9YEyTAn4L79Jw3eSBfFFFPXTV+6dpn/PTqL9JH6TruHeafpWL4d69+w0+5H8MXs9mr/xp4PF8YlH9mHJX8mHSTQl4B+OcojxeHjz6PTucJS8Es//Tqg/fn+YwO0l/50fltNPkOfg528kntnbaVf/a+Y86eVfEXmmBHyGb5Ke7/uTtA9Pccf533OQWdedxP0XoxLwyzfyV9Ljf8mdH5QPBPibKvAZozXw2d9r4Cf3ss5g3tXP/p3Hd/LS8o018HPgCfqhr6p1MU3gk+59drLo6hO6878XXf1kP4E5mUd8OrAbp2OBR6fJYZPFGyvwv2bOF+m3qO+5hq1ME/jV4G6Yd+XZ33cHy8Hd3UH0x4Ph6nLubw/6ya8//GW0fCP5lOz4xeAuPWpf5AA/fPCwUgN4pQbwSg3glRrAKzWAV2oAr9QAXqkBvFIDeKUG8EoN4JUaVYLDWtbOq62b4+IkVA7gxbsBPJviJFQO4MW7ATyb4iRUDuDFuwE8m+IkVA7gRbpdXXUtDuAlul1drZMHeC7FAXxFua28AH5u6OpZFiehcgAv3g3g2RQnoXIAL94N4NkUJ6FyAC/ezRt4mHBDxMt0Q1fPpjhmlSvc7Vk6Abx0t11+xfu7SyeAl+4G8GyKY1Y5dPVhumFwx6Y4CZUDePFuAM+mOAmVA3jxbgDPpjgJlQN48W4Az6Y4CZUDePFuAM+mOAmVA3jxbgDPpjhKt9Ib7QTFATxvt/KpNYLiaoJfbKmd/Z6+GDw5T/731RuAt+3mG/z1UXx2vPh9eRxfHk2/R8S7cPPc1X98kzJf/b4+vv0u24z+/v37FW4wCVYF/t0c+Pz39NWn5NftD9l7bb5viHg6N4cRP315nr6YvQLwvt3cneNvnyfckxP99THAM3CzP6pPOvjs99lgMDhajPMB3rcbruPZFCehcgAv3g3g2RQnoXIAL95NA/gat7Eoi5PhpgB8nRvXhMUJcQN46uKEuCkAj66ezk8WeAzuyPwAXrzbml+DHhHgxbut/JqMgbiCN9TA6bMKQtyCAm+qQpmbtaeThLgF1dUDvG0/puDR1dv24wqe1k0GQYAnd5NBkAP4u4Mos3unLb8NMDmGiJfpRt3VX9SNeHdiAZ7Ozwj+7nA0Hk56iHj2btTgn51e9JMfAM/djRj87PVo0nMBvtFUK8BT+RnBx5P9306i/m7uHcE3e7gC4Kn8zOBrWzexAN/Vjfocf+BoVI+uvqObjYif9K1HvBM3GQQZgRc9qu+8764QNxvgbx7JBV8YPIggyAN8fo7v7+YO8J7dhI7q7bmhq690MkZ8enoXfY73V5yEyhnAz07yadn9DwDP3c1GxNcyd2IBns7PCD6e7H+4eTgCePZu9JM0yeXcY3T17N0wuGNTnITKmSP+ZJh19/lfhVy2qx8AT+jmdimwEXx2B2c5R1PIc7f6AfB0bo4X/5vBp3axIF/IbLn6gVy2dJaC91PyJvgk5PuL/xdy2a5+ZO+5+5YGHfFcuvqL6N6/ltzNEQ/w3t1Iwd8d9Auz8TjH83Ujj/j9X1bgC7lsMapn5UY+uLt5EA3jGuZOLMDT+VWAT2wc3koaF4/4yQdfy9yJJWgbJw/1AjyxWICn89MGHl39wskheH/PQskgyAZ8rbWy9cF7fPpRBkGAr5Dbzk0GwVDBo6u348b/HN9ZLMDT+QG8eDeAZ1OchMoBvHg34mnZ+nnu3IkFeDo/c8SPhzXH9e7EAjydnxG8rserm+RM7l4arRsx+OLj1YGDb5IlvXtpxG7UXX16mq/DPQTz94QrB9M8qkdXv7Ik4r99jUWTNtxov2b05/jxEIsmbbgRjyjoR/XjoZpRvVM33uCziNcyqnfsxrqrLy6aBHi+brhXz6Y4CZUzgtd1567cZGxaTgoeWa8+d1ixLqFy1RFfy9yJBXg6PyN4bEaksqvHZkRmtyY72fJNxm8Gj82Iyt1qnACWboy33zCCd7YZkQs3B+BLnx2XCN7VZkRO3Ox39YbVIgK7+vrmTiwP8KUmbpkQwBO5SVsmZAY/xuWcDDerN3AKKU2nLwZPzpP/ffUG4Bm4UUf8z+tP3xTSnV0ex5dH0+8R8TzcrN65KyQ4TL8Ax7ffDZ5+QkrTEKyqqy+kNI3TjHfJr9sfsvfcfUsR8XR+RvBrXf3Z4Ol/CxE/fXmevo6UpizcqAd3hb1lC+f42+cJ9+REf42UphzcrF7HF1Kang0GgyOkNOXiRgr+7tlbV7tJu3CTQZAD+CbmTizA0/kZweOZOylupODxzJ0cN6u3bAGerxv5fHwvuaKrk7DenViAp/Mzgp+9Hl30sGhSgBt9Vz/GM3cS3Kgj/se3hyNEvAA38nN8tP/+EIkR+LvhBg6b4iRUDuDFuxHfqz9NMxxicCfADeDZFCehcgAv3g3g2RQnoXIm8MheLcbN26geJtxwOSfTDdfxbIqTUDmAF+8G8GyKk1A5gBfvBvBsipNQOYAX7wbwbIqTUDmAF+8G8GyKk1A5gBfvBvBsipNQOYAX7wbwbIqTUDmAF+8G8GyKk1A5gBfvBvBsipNQOYAX72YVfCGXbZbGFlmvuLhZBV/Ic5elsV28AvC+3ayCL+SyzdLYzl9BLlv5VgW+kMs2S2O7eAUR79vNXsRv5bJNO/qPAM/Ezd05Pktji3M8Fzf7o/pFLtvVD4Bn4IbreDbFSagcwIt3A3g2xUmoHMCLdwN4NsVJqBzAi3cDeDbFSagcwIt3A3g2xUmoHMCLdwN4NsVJqBzAi3cDeDbFSagcwIt3A3g2xUmoHMCLdwN4NsVJqBwBeJhwQ8TLdENXz6Y4CZUDePFunMBfXVkRC/B0flbAX13tJC+hbYS4ATyb4iRUzgp4dPUu3TiBtyQW4On8AF68G8CzKU5C5QBevBvAsylOQuUAXrwbwLMpTkLlAF68m4r5eMcpttwW5yt/GMB7Lg7gzQbwFkwCeJgFA3ilBvBKDeCVGmPwi2yK0xeDJ+dZ1nQnxW3kZ7dc2uVgMDiyX7ltYwx+kT/18ji+PMqypjspbiM/u+XSEvvPuf3KbRtj8KuMyfH1cZY13Ulx6/nZ7ZeWfQXsV27bGINf5UifvvqUZU13UtxGfnbLpaUBH9uv3LYxBr8MiunL8/SXXRKFDubIXcTf/n1epM3SSowx+MVp8Pb5eXaiv7Z60l0fUqznZ7dcWkbcfuW2jTH4Rdb0s/nA1+4wuyRJu4vSUuj2SysxxuBhNg3glRrAKzWAV2oAr9QAXqkBvFIDeKUG8EW7+fKbqOdbhAsD+KLdPBzNToa+VTgwgC/azeMP8UXftwoHBvBFA3ilhq5eqWFwp9TSrl6FAXzRAB4WtgG8UgN4pQbwSg3glRrAKzWAV2oAr9QAXqkBvFL7PwuGA8CXf6FhAAAAAElFTkSuQmCC" alt="plot of chunk reproduce_univar" /></p>
<p>Reproduce bivariate PDF, CDF figures, namely <strong>Figure 4</strong> and <strong>Figure 5</strong> in
the text respectively.</p>
<pre><code class="language-r">sig_x <- 1
sig_y <- 1
num_obs <- 5000
rho <- 0.5
observations_mat <- mvtnorm::rmvnorm(n=num_obs,mean=rep(0,2),
sigma = matrix(c(sig_x^2,rho*sig_x*sig_y,
rho*sig_x*sig_y,sig_y^2),
nrow=2,ncol=2, byrow = TRUE))
hermite_est <- hermite_estimator(est_type = "bivariate",
observations = observations_mat)
vals <- seq(-5,5,by=0.25)
x_grid <- as.matrix(expand.grid(X=vals, Y=vals))
pdf_est <- dens(hermite_est,x_grid, clipped = TRUE)
cdf_est <- cum_prob(hermite_est,x_grid,clipped = TRUE)
spear_est <- spearmans(hermite_est)
kendall_est <- kendall(hermite_est)
actual_pdf <-mvtnorm::dmvnorm(x_grid,mean=rep(0,2),
sigma = matrix(c(sig_x^2,rho*sig_x*sig_y,
rho*sig_x*sig_y,sig_y^2),
nrow=2,ncol=2, byrow = TRUE))
actual_cdf <- rep(NA,nrow(x_grid))
for (row_idx in seq_len(nrow(x_grid))) {
actual_cdf[row_idx] <- mvtnorm::pmvnorm(lower = c(-Inf,-Inf),
upper=as.numeric(x_grid[row_idx,]),
mean=rep(0,2), sigma =
matrix(c(sig_x^2, rho*sig_x*sig_y,
rho*sig_x*sig_y,sig_y^2), nrow=2,
ncol=2, byrow = TRUE))
}
actual_spearmans <- cor(observations_mat,method = "spearman")[1,2]
actual_kendall <- cor(observations_mat,method = "kendall")[1,2]
df_pdf_cdf <- data.frame(x_grid,pdf_est,cdf_est,actual_pdf,actual_cdf)
p1 <- ggplot(df_pdf_cdf) + geom_tile(aes(X, Y, fill= actual_pdf)) +
scale_fill_continuous_sequential(palette="Oslo",
breaks=seq(0,.2,by=.05),
limits=c(0,.2))
p2 <- ggplot(df_pdf_cdf) + geom_tile(aes(X, Y, fill= pdf_est)) +
scale_fill_continuous_sequential(palette="Oslo",
breaks=seq(0,.2,by=.05),
limits=c(0,.2))
pdf_diff <- ggplot(df_pdf_cdf) + geom_tile(aes(X, Y, fill
= pdf_est - actual_pdf)) +
scale_fill_continuous_sequential(palette="Oslo",
breaks=seq(-.04,.04,by=.04),
limits=c(-.04,.04))
(p1+ ggtitle("Actual PDF")+ theme(legend.title = element_blank()) + p2 +
ggtitle("Estimated PDF") +theme(legend.title = element_blank()) +
plot_layout(guides = 'collect')) / (pdf_diff +
ggtitle("Estimated PDF - Actual PDF") +
theme(legend.title = element_blank()))
</code></pre>
<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfgAAAH4CAIAAAApSmgoAAAACXBIWXMAAAsSAAALEgHS3X78AAAgAElEQVR4nO3dW2wc2Xkn8K/YvOs+Q81Y5missZuyLTM3RBvG5MqJsslimwK4MqDlYoGFBewCJOappQDyQzQBAkSTFwGR+mExIIF90GAxCxAKInRW7N3A2UlmlvQyUexsQssx2bbk0dCaGVEaXXjvS+0D2VVfkec73VWsvp3+/6CHVnV1VbH79GHxO+d8n2XbNgEAgLmaqn0BAABQXujoAQAMh44eAMBw6OgBAAyHjh4AwHDo6AEADIeOHgDAcOjoAQAMh44eAMBw6OgBAAyHjh4AwHDV6+hTo5Y1kEiX5+DpxIA1mlJs3KZwATuecq9M8aqdh4b6ofpAS/1Ile2qXFKjO78gaMMQSLU6+nTiyvjISO+Fq8WaW8hfrZFJm5nsvdDjfB34U54ntr/KtsdioV0QVMP2D1T3kfIWGI1P7ebDD6cxow2Db1Xq6NO3J6ZHzl460T9+q5o3FrFL1/un784rnhibHJku/lsIoNrQhqEE1enoN/v5WDT+1sj4Ff7XKfsbczRFRKnRngvTND64+WcovyHij1Oj4f9FGjs7QrNzZYosQc1y29Lm3bDUAtOJAWs0UWiuoym36TotcHuz9B7Kswdrte62W7v9WdCGoaAqHX3q6gW6filGRLGzI9MTtwtNMTXac6F38y/M+euzg6Mpio3NX++nkUl7Kh4VjzY6OL71d+nkCHl/cRS/kOmRs+q/YXtOuDdK44OIbhrF+4G6n2lqdHD2+nwh8nE+kda2wPEJurHZ7MYHrfN0w7bt+ev9Wy1wZ7Pcdqh0YmCQJguNfavzd181f2J2vJQfBW0YSlCNjj51a7x/+Mzm1yZ21v3zMnVrvH+z//cVDI2NOQHH2NmRIjt7m/vg7PX5Us7ijW8iuln3dsTo3c+00DPGxnR3F5tHeWtzh54T/YXH0TPDW31rsWa59VctEVE0/tbW/Q77CkTjbwmNGW0YfKt8R59OXBmn6Qs9hXY6TrQZqE/PzQY+5AA7mta2b7jmqzx/d7r/RE/AK4L6FBuzJ6nQj+72rrd4s3S67K0dSvsKoA2DbxXv6NO3J6a9LbXw1270eG+gAyYGeiaG5+3CH8khSd0ap97j+js6MFBsrNCUxgd30dWX1Cz5F2EqHg36FZCgDUNBpTt6RUTR+cOVh3HSiQF3zKowoBQ93rt190/p2xPTm0/O350utObUaNE7+lIvc3TQDSNBo/C0Os7/kKbYLJ3GfGbYmXPmjPGyr0A6cWV3jRltGFwV7uh5GN5VaN6xsfnrs5t/zfZc6J2cike3gp4Xera+B5eu92/+uXuehrfuktxt1pUTk8JUs1Lw0Ocgacd/oc7tGIzdDNRE41OTvVtRRSf27WmBJVM2S8+hovGpQpioZ2J4K87ufgXcFh7w50IbBpdl23a1rwEAAMoIuW4AAAyHjh4AwHDo6AEADIeOHgDAcOjoAQAMh44eAMBw6OgBAAzXXOHzLS4uBnhVV1dXsBeGfhBcTLgH6erq2uV5/ar3Fmhey6nuxVS+BVYF7ugBAAyHjh4AwHDo6AEADIeOHgDAcOjoAQAMh44eAMBw6OgBAAxX6Xn0kiNHjlT7EqCMHj58WO1LKKKCLdAStherDGG5L7Q8B3Ef23ZO/dIm9TfdzmeLnJTIspoKB88XvTDvD1FDtS5qvwWWFe7oAQAMh44eAMBw6OgBAAyHjh4AwHC1MhgLYDRpAJbvwoc0VcOYfKPVxDarx0j5AGxTpNXdP+8O2NpUfDDWPb50heyx1RThl8B2ySn3h8rAHT0AgOHQ0QMAGA4dPQCA4RCjB6iAUqLSLAJeLF4vLYzy7MMWQ+WEhVE8jm+xuH8+t1Hs8HzUwb1CPgBQGvVxIFy4owcAMJxl18YIeEtLS7UvAcook8lU+xKKqH4LtISZOeX8hvq7oy9LqoMK3dHXfgssq/qoGQv1Tvrc66VmLNS72mmBVYEYPUBtkO7cnRttKaeYd29+xBJOyo4pzLvP5wr3wp4rLGFlQElqIqJgPMToAQAMh44eAMBw6OgBAAyHGD1AhfksPKJKNcNnyHhSygjz5Zua25TnyefW3c3ZNeVrWeERfoUsv40VUW6XZ/QhLl9puKMHADAcOnoAAMOhowcAMBxi9PXL10RmREWrS5rerg67q6PhbKPNDyIWBOdrffktnb90NE4+ektIgs8T73iX2iIffa3AHT0AgOHQ0QMAGA4dPQCA4RCjrx1CzL2kULyzkxT9lPIOcoiclk/xGeViIhnlS8W8N3xOfUb5mIu0dLivjLgx/dzGMnutKqYvZMyXJvJ75trzWL9nsAEtsFxwRw8AYDh09AAAhkNHDwBgOHT0AACGw2Bs5UmDrpawh6V8WPzgQrE32zPQ52sEEIrazXtoKx+6OcWEcUs+zmmXVJzElcusOo+b8u5rmyJuErQ8bSU+84zK8qxqQouyPJVM3JHePB+wzUkV/orOLwAfcEcPAGA4dPQAAIZDRw8AYLhyxOgXbsbffPce0enLyYt9ZTh+vSglFm8pt5e0jzIczJeuWEJI1zY+Xl/FFljCe2UJd1dCeJ2F3Vmr8CQsKx67b27fpzxRZu2585gXISFPND5SeMATlrkH5yutmpr4wii+eosdsXhcvgTCii1QKsMd/czEh6feSSaTl+m9mwvhHx6gCLRAAK8y3NH3XUz0EdHCg/vHjnZvbTt58uTmgzt37oR/Rqh5XV1dlTsZWiDsUNEWWHvKNL1y5trQ2++fvpws/N/5di0uLpbnjFDTpM+9bF8/tEDwqHgLrC2WXMB312auxR8MJ851823S233kyJFyXUZF+YuzewKdTXxichPbh28XgpiFD9EzjZqXhsiry0TItSzUZaADe/jwoXJ7eb9mNdQCi495WELs3u/UeOUB+UGaIq3OY57UjE9v50nNnBB8S9te5YnyOfeFnmbMftBcZo3tzwYD/I1YBB86qk4LrBnhx+gXbsavzYR+VIBSoQUCbBN+6Kb73HePxoeG3iZ64zvvJLqLvwAgVGiBANuUM3SjgtANQjdc5f9wRugGoRuuQUI3yHUThkL/6+3QeWfNO3Q+AZklA2kS9ik6d57VkuazlfOeehEsuwj/XcDmS8vz6wl2rfibKHXobq6bEnp8T44a3p8y+dyG87htzyH3RC2d7k5sH+cXgOdXkXAbkdtYZdvdVuf9+YuXShegLQaElbEAAFWRTgxYlmVZoynv9tSoZbEnpN18QEcPAFANqasTw/O2bU/SIO/D04krNGnbtj1/ffZKIi3t5gs6egCAKkjP0fCZKBHFzo7MzqWd7dH41FiMiCh6vLf3eFTazRfE6H1Rp4a3nN+XbCSqiScG4clA2OMIe8z3IfbakkarCsFQm2cRYY+9wV1eypkH7EuJnDZgkNTXj+9v0LWU0thOaJ6P3PBYPJdnH3qkdY/zuLnVHXTlsX4+jhppY62u46B7ro2VrUeZFXcHdjEtbHSXXyQ/uOcis+tsHz4wq5qzILwt0lBzZeRyqoLpWpFIZNuW+buzdEbzitTolROXpmj+ln63kqCjBwDwJ5vzfcezo5+nnhO9c+LuqVHr1ll7LEpEut1KhdANAIA/uZzt99/Og0SP08TtNBGlbo33Ho+6T6QTA9ats/Zm/EbezQ909AAA/mRyeb//FEeJXRqe6LEsa5Amx2JElBodSKSJUlcvTNP4oGVZljWQSO/YLQgsmCpKiMurpsnzOHukmS1LaXYjqlZLu3uU5g722N3O59eTNHmZB0CzhdUoWTaLmS1RybGoaC7rTpHmMX2+kMq78IpI+E/pame5SkktUHjP1UrY2RtQVi9G49neOT4b3RFhc9754gn+IbZ2sjg7a43EBmYsFotv3v8F5QVkV54VDs5WXbEDepriupvg3m2W21pghsfoWQvM88fKILhQP1nsxNydHj78hXKPYC3wybO14jt5vXSgvfhOZYMYPQCAP5lspYd/dwkdPQCAPwEGY6sLHT0AgD9Z3NEbQcpBxot2sjQ1hXnEkRY3Fs/TRVGrmw3KYpmhIm3uTOcIm+nM59pzPKDJk4rk1rcuxjP7nUU5LRbn9cSLPYU3+akaeu58CT+8pXhU6jslzJfnn5EQr3d3YB9ipM1tdXz1Bj9NZvWF87i184DzuP3wl53HnYffcPcvxOWJaN0ZMRLaf5btnNtwT+SNv7PWyBcEsIvMe1Z4qGL0JcXlhf1Dlc3X2ZcCHT0AgD/ZLDp6AACjZZXTJWsYOnoAAH/Q0QMAGA6zbuqXtDCKD0Cx3GRswUhzYQy2iQ26UjtbisKGv1pZqYcWtqQl0u6+toktmOKZoXJrS87jzMpT57GzAiqrXEW1rXqJWMmEq7N2HC7PejH1eihe9YWK7ew5IB/GVC6G2rbdGerny/FaOva5B2xzH3uuhp2opcNtgc3t7v681TWzaQJt+15x92ndWpy1sfSYX6LzMN/CFkZ5CpKwAVj2zvBEZnm2fM+bta21sLO7A//p+M6e3Hwl5InbPcyjBwAwXA6zbvQapEIjbFM7n3vtXAlUUrifO+7oi5AyjYDZpM+9dnLdgNnCbYGI0dctKWEZXxjlicu7KYqaCkFSq/MlZ2PrPrcBtR9w00W1H/yi+3j/YfeALFrKZVlcfu35I+U+uUL+stz6srPR9lQs2U0svs7adLhKqSTCdnYfi3m2mnYkJt/cn8flWbY7t2q8NNDCq7qz9HkdXcecx/tf+wbb332Y3XBribSxFtu6x23J2fWtFphZdRdG8Vr2fAQiw4amIvzNY+n2NtbcxGc8rV4TqaupKDmZBInItqQcfOWCWTcAAIaruzt65KMHAPAnm7P9/lMdJp0YsCzLslQ1v9OJgcLmwm7WQCJgyVh09AAAPmVzeb//FEdJXZ0Ynrdte5IGt3X1qVGr58J04X/zd3snbdu27al4wAJTDR668URXFYVEiM3nJTZfnlhcnoisPVvBzfYDrzobO7q+5Dze98pXnMd7XnFTR7160J3dvKfFvYDljNssPn3qBka5DAt0Ni0VZlhLlcSlycWex8JLG49cJ0S1M4/L21LNaHcfcWK4Z2SIfY6Fx56p6Gz6eYTPl2cjQHtf7XEed7DtLR37ncddr7qttOewOzDw40/d2P3q5wubD/hQE8+7t/7CHTraWHriPM6xYuL2hjt6xL9rniIsvPBIsbfdswShhMIj4Tr3O8c2H/z3v7yn3/M//Os3pKfSczR8JkpEsbMjV+bSFHN68RSdtedPDFwt7Dc7fsEaJ+q/Ph+0q2/sjh4AwL//9j9/5nfP//hvvrztqfm7s3RG+aJYLEbpOXc/uj5vx6OUTowm0mOBunp09AAA/oQyj77nRO9c8b2IYmNTm6Vi5d8MRSFGDwDgTzZv+/238yDR4zRxO01EqVvjvcfF+3Q2Kkua3fQa8I5ePeuZWFTUU+Obx+V5/RA2Zd4Jze951Y3FH+h2Zy6//rr78Xz9C26xkcP7Wclm5tHzDeX2j56r8+G4PEW9ea4VnpuFbffGSJUPGwYPtRctCF5KXF55bDEuz0+aYxHtlkL97pa9bGlPqztE1LLHnbq+/7Ve5/HB13/Jebzn5dedx7/6RbcF/vqX3cxLrc3uxbSzx6trv7b14Klb4X3t2afO4/XnnzmP86wIeH71c+dxdt2N13tq7OTdrwD/qZ0m6JkvL6QP4qS3NFzhVJiKXRq+0mNdIBqZtGNElBodmLu0Iwofjd84MWBZg0Qjk/ZYwFM1YEcPALArIVWYisan7Lj7XydGs/XcmHq3INDRAwD4g1w3AACGQ83Y2iQkCWHhPF5VOcJy2nhqfLM8HjyVjTNlnsflv/6V487jX3/DnS//xqtuhHRvh3vSpVV1avKPHq8qt/M89U4VZpvno2cTjT2llj1xfBa7V56mcZRU5Nva8UDcmweXvU+wGD1bpeHJHsM+O2f1RmSvmyOer9JoP+TOkT941I3Ln/6VrzuPv/nVl53H+zrdVvd0yZ26vvjcDa8f2uMOU/V2bw1H/QOLsz//xY+dxzxGb6+7qZn4ZH+pODgPqRPPAuT2pMIwUlXhjh4AwHC4owcAMFzdJTVDRw8A4E8GaYprHJ87z6OonrnzLKk3sbnzvPQrz/vhpLLh8+V5XP6XjrmPj7zcqbywh49XlNt53huem57Xj81trDp7OBt5pu88i5B6CmxKeW9qJhhaFXJZ18Lkbr7SUNiZz6/nGZN4rhubfV6tne6U9uY2d5WG0wKbWY4aHpffd9hdWx993X38W71utYNfjroHf/S5e9LPl9jFuKekpXX34j9+trUPj8XzefRrzz5xHlsbbrPk36Nc1m2NWVY1gefM8WYNsgtXxZcd8Dn16uULnvK8Yuqn3crgjh4AwGwI3QAAGA6hGwAAw9Vd6KaUGFZqNHhhE4DdQwuE2pLJ2X7/VfeCS7mjj43dmBuwrN5JeyxWfG+ihZvxN9+9R3T6cvJi3y6vbxekRVJsMLaJFxhhg0Ks8LfV5g7Gtu5xR7R4jW+nlghPWMYXRvEBWL5c5cWKO3bHF0zxpGa88AgvDp5Zeeo8dmuCsxLMOTYYyxdS8VEsuz4GXSvSAvk7YRUpWOEZISzhbslTRoOPEPKy2msvnMfN7W7OsqaOrZH8lk62Xo+N3L589GvO49/+ujuK293lrvVbXnUbA//hvnyEpcmz3DHSH953W92jzz7efLCxzIqKsKri1rpbAyfLFkzx4f08nybAhqw9EZCi6eE8JdGL7Lv5glJ2CqDuQjeljUpH41O2ffZWaTULZyY+PPVOMpm8TG9fm9nt9QEQoQVCbcnkbb//qnvBPmL0sTHbTicGLKtQynBEeYO18IBOfbObiPr6T7/3YIH6uono5MmTm8/euXNnt5cMdairq6v4TsWgBUJgobRAx0Y4oZh0YqDnwrS6IacTA1ePT43FiuxWIh8dfWrUGpy9Pm/b+tT3Hz+4T9/cvtH5di0uLvq6PjCD9Ln7+vqhBUJgobRARzgd/WZx8KloatQaTXn68NSoNThOI5NFditdaR19OjHQc6F30i4l7f1rR489CHIlZSQvkmKJzFiMnprd4GakzQ218yBp+353NYpT45sXEuEJyzgel+eLpO596kZIf/yJ+3j5M7f68NrTXziPN5bdqg5OJik740ZC8zxG70lqVoeLpCrRAll+N1al2jOoUwiv8/fTs0KHL57iYyHsgM3t7ronnsgsw1bA8YR0LZ0Htj0goggbRvrlI6yQSI8bo9/b6TbptQ33Yg4fdF/7lC2Yusda3c+e8JD61mszq+4oQmbZHSIiob4HLzbC316+OJEv6/PaetstXuMlr078J8XuS6oJE8jkH/3LzQe/+4cf6Pf83h9/S3qqxOLg8m4+lNLRp0bP041it1GO7qP04fcXzp3rnpl+/1j/xQDXBOCFFgi15Vt/8Dd+9/zgT35r21MlFgffRaVYV2mzbqb8/LXQN3zqvTeH3iU6fTlZxUk3YA60QKgtOfEPER9KLA5eag1xrXIsmOo+l0ieK8NxAUqDFgjl5Sn8ENRmcfB4PJq6Nd57VgxKlribnnkrYwvROnHuPC82ok5qRs1uEJMXMo60swRn7PGeFsUsVT4vnsfi+XYel//7e+7M5Y8+cucQvvjsp85jnj0qu+LuT4VMUjlWmplHP+tw7nwtamraGoPJ5dXVYPgIEE9klsuwaDV7+3m8vrnDDcFTp1snpG3/Vul5PlyUZZPuH7PiITk26MKLYyw+dRvGE1Zg5D6Ly//NvDvq8/RTd2Ro/cXWMObyI7cpZp/83L1a1tKaWaGePEtkls+p169It8Z8H5dYEJzvzAuIl6up58O4oy+xOPiO3YIwr6MHACgvcVjYHxQHBwCoVflsKB195aCjBwDwJ6Q7+soxtqP3JLkQCoJ74oBsBjSfX89z4DRF1G+XUxuE56iR8H34fHkel3+28CPn8eqiGwzdeMEWfayxXDeZrZBxjpVjzvO2KBQEr+m585Um1Pvm9dOLzcv2fP+FhDk5lo+I8m5OG7vDTV/TylZsOOVuWve4c+T57PL0I3e05u9+4qajOcjm0f8Dy13zi2dujJ4n2/rskbtK48Un7kSP5c9+VnjgBu4zS4+dx00R93vEJ/hz+Zx70iabjYcJmX+cd9JqYjtLePMWDhguPvxQF4zt6AEAygR39AAAhgtn1k0FoaMHAPAnlHn0lWRcR28pHynSlZA30OkJ7Qk1hfPs0+V1unnKeMdHj91QLC/wzXfmQU8+X57H5XkVZnvFjcDmWRXmXGYrAOrJHMKKgHvnziMur1T8bcnni9zHeYL4JeS9yrMxlaYNd8Amu+o2kkwhC/zew284Gztfeo2d1X34P/7RrVgQYa3782fuHPl1NtKzwVZjrDx2W50TlyeiTCGrksVWA/D1KFmWm57f6uZY5iVPbnpWHp2Pk6lnvXvGRdTjKJ50Q6pjhA539AAAhvNkCawH6OgBAPzBHT0AgOEw66Zm8FidkPdGDOixkJ8n5sji8rx8q+Oj53t3biRvQJ+/kOeX53ls+Hx5T1x+3c1wks24E5OdoKc3p400dx788OQ6L/I28nz0YmIWoX6nzWaa07I7S3318VbJ1rb9X3A2trDEODxN/LOPFc2SiFr3uBPzs2vuYMDTn//Qebz04B/dF7ARIGp1J/s7+LhXnmdYyvPs/Cz+LvSMfH/lFHjb8zZKX151vL58Efs8BmMBAMyGWTcAAIbDHT0AgOEQo6+KopE4aQee0oTNOme/rnMb7nT4zAqrk8lk1p5vPuDJcPjvfB7c5wfhdV89+eVZHhs+X94Tl2dTsJ1m5wlQIiwfBh6Mtp2HQrCer9Lw7CHE6/k+TTx2zxK8OAMwS5/8xNm4+sQti9vU3Moetym3r7D9syymv/b5gntS1uo2WL77SGGaPP8W8coHHnxKu8XzRLkXw+fRe2rJ8rdaOLr70BPQl9p6beej3yyFPE00Mumt+b1te+G/1H99fme6+pKox4UAAEBi57N+/ymOkro6MTxv2/YkDY6mNNvn7/ZO2rZt2wF7eTLljh4AoHJ+/lf/ZfPB6789qt/zo78Wi/+l52j4TJSIYmdHrsylKRZVb++Zmx2/YI3v5oa+4h19V1dXhc8ItaB2PvfauRKopHA/96Pf+s9+93zwwX/d9tT83Vk6o3jJ9u3zd+n6vB2PUjoxmkiPBerqK93RLy4uFt8JjCN97pXvdtECG1O4LTCUWTc9J3rnStnuVBiUfjOUwLzQjXLcVaojwbbzIFrWTcaUW3ffIj6ExBM2NS0paiN4VlqxEd3curtcxV5ny1I8ScrY/qqFUeQd93d/EO8I4M6rgt1wRgtLK7CuTqUXaWlj29myI5YxrYkPURYWYfGWs/b04c4diKht/2HldiczGnkLixNrXbz2Dq+3s1GYPmCzK/QmB2RD0GzJXs6TBK14V2Mrx1rLVjxkN0KZRx89ThO30/F4NHVrvPfsmLQ9nRi4enxqc7C293jAID0GYwEA/AlnMDZ2aXiix7KsQZocixFRanQgkd6xPRq/ceKKZVmWdeusZ26OH+bd0QMAlFdIK2Oj8Sk77v7XidFs277tv0GgowcA8CePBVPV5oT51LmobE8BYpYCjIXULVa+mcdis3wNFAuYKuOJnt/5LOhP/OAs0M9XoPAa3/zCPDnL1GujEJcvKx9Jsjyl5ynCtrMy9DxGzxpMfv2589he7dh80NzuJhfjMXTejDdUufZoW/ibta7sklvWJrPiLt+LtO5xHxfqfWfXeVPkycuKp3IjMdeYrXzovDGlNWjhgGWDXDcAAIZDCgQAAMPZOVSYAgAwGu7oawYP/VlsVjIvKsILP7JQOI+tWnwfFmq3lQXEeSCSz3Pnc+rZYz7Xnu/jGerx1PiWcpYhNF8unsUWft5n7+xy94PjpbRtu9157MmIl2U5s55uFR6x2ty4ud3uFh7hTdpmpWk8WllJHLYag6/w8F6ku6oj0txR+Il4IW82XMS/I57vhTR2VDwHmV20VE7QzyUU6OgBAAyHfPQAAIbz/BFTD9DRAwD4Y4WTj75yzOjoeYTOUmzk8+h5MWJiM5c9x2NzhFkwzhILi9uF8/ATub/z854J+1nlPjzo6ZmPL/wgUEa+CoLzWLwnAZF65jjPGMPLaje3uWF0Pk3eielvsDLxzW3unPfmlg73gHmeasYdUsrn3DL0PPGJM0eeiFo63ALi3mxL7qCCQGqi/DsipawJPAW+qt+FPDp6AACz4Y4eAMBwmHUDAGA2G6GbKnMSs7PQn8VD58RC4d7AvPMoxwKdPALrCd16XurE6Pk8d55Uhz32xOL5hUmBTsTla5pYBNyTDcaNuUdYSJ0nOMqyKfBNzW7oPFKo8e0dDFCPAPFhJM+AgWeWCI/ju1t5MXFlunlp1MHLb9Oty+btWegQnM/i4Nt38wH56AEA/MnnMn7/KY5SYnFwaTc/0NEDAPiz8uLx5r9cdl3/z9lz50F4EfDZubS0XdrNF+NCNwAAlbK+ulR8J0GJxcF3USnWZW5Hz8Pfnng924V4vg4WUeWznovNnefnEuPsJcXiPVcvbIeK8LVeoaSipjzVupsxpini1o/Ns0IFeZZVyclrz+e8e9LC8Hg9GwGy2GT85uY25f58jnxuQx13do5j8QEIMV5fSsp+NG+ikouDS7v5Uo7QzcLN+NDQ0NDQtZkyHBygKLRAqAObRcCJKHVrnFf93rZd2s2XMnT0MxMfnnonmUxepvduLoR/eIAi0AKhLpRWHHzHbkFYxdOBBrRwMz5xNHGxj4iITp48ubn1zp07yr1bWlqU2/1T/eXIwi88LOOZLlnKPgjdBJXJVH7ecbVaoAIvtsenTnqiLix0wzlV/SIs/OIN3agn7/KvtjQ1s4T0BiwElBcqWfqpsLj5ap/7h6AaLbCGlClGP3Nt6O33T19OFv7vfLsWFxfLc0aoadLn3tXVVZ4TogWCR8VbYG0J7Y5+5l8p7UUAACAASURBVNrQ2+8TvfGddxLnugub4g+Gnf9tkt7uI0eOhHIZjHCX4blzF/YPfoMiVFpomDt3ycOHD5XbQ/ya1VwL9GRG49v5LqxouKdQiWJVHf+zQM6e5vIUEPek22PL96WLVLfMUhKQCX8Ni0PWFarrXYEWWMtCu6Pvu5hMXiQiWrgZv+b8wQxQKWiBAJLwQzfd5757ND409PbmvVV38RcAhAotEGCb8g3GqiF0I73SbLXzhzNCNwjdcAjd1DvhuyUspPLOouHb/TRE8flG6dDBJf1298y64n2uOn2e00fbrKh3KdT5Vbz4bxqe1IxXRGG/daSiIkIis5JuIvHVqATkugEAMBw6egAAw6GjBwAwnMExeq54tLS0QgqlbAfQEiqPe6vWKPa3+G2ZpzCIG2f3rIz11LVXv5bvkxP2d6qmeMsq8TRtPmqpl8w5Jr5oIcAdPQCA4dDRAwAYDh09AIDhGiRGXwqEAqFshNyodilLipyoNz+IsLqKP3YqlpC3OrmnbL1wvepFWFIs3hbi9Z4jiv+RLqGEfaBUuKMHADAcOnoAAMOhowcAMBxi9ABlIsyXF6LPPGeZd359rvCAxdZLyHvjnVOfU+7DT8rn4+dzbq6b0qqfu2f1sTNRxZKaNTjc0QMAGA4dPQCA4dDRAwAYDjF6gDLxF3H21ANRlu8oQ40g73x5Pk9fnT+nDBCXrwTc0QMAGK7SpQQlLS0txXeCupXJFK92VF011gJVhS3L8VUVsmB6Vs+W946+Qmq/BZZVpUM3UsVOMJv0uddOzVgwW+20wKpA6AYAwHAYjAWoLF4DxBbKaqvKcPMkZZ6QC6kLiXgTnLmBKYvlHcuzhVfiwKxbeIQPF/stPIKFUdWEO3oAAMOhowcAMBw6egAAwyFGD1ABuyifXdjfJjeGbvGyH8QLj7B9PAXBSbmP5qzuI09oXneF289kSftApeGOHgDAcOjoAQAMh44eAMBwtRKjf/jwoebZrq6u3S9oDOUguJiyHqSK6qUFmtdyau1ijIQ7egAAw6GjBwAwHDp6AADDoaMHADAcOnoAAMOhowcAMBw6egAAw9VKKcEKOHny5J07d6p9FVtwMQ2opt5nXExDwR09AIDh0NEDABiugUI3AACNCXf0AACGQ0cPAGA4dPQAAIZrnI5+4WZ8aGhoaOjaDC6joKYuxng18m7XyGVsqqmLMVnDdPQzEx+eeieZTF6m924u1MJlvF39tl0j70mDqJF3Gy2wITVMR993MXGum2jhwf1jR7urdhULD+jUN7uJqK//9P0H1W7atfGeNIraeLfRAhtTw3T0REQz14befPdYf1/1ruDjB/erd3Kl6r8njaT67zZaYGMyvKOfuTY0NDQ0FN/8u7DvYjKZ7J+OV++vxNeOHqvWqQXVf0/MhhZYTPXfk0ZgeEffdzGZTCaTiXN0M179iCRR91H68PsLRDQz/X7V/1hdqI33xGxogRpogRXTOCtjF27G33z3HtEb33knca6KMdKtyzh9OXmx6n+t1sh70iBq5N1GC2xEjdPRAwA0KMNDNwAAgI4eAMBw6OgBAAyHjh4AwHDo6AEADIeOvnLSiQFrIJEu/Dc1almjqWpeEDQYtMCGhemVFZUata6cmJ+KRyk1at06a4/Fqn1F0FjQAhsTOvoK2/x6XZobuHp8Cl8yqDy0wEbUXO0LaDSxsclbltUzMmnHq30p0JDQAhsRYvSVlp6bHRkZGb+F2ChUB1pgA0LoprLSiYHzdGPqzO2BnrtvIUAKFYcW2JDQ0VfS1pcsHiVKJ/BFg4pDC2xQ6OgrJp0Y6JkYnp+KR9X/BygvtMDGhY4eAMBwGIwFADAcOnoAAMOhowcAMBw6egAAw6GjBwAwHDp6AADDoaMHADAcOnoAAMOhowcAMBw6egAAw6GjBwAwHDp6AADDoaMHADBcxTv6dGLA2qm0WvTpxEDlqtanRq2BRHrnBWxT2GfHU+6LVT+y7x8jNWrtvJ6wKN/YKv6wABCqqtzRj0za28jVD3gfFI1P7aZOQji/J7wXP9l7ocfp5fhTnid2/sg+f4x04sr4yEjvhavFLj/k34VV+WEBIGQI3exO7NL1/um784onxiZHpot3zKVJ356YHjl76UR/dQt9VuaHBYCw1VhHnxr1BgNSoz0Xpml8cPO/7u1qOjFgjSYKUYLRlBsxcG5n3UNtbvQeyrMHuwV2t93a7c8SOztCs3NhBFs2+/lYNP7WyPgVHr5hcZLRFMlvl/fx9ncmDOH9sAAQuqp09OOD6iBuanRw9vp8IRhwPpGm2Nj89X4ambQV5c7GJ+iGbdv25Mj4oHWebti2PX+9f6snTI0Ojm9FECZHaPxKIr3tUOnEwCBN2rZtz1+fHdzq/N1XzZ+YHS/lR0ldvTA9clYdmug54d7/en9kf91r6uoFun4pRkSxsyPTE7cL3WlqtOdC7+bPOH99dnA0pX27nKPteGf8XEjZf1gACF9txOjdIG6hs4iN6TqrzaO8tblDz4n+wuPomeGt7iY25hw1dnZk54u3bpKJiKLxt7a6z9St8f7NHpWi8bcUryLa3osNzl6fLyUE7f2RfQWtU7fG+4fPRAs/ixMiYVfrZ/Si2DvjUfEfFgDKoKZCN7Exe5IGQ7oRdMMag8K9udOLbe2Qnpst4bjbfktpfh3N353uP9Hj82K3/9jpxJVxmr7Qwy51M1Bf2tXqTya9M46y/LAAUGE11dHT5v1mIR6zi65+q7594VjqnXgvNhWPUvR4b+ATKqRujVPvcf1fJQXR+JT6/jd9e2La29sWwlMBr7akd8Y/Pz8sAFRYLXX06cSAeqq4/1G++bvThX4nNcrvWwuHip4ZdqawOAOVLDCSTlwpKUYvSo0OupGV4EfZGRV3Ik08jON565yf8Xjv1t0/pW9PTG8+Kb4zu7rMUH5YACiT2hiM3YxYRONTk71bQQonHBw9M9w/faHHZyQndul6/9ZZrpyY3JoU6DlUND5VCBP1TAxvhZ5jY/PXZwcty7LO07D/u13+cw2Sdki0NDwMz364rR7evVqr50Lv5FQ8uu1ndN8F98dRvjNBhP7DAkC5WLZtV/saAACgjGopdAMAAGWAjh4AwHDo6AEADIeOHgDAcOjoAQAMh44eAMBwzRU+3+LiYoXPSERdXV1VOW8pcG3B4NqCwbXtPGmFz1gVuKMHADAcOnoAAMOhowcAMBw6egAAw6GjBwAwHDp6AADDoaMHADAcOnoAAMNVesFUMN/+0x9V+xIqxLKEJ+SqAQHqCUgn0VxAk3hluqNl8r6vri2iOZ7aei5ITQXpNJEm8QKy/n+ciPy+2cJHpzmJ5q0Jt6yE/2ZYfX/++9+o9iXULtzRAwAYDh09AIDh0NEDABiuPmL0hpHDtnIQNsBL5GivLtIqPKe55pz/ssPtEfEOo7NFfEqK+K/ncn4vgOQ3QROIl6P34luteXNahdEIzc1XJi8+FeBT0KjlWDwEgDt6AADDoaMHADAcOnoAAMMhRl8NcgRUjsGKNIFj6SnNTG3pmQAz4jXWc+IPuiY/JdFMvW+W351lTcDbvwATzzcCTf/3K8C4QjDhzvGv2IqBBoE7egAAw1X6jr5BCncBQIWhb9FoiJqxAGC8YH1Lg/x6QIy+CsINMgaItGoSsIQ7HTvAIEEAmqO1yCHqvcKEfU3sPlgWmsqQLiDYWx1gyCHcVo1AfLgQowcAMBw6egAAw6GjBwAwHDp6AADDYTB2t8It0aBZ3iIJMNqmGXGVxmnlLGS6ccgAJUH2t0akp/LCZS/Jw6dP133nO9OM32pWjUlPaI4mvUQ3Hh5q/ZmKqccyJobBHT0AgOHQ0QMAGA4dPQCA4RCjdwXLoxQgzqgJxIvhWfklmrxdOSGmrLlmMUCcD3ONVUezeIeheXMqkgRMF4jXLjRTjxNk5ItuFd6ElibxzdEkgwt1oRtWP5kGd/QAAIZDRw8AYDh09AAAhkOMvgqC5JmSX5KTn5NCygHiucGSnUkB99WsGGtezfo+y6F2cep9Z4v41GfLGeX2jCYOrlvloH7OlmvJrGfVc/wteUAmIofvpeIrttw8ArTDitUDQeGRcOGOHgDAcOjoAQAMh44eAMBwxsboAxSCCBb7q3oejwCZUTRT76V8Mpqz6Cbyhzy7W320z+W4/npWvABpLr/mmnNZeQBBip7rPh71U5HmFukVe4RiKSRPsde8AxqW8JkG+zwr9mUECe7oAQAMh44eAMBw6OgBAAxXjhj9ws34m+/eIzp9OXmxrwzH361aDv9psqlIAsTBs/IMaun07XJ2Gs35pbwxmrB+975W8WhCGHrh+Zr0kqV1OaouZKexLHHqvYYlfHCdLeJXrEMIuLdKU+KJNuTMOUsZKa+RZpmFnCs/1C+JdJ5wa8SDRhnu6GcmPjz1TjKZvEzv3VwI//AAAOBLGe7o+y4m+oho4cH9Y0e7t7adPHly88GdO3fCPyMANLyurq5qX0LtKtP0yplrQ2+/f/pysvB/p39fXFwszxkBoKEF61sa5NdDmTr6vovJ5MWZa/GbryXOdRffPahwE2IEmO0b8ES6lOu+j6eJd0s0MXrpCU12Gh3hx9EEZ+9/viI9FYmoo+eH97RJL3ku14xdXvpcud1qEqexH9i3T3pK+tw075vUDLI58QN9tiH+OPmsOnVPU0TzHfdfGEFuu5pWGG4sPtj3tMGFH6NfuBm/NhP6UQEAIKDw7+i7z333aHxo6G2iN77zTqKMt/MAAFCKcoRuus8lkufKcFwAAAgAC6YAAAxX30nN6rSEcbirUTQjqxLN+K18NP+504g6hLofy+vr4sFy4hKn7Lp6vLFjnzhxovuAOE77Wae68T9aES9A805LyeAy6+LY8pMX6qesJnHFVlNEXE1mCSPVti3ezAVaGqYZxvc9Thvse4BVVgHgjh4AoMLSiQHLsixrNFV8ezoxMJBI7+586OgBACordXVieN627Uka9HT1iu3pxPkL07s+ITp6AICKSs/R8JkoEcXOjszOpTXb04nzE8PXR3Z9xvqO0WtoFiVVJmFTsLO0CNFzTXQ43KRmrcIFaKpsa07/bE0d725vEWPNB/Z2SE89WlXH6O89Ui99IiK765D01Bf2q69heUNc4vT42VPpqZb2vertbZ3iteWF4uByjL7Z/9Gk7URkWfJ9nvj9CdKspVR9mqZby4H4XE58SyXb1vrN352lM4rdtm9PJ85PDN+YOn51Ys7vGbcxtqMHACiHrJxDVLJtpLznRK+y5962PX17Ynp6usciIppNnJmKR/2e14HQDQCAD7mc7ffftiNEj9PE7TQRpW6N9x6PStuj8Snbtm17cqT/+o1d9PKEjh4AwJdMLu/33/ZDxC4NT/RYljVIk2MxIkqNbs6r2b49NJYdbsS6mGAZ5r79pz9SbteU6QgQudYkS9KcKOv/RFIgnuTL1sTo2+Q6FZbwM61lxSCjVKfiQJuY6uu5nGkru76s3L5vj5gdTOPp54+U29v2viS95De/tF966rlQUvwf7gWpovDFw68ot7dGxHup50JRlGBfSKkmiS4OrlsWIFRlkb8lTf6T6wVLdiad588ufiPA0QJkr3zyTCx0I3npQLvfl4QLMXoAAB8ywTK5VhU6egAAHwIMxlYdOnoAAB+yuKMvEyn4p6uk7f+Xru5ooZ5I84oAUct1+f6iVZiQrSkYbefVjVgT6t0nnYZotUk9u/zZU3W0nYiefqwejyF53vepgd+TXvKrbxyUnvrbefXs+9zGqvSS1r3irPyDHeqv0vM1cQDj6dIL5XZNtp9Iq7jIoLNNndWns1n8dNaFYutEJIxfBGRYEfAA2aWqrj46egCAGpHNoqMHADBaVv5LqGahowcA8AEdfblIfylpgmUBpthrI2++T6QJamsuu71ZHYZel8d/NAF36VUtQu5yImpuVjeJV/eK8+j3t4ut6KeP1TOOl+W3ev+Rr0lPZdfUQe0f/ETMBLIhfycPdap/oqYWccrz8uJH0lP3hCw0TXI7XHv6qXK7Jb+k46UvSk+tZtSDAavymom9reIH19mifkpzNM3Xp1VY6qH5ImhT/4tPVQZm3QAAGA7z6IsLsA4NAKCoivUtuar/TeFfpTv6YCkQAAD0gvUtAX494I6+0jSz2zWJNwJE2HQpPoRngsXxpDQ4tpzQZk1udlIQVpPkZDmjnkG9uCxewINnG9JTL548VG5/9dVu6SV9xw5IT6X+SZ2F5uM7fy695Ierz6WnDh1Vp0b5/Oc/lF6y9lT94xBR+/7Dyu2vv/oF8WhCwD3SLNa5PSAPhyw+VefKb4qIL8nKU+w1Q1wBSK26HiekE2L0AADGw6wbAADD4Y4eAMBw6OgrLSJH4sMN/2ki/hn/J9KEP5eF2dB5+Sy6yp8CTXqc3PqKcvsvPlNP+iaiVTly3bpHnSnefkWM0f/VnFgA9sUn88rtR35FrNHQ1/Oa9NT37/5Uuf3ZR/9Pekln1zHpqS99QR2LP/aSmJ1Gar1Lcn7/dXnxvRiLl6Ptmlw3mvxS8ktEUnsL9h0Nc/QgEIRuAAAMl0GuGwAAs2EePQCA4TCPHgDAcPU4/b8+OnppLLROR1w1i1Hy0lom+TX57Lr01NMVdQ2NJnlJzsF96mraTzU1poVaJSQn4dK8n88/uyc91SoUAT/9jS9JLzm4p1V6KtK2R7m966unpJcc+tKvSU+98bJ60FXTRBdXMsrtz558Ir0kIidcO3RAXRSlWW7WT9fFUV9pTV2LXOs8GyiLn0RaYxXsaOFChSkAAMNV/TdNAOjoAQB8QIweAMBwuKOvD1L0T5O5LEAJcE1sVEM6TbscG800iXHbFWH1k50Xaz9/cb86qP1LR8QlTj9dVIfOSV6S8y++pB4JIKJXfu03pafu/Eydt+v2B1PiBbwQq5Af6D6hvraTYoy+Tf4UfvzJsnL7kzV1IJ6IsqtCcfC8GDrXLI5rFa6tRU6H1ybfmUprtjRfA02mPEmw71vVe1nc0QMAGA539AAAhkOuGwAAw2WQ66ZMpOh5m1g4QZe3S/rDq0VODqYJuEsn0kwV7xAqgBPRxoY6er60rp4RT0T7OtXzwYnoQJe6GsbjVTFGvyH8OE3ymyPO/SdqFd63r3bvE18ifwz/dO+Bcvujf/5r6SXN7eKJWjrU4wRz7Xull0iLDIjo8ZPPlNtXP/+F9JL2/a8ot3ceEiuA53PiB/d4Rb2c4kC7vJJAXpwhVZzXRC00M9+l74LmxliTZiDY6FeIMrijBwAwG0I3AACGq8fQTSmpzFOjA4l02a8EAKAOZHK233/VvuSS7uhjYzfmBiyrd9IeEws8cAs342++e4/o9OXkxb5dXt+mvBDNa9LV3PD95momTWnDgsLL5Mi1Ns2pUKIhJ07HfvxIXTKbiNoPqGP0BzvEXDcbQq7thadiRp3uA+LRjh9Rx7ufLYs/zp/9QKxwsvRInQbn6G/8O+klUiCeiJ4//Ily+9oz8QL2danzyRDR0t6Xlds1MfpcZk25PS/Po8/LCyCkKfaa2vHh9j8Vi5xXvfBILXTcfpVWnCgan7Lts7csq5Rb+5mJD0+9k0wmL9Pb12Z2e30AADUlk8v7/VftS/YTo4+N2XY6MWBZ01sbRpS3+AsP6NQ3u4mor//0ew8WqK+biE6ePLn57J07d3Z7yQAAO3R1dVXmRAFy2Vadj44+NWoNzl6ft+2odrePH9ynb27f6PTvi4uLvq4PAKAUwfqWAL8epCnIfqQTAz0XpnfeLW/bLu3mW2kdfTox0HOhd9K2x4rv+9rRY+rZzrsghbtX5fijZo6wNItdM/V+Va4S2SrkEhGqfBMRrWfFSOtLQvR8rVWcDf3ouZjOZeWx+qN4/StflV4iNeL0p2LN7n/f94b01NCAOkPO9+6IKddXNsTw/e+d+h3l9lflQYK/+OHPpafaD6rLeZ/q7ZFe0tEiLtx4uKS+7A55UnykRX3ZUuyetIUE2lpalNs3NHED+TsiBdybdKXGfXd/choe3Qhb1W+oQ+joU1cnhuftqWhq1BpNsT5823YSdvOvlI4+NXqebhS7kXd0H6UPv79w7lz3zPT7x/ovBr80AIDaM/lH/3Lzwe/+4Qea3b73x9+SnkrP0fCZKBHFzo5cmUtTLKrcnib1bgGUNutmys+vkr7hU++9OfQu0enLyXAm3QAA1Ipv/cHf+N3tgz/5Lf7U/N1ZOqN4ybbt0m4BlGPBVPe5RPJcGY4LAFB1OXmuc4l6TvTOlbBd2i0AY1fGSsk6iKizWR1pXc/JYXWZlM6lU05o80QoFkpEG0L88Y1DYnDWIjGmLEVav/YFMT3ODx+ok6R/9mPxLuZ/7RXzyQz2qSPUh/aJQw772tSxZpJTq3++vCG9ZGPpifRUZ9fryu1f6uqUXvKD+8+kp5Y+UU883nP4mPSSL7+s/hQ+FcL9pI1cSwmUnqwFmdvXKuU2kqPqQQrDyvn9NWtNNLmVKsOWMw6VKHqcJm6n4/Fo6tZ479kxaXuU1LsFUNo8egAAICKifC7j99/2Q8QuDU/0WJY1SJNjMXKzD2zbvn234Iy9owcAKAdNgbaSReNTdtz9rzMOum37tv8Gh44eAMCHvDw9umahowcA8CGMO/pKq4+OXlqloRmV0YwMSQOewawJqyfEwVMissXxsefL6hrTj1vFpTpH5IHNl/aoBzaPvNQhvWR1Q31tP+48IL3ko5/8rfTUn32gzgK2tC5+VdI//EvpqTlhtsNXfl2cg/b1r4gj1UtCAezptLg07KPPxLWX0ionW/6spbHlNnkY//NVcZxWGiWNyIn/cvL3R6rq3i5fWwCa8VvNWqqqy2d3O+um8uqjowcAqBG4owcAMJwmZ3jNQkcPAODD7ufRV16ddPShrpDQlGIIICtEM7Py6itbjo3aQtGJT5fENUGfyHUq7Efqp9bld+DXv3xQuf0/ffvfSi/53k/ERUm3/m5euX1j+an0Es2anBah0vezZ4+llyyviUvD8hl1KZWOPWKtkv37xcIjJITCpQ+UiB6+UN8YrmSCtM8V4TOVku4RkWaBoNRANQnFNIVHpBfp1ljJh6t69B539AAAhtP88q5Z6OgBAHzAHT0AgOEw66ZcAoToA0QMg12ClJhpQxcBla9AWDKgmY69sSLO+155/LFy+/99pq5kTUR72nqV27/+mpi57MsvtUtP/Z/5+9JTkt8YEJN6vHZQfaL//Y9iJeOFH/2F9FTny+qkZq//Sr/0kq694pIFKcvg8op6YQTJZXPam8W2K9dUF2nnqsvhe6GJao6m+cYFWAejOVENxOjR0QMAGA2zbgAADIc7egAAwyFGX0M0VYzzQsA9WD2DZiE2mc2LWUGkC9BehPjjRFrExDXtB15VbtfUmP7gn9Vh/b/6e3Hm+8aK+FRzm3oae8fLr0kvaZFKXhC9WFN/wVr3itPb9x4WC5c3CbW5F16o59cTkWYBhlQow4qIdVSkj7pNLsehCU8vCbPvNSNSmrw1lvAqzVdEcyJpMCAXaIFMlcuOYNYNAIDxcEdfXFdXV4XPCACNoGJ9CwZji1tcFBO9AgAEFqxvCfDrAXf0NUQTzZTC97qiw/6f0QwSWE3i297Wrg4cN8tHe7EuRo5b97yk3B59RUwu//FzdVKdhXs/kF5i2+KKgcNf+5Zy+9GDYgqa9OKS9FQuq46et7XvlV5yJHpSemo1o4605tZXpJc8FNLjEFFTi3qOfyQifta5vPqDe7Imtra2UNO0axq81Ho1KewD0PwwVQ/Ea2DWDQCA4RC6AQAwHEI3AACGwx19DdHE+MLNlSHNRdaGU8Vp7PuF2rDy1GpaWhafy669UG5/tiYGtaXENe2/+q+klzxfFSPXnW3q5DCat+aXvyimg18R6tn+5KE4Cre8Jkb89710RLm9o10cwHgm/6RSi2uVP7l1/8luhdoHRPJbGizYLQ4JhRo7lweeAi5qqYw87ugBAMyGO3oAAMMhRg8AYDhbk4G8Vhnb0esm/AYI/2mCicL2Fjk/t6bw5pNV9eRuTai3o1PMFL8iZLFfePiR9JJHe9R5Y15/WYxcdzaLyXZ+8Uw9SLCRE1PYH94nJofZ164ewGiS88k0y1Ps1zPqFQMdzeK1NTeLJ8oJb/VGLkg6eImm5QZo1JqvSLjz5aUJ+zUch9fBHT0AgOHQ0QMAGA4rYwEADGfnEaMHADCahXz0ZSINWmkSh4U7mhSxNMtepFE48dpseRRKytu1si62Lc14Y3unegR1eWNVesnKE3XhkZ/JK4/a9on5/5qE9G1rK8+ll/xtWixjIiUOO7RHTJG2t1X84J6uqe/Lnq/Lf5jrRk+Fqu7yC6QmGu4yooolDgv3RFWvAK6TR0cPAGA23NEDABgOs24AAMxmI3RTJlKMTxPsrpi8sPrJJjEBVUtEvfCHiPZ1dCq3L62tSS/Jri2L19aszim299AXpJdsdB5Ubte81QfaxVbUKixl+vSFeDRNIhFLGClZlYt2S6XbiahVyDq3nhPD+pqBHymwrok1S8vmws3nFSy7X5DlV/5PFO76r4rJZ0Ps6NOJgZ4L00Qjk/ZYrMj2dGLgPN2Yikf9n0ZOiggAADvkcxm//8Rjpa5ODM/btj1Jg6Mp/fZ04vyF6aDXjI4eAMCHlRePN//lsuuaf85uKy8eS4dKz9HwmSgRxc6OzM6lNdvTifMTw9dHgl4zOnoAgCDWV5c0/0o5wvzd2ZK2pxPnJ4ZvxI8HvtRyxOgXbsbffPce0enLyYt9ZTi+S04OFjLdrHwpOGvLxcHlE7U3q3/12u1ipq1luZa0LWTa0iRcO3xIPStf8wZk5Y9BSul1qFP8cdrk9G0ZYcnC52tiWP/JmlyqQ/gcOoWPgIiEwidE2jdBIn8IQYT7XahI3ZHGlRq1BseJ+q9PDvcqd+g50TvH/pu+PTE9Pd1jERHNJs4EiNKX4Y5+ZuLDU+8kk8nLbu2/aQAABoJJREFU9N7NhfAPDwBQ12Jjtm3b9lQ8dpwmbqeJKHVrvPe4231Hvduj8Snbtm17cqT/+o0gY7HluKPvu5joI6KFB/ePHe3e2nby5MnNB3fu3An/jADQ8Lq6xBXatSt2afhKj3WBaGTSjhFRanRg7tJUPLp9+25ZdlmKM85cG3r7fVXoZnFRLO+p8e0//VEYV1Um0iw58QUtcnRin1AzVjODcHlNzGcgfbh7hUmcRHRQyPkeLHSjybwvCTd0EyBpgTZ0I/440pugOb//dPQ6AUI3Ac4fsAJtqEeT/PnvfyPAq+ry14N/od3Rz1wbevt9oje+807iXDf1XUwmL85ci998LXGuu/iL65u6GWu+xrrCI0KfpYmqd7SJ8e51IUS+khF7RunasnJdamkkQKOjRWx4ml9pG8JTTfKbo5upLTy3Il9AuD2jdDRLPk+ADE61kIIm3BNhnCCA0Dr6vovJ5EUiooWb8WtHE2UehQUAgFKFH6PvPvfdo/Ghobc37+6Nv50HAKh15Zhe2X0ukTxXhuMCAEAA9ZHrppYFGmjyXbg8I9eY1kSopUwvWTlXfsZ/hXspBY3Gmhzx14VnhXGPVvkd6GwR0wotbah/Us2Ia7jpXAKdx7dwI9oVi48jEB8urIwFADAcOnoAAMOhowcAMJyxMfqKzcMNdDTx6pqE37x5eQK17ikhDKwJ6zcJAXcheTsRUau8xGlDiMVLE/xJm0FeempNnvm+Jme3l5YmdMgLpjRz/KWfR/O+ye+BqOoFYGt5wRRo4I4eAMBw6OgBAAyHjh4AwHDo6AEADGfsYGwtj/NoKk40CWuCAia6El6kyXQoXVtETtKmydEmDV5KhblJOxaaC7W4hnTZmpMEGFnVjLhKb7Xms877X2oXTA1MWIAw4Y4eAMBw6OgBAAyHjh4AwHD1HaOvWFGFAEfTBOI1UWDN6idJmxw5lg4WoFJSgOLXGnk5c9qG/6xqmndAs5jrhZDULEBxDwo1qZklv6jqrRqFR+oU7ugBAAyHjh4AwHDo6AEADFffMfpanu0bakxbR5MgTBonCDZ+EKJwTyKnGqOIJZ5KSmqmWRYQQIBYcy23ahQeqVO4owcAMFyl7+i7uroqfEYAaAToWzQq3dEvLi5W+IwA0AiC9S0N8uuhvmP05pFSymjm1weYqa2J0UtZaJrlXDeaDDBrwviBJg6uyXUjXfZyRgzSr2R9D2BoLkBT4UQ6jeatll4ToAS5/lUBoPCIYRCjBwAwHDp6AADDoaMHADAcYvRVoI20quOWcoRcF+mUntHMFBdz2sgXsCE+I2aQl+awa88Tdr4d4WBrQkFz0n4K0hhKgNT/uo+6UlHtOp19DxLc0QMAGA4dPQCA4dDRAwAYzrIrFvYjoiotmOrq6qrZhVq4tmBwbcHg2naetMJnrArc0QMAGA4dPQCA4dDRAwAYDh09AIDh0NEDABgOHT0AgOHQ0QMAGA4dPQCA4Sq9YAq2OXny5J07d6p9FfUH71sweN8aE+7oAQAMh44eAMBwCN0AABgOd/QAAIZDRw8AYDh09AAAhkNHX10LN+NDQ0NDQ9dmqn0l9QLvWDB43xoaOvqqmpn48NQ7yWTyMr13c6HaF1MX3HfsbXRZPqClNTZ09FXVdzFxrpto4cH9Y0e7q30x9WDhAZ36ZjcR9fWfvv8APVbJ0NIaGzr6qpu5NvTmu8f6+6p9HXXh4wf3q30J9QstrXGho6+CmWtDQ0NDQ/HNv6H7LiaTyf7pOP6iLsFrR49V+xLqF1pa40JHXwV9F5PJZDKZOEc34wg0+9J9lD78/gIRzUy/jxhE6RbQ0hobVsZW18LN+Jvv3iN64zvvJM6h3ypB4R07fTl5EUGI0qGlNTR09AAAhkPoBgDAcOjoAQAMh44eAMBw6OgBAAyHjh4AwHDo6KFupBMD1kAiXfhvatSyRlPVvCCAOoHplVBPUqPWlRPzU/EopUatW2ftsVi1rwigDqCjh/qy2cFfmhu4enwK3TxASZqrfQEAvsTGJm9ZVs/IpB2v9qUA1AvE6KHOpOdmR0ZGxm8hOg9QKoRuoK6kEwPn6cbUmdsDPXffQogeoCTo6KGObHXz8ShROoGuHqBE6OihXqQTAz0Tw/NT8aj6/wAgQEcPAGA4DMYCABgOHT0AgOHQ0QMAGA4dPQCA4dDRAwAYDh09AIDh0NEDABgOHT0AgOHQ0QMAGA4dPQCA4dDRAwAY7v8D+OtHRx9q+9MAAAAASUVORK5CYII=" alt="plot of chunk reproduce_bivar_fig" /></p>
<pre><code class="language-r">p1 <- ggplot(df_pdf_cdf) + geom_tile(aes(X, Y, fill= actual_cdf)) +
scale_fill_continuous_sequential(palette="Oslo",
breaks=seq(0,1,by=.2),
limits=c(0,1))
p2 <- ggplot(df_pdf_cdf) + geom_tile(aes(X, Y, fill= cdf_est)) +
scale_fill_continuous_sequential(palette="Oslo",
breaks=seq(0,1,by=.2),
limits=c(0,1))
cdf_diff <- ggplot(df_pdf_cdf) + geom_tile(aes(X, Y, fill
= cdf_est - actual_cdf)) +
scale_fill_continuous_sequential(palette="Oslo",
breaks=seq(-.02,.02,by=.02),
limits=c(-.02,.02))
(p1+ ggtitle("Actual CDF") + theme(legend.title = element_blank()) + p2 +
ggtitle("Estimated CDF") + theme(legend.title = element_blank())+
plot_layout(guides = 'collect')) / (cdf_diff +
ggtitle("Estimated CDF - Actual CDF") +
theme(legend.title = element_blank()))
</code></pre>
<p><img src="data:image/png;base64,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" alt="plot of chunk reproduce_bivar_fig" /></p>
<p>Reproduce actual and estimated Spearman and Kendall correlation coefficient
results for <strong>Table 3</strong> in the text.</p>
<p>Actual Spearmans</p>
<pre><code class="language-r">print(round(actual_spearmans,3))
</code></pre>
<pre><code>## [1] 0.479
</code></pre>
<p>Estimated Spearmans</p>
<pre><code class="language-r">print(round(spear_est,3))
</code></pre>
<pre><code>## [1] 0.475
</code></pre>
<p>Actual Kendall</p>
<pre><code class="language-r">print(round(actual_kendall,3))
</code></pre>
<pre><code>## [1] 0.331
</code></pre>
<p>Estimated Kendall</p>
<pre><code class="language-r">print(round(kendall_est,3))
</code></pre>
<pre><code>## [1] 0.33
</code></pre>
<p>Reproduce quantile estimate results on EUR/USD and GBP/USD as presented in
<strong>Table 4</strong> in the text.</p>
<pre><code class="language-r">spread_data <-
arrow::read_parquet("./eurusd_gbpusd_spread_2021_10.parquet")
percs <- c(0.01,0.1,0.25,0.5,0.75,0.9,0.99)
hermite_ests <- by(spread_data, list(spread_data$hr,spread_data$currency_pair),
function(x){hermite_estimator(observations = log(x$spread_bps+1e-8))})
quantiles_ests <- t(sapply(hermite_ests,FUN=function(x){exp(quant(x,percs))}))
eur_usd_merged <- merge_hermite(as.list(hermite_ests)[1:24])
gbp_usd_merged <- merge_hermite(as.list(hermite_ests)[25:48])
gbp_all_hours <- exp(quant(gbp_usd_merged,percs))
eur_all_hours <- exp(quant(eur_usd_merged,percs))
dim(gbp_all_hours) <- c(1,length(percs))
dim(eur_all_hours) <- c(1,length(percs))
result <- data.frame(currency_pair = rep(attr(hermite_ests,"dimnames")[[2]],
each=24), hour_utc = rep(attr(hermite_ests,"dimnames")[[1]],2),
quantiles_ests)
result <- rbind(result,
data.frame(currency_pair = "EUR/USD", hour_utc = "All", eur_all_hours))
result <- rbind(result,
data.frame(currency_pair = "GBP/USD", hour_utc = "All", gbp_all_hours))
colnames(result) <- c("currency_pair", "hour_utc", paste0("p_",percs*100,"%"))
print(result,digits=1)
</code></pre>
<pre><code>## currency_pair hour_utc p_1% p_10% p_25% p_50% p_75% p_90% p_99%
## 1 EUR/USD 0 0.2 0.3 0.3 0.4 0.4 0.5 0.7
## 2 EUR/USD 1 0.2 0.3 0.3 0.4 0.4 0.4 0.5
## 3 EUR/USD 2 0.2 0.3 0.3 0.4 0.4 0.5 0.6
## 4 EUR/USD 3 0.2 0.3 0.3 0.4 0.4 0.5 0.6
## 5 EUR/USD 4 0.2 0.3 0.3 0.4 0.4 0.5 0.6
## 6 EUR/USD 5 0.2 0.3 0.3 0.4 0.4 0.5 0.6
## 7 EUR/USD 6 0.2 0.3 0.3 0.4 0.4 0.4 0.5
## 8 EUR/USD 7 0.2 0.3 0.3 0.4 0.4 0.5 0.5
## 9 EUR/USD 8 0.2 0.3 0.3 0.4 0.4 0.4 0.5
## 10 EUR/USD 9 0.2 0.3 0.3 0.4 0.4 0.4 0.5
## 11 EUR/USD 10 0.1 0.2 0.3 0.4 0.4 0.5 0.6
## 12 EUR/USD 11 0.2 0.3 0.3 0.4 0.4 0.5 0.6
## 13 EUR/USD 12 0.2 0.3 0.3 0.3 0.4 0.4 0.5
## 14 EUR/USD 13 0.2 0.3 0.3 0.4 0.4 0.4 0.5
## 15 EUR/USD 14 0.2 0.3 0.3 0.4 0.4 0.5 0.5
## 16 EUR/USD 15 0.2 0.3 0.3 0.4 0.4 0.5 0.5
## 17 EUR/USD 16 0.2 0.3 0.3 0.4 0.4 0.5 0.5
## 18 EUR/USD 17 0.2 0.3 0.3 0.4 0.4 0.5 0.6
## 19 EUR/USD 18 0.2 0.3 0.3 0.4 0.4 0.5 0.6
## 20 EUR/USD 19 0.2 0.3 0.3 0.4 0.4 0.5 0.6
## 21 EUR/USD 20 0.3 0.3 0.4 0.5 0.7 0.8 1.0
## 22 EUR/USD 21 1.8 2.6 3.0 4.0 6.0 8.5 15.9
## 23 EUR/USD 22 0.4 0.5 0.6 0.7 0.7 0.9 1.2
## 24 EUR/USD 23 0.3 0.4 0.5 0.5 0.6 0.7 0.7
## 25 GBP/USD 0 0.4 0.5 0.6 0.7 0.9 1.0 1.2
## 26 GBP/USD 1 0.4 0.5 0.6 0.8 0.9 1.0 1.2
## 27 GBP/USD 2 0.4 0.5 0.5 0.7 0.9 1.0 1.2
## 28 GBP/USD 3 0.4 0.5 0.6 0.8 0.9 1.0 1.1
## 29 GBP/USD 4 0.4 0.5 0.6 0.7 0.9 1.0 1.1
## 30 GBP/USD 5 0.4 0.5 0.6 0.7 0.8 0.9 1.2
## 31 GBP/USD 6 0.4 0.5 0.6 0.7 0.8 0.8 1.0
## 32 GBP/USD 7 0.3 0.5 0.6 0.7 0.8 0.9 1.0
## 33 GBP/USD 8 0.3 0.4 0.5 0.6 0.7 0.8 1.0
## 34 GBP/USD 9 0.3 0.4 0.5 0.6 0.7 0.8 1.0
## 35 GBP/USD 10 0.3 0.4 0.5 0.6 0.7 0.8 0.9
## 36 GBP/USD 11 0.4 0.5 0.6 0.7 0.7 0.8 0.9
## 37 GBP/USD 12 0.3 0.4 0.5 0.6 0.7 0.8 1.0
## 38 GBP/USD 13 0.3 0.4 0.5 0.6 0.7 0.8 0.9
## 39 GBP/USD 14 0.3 0.4 0.5 0.6 0.7 0.8 0.9
## 40 GBP/USD 15 0.3 0.4 0.5 0.6 0.7 0.7 0.9
## 41 GBP/USD 16 0.3 0.4 0.5 0.6 0.7 0.8 0.9
## 42 GBP/USD 17 0.3 0.4 0.5 0.6 0.7 0.8 0.9
## 43 GBP/USD 18 0.4 0.5 0.6 0.7 0.8 0.8 0.9
## 44 GBP/USD 19 0.3 0.5 0.6 0.7 0.8 0.8 1.0
## 45 GBP/USD 20 0.5 0.7 0.8 1.0 1.1 1.3 2.3
## 46 GBP/USD 21 2.1 2.5 3.3 5.0 8.9 12.0 24.7
## 47 GBP/USD 22 0.9 1.0 1.1 1.3 1.6 1.9 2.5
## 48 GBP/USD 23 0.7 0.8 0.9 1.0 1.2 1.4 1.6
## 49 EUR/USD All 0.2 0.3 0.3 0.4 0.5 0.6 6.4
## 50 GBP/USD All 0.4 0.5 0.6 0.7 0.9 1.1 9.0
</code></pre>
<p>Reproduce sequential quantile estimate results on EUR/USD and GBP/USD as
presented in <strong>Figure 6</strong> in the text along with sequential Spearman
and Kendall correlation estimates presented in <strong>Figure 7</strong> in the text.</p>
<pre><code class="language-r">eur_data <- spread_data[which(spread_data$currency_pair == "EUR/USD" &
spread_data$time_stamp >= as.POSIXct(as.Date("2021-10-07")) &
spread_data$time_stamp < as.POSIXct(as.Date("2021-10-08"))),]
gbp_data <-spread_data[which(spread_data$currency_pair == "GBP/USD" &
spread_data$time_stamp >= as.POSIXct(as.Date("2021-10-07")) &
spread_data$time_stamp < as.POSIXct(as.Date("2021-10-08"))),]
eur_data <- eur_data[order(eur_data$time_stamp),]
gbp_data <- gbp_data[order(gbp_data$time_stamp),]
h_est_eur <- hermite_estimator(exp_weight_lambda = 0.05)
h_est_gbp <- hermite_estimator(exp_weight_lambda = 0.05)
h_est_bivariate <- hermite_estimator(est_type = "bivariate",
exp_weight_lambda = 0.05)
output_eur <- rep(NA,nrow(eur_data))
output_gbp <- rep(NA,nrow(gbp_data))
output_spearman<- rep(NA,nrow(gbp_data))
output_kendall<- rep(NA,nrow(gbp_data))
for (idx in seq_len(nrow(eur_data))) {
current_obs_eur <- eur_data[idx,]$spread_bps
current_obs_gbp <- gbp_data[idx,]$spread_bps
h_est_eur <- update_sequential(h_est_eur,log(current_obs_eur+1e-8))
h_est_gbp <- update_sequential(h_est_gbp,log(current_obs_gbp +1e-8))
h_est_bivariate <- update_sequential(h_est_bivariate,
c(log(current_obs_eur+1e-8),log(current_obs_gbp+1e-8)))
output_eur[idx] <- exp(quant(h_est_eur,p=0.5))
output_gbp[idx] <- exp(quant(h_est_gbp,p=0.5))
output_spearman[idx] <- spearmans(h_est_bivariate)
output_kendall[idx] <- kendall(h_est_bivariate)
}
output_res_df_eur <- data.frame(time_stamp = eur_data$time_stamp,
median_spread = output_eur, currency_pair="EUR/USD")
output_res_df_gbp <- data.frame(time_stamp = gbp_data$time_stamp,
median_spread = output_gbp, currency_pair="GBP/USD")
output_res_df <- rbind(output_res_df_eur,output_res_df_gbp)
output_spearman_df <- data.frame(time_stamp = eur_data$time_stamp,
correlation=output_spearman, type="spearman" )
output_spearman_df <- output_spearman_df[seq(1,nrow(output_spearman_df),by=10),]
output_kendall_df <- data.frame(time_stamp = eur_data$time_stamp,
correlation=output_kendall , type="kendall" )
output_kendall_df <- output_kendall_df[seq(1,nrow(output_kendall_df),by=10),]
output_correl_df <- rbind(output_spearman_df, output_kendall_df)
output_correl_df <- output_correl_df[order(output_correl_df$time_stamp),]
output_res_df_plot <- output_res_df[seq(1,nrow(output_res_df),by=10),]
ggplot(output_res_df_plot,mapping=aes(x=time_stamp ,y=median_spread,color =
currency_pair)) + geom_line() + xlab("Timestamp") +
ylab("Median Spread (bps)")
</code></pre>
<pre><code>## Warning: Removed 1 row containing missing values (`geom_line()`).
</code></pre>
<p><img src="data:image/png;base64,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" alt="plot of chunk unnamed-chunk-7" /></p>
<pre><code class="language-r">ggplot(output_correl_df,mapping=aes(x=time_stamp, y=correlation,color=type)) +
geom_line() +geom_smooth() + xlab("Timestamp") + ylab("Correlation")
</code></pre>
<pre><code>## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
</code></pre>
<pre><code>## Warning: Removed 2 rows containing non-finite values (`stat_smooth()`).
</code></pre>
<pre><code>## Warning: Removed 2 rows containing missing values (`geom_line()`).
</code></pre>
<p><img src="data:image/png;base64,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" alt="plot of chunk unnamed-chunk-7" /></p>
<p>Benchmark hermiter vs tdigest (parallel computation enabled), updating
with 1e6 observations. Reproduces <strong>Figure 8</strong> in the text.</p>
<pre><code class="language-r">obs <- rnorm(1e6)
bench_res <- microbenchmark::microbenchmark(
t_digest = tdigest(obs),
hermite_N_10 = hermite_estimator(N = 10, observations = obs),
hermite_N_20 = hermite_estimator(N = 20, observations = obs),
hermite_N_30 = hermite_estimator(N = 30, observations = obs),
hermite_N_50 = hermite_estimator(N = 50, observations = obs),
times = 20
)
autoplot(bench_res, log = TRUE)
</code></pre>
<pre><code>## Coordinate system already present. Adding new coordinate system, which will replace the existing one.
</code></pre>
<p><img src="data:image/png;base64,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" alt="plot of chunk benchmark_updating" /></p>
<pre><code class="language-r">print(bench_res)
</code></pre>
<pre><code>## Unit: milliseconds
## expr min lq mean median uq max neval
## t_digest 97.3098 98.14090 98.94098 98.70065 99.58645 101.8031 20
## hermite_N_10 23.8611 24.22610 26.47650 24.42310 24.81625 42.5259 20
## hermite_N_20 31.9809 32.46780 35.16618 32.67305 34.62435 48.2838 20
## hermite_N_30 40.0571 40.60320 41.12018 40.98390 41.57010 42.6173 20
## hermite_N_50 56.4826 57.23035 60.30319 57.39500 61.20965 74.3275 20
</code></pre>
<p>Benchmark hermiter vs tdigest (parallel computation disabled), updating
with 1e6 observations. Reproduces <strong>Figure 9</strong> in the text.</p>
<pre><code class="language-r">options(hermiter.parallel = FALSE)
bench_res <- microbenchmark::microbenchmark(
t_digest = tdigest(obs),
hermite_N_10 = hermite_estimator(N = 10, observations = obs),
hermite_N_20 = hermite_estimator(N = 20, observations = obs),
hermite_N_30 = hermite_estimator(N = 30, observations = obs),
hermite_N_50 = hermite_estimator(N = 50, observations = obs),
times = 20
)
autoplot(bench_res, log = TRUE)
</code></pre>
<pre><code>## Coordinate system already present. Adding new coordinate system, which will replace the existing one.
</code></pre>
<p><img src="data:image/png;base64,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" alt="plot of chunk benchmark_updating_serial" /></p>
<pre><code class="language-r">print(bench_res)
</code></pre>
<pre><code>## Unit: milliseconds
## expr min lq mean median uq max neval
## t_digest 96.4097 96.94005 97.07654 97.1558 97.2563 97.8746 20
## hermite_N_10 127.5902 129.94110 162.93353 134.5115 153.5274 381.7957 20
## hermite_N_20 254.6851 263.29775 273.58323 276.9704 283.4670 292.7922 20
## hermite_N_30 339.0049 350.70885 382.53319 363.1500 373.3352 604.3701 20
## hermite_N_50 581.8368 594.12540 620.07919 597.4981 602.7125 837.2012 20
</code></pre>
<pre><code class="language-r">options(hermiter.parallel = TRUE)
</code></pre>
<p>Benchmark hermiter vs tdigest, quantile estimation. Reproduces <strong>Figure 10</strong>
in the text.</p>
<pre><code class="language-r">obs <- rnorm(1e6)
td <- tdigest(obs)
h_est <-
hermite_estimator(observations = obs)
p_1 <- 0.5
p_100 <- seq(0.01, 1, 0.01)
p_10000 <- seq(0.0001, 1, 0.0001)
p_100000 <- seq(0.00001, 1, 0.00001)
bench_res <- microbenchmark::microbenchmark(
hermite_1_quantile = quant(h_est, p = p_1),
tdigest_1_quantile = quantile(td, probs = p_1),
hermite_100_quantiles = quant(h_est, p = p_100),
tdigest_100_quantiles = quantile(td, probs = p_100),
hermite_10_000_quantiles = quant(h_est, p = p_10000),
tdigest_10_000_quantiles = quantile(td, probs = p_10000),
hermite_100_000_quantiles = quant(h_est, p = p_100000),
tdigest_100_000_quantiles = quantile(td, probs = p_100000),
times = 1e2
)
autoplot(bench_res,
log = T,
xlab = "Algorithm",
ylab = "Time (millis)")
</code></pre>
<pre><code>## Coordinate system already present. Adding new coordinate system, which will replace the existing one.
</code></pre>
<p><img src="data:image/png;base64,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" alt="plot of chunk benchmark_quantile_est" /></p>
<pre><code class="language-r">print(bench_res)
</code></pre>
<pre><code>## Unit: microseconds
## expr min lq mean median uq max neval
## hermite_1_quantile 258.2 348.05 421.941 406.80 454.45 1064.2 100
## tdigest_1_quantile 10.2 12.55 23.833 20.65 32.85 56.4 100
## hermite_100_quantiles 265.9 353.25 786.992 408.50 464.40 35910.4 100
## tdigest_100_quantiles 13.1 15.95 28.017 21.55 37.55 109.1 100
## hermite_10_000_quantiles 502.5 595.55 674.612 672.15 728.15 1397.5 100
## tdigest_10_000_quantiles 240.8 257.75 291.264 273.40 300.60 817.8 100
## hermite_100_000_quantiles 2421.3 2965.50 3056.162 3064.70 3241.50 5493.4 100
## tdigest_100_000_quantiles 2325.9 2428.70 2484.415 2484.75 2521.80 2928.9 100
</code></pre>
<p>Univariate simulation study comparing hermiter and tdigest for quantile
estimation.</p>
<pre><code class="language-r">calculate_miae_per_distro <- function(full_miae = FALSE) {
distros_index <- c(1:5, 7:8, 11, 13:17, 21:28)
numruns <- total_number_of_runs
num_obs_vec <- c(1e4, 1e5, 1e6, 1e7)
if (full_miae == TRUE) {
p <- randtoolbox::sobol(1000)
norm_factor <- 1
} else {
p <- randtoolbox::sobol(1000) * 0.98 + 0.01
norm_factor <- 0.98
}
distr_name_all <- c()
num_obs_all <- c()
mae_hermite_quant <- c()
mae_t_digest_quant <- c()
count <- 0
for (num_obs in num_obs_vec) {
for (current_distro_idx in seq_along(distros_index)) {
dnum <- distros_index[current_distro_idx]
distr_name <- benchden::berdev(dnum)$name
r_func <-
function(core_obs) {
benchden::rberdev(n = core_obs, dnum = dnum)
}
q_func <-
function(p_est) {
benchden::qberdev(p_est, dnum = dnum)
}
p_func <- function(x) {
benchden::pberdev(x, dnum = dnum)
}
res_hermite_quant <- rep(0, numruns)
res_t_digest_quant <- rep(0, numruns)
for (run in c(1:numruns)) {
obs <- r_func(num_obs)
h_est <- hermite_estimator(observations = obs )
td <- tdigest(obs)
q_est_hermite <- h_est %>% quant(p)
q_est_t_digest <- quantile(td, probs = p)
true_quant <- q_func(p)
res_hermite_quant[run] <- norm_factor *
mean(abs(q_est_hermite - true_quant))
res_t_digest_quant[run] <- norm_factor *
mean(abs(q_est_t_digest - true_quant))
}
mae_herm_quant <- mean(res_hermite_quant)
mae_t_dig_quant <- mean(res_t_digest_quant)
count <- count + 1
distr_name_all[count] <- distr_name
num_obs_all[count] <- num_obs
mae_hermite_quant[count] <- mae_herm_quant
mae_t_digest_quant[count] <- mae_t_dig_quant
}
}
result <- data.frame(
distribution_name = distr_name_all,
num_obs =
num_obs_all,
mae_hermite_quant,
mae_t_digest_quant
)
result <- result %>% mutate(hermite_better_quant =
ifelse(mae_hermite_quant < mae_t_digest_quant,
1, 0))
return(result)
}
</code></pre>
<pre><code class="language-r">calculate_miae <- function(miae_per_distro) {
univariate_quantile_results <- miae_per_distro %>%
group_by(num_obs) %>%
summarise(
num_herm_better = sum(hermite_better_quant),
total_distros = n(),
perc_herm_better =
sum(hermite_better_quant) / n()
)
return(univariate_quantile_results)
}
univar_quant_results_partial_per_distro <-
calculate_miae_per_distro(full_miae = FALSE)
univar_quant_results_full_per_distro <-
calculate_miae_per_distro(full_miae = TRUE)
univar_quant_results_partial <-
calculate_miae(univar_quant_results_partial_per_distro)
univar_quant_results_full <-
calculate_miae(univar_quant_results_full_per_distro)
</code></pre>
<p>Reproduces <strong>Table 5</strong> in the text:</p>
<pre><code class="language-r">print(univar_quant_results_full)
</code></pre>
<pre><code>## # A tibble: 4 × 4
## num_obs num_herm_better total_distros perc_herm_better
## <dbl> <dbl> <int> <dbl>
## 1 10000 12 21 0.571
## 2 100000 16 21 0.762
## 3 1000000 18 21 0.857
## 4 10000000 18 21 0.857
</code></pre>
<p>Reproduces <strong>Table 6</strong> in the text:</p>
<pre><code class="language-r">print(univar_quant_results_partial)
</code></pre>
<pre><code>## # A tibble: 4 × 4
## num_obs num_herm_better total_distros perc_herm_better
## <dbl> <dbl> <int> <dbl>
## 1 10000 15 21 0.714
## 2 100000 18 21 0.857
## 3 1000000 18 21 0.857
## 4 10000000 19 21 0.905
</code></pre>
<p>R implementation of count matrix algorithm of Xiao, Wei. “Novel online
algorithms for nonparametric correlations with application to analyze sensor
data.” 2019 IEEE International Conference on Big Data (Big Data). IEEE,
as an S3 class. The implementation below follows
<a href="https://github.com/wxiao0421/onlineNPCORR/">https://github.com/wxiao0421/onlineNPCORR/</a> reasonably closely in parts.</p>
<pre><code class="language-r">count_matrix_calculator <-
function(cut_points_inpt, normalize = FALSE) {
this <- list(
cut_points = cut_points_inpt,
count_matrix = matrix(
rep(0, cut_points_inpt ^ 2),
nrow = cut_points_inpt,
ncol = cut_points_inpt,
byrow = TRUE
),
n_row = rep(0, cut_points_inpt),
n_col = rep(0, cut_points_inpt),
x_breaks = qnorm(p = seq(0, 1, length.out =
(
cut_points_inpt + 1
)))[2:(cut_points_inpt)],
y_breaks = qnorm(p = seq(0, 1, length.out =
(
cut_points_inpt + 1
)))[2:(cut_points_inpt)],
num_obs = 0,
normalize_obs = normalize,
running_mean_x = 0,
running_mean_y = 0,
running_variation_x = 0,
running_variation_y = 0
)
class(this) <- append(class(this), "count_matrix_calculator")
return(this)
}
get_idx <- function(x, breaks) {
if (breaks[length(breaks)] < x) {
return(length(breaks) + 1)
}
return(which(breaks >= x)[1])
}
update_matrix <- function(this, x) {
UseMethod("update_matrix", this)
}
update_matrix.count_matrix_calculator <- function(this, x) {
this$num_obs <- this$num_obs + 1
if (this$normalize_obs == TRUE) {
prev_mean <- c(this$running_mean_x, this$running_mean_y)
upd_mean <- (prev_mean * (this$num_obs - 1) + x) / this$num_obs
this$running_mean_x <- upd_mean[1]
this$running_mean_y <- upd_mean[2]
if (this$num_obs < 2) {
return(this)
}
upd_var <- c(this$running_variation_x,
this$running_variation_y) + (x - prev_mean) *
(x - upd_mean)
this$running_variation_x <- upd_var[1]
this$running_variation_y <- upd_var[2]
x <- (x - upd_mean) / sqrt(upd_var / (this$num_obs))
}
idx_row <- get_idx(x[1], this$x_breaks)
idx_col <- get_idx(x[2], this$y_breaks)
this$count_matrix[idx_row, idx_col] <-
this$count_matrix[idx_row, idx_col] + 1
this$n_row[idx_row] <- this$n_row[idx_row] + 1
this$n_col[idx_col] <- this$n_col[idx_col] + 1
return(this)
}
get_spearmans <- function(this) {
UseMethod("get_spearmans", this)
}
get_spearmans.count_matrix_calculator <- function(this) {
len_x_breaks <- length(this$x_breaks)
len_y_breaks <- length(this$y_breaks)
r_row <- rep(0, len_x_breaks + 1)
r <- 0
for (k in c(1:(len_x_breaks + 1))) {
if (this$n_row[k] == 0) {
r_row[k] <- r
} else {
r_row[k] <- ((r + 1) + (r + this$n_row[k])) / 2
r <- r + this$n_row[k]
}
}
r_col <- rep(0, len_y_breaks + 1)
r <- 0
for (k in c(1:(len_y_breaks + 1))) {
if (this$n_col[k] == 0) {
r_col[k] <- r
} else {
r_col[k] <- ((r + 1) + (r + this$n_col[k])) / 2
r <- r + this$n_col[k]
}
}
r_row <- r_row - (this$num_obs + 1) / 2
r_col <- r_col - (this$num_obs + 1) / 2
r_row <- r_row / sqrt(sum(this$n_row * r_row ^ 2))
r_col <- r_col / sqrt(sum(this$n_col * r_col ^ 2))
corr <- t(r_row) %*% this$count_matrix %*% r_col
return(corr)
}
get_kendall <- function(this) {
UseMethod("get_kendall", this)
}
get_kendall.count_matrix_calculator <- function(this) {
len_n_row <- length(this$n_row)
len_n_col <- length(this$n_col)
count_mat_sum <-
matrix(rep(0, len_n_row * len_n_col), len_n_row, len_n_col, byrow = TRUE)
for (i in 2:len_n_row) {
count_mat_sum[i, 2:len_n_col] <-
cumsum(this$count_matrix[(i - 1), 1:(len_n_col - 1)])
}
for (i in 2:len_n_row) {
count_mat_sum[i, ] <- count_mat_sum[i, ] + count_mat_sum[(i - 1), ]
}
concord_pairs <- sum(this$count_matrix * count_mat_sum)
ties_in_x <- 0
for (i in 1:len_n_row) {
ties_in_x <- ties_in_x + (this$n_row[i] ^ 2 -
sum(this$count_matrix[i, ] ^ 2)) / 2
}
ties_in_y <- 0
for (j in 1:len_n_col) {
ties_in_y <- ties_in_y + (this$n_col[j] ^ 2 -
sum(this$count_matrix[, j] ^ 2)) / 2
}
ties_in_x_and_y <- sum(this$count_matrix * (this$count_matrix - 1)) / 2
discord_pairs <- this$num_obs * (this$num_obs - 1) / 2 - concord_pairs -
ties_in_x - ties_in_y - ties_in_x_and_y
corr <- (concord_pairs - discord_pairs) /
sqrt((concord_pairs + discord_pairs + ties_in_x) *
(concord_pairs + discord_pairs + ties_in_y))
return(corr)
}
</code></pre>
<p>Bivariate simulation study comparing hermiter and count matrix
algorithms for estimation of Spearman’s Rho and Kendall Tau coefficients.</p>
<pre><code class="language-r">rho_inpt <- c(-0.75, -0.5, -0.25, 0.25, 0.5, 0.75)
num_obs_inpt <- c(1e4, 5e4, 1e5)
runs <- total_number_of_runs
mae_matrix_kendall <- c()
mae_hermite_kendall <- c()
mae_matrix_spear <- c()
mae_hermite_spear <- c()
rho_vec <- c()
num_obs_vec <- c()
sig_x <- 1
sig_y <- 1
for (num_obs in num_obs_inpt) {
for (rho in rho_inpt) {
for (j in 1:runs) {
obs_mat <- mvtnorm::rmvnorm(
n = num_obs,
mean = rep(0, 2),
sigma = matrix(
c(sig_x ^ 2, rho * sig_x * sig_y,
rho * sig_x * sig_y, sig_y ^ 2),
nrow = 2,
ncol = 2,
byrow = T
)
)
matrix_est_c30 <-
count_matrix_calculator(cut_points_inpt = 30,
normalize = F)
matrix_est_c100 <-
count_matrix_calculator(cut_points_inpt = 100,
normalize = F)
hermite_est <-
hermite_estimator(est_type = "bivariate", standardize = F)
for (i in seq_len(nrow(obs_mat))) {
matrix_est_c100 <- matrix_est_c100 %>% update_matrix(obs_mat[i, ])
matrix_est_c30 <-
matrix_est_c30 %>% update_matrix(obs_mat[i, ])
hermite_est <-
hermite_est %>% update_sequential(obs_mat[i, ])
}
kendall_est_matrix <-
matrix_est_c100 %>% get_kendall()
kendall_est_hermite <- hermite_est %>% kendall()
spear_est_matrix <-
matrix_est_c30 %>% get_spearmans()
spear_est_hermite <- hermite_est %>% spearmans()
kendall_true <- 2 / pi * asin(rho)
spear_true <- cor(obs_mat, method = "spearman")[1, 2]
mae_matrix_kendall <- append(mae_matrix_kendall,
abs(kendall_est_matrix - kendall_true))
mae_hermite_kendall <- append(mae_hermite_kendall,
abs(kendall_est_hermite - kendall_true))
mae_matrix_spear <- append(mae_matrix_spear,
abs(spear_est_matrix - spear_true))
mae_hermite_spear <- append(mae_hermite_spear,
abs(spear_est_hermite - spear_true))
num_obs_vec <- append(num_obs_vec, num_obs)
rho_vec <- append(rho_vec, rho)
}
}
}
result <-
data.frame(
num_obs_vec,
rho_vec,
mae_matrix_kendall,
mae_hermite_kendall,
mae_matrix_spear,
mae_hermite_spear
)
summary_by_rho_and_num_obs <-
result %>%
group_by(num_obs_vec, rho_vec) %>%
summarise(
mae_matrix_kendall = mean(mae_matrix_kendall),
mae_hermite_kendall =
mean(mae_hermite_kendall),
mae_matrix_spear = mean(mae_matrix_spear),
mae_hermite_spear = mean(mae_hermite_spear)
)
summary_num_obs_kendall <- summary_by_rho_and_num_obs %>%
group_by(num_obs_vec) %>%
summarise(
mae_matrix_kendall_avg =
mean(mae_matrix_kendall) * 100,
mae_hermite_kendall_avg =
mean(mae_hermite_kendall) * 100,
sd_matrix_kendall =
sd(mae_matrix_kendall) * 100,
sd_hermite_kendall = sd(mae_hermite_kendall) * 100
)
summary_num_obs_spear <- summary_by_rho_and_num_obs %>%
group_by(num_obs_vec) %>%
summarise(
mae_matrix_spear_avg =
mean(mae_matrix_spear) * 100,
mae_hermite_spear_avg = mean(mae_hermite_spear) * 100,
sd_matrix_spear = sd(mae_matrix_spear) * 100,
sd_hermite_spear =
sd(mae_hermite_spear) * 100
)
</code></pre>
<p>Reproduces <strong>Table 7</strong> in the text.</p>
<pre><code class="language-r">print(summary_num_obs_spear)
</code></pre>
<pre><code>## # A tibble: 3 × 5
## num_obs_vec mae_matrix_spear_avg mae_hermite_spear_avg sd_matrix_spear sd_hermite_spear
## <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 10000 0.0947 0.146 0.0288 0.0502
## 2 50000 0.0990 0.0577 0.0295 0.00937
## 3 100000 0.103 0.0550 0.0271 0.00847
</code></pre>
<p>Reproduces <strong>Table 8</strong> in the text.</p>
<pre><code class="language-r">print(summary_num_obs_kendall)
</code></pre>
<pre><code>## # A tibble: 3 × 5
## num_obs_vec mae_matrix_kendall_avg mae_hermite_kendall_avg sd_matrix_kendall sd_hermite_kendall
## <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 10000 0.566 0.653 0.140 0.163
## 2 50000 0.377 0.210 0.148 0.0486
## 3 100000 0.377 0.153 0.140 0.0565
</code></pre>
<p>Reproduces <strong>Figure 11</strong> in the text.</p>
<pre><code class="language-r">pivoted_summary <- summary_by_rho_and_num_obs %>%
tidyr::pivot_longer(cols=-c(num_obs_vec,rho_vec)) %>%
tidyr::separate(col=name,sep = "_",into=
c("metric","method","correlation_type")) %>%
mutate(correlation_type=ifelse(correlation_type ==
"spear","Spearman","Kendall"))
ggplot(pivoted_summary,
aes(x=as.factor(num_obs_vec),y=value,fill=method)) +
geom_violin(position=position_dodge(.5)) +
stat_summary(fun=mean, geom="point", shape=23, size=2,
position = position_dodge(.5))+
scale_fill_brewer(palette="Blues") +
facet_wrap(~correlation_type,nrow=1) +
xlab("Number of Observations")+
ylab("Mean Absolute Error (MAE)")+ labs(fill = "Algorithm")
</code></pre>
<p><img src="data:image/png;base64,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" alt="plot of chunk unnamed-chunk-12" /></p>
<p>Computational Details</p>
<pre><code class="language-r">sessionInfo()
</code></pre>
<pre><code>## R version 4.3.0 (2023-04-21 ucrt)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 10 x64 (build 19045)
##
## Matrix products: default
##
##