/
feed.r.xml
2549 lines (1983 loc) · 745 KB
/
feed.r.xml
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
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="https://www.w3.org/2005/Atom">
<channel>
<title>free range statistics - R</title>
<description>Posts categorised as 'R'</description>
<link>https://freerangestats.info</link>
<atom:link href="https://freerangestats.info/feed.R.xml" rel="self" type="application/rss+xml" />
<item>
<title>Reproducing and adapting the UN Population Projections by @ellis2013nz</title>
<description><p>I set out to see if it was possible to reproduce the UN’s <a href="https://population.un.org/wpp/">2022 Revision of World Population Prospects</a> for a given country by cohort component projection from the fertility, mortality and immigration rates and population starting point published as part of their projection. The motivation is to make small changes to some of those parameters - for example by substituting in a recent census result for the population and a given year - and “re-run” the projections to see the impact of changes, or to get a more up-to-date version with data that wasn’t available to the UN at the time of their projection.</p>
<p>It turns out this wasn’t too hard (one morning’s work for the modelling, then a few hours of write-up), particularly in cases where migration is small in the projection period. I was able to reproduce almost exactly population, birth and death totals to 2100 for Vanuatu, and demonstrate the impact of updating the 2020 year for their recent census population totals and fertility rates, and getting a slightly lower projection as a result.</p>
<p>Here’s my reproduction of Vanuatu’s population projection from 2020 to 2100, using just the 2020 population totals and the forecast fertility, mortality and migration rates. As you can see it’s basically identical to the UN totals:</p>
<object type="image/svg+xml" data="https:/freerangestats.info/img/0262-vanuatu-pop.svg" width="100%"><img src="https:/freerangestats.info/img/0262-vanuatu-pop.png" width="100%" /></object>
<p>And here’s the same method tweaked for the actual 2020 census total and with a rough adjustment made to fertility rates based on what was observed at the 2020 census:</p>
<object type="image/svg+xml" data="https:/freerangestats.info/img/0262-vanuatu-revised.svg" width="100%"><img src="https:/freerangestats.info/img/0262-vanuatu-revised.png" width="100%" /></object>
<p>Of course, this method delivers a full set of projections by age and sex, and we could construct life tables or any indicators we want from it. Here are population pyramids comparing the published UN projections for 2050 with my revised set. Not visually stunning in its comparison, but enough to prove that it’s possible:</p>
<object type="image/svg+xml" data="https:/freerangestats.info/img/0262-vanuatu-pyramid.svg" width="100%"><img src="https:/freerangestats.info/img/0262-vanuatu-pyramid.png" width="100%" /></object>
<h2 id="reproducing-un-projections">Reproducing UN projections</h2>
<p>So here’s how I went about that.</p>
<p>First, downloading all the data. The UN recommend bulk downloads of their CSV files. For my purposes I first need the fertility, mortality and population by sex and one year age groups. Of the population original data I am only going to use the 2020 year, and then project it forward myself based on fertility, mortality and migration; but I want the full set for comparison purposes. For migration, I couldn’t see in my hasty look at the UN site a dataset of migration projections by age and sex, so I just use the much simpler net migration rate (per thousand people) per year in the projection period. Here’s code to download all this UN data:</p>
<figure class="highlight"><pre><code class="language-r" data-lang="r"><span class="n">library</span><span class="p">(</span><span class="n">tidyverse</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">glue</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">scales</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">patchwork</span><span class="p">)</span><span class="w">
</span><span class="n">dir.create</span><span class="p">(</span><span class="s2">"data-pop-proj-2022"</span><span class="p">,</span><span class="w"> </span><span class="n">showWarnings</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">FALSE</span><span class="p">)</span><span class="w">
</span><span class="c1">#------------------download and import data for all countries from existing projections----------------</span><span class="w">
</span><span class="n">list.files</span><span class="p">(</span><span class="s2">"data-pop-proj-2022"</span><span class="p">)</span><span class="w">
</span><span class="n">files</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"WPP2022_Fertility_by_Age1.zip"</span><span class="p">,</span><span class="w">
</span><span class="s2">"WPP2022_DeathsBySingleAgeSex_Medium_1950-2021.zip"</span><span class="p">,</span><span class="w">
</span><span class="s2">"WPP2022_DeathsBySingleAgeSex_Medium_2022-2100.zip"</span><span class="p">,</span><span class="w">
</span><span class="s2">"WPP2022_Population1JanuaryBySingleAgeSex_Medium_1950-2021.zip"</span><span class="p">,</span><span class="w">
</span><span class="s2">"WPP2022_Population1JanuaryBySingleAgeSex_Medium_2022-2100.zip"</span><span class="p">,</span><span class="w">
</span><span class="s2">"WPP2022_Demographic_Indicators_Medium.zip"</span><span class="w">
</span><span class="p">)</span><span class="w">
</span><span class="c1"># let downloads take up to 10 minutes rather than 1 minute max, as files are</span><span class="w">
</span><span class="c1"># large (largest is fertility for single age, 78MB)</span><span class="w">
</span><span class="n">options</span><span class="p">(</span><span class="n">timeout</span><span class="o">=</span><span class="m">600</span><span class="p">)</span><span class="w">
</span><span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">file.exists</span><span class="p">(</span><span class="s2">"data-pop-proj-2022/WPP2022_Demographic_Indicators_Medium.csv"</span><span class="p">)){</span><span class="w">
</span><span class="c1"># download the zip files:</span><span class="w">
</span><span class="k">for</span><span class="p">(</span><span class="n">i</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="m">1</span><span class="o">:</span><span class="nf">length</span><span class="p">(</span><span class="n">files</span><span class="p">)){</span><span class="w">
</span><span class="n">download.file</span><span class="p">(</span><span class="n">glue</span><span class="p">(</span><span class="s2">"https://population.un.org/wpp/Download/Files/1_Indicators%20(Standard)/CSV_FILES/{files[i]}"</span><span class="p">),</span><span class="w">
</span><span class="n">destfile</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">glue</span><span class="p">(</span><span class="s2">"data-pop-proj-2022/{files[i]}"</span><span class="p">),</span><span class="w"> </span><span class="n">mode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"wb"</span><span class="p">)</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="c1"># unzip them</span><span class="w">
</span><span class="k">for</span><span class="p">(</span><span class="n">i</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="m">1</span><span class="o">:</span><span class="nf">length</span><span class="p">(</span><span class="n">files</span><span class="p">)){</span><span class="w">
</span><span class="n">unzip</span><span class="p">(</span><span class="n">glue</span><span class="p">(</span><span class="s2">"data-pop-proj-2022/{files[i]}"</span><span class="p">),</span><span class="w"> </span><span class="n">exdir</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"data-pop-proj-2022"</span><span class="p">)</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="n">fert_all</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">read_csv</span><span class="p">(</span><span class="s2">"data-pop-proj-2022/WPP2022_Fertility_by_Age1.csv"</span><span class="p">)</span><span class="w">
</span><span class="n">mort_past</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">read_csv</span><span class="p">(</span><span class="s2">"data-pop-proj-2022/WPP2022_DeathsBySingleAgeSex_Medium_1950-2021.csv"</span><span class="p">)</span><span class="w">
</span><span class="n">mort_future</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">read_csv</span><span class="p">(</span><span class="s2">"data-pop-proj-2022/WPP2022_DeathsBySingleAgeSex_Medium_2022-2100.csv"</span><span class="p">)</span><span class="w">
</span><span class="n">pop_past</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">read_csv</span><span class="p">(</span><span class="s2">"data-pop-proj-2022/WPP2022_Population1JanuaryBySingleAgeSex_Medium_1950-2021.csv"</span><span class="p">)</span><span class="w">
</span><span class="n">pop_future</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">read_csv</span><span class="p">(</span><span class="s2">"data-pop-proj-2022/WPP2022_Population1JanuaryBySingleAgeSex_Medium_2022-2100.csv"</span><span class="p">)</span><span class="w">
</span><span class="n">indicators</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">read_csv</span><span class="p">(</span><span class="s2">"data-pop-proj-2022/WPP2022_Demographic_Indicators_Medium.csv"</span><span class="p">)</span><span class="w">
</span><span class="n">mort_all</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">rbind</span><span class="p">(</span><span class="n">mort_past</span><span class="p">,</span><span class="w"> </span><span class="n">mort_future</span><span class="p">)</span><span class="w">
</span><span class="n">pop_all</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">rbind</span><span class="p">(</span><span class="n">pop_past</span><span class="p">,</span><span class="w"> </span><span class="n">pop_future</span><span class="p">)</span><span class="w">
</span><span class="c1"># clean up</span><span class="w">
</span><span class="n">rm</span><span class="p">(</span><span class="n">mort_past</span><span class="p">,</span><span class="w"> </span><span class="n">mort_future</span><span class="p">,</span><span class="w"> </span><span class="n">pop_past</span><span class="p">,</span><span class="w"> </span><span class="n">pop_future</span><span class="p">)</span></code></pre></figure>
<p>Next, I wrote my own cohort component population projection function. I wanted to do this from scratch rather than using an existing demography package to make sure I understood what was happening (I’m not a demographer) and could make tweaks as necessary to match the UN approach. I used <a href="https://farid-flici.github.io/tuto.html">this tutorial</a> by Farid Flici as my starting point; abstracted his code into a function for easy use with multiple countries, and added a net migration component.</p>
<p>Because migrants’ ages tend to be dissimilar from the country they are migrating too - they are more likely to be in the prime of their working / family life I believe - I needed a way to set the ages of migrants. In the function below I defaulted to a normal distribution of ages, mean 28 and standard deviation 11, which worked well to get similar results to the UN in a few countries I tried. This was the hardest and most discretionary part of the exercise.</p>
<p>My observation is that demographers seem to think in terms of matrices of numbers rather than database-oriented tidy data, and I have kept that matrix approach in this function.</p>
<figure class="highlight"><pre><code class="language-r" data-lang="r"><span class="c1">#----------------------projections for one country-------------------</span><span class="w">
</span><span class="c1"># adapting the implementation of the method for cohort component projection at </span><span class="w">
</span><span class="c1"># https://farid-flici.github.io/tuto.html</span><span class="w">
</span><span class="cd">#' @param start_pop_m is a vector of population of males at single year age</span><span class="w">
</span><span class="cd">#' periods beginning of year starting age 0</span><span class="w">
</span><span class="cd">#' @param start_pop_f as start_pop_m but for females</span><span class="w">
</span><span class="cd">#' @param start_year first year ie the year for which the actual population</span><span class="w">
</span><span class="cd">#' number refers to</span><span class="w">
</span><span class="cd">#' @param end_year end year for the population projection</span><span class="w">
</span><span class="cd">#' @param fertility a matrix with rows for female agegroups 15 to 49 and a</span><span class="w">
</span><span class="cd">#' column for each year, values are births per woman (not per thousand women)</span><span class="w">
</span><span class="cd">#' that year and age. Must have 35 rows and number of columns equal to</span><span class="w">
</span><span class="cd">#' end_year minus start_year plus one.</span><span class="w">
</span><span class="cd">#' @param mort_m a matrix with rows for age 0 to at least 50 and columns for</span><span class="w">
</span><span class="cd">#' each year, for males. Must have number of columns equal to end_year minus</span><span class="w">
</span><span class="cd">#' start_year plus one.</span><span class="w">
</span><span class="cd">#' @param mort_f as mort_m but for females. Must have same number of rows and</span><span class="w">
</span><span class="cd">#' columns as mort_m.</span><span class="w">
</span><span class="cd">#' @param sex_ratio_birth number of boys born for every girl born, vector with</span><span class="w">
</span><span class="cd">#' length of years to be projected.</span><span class="w">
</span><span class="cd">#' @param net_migration vector of proportions of the population that migrate to</span><span class="w">
</span><span class="cd">#' the country, net of those who leave. Defaults to a vector of zeroes.</span><span class="w">
</span><span class="cd">#' @param female_share_migration vector of proportions of net migrants that are</span><span class="w">
</span><span class="cd">#' female. Defaults to a vector of 0.5s.</span><span class="w">
</span><span class="cd">#' @param migration_age_weights vector of relative distribution of the age of</span><span class="w">
</span><span class="cd">#' net migrants. Must be 121 values representing relative proportion of net</span><span class="w">
</span><span class="cd">#' migrants aged zero to 120. Defaults to a normal distribution of mean 28 and</span><span class="w">
</span><span class="cd">#' standard deviation 11. Note that this distribution currently must be the</span><span class="w">
</span><span class="cd">#' same through the projection period (unlike eg fertility and mortality,</span><span class="w">
</span><span class="cd">#' which have individual values for each age group and sex for each year).</span><span class="w">
</span><span class="cd">#' Only the total net migration proportion can change over time, not its age</span><span class="w">
</span><span class="cd">#' make-up.</span><span class="w">
</span><span class="cd">#' @author Peter Ellis, expanding on a less-featured example by Farid Flici</span><span class="w">
</span><span class="cd">#' https://farid-flici.github.io/tuto.html</span><span class="w">
</span><span class="n">pop_proj</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="k">function</span><span class="p">(</span><span class="n">start_pop_m</span><span class="p">,</span><span class="w">
</span><span class="n">start_pop_f</span><span class="p">,</span><span class="w">
</span><span class="n">start_year</span><span class="p">,</span><span class="w">
</span><span class="n">end_year</span><span class="p">,</span><span class="w">
</span><span class="n">fertility</span><span class="p">,</span><span class="w">
</span><span class="n">mort_m</span><span class="p">,</span><span class="w">
</span><span class="n">mort_f</span><span class="p">,</span><span class="w">
</span><span class="n">sex_ratio_birth</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">rep</span><span class="p">(</span><span class="m">1.045</span><span class="p">,</span><span class="w"> </span><span class="n">end_year</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">start_year</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="m">1</span><span class="p">),</span><span class="w">
</span><span class="n">net_migration</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">rep</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="n">end_year</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">start_year</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="m">1</span><span class="p">),</span><span class="w">
</span><span class="n">female_share_migration</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">rep</span><span class="p">(</span><span class="m">0.5</span><span class="p">,</span><span class="w"> </span><span class="n">end_year</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">start_year</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="m">1</span><span class="p">),</span><span class="w">
</span><span class="n">migration_age_weights</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">dnorm</span><span class="p">(</span><span class="m">0</span><span class="o">:</span><span class="m">120</span><span class="p">,</span><span class="w"> </span><span class="n">mean</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">28</span><span class="p">,</span><span class="w"> </span><span class="n">sd</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">11</span><span class="p">)</span><span class="w">
</span><span class="p">){</span><span class="w">
</span><span class="n">stopifnot</span><span class="p">(</span><span class="n">nrow</span><span class="p">(</span><span class="n">fertility</span><span class="p">)</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="m">35</span><span class="p">)</span><span class="w">
</span><span class="n">stopifnot</span><span class="p">(</span><span class="nf">length</span><span class="p">(</span><span class="n">migration_age_weights</span><span class="p">)</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="m">121</span><span class="p">)</span><span class="w">
</span><span class="n">ncols</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">end_year</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">start_year</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="m">1</span><span class="w">
</span><span class="n">stopifnot</span><span class="p">(</span><span class="n">ncol</span><span class="p">(</span><span class="n">fertility</span><span class="p">)</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">ncols</span><span class="p">)</span><span class="w">
</span><span class="n">stopifnot</span><span class="p">(</span><span class="n">ncol</span><span class="p">(</span><span class="n">mort_m</span><span class="p">)</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">ncols</span><span class="p">)</span><span class="w">
</span><span class="n">stopifnot</span><span class="p">(</span><span class="n">ncol</span><span class="p">(</span><span class="n">mort_f</span><span class="p">)</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">ncols</span><span class="p">)</span><span class="w">
</span><span class="n">stopifnot</span><span class="p">(</span><span class="nf">length</span><span class="p">(</span><span class="n">start_pop_m</span><span class="p">)</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="m">50</span><span class="p">)</span><span class="w">
</span><span class="n">stopifnot</span><span class="p">(</span><span class="nf">length</span><span class="p">(</span><span class="n">start_pop_m</span><span class="p">)</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="m">120</span><span class="p">)</span><span class="w">
</span><span class="n">stopifnot</span><span class="p">(</span><span class="nf">length</span><span class="p">(</span><span class="n">start_pop_f</span><span class="p">)</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="m">50</span><span class="p">)</span><span class="w">
</span><span class="n">stopifnot</span><span class="p">(</span><span class="nf">length</span><span class="p">(</span><span class="n">start_pop_f</span><span class="p">)</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="m">120</span><span class="p">)</span><span class="w">
</span><span class="n">stopifnot</span><span class="p">(</span><span class="nf">length</span><span class="p">(</span><span class="n">net_migration</span><span class="p">)</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">ncols</span><span class="p">)</span><span class="w">
</span><span class="n">stopifnot</span><span class="p">(</span><span class="nf">length</span><span class="p">(</span><span class="n">sex_ratio_birth</span><span class="p">)</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">ncols</span><span class="p">)</span><span class="w">
</span><span class="n">stopifnot</span><span class="p">(</span><span class="nf">length</span><span class="p">(</span><span class="n">female_share_migration</span><span class="p">)</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">ncols</span><span class="p">)</span><span class="w">
</span><span class="n">stopifnot</span><span class="p">(</span><span class="nf">min</span><span class="p">(</span><span class="n">female_share_migration</span><span class="p">)</span><span class="w"> </span><span class="o">&gt;=</span><span class="w"> </span><span class="m">0</span><span class="p">)</span><span class="w">
</span><span class="n">stopifnot</span><span class="p">(</span><span class="nf">max</span><span class="p">(</span><span class="n">female_share_migration</span><span class="p">)</span><span class="w"> </span><span class="o">&lt;=</span><span class="w"> </span><span class="m">1</span><span class="p">)</span><span class="w">
</span><span class="n">stopifnot</span><span class="p">(</span><span class="n">nrow</span><span class="p">(</span><span class="n">mort_m</span><span class="p">)</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">nrow</span><span class="p">(</span><span class="n">mort_f</span><span class="p">))</span><span class="w">
</span><span class="c1"># fill in with high probability of death for ages beyond where we have mortality data</span><span class="w">
</span><span class="k">if</span><span class="p">(</span><span class="n">nrow</span><span class="p">(</span><span class="n">mort_m</span><span class="p">)</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="m">121</span><span class="p">){</span><span class="w">
</span><span class="n">extra_deaths_m</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">matrix</span><span class="p">(</span><span class="nf">max</span><span class="p">(</span><span class="n">mort_m</span><span class="p">),</span><span class="w"> </span><span class="n">nrow</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">121</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">nrow</span><span class="p">(</span><span class="n">mort_m</span><span class="p">),</span><span class="w"> </span><span class="n">ncol</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ncol</span><span class="p">(</span><span class="n">mort_m</span><span class="p">))</span><span class="w">
</span><span class="n">extra_deaths_f</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">matrix</span><span class="p">(</span><span class="nf">max</span><span class="p">(</span><span class="n">mort_f</span><span class="p">),</span><span class="w"> </span><span class="n">nrow</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">121</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">nrow</span><span class="p">(</span><span class="n">mort_f</span><span class="p">),</span><span class="w"> </span><span class="n">ncol</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ncol</span><span class="p">(</span><span class="n">mort_f</span><span class="p">))</span><span class="w">
</span><span class="n">mort_m</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">rbind</span><span class="p">(</span><span class="n">mort_m</span><span class="p">,</span><span class="w"> </span><span class="n">extra_deaths_m</span><span class="p">)</span><span class="w">
</span><span class="n">mort_f</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">rbind</span><span class="p">(</span><span class="n">mort_f</span><span class="p">,</span><span class="w"> </span><span class="n">extra_deaths_f</span><span class="p">)</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="c1"># Create matrices for male and female population for the full projections</span><span class="w">
</span><span class="c1"># each row of the matrix is an age group, each column is a year</span><span class="w">
</span><span class="n">PopM</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">matrix</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="n">nrow</span><span class="o">=</span><span class="m">121</span><span class="p">,</span><span class="w"> </span><span class="n">ncol</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ncols</span><span class="p">)</span><span class="w">
</span><span class="n">PopF</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">matrix</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="n">nrow</span><span class="o">=</span><span class="m">121</span><span class="p">,</span><span class="w"> </span><span class="n">ncol</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ncols</span><span class="p">)</span><span class="w">
</span><span class="n">deaths</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="nf">rep</span><span class="p">(</span><span class="kc">NA</span><span class="p">,</span><span class="w"> </span><span class="n">ncols</span><span class="p">)</span><span class="w">
</span><span class="n">rownames</span><span class="p">(</span><span class="n">PopF</span><span class="p">)</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">rownames</span><span class="p">(</span><span class="n">PopM</span><span class="p">)</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">0</span><span class="o">:</span><span class="m">120</span><span class="p">)</span><span class="w"> </span><span class="c1"># ages</span><span class="w">
</span><span class="n">colnames</span><span class="p">(</span><span class="n">PopF</span><span class="p">)</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">colnames</span><span class="p">(</span><span class="n">PopM</span><span class="p">)</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="n">start_year</span><span class="o">:</span><span class="n">end_year</span><span class="p">)</span><span class="w"> </span><span class="c1"># years</span><span class="w">
</span><span class="c1"># first year gets populated with the actual population numbers that we have:</span><span class="w">
</span><span class="n">PopM</span><span class="p">[</span><span class="m">1</span><span class="o">:</span><span class="nf">length</span><span class="p">(</span><span class="n">start_pop_m</span><span class="p">),</span><span class="w"> </span><span class="m">1</span><span class="p">]</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">start_pop_m</span><span class="w">
</span><span class="n">PopF</span><span class="p">[</span><span class="m">1</span><span class="o">:</span><span class="nf">length</span><span class="p">(</span><span class="n">start_pop_f</span><span class="p">),</span><span class="w"> </span><span class="m">1</span><span class="p">]</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">start_pop_f</span><span class="w">
</span><span class="c1"># subsequent years get modified by people aging one year, deaths, births, and net migration</span><span class="w">
</span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">i</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="m">2</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">ncols</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="c1"># Age one and above:</span><span class="w">
</span><span class="n">PopM</span><span class="p">[</span><span class="m">2</span><span class="o">:</span><span class="m">121</span><span class="p">,</span><span class="w"> </span><span class="n">i</span><span class="p">]</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">PopM</span><span class="p">[</span><span class="m">1</span><span class="o">:</span><span class="m">120</span><span class="p">,</span><span class="w"> </span><span class="n">i</span><span class="m">-1</span><span class="p">]</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="p">(</span><span class="m">1</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">mort_m</span><span class="p">[</span><span class="m">1</span><span class="o">:</span><span class="m">120</span><span class="p">,</span><span class="w"> </span><span class="n">i</span><span class="m">-1</span><span class="p">])</span><span class="w">
</span><span class="n">PopF</span><span class="p">[</span><span class="m">2</span><span class="o">:</span><span class="m">121</span><span class="p">,</span><span class="w"> </span><span class="n">i</span><span class="p">]</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">PopF</span><span class="p">[</span><span class="m">1</span><span class="o">:</span><span class="m">120</span><span class="p">,</span><span class="w"> </span><span class="n">i</span><span class="m">-1</span><span class="p">]</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="p">(</span><span class="m">1</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">mort_f</span><span class="p">[</span><span class="m">1</span><span class="o">:</span><span class="m">120</span><span class="p">,</span><span class="w"> </span><span class="n">i</span><span class="m">-1</span><span class="p">])</span><span class="w">
</span><span class="n">deaths</span><span class="p">[</span><span class="n">i</span><span class="m">-1</span><span class="p">]</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="nf">sum</span><span class="p">(</span><span class="n">PopM</span><span class="p">[,</span><span class="w"> </span><span class="n">i</span><span class="m">-1</span><span class="p">])</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="nf">sum</span><span class="p">(</span><span class="n">PopM</span><span class="p">[,</span><span class="w"> </span><span class="n">i</span><span class="p">])</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">sum</span><span class="p">(</span><span class="n">PopF</span><span class="p">[,</span><span class="w"> </span><span class="n">i</span><span class="m">-1</span><span class="p">])</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="nf">sum</span><span class="p">(</span><span class="n">PopF</span><span class="p">[,</span><span class="w"> </span><span class="n">i</span><span class="p">])</span><span class="w">
</span><span class="c1"># migration. </span><span class="w">
</span><span class="n">total_migrants</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="p">(</span><span class="nf">sum</span><span class="p">(</span><span class="n">PopM</span><span class="p">[,</span><span class="n">i</span><span class="p">])</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">sum</span><span class="p">(</span><span class="n">PopF</span><span class="p">[,</span><span class="n">i</span><span class="p">]))</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">net_migration</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="w">
</span><span class="n">migf</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">total_migrants</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">female_share_migration</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">migration_age_weights</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="nf">sum</span><span class="p">(</span><span class="n">migration_age_weights</span><span class="p">)</span><span class="w">
</span><span class="n">migm</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">total_migrants</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="p">(</span><span class="m">1</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">female_share_migration</span><span class="p">[</span><span class="n">i</span><span class="p">])</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">migration_age_weights</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="nf">sum</span><span class="p">(</span><span class="n">migration_age_weights</span><span class="p">)</span><span class="w">
</span><span class="n">PopM</span><span class="p">[,</span><span class="w"> </span><span class="n">i</span><span class="p">]</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">PopM</span><span class="p">[,</span><span class="w"> </span><span class="n">i</span><span class="p">]</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">migm</span><span class="w">
</span><span class="n">PopF</span><span class="p">[,</span><span class="w"> </span><span class="n">i</span><span class="p">]</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">PopF</span><span class="p">[,</span><span class="w"> </span><span class="n">i</span><span class="p">]</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">migf</span><span class="w">
</span><span class="c1"># Age zero ie births. Fertility rate by the number of women in the middle of the previous year.</span><span class="w">
</span><span class="c1"># Note that PopF rows 16:50 equates to women age 15:49</span><span class="w">
</span><span class="n">reproducing_women</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="p">(</span><span class="n">PopF</span><span class="p">[</span><span class="m">16</span><span class="o">:</span><span class="m">50</span><span class="p">,</span><span class="w"> </span><span class="n">i</span><span class="m">-1</span><span class="p">]</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">PopF</span><span class="p">[</span><span class="m">16</span><span class="o">:</span><span class="m">50</span><span class="p">,</span><span class="w"> </span><span class="n">i</span><span class="p">])</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="m">2</span><span class="w">
</span><span class="n">prop_boys</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">sex_ratio_birth</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="p">(</span><span class="m">1</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">sex_ratio_birth</span><span class="p">[</span><span class="n">i</span><span class="p">])</span><span class="w">
</span><span class="n">prop_girls</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">prop_boys</span><span class="w">
</span><span class="n">PopM</span><span class="p">[</span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="n">i</span><span class="p">]</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">reproducing_women</span><span class="w"> </span><span class="o">%*%</span><span class="w"> </span><span class="n">fertility</span><span class="p">[,</span><span class="w"> </span><span class="n">i</span><span class="m">-1</span><span class="p">]</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">prop_boys</span><span class="w">
</span><span class="n">PopF</span><span class="p">[</span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="n">i</span><span class="p">]</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">reproducing_women</span><span class="w"> </span><span class="o">%*%</span><span class="w"> </span><span class="n">fertility</span><span class="p">[,</span><span class="w"> </span><span class="n">i</span><span class="m">-1</span><span class="p">]</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">prop_girls</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="c1"># Return a list of the two matrices</span><span class="w">
</span><span class="nf">return</span><span class="p">(</span><span class="nf">list</span><span class="p">(</span><span class="w">
</span><span class="n">PopM</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">PopM</span><span class="p">,</span><span class="w">
</span><span class="n">PopF</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">PopF</span><span class="p">,</span><span class="w">
</span><span class="n">deaths</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">deaths</span><span class="w">
</span><span class="p">))</span><span class="w">
</span><span class="p">}</span></code></pre></figure>
<p>Next, I wrote a function to extract the necessary fertility, mortality, migration rates and 2020 starting population from the UN data, feed it into my <code class="language-plaintext highlighter-rouge">pop_proj()</code> function and return the result. Unlike <code class="language-plaintext highlighter-rouge">pop_proj()</code>, which is to some degree fully portable, this function is very much specific to this particular project and is really just a convenience function for grabbing the data and turning it into the right units and shapes (vectors and matrices) needed for <code class="language-plaintext highlighter-rouge">pop_proj()</code>.</p>
<figure class="highlight"><pre><code class="language-r" data-lang="r"><span class="n">repeat_un_proj</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="k">function</span><span class="p">(</span><span class="n">the_country</span><span class="p">,</span><span class="w"> </span><span class="n">the_years</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">2020</span><span class="o">:</span><span class="m">2100</span><span class="p">){</span><span class="w">
</span><span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">the_country</span><span class="w"> </span><span class="o">%in%</span><span class="w"> </span><span class="n">unique</span><span class="p">(</span><span class="n">indicators</span><span class="o">$</span><span class="n">Location</span><span class="p">)){</span><span class="w">
</span><span class="n">stop</span><span class="p">(</span><span class="s2">"Country not found"</span><span class="p">)</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="n">this_fert</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">fert_all</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">filter</span><span class="p">(</span><span class="n">Location</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">the_country</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="n">Variant</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s2">"Medium"</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">filter</span><span class="p">(</span><span class="n">Time</span><span class="w"> </span><span class="o">%in%</span><span class="w"> </span><span class="n">the_years</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="c1"># Age-Specific Fertility rate</span><span class="w">
</span><span class="n">select</span><span class="p">(</span><span class="n">Time</span><span class="p">,</span><span class="w"> </span><span class="n">AgeGrp</span><span class="p">,</span><span class="w"> </span><span class="n">ASFR</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">mutate</span><span class="p">(</span><span class="n">Time</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">as.character</span><span class="p">(</span><span class="n">Time</span><span class="p">),</span><span class="w">
</span><span class="c1"># turn into proportions, not rates per 1000:</span><span class="w">
</span><span class="n">ASFR</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ASFR</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="m">1000</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">pivot_wider</span><span class="p">(</span><span class="n">id_cols</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">AgeGrp</span><span class="p">,</span><span class="w"> </span><span class="n">names_from</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Time</span><span class="p">,</span><span class="w"> </span><span class="n">values_from</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ASFR</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">arrange</span><span class="p">(</span><span class="n">AgeGrp</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">select</span><span class="p">(</span><span class="o">-</span><span class="n">AgeGrp</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">as.matrix</span><span class="p">()</span><span class="w">
</span><span class="c1"># should be 35 rows ie fertilities for ages 15 to 49</span><span class="w">
</span><span class="n">stopifnot</span><span class="p">(</span><span class="n">nrow</span><span class="p">(</span><span class="n">this_fert</span><span class="p">)</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="m">35</span><span class="p">)</span><span class="w">
</span><span class="c1"># should be 81 columns, 1 column for each year from 2020 to 2100</span><span class="w">
</span><span class="n">stopifnot</span><span class="p">(</span><span class="n">ncol</span><span class="p">(</span><span class="n">this_fert</span><span class="p">)</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="nf">length</span><span class="p">(</span><span class="n">the_years</span><span class="p">))</span><span class="w">
</span><span class="c1"># Mortality is in numbers not a ratio so we need to join to the population data to turn it into a ratio</span><span class="w">
</span><span class="n">pop_years</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">pop_all</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">filter</span><span class="p">(</span><span class="n">Location</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">the_country</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="n">Variant</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s2">"Medium"</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="n">Time</span><span class="w"> </span><span class="o">%in%</span><span class="w"> </span><span class="n">the_years</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">select</span><span class="p">(</span><span class="n">Time</span><span class="p">,</span><span class="w"> </span><span class="n">PopMale</span><span class="p">,</span><span class="w"> </span><span class="n">PopFemale</span><span class="p">,</span><span class="w"> </span><span class="n">AgeGrp</span><span class="p">)</span><span class="w">
</span><span class="n">this_mort</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">mort_all</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">filter</span><span class="p">(</span><span class="n">Location</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">the_country</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="n">Variant</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s2">"Medium"</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">filter</span><span class="p">(</span><span class="n">Time</span><span class="w"> </span><span class="o">%in%</span><span class="w"> </span><span class="n">the_years</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">left_join</span><span class="p">(</span><span class="n">pop_years</span><span class="p">,</span><span class="w"> </span><span class="n">by</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"Time"</span><span class="p">,</span><span class="w"> </span><span class="s2">"AgeGrp"</span><span class="p">))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="c1"># next step important because we will be sorting by AgeGrp</span><span class="w">
</span><span class="n">mutate</span><span class="p">(</span><span class="n">AgeGrp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">case_when</span><span class="p">(</span><span class="w">
</span><span class="n">AgeGrp</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s2">"100+"</span><span class="w"> </span><span class="o">~</span><span class="w"> </span><span class="m">100</span><span class="p">,</span><span class="w">
</span><span class="kc">TRUE</span><span class="w"> </span><span class="o">~</span><span class="w"> </span><span class="n">suppressWarnings</span><span class="p">(</span><span class="nf">as.numeric</span><span class="p">(</span><span class="nf">as.character</span><span class="p">(</span><span class="n">AgeGrp</span><span class="p">)))</span><span class="w">
</span><span class="p">))</span><span class="w">
</span><span class="n">this_mort_m</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">this_mort</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="c1"># sometimes more deaths than people (eg 1 death, 0 people) so cap the death ratio at 1</span><span class="w">
</span><span class="n">mutate</span><span class="p">(</span><span class="n">DeathMale</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pmin</span><span class="p">(</span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="n">DeathMale</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="n">PopMale</span><span class="p">))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">select</span><span class="p">(</span><span class="n">Time</span><span class="p">,</span><span class="w"> </span><span class="n">AgeGrp</span><span class="p">,</span><span class="w"> </span><span class="n">DeathMale</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">mutate</span><span class="p">(</span><span class="n">Time</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">as.character</span><span class="p">(</span><span class="n">Time</span><span class="p">))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">pivot_wider</span><span class="p">(</span><span class="n">id_cols</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">AgeGrp</span><span class="p">,</span><span class="w"> </span><span class="n">names_from</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Time</span><span class="p">,</span><span class="w"> </span><span class="n">values_from</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">DeathMale</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">arrange</span><span class="p">(</span><span class="n">AgeGrp</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">select</span><span class="p">(</span><span class="o">-</span><span class="n">AgeGrp</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">as.matrix</span><span class="p">()</span><span class="w">
</span><span class="n">this_mort_f</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">this_mort</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">mutate</span><span class="p">(</span><span class="n">DeathFemale</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pmin</span><span class="p">(</span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="n">DeathFemale</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="n">PopFemale</span><span class="p">))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">select</span><span class="p">(</span><span class="n">Time</span><span class="p">,</span><span class="w"> </span><span class="n">AgeGrp</span><span class="p">,</span><span class="w"> </span><span class="n">DeathFemale</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">mutate</span><span class="p">(</span><span class="n">Time</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">as.character</span><span class="p">(</span><span class="n">Time</span><span class="p">))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">pivot_wider</span><span class="p">(</span><span class="n">id_cols</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">AgeGrp</span><span class="p">,</span><span class="w"> </span><span class="n">names_from</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Time</span><span class="p">,</span><span class="w"> </span><span class="n">values_from</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">DeathFemale</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">arrange</span><span class="p">(</span><span class="n">AgeGrp</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">select</span><span class="p">(</span><span class="o">-</span><span class="n">AgeGrp</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">as.matrix</span><span class="p">()</span><span class="w">
</span><span class="c1"># check the years are correct, didn't get mangled or reordered</span><span class="w">
</span><span class="n">stopifnot</span><span class="p">(</span><span class="nf">all</span><span class="p">(</span><span class="n">colnames</span><span class="p">(</span><span class="n">this_mort_f</span><span class="p">)</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">the_years</span><span class="p">))</span><span class="w">
</span><span class="n">stopifnot</span><span class="p">(</span><span class="nf">all</span><span class="p">(</span><span class="n">colnames</span><span class="p">(</span><span class="n">this_mort_m</span><span class="p">)</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">the_years</span><span class="p">))</span><span class="w">
</span><span class="n">this_pop</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">pop_all</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">filter</span><span class="p">(</span><span class="n">Location</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">the_country</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="n">Variant</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s2">"Medium"</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">filter</span><span class="p">(</span><span class="n">Time</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="nf">min</span><span class="p">(</span><span class="n">the_years</span><span class="p">))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="c1"># next step important because we will be sorting by AgeGrp</span><span class="w">
</span><span class="n">mutate</span><span class="p">(</span><span class="n">AgeGrp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">case_when</span><span class="p">(</span><span class="w">
</span><span class="n">AgeGrp</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s2">"100+"</span><span class="w"> </span><span class="o">~</span><span class="w"> </span><span class="m">100</span><span class="p">,</span><span class="w">
</span><span class="kc">TRUE</span><span class="w"> </span><span class="o">~</span><span class="w"> </span><span class="n">suppressWarnings</span><span class="p">(</span><span class="nf">as.numeric</span><span class="p">(</span><span class="nf">as.character</span><span class="p">(</span><span class="n">AgeGrp</span><span class="p">)))</span><span class="w">
</span><span class="p">))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">arrange</span><span class="p">(</span><span class="n">AgeGrp</span><span class="p">)</span><span class="w">
</span><span class="c1"># convert to units, not thousands of people:</span><span class="w">
</span><span class="n">this_pop_m</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">this_pop</span><span class="o">$</span><span class="n">PopMale</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="m">1000</span><span class="w">
</span><span class="n">this_pop_f</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">this_pop</span><span class="o">$</span><span class="n">PopFemale</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="m">1000</span><span class="w">
</span><span class="c1"># reality check</span><span class="w">
</span><span class="c1"># Population in millions; should be about 0.3 if the_country is Vanuatu, about 1400 if India:</span><span class="w">
</span><span class="p">(</span><span class="nf">sum</span><span class="p">(</span><span class="n">this_pop_m</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">sum</span><span class="p">(</span><span class="n">this_pop_f</span><span class="p">)</span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="m">1e6</span><span class="w">
</span><span class="c1"># net migration</span><span class="w">
</span><span class="n">this_cnmr</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">indicators</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">filter</span><span class="p">(</span><span class="n">Location</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">the_country</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="n">Time</span><span class="w"> </span><span class="o">%in%</span><span class="w"> </span><span class="n">the_years</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">arrange</span><span class="p">(</span><span class="n">Time</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">pull</span><span class="p">(</span><span class="n">CNMR</span><span class="p">)</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="m">1000</span><span class="w">
</span><span class="c1"># sex ratio at birth</span><span class="w">
</span><span class="n">this_srb</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">indicators</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">filter</span><span class="p">(</span><span class="n">Location</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">the_country</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="n">Time</span><span class="w"> </span><span class="o">%in%</span><span class="w"> </span><span class="n">the_years</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">arrange</span><span class="p">(</span><span class="n">Time</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">pull</span><span class="p">(</span><span class="n">SRB</span><span class="p">)</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="m">100</span><span class="w">
</span><span class="n">this_proj</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">pop_proj</span><span class="p">(</span><span class="w">
</span><span class="n">start_pop_m</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">this_pop_m</span><span class="p">,</span><span class="w">
</span><span class="n">start_pop_f</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">this_pop_f</span><span class="p">,</span><span class="w">
</span><span class="n">start_year</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">min</span><span class="p">(</span><span class="n">the_years</span><span class="p">),</span><span class="w">
</span><span class="n">end_year</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">max</span><span class="p">(</span><span class="n">the_years</span><span class="p">),</span><span class="w">
</span><span class="n">fertility</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">this_fert</span><span class="p">,</span><span class="w">
</span><span class="n">mort_m</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">this_mort_m</span><span class="p">,</span><span class="w">
</span><span class="n">mort_f</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">this_mort_f</span><span class="p">,</span><span class="w">
</span><span class="n">net_migration</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">this_cnmr</span><span class="p">,</span><span class="w">
</span><span class="n">sex_ratio_birth</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">this_srb</span><span class="w">
</span><span class="p">)</span><span class="w">
</span><span class="nf">return</span><span class="p">(</span><span class="nf">list</span><span class="p">(</span><span class="n">un_proj</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">this_proj</span><span class="p">,</span><span class="w">
</span><span class="n">un_pop_m</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">this_pop_m</span><span class="p">,</span><span class="w">
</span><span class="n">un_pop_f</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">this_pop_f</span><span class="p">,</span><span class="w">
</span><span class="n">un_fert</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">this_fert</span><span class="p">,</span><span class="w">
</span><span class="n">un_mort_m</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">this_mort_m</span><span class="p">,</span><span class="w">
</span><span class="n">un_mort_f</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">this_mort_f</span><span class="p">,</span><span class="w">
</span><span class="n">un_cnmr</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">this_cnmr</span><span class="p">,</span><span class="w">
</span><span class="n">un_srb</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">this_srb</span><span class="p">))</span><span class="w">
</span><span class="p">}</span></code></pre></figure>
<p>Note that this function returns, in addition to the results of the population projection, the various inputs in their correct units and shape. This will be useful later when we want to modify some of those inputs.</p>
<p>Now that we’ve got these functions, using them to do projections from 2020 and compare those projections to the published numbers is pretty straight forward. Here’s the code to do that for Vanuatu, which produces the first chart at the top of this blog post:</p>
<figure class="highlight"><pre><code class="language-r" data-lang="r"><span class="n">the_country</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="s2">"Vanuatu"</span><span class="w">
</span><span class="n">my_proj</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">repeat_un_proj</span><span class="p">(</span><span class="n">the_country</span><span class="p">)</span><span class="o">$</span><span class="n">un_proj</span><span class="w">
</span><span class="c1"># total population</span><span class="w">
</span><span class="n">comp_data</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">indicators</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">filter</span><span class="p">(</span><span class="n">Location</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">the_country</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="n">Variant</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s2">"Medium"</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="n">Time</span><span class="w"> </span><span class="o">%in%</span><span class="w"> </span><span class="m">2020</span><span class="o">:</span><span class="m">2100</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">select</span><span class="p">(</span><span class="n">Time</span><span class="p">,</span><span class="w"> </span><span class="n">`UN original`</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">TPopulation1Jan</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">mutate</span><span class="p">(</span><span class="n">`Reproduction`</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">as.numeric</span><span class="p">(</span><span class="n">apply</span><span class="p">(</span><span class="n">my_proj</span><span class="o">$</span><span class="n">PopM</span><span class="p">,</span><span class="w"> </span><span class="m">2</span><span class="p">,</span><span class="w"> </span><span class="n">sum</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">apply</span><span class="p">(</span><span class="n">my_proj</span><span class="o">$</span><span class="n">PopF</span><span class="p">,</span><span class="w"> </span><span class="m">2</span><span class="p">,</span><span class="w"> </span><span class="n">sum</span><span class="p">))</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="m">1000</span><span class="p">)</span><span class="w">
</span><span class="c1"># First year should be an exact match:</span><span class="w">
</span><span class="n">stopifnot</span><span class="p">(</span><span class="n">comp_data</span><span class="p">[</span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="p">]</span><span class="o">$</span><span class="n">`UN original`</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">comp_data</span><span class="p">[</span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="p">]</span><span class="o">$</span><span class="n">Reproduction</span><span class="p">)</span><span class="w">
</span><span class="n">comp_data</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">gather</span><span class="p">(</span><span class="n">variable</span><span class="p">,</span><span class="w"> </span><span class="n">value</span><span class="p">,</span><span class="w"> </span><span class="o">-</span><span class="n">Time</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">ggplot</span><span class="p">(</span><span class="n">aes</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Time</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">value</span><span class="p">,</span><span class="w"> </span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">variable</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">geom_line</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">scale_y_continuous</span><span class="p">(</span><span class="n">label</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">comma</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">labs</span><span class="p">(</span><span class="n">title</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">the_country</span><span class="p">,</span><span class="w">
</span><span class="n">subtitle</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Attempt to re-create the UN population projections from population in 2020, fertility and mortality rates"</span><span class="p">,</span><span class="w">
</span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Population"</span><span class="p">,</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">""</span><span class="p">)</span></code></pre></figure>
<object type="image/svg+xml" data="https:/freerangestats.info/img/0262-vanuatu-pop.svg" width="100%"><img src="https:/freerangestats.info/img/0262-vanuatu-pop.png" width="100%" /></object>
<p>As we can see the results are pretty much identical. Let’s look at my projected births and deaths based on fertility and mortality rates, and compare them to the published projected numbers</p>
<figure class="highlight"><pre><code class="language-r" data-lang="r"><span class="c1"># births</span><span class="w">
</span><span class="n">indicators</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">filter</span><span class="p">(</span><span class="n">Location</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">the_country</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="n">Variant</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s2">"Medium"</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="n">Time</span><span class="w"> </span><span class="o">%in%</span><span class="w"> </span><span class="m">2020</span><span class="o">:</span><span class="m">2100</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">select</span><span class="p">(</span><span class="n">Time</span><span class="p">,</span><span class="w"> </span><span class="n">`UN original`</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Births</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">mutate</span><span class="p">(</span><span class="n">Reproduction</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">as.numeric</span><span class="p">(</span><span class="n">my_proj</span><span class="o">$</span><span class="n">PopM</span><span class="p">[</span><span class="m">1</span><span class="p">,]</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">my_proj</span><span class="o">$</span><span class="n">PopF</span><span class="p">[</span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="p">])</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="m">1000</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">gather</span><span class="p">(</span><span class="n">variable</span><span class="p">,</span><span class="w"> </span><span class="n">value</span><span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="o">-</span><span class="n">Time</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">ggplot</span><span class="p">(</span><span class="n">aes</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Time</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">value</span><span class="p">,</span><span class="w"> </span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">variable</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">geom_line</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">labs</span><span class="p">(</span><span class="n">title</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">the_country</span><span class="p">,</span><span class="w">
</span><span class="n">subtitle</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Attempt to re-create the UN population projections from population in 2020, fertility and mortality rates"</span><span class="p">,</span><span class="w">
</span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Births (thousands)"</span><span class="p">,</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">""</span><span class="p">)</span><span class="w">
</span><span class="c1"># deaths</span><span class="w">
</span><span class="n">indicators</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">filter</span><span class="p">(</span><span class="n">Location</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">the_country</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="n">Variant</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s2">"Medium"</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="n">Time</span><span class="w"> </span><span class="o">%in%</span><span class="w"> </span><span class="m">2020</span><span class="o">:</span><span class="m">2100</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">select</span><span class="p">(</span><span class="n">Time</span><span class="p">,</span><span class="w"> </span><span class="n">`UN original`</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Deaths</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">mutate</span><span class="p">(</span><span class="n">Reproduction</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">as.numeric</span><span class="p">(</span><span class="n">my_proj</span><span class="o">$</span><span class="n">deaths</span><span class="p">)</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="m">1000</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">gather</span><span class="p">(</span><span class="n">variable</span><span class="p">,</span><span class="w"> </span><span class="n">value</span><span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="o">-</span><span class="n">Time</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">ggplot</span><span class="p">(</span><span class="n">aes</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Time</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">value</span><span class="p">,</span><span class="w"> </span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">variable</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">geom_line</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">labs</span><span class="p">(</span><span class="n">title</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">the_country</span><span class="p">,</span><span class="w">
</span><span class="n">subtitle</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Attempt to re-create the UN population projections from population in 2020, fertility and mortality rates"</span><span class="p">,</span><span class="w">
</span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Deaths (thousands)"</span><span class="p">,</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">""</span><span class="p">)</span></code></pre></figure>
<object type="image/svg+xml" data="https:/freerangestats.info/img/0262-vanuatu-births.svg" width="100%"><img src="https:/freerangestats.info/img/0262-vanuatu-births.png" width="100%" /></object>
<object type="image/svg+xml" data="https:/freerangestats.info/img/0262-vanuatu-deaths.svg" width="100%"><img src="https:/freerangestats.info/img/0262-vanuatu-deaths.png" width="100%" /></object>
<p>I’m pretty happy with those. There’s definitely some discrepancies and a lag in the births which I suspect come down to how one treats populations of mothers - numbers on 1 January v 1 July, that sort of thing. But in the scheme of things these are very small.</p>
<p>Now, Vanuatu is relatively easy because the UN assumed net zero migration in the projection period. We can see this by comparing the net migration rates in their Indicators dataset for a few countries, with this code:</p>
<figure class="highlight"><pre><code class="language-r" data-lang="r"><span class="n">plot_mig</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="k">function</span><span class="p">(</span><span class="n">the_country</span><span class="p">){</span><span class="w">
</span><span class="n">p</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">indicators</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">filter</span><span class="p">(</span><span class="n">Location</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">the_country</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">ggplot</span><span class="p">(</span><span class="n">aes</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Time</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">CNMR</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">geom_vline</span><span class="p">(</span><span class="n">xintercept</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">2022</span><span class="p">,</span><span class="w"> </span><span class="n">lty</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">2</span><span class="p">,</span><span class="w"> </span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"steelblue"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">geom_hline</span><span class="p">(</span><span class="n">yintercept</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="n">lty</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">2</span><span class="p">,</span><span class="w"> </span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"steelblue"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">geom_line</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">labs</span><span class="p">(</span><span class="n">title</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">the_country</span><span class="p">,</span><span class="w">
</span><span class="n">subtitle</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Net migration rate per thousand people"</span><span class="p">,</span><span class="w">
</span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w">
</span><span class="n">caption</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Source: UN World Population Prospects 2022"</span><span class="p">)</span><span class="w">
</span><span class="nf">return</span><span class="p">(</span><span class="n">p</span><span class="p">)</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="n">plot_mig</span><span class="p">(</span><span class="s2">"Vanuatu"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">plot_mig</span><span class="p">(</span><span class="s2">"Fiji"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">plot_mig</span><span class="p">(</span><span class="s2">"Australia"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">plot_mig</span><span class="p">(</span><span class="s2">"India"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">plot_layout</span><span class="p">(</span><span class="n">ncol</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">2</span><span class="p">)</span></code></pre></figure>
<object type="image/svg+xml" data="https:/freerangestats.info/img/0262-migration.svg" width="100%"><img src="https:/freerangestats.info/img/0262-migration.png" width="100%" /></object>
<p>For countries that have good data on it, migration is a big deal in the projections; but forecasting is hard, particularly of the future.</p>
<p>My first few goes at reproducing the projections for Australia and India tended to be badly out because I had added in net migration evenly across the whole age distribution. My eventual solution, making net migration bell curved with an average age of 28, is a bit of a hack with the parameters chosen to make Australia’s projections come out right. Definitely a better method would be to have actual age-specific net migration forecasts. Whether such things are possible will very much depend on the country; it’s probably possible for Australia, but not for most of the countries I work with.</p>
<p>Here’s the final result comparing UN projections with mine for a few interesting countries:</p>
<object type="image/svg+xml" data="https:/freerangestats.info/img/0262-Australia-pop.svg" width="100%"><img src="https:/freerangestats.info/img/0262-Australia-pop.png" width="100%" /></object>
<object type="image/svg+xml" data="https:/freerangestats.info/img/0262-China-pop.svg" width="100%"><img src="https:/freerangestats.info/img/0262-China-pop.png" width="100%" /></object>
<object type="image/svg+xml" data="https:/freerangestats.info/img/0262-India-pop.svg" width="100%"><img src="https:/freerangestats.info/img/0262-India-pop.png" width="100%" /></object>
<h2 id="adjusting-the-starting-point">Adjusting the starting point</h2>
<p>Now, the whole point of this exercise was to see if we can plausibly adjust the starting point - say the population totals in 2020, or the forecast fertility rates - and say we are building on the UN’s projections to get our own. Here’s my rough demo of how we might do that, again using the case of Vanuatu. Vanuatu’s 2020 census wasn’t available at the time of the UN’s 2022 population projections, so the actual population and fertility numbers for 2020 differ somewhat (of course) from what was projected.</p>
<p>For the below, I am relying on <a href="https://sdd.spc.int/digital_library/vanuatu-2020-national-population-and-housing-census-analytical-report-volume-2">the analytical report of the Vanuatu census</a>. On a quick glance I didn’t see a table of the actual total population by single year age and sex, so I just adjusted the UN’s projected totals by a factor to make them add up to the correct 2020 total males and females. Of course if we were doing this for real we’d get the real numbers straight from the census; I actually can do this easily enough at work but obviously for this blog wanted to use only easily accessible public data.</p>
<figure class="highlight"><pre><code class="language-r" data-lang="r"><span class="c1">#-----------------changing one or two factors while keeping the rest the same--------------</span><span class="w">
</span><span class="c1"># Say we had the 2020 Vanuatu census so we knew the real population then, and wanted</span><span class="w">
</span><span class="c1"># to redo the population projections with everything staying as they were before</span><span class="w">
</span><span class="c1"># file:///C:/Users/Peter/Downloads/Vanuatu_2020_Census_Analytical_report_Vol_2.pdf</span><span class="w">
</span><span class="n">revision_country</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="s2">"Vanuatu"</span><span class="w">
</span><span class="n">van_orig</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">repeat_un_proj</span><span class="p">(</span><span class="n">revision_country</span><span class="p">)</span><span class="w">
</span><span class="c1"># rough adjustment of starting population in 2020 to make totals match the Census totals.</span><span class="w">
</span><span class="c1"># In principle could of course use the actual numbers by single age category.</span><span class="w">
</span><span class="n">revised_pop_m</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">van_orig</span><span class="o">$</span><span class="n">un_pop_m</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="m">151597</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="nf">sum</span><span class="p">(</span><span class="n">van_orig</span><span class="o">$</span><span class="n">un_pop_m</span><span class="p">)</span><span class="w">
</span><span class="n">revised_pop_f</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">van_orig</span><span class="o">$</span><span class="n">un_pop_f</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="m">148422</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="nf">sum</span><span class="p">(</span><span class="n">van_orig</span><span class="o">$</span><span class="n">un_pop_f</span><span class="p">)</span><span class="w">
</span><span class="c1"># calculate the crude birth rate in the current projection</span><span class="w">
</span><span class="n">un_cbr_2020</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="p">(</span><span class="n">van_orig</span><span class="o">$</span><span class="n">un_proj</span><span class="o">$</span><span class="n">PopM</span><span class="p">[</span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="m">2</span><span class="p">]</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">van_orig</span><span class="o">$</span><span class="n">un_proj</span><span class="o">$</span><span class="n">PopF</span><span class="p">[</span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="m">2</span><span class="p">])</span><span class="w"> </span><span class="o">/</span><span class="w">
</span><span class="nf">sum</span><span class="p">(</span><span class="n">van_orig</span><span class="o">$</span><span class="n">un_proj</span><span class="o">$</span><span class="n">PopM</span><span class="p">[,</span><span class="w"> </span><span class="m">2</span><span class="p">],</span><span class="w"> </span><span class="n">van_orig</span><span class="o">$</span><span class="n">un_proj</span><span class="o">$</span><span class="n">PopF</span><span class="p">[,</span><span class="w"> </span><span class="m">2</span><span class="p">])</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="m">1000</span><span class="w">
</span><span class="c1"># make a rough adjustment of future fertility rates assuming they are "out" by the</span><span class="w">
</span><span class="c1"># same proportion that crude birth rate was out in 2020</span><span class="w">
</span><span class="n">adj_ratio</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="m">28.2</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="n">un_cbr_2020</span><span class="w">
</span><span class="n">revised_fert</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">van_orig</span><span class="o">$</span><span class="n">un_fert</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">adj_ratio</span><span class="w">
</span><span class="c1"># Refit the projection with the above rough adjustments:</span><span class="w">
</span><span class="n">revised_proj</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">pop_proj</span><span class="p">(</span><span class="w">
</span><span class="n">start_pop_m</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">revised_pop_m</span><span class="p">,</span><span class="w">
</span><span class="n">start_pop_f</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">revised_pop_f</span><span class="p">,</span><span class="w">
</span><span class="n">start_year</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">2020</span><span class="p">,</span><span class="w">
</span><span class="n">end_year</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">2100</span><span class="p">,</span><span class="w">
</span><span class="n">fertility</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">revised_fert</span><span class="p">,</span><span class="w">
</span><span class="n">mort_m</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">van_orig</span><span class="o">$</span><span class="n">un_mort_m</span><span class="p">,</span><span class="w">
</span><span class="n">mort_f</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">van_orig</span><span class="o">$</span><span class="n">un_mort_f</span><span class="p">,</span><span class="w">
</span><span class="n">sex_ratio_birth</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">van_orig</span><span class="o">$</span><span class="n">un_srb</span><span class="p">,</span><span class="w">
</span><span class="n">net_migration</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">van_orig</span><span class="o">$</span><span class="n">un_cnmr</span><span class="p">)</span><span class="w">
</span><span class="n">projected_pop</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">apply</span><span class="p">(</span><span class="n">revised_proj</span><span class="o">$</span><span class="n">PopM</span><span class="p">,</span><span class="w"> </span><span class="m">2</span><span class="p">,</span><span class="w"> </span><span class="n">sum</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">apply</span><span class="p">(</span><span class="n">revised_proj</span><span class="o">$</span><span class="n">PopF</span><span class="p">,</span><span class="w"> </span><span class="m">2</span><span class="p">,</span><span class="w"> </span><span class="n">sum</span><span class="p">)</span><span class="w">
</span><span class="c1">#-----------------Compare total population----------------</span><span class="w">
</span><span class="n">comp_data</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">indicators</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">filter</span><span class="p">(</span><span class="n">Location</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">revision_country</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="n">Variant</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s2">"Medium"</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="n">Time</span><span class="w"> </span><span class="o">%in%</span><span class="w"> </span><span class="m">2020</span><span class="o">:</span><span class="m">2100</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">select</span><span class="p">(</span><span class="n">Time</span><span class="p">,</span><span class="w"> </span><span class="n">`2022 UN projections`</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">TPopulation1Jan</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">mutate</span><span class="p">(</span><span class="n">`Revised with 2020 census`</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">as.numeric</span><span class="p">(</span><span class="n">projected_pop</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="m">1000</span><span class="p">)</span><span class="w"> </span><span class="p">)</span><span class="w">
</span><span class="n">p5</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">comp_data</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">filter</span><span class="p">(</span><span class="n">Time</span><span class="w"> </span><span class="o">&lt;=</span><span class="w"> </span><span class="m">2050</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">gather</span><span class="p">(</span><span class="n">variable</span><span class="p">,</span><span class="w"> </span><span class="n">value</span><span class="p">,</span><span class="w"> </span><span class="o">-</span><span class="n">Time</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">ggplot</span><span class="p">(</span><span class="n">aes</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Time</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">value</span><span class="p">,</span><span class="w"> </span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">variable</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">geom_line</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">labs</span><span class="p">(</span><span class="n">title</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">revision_country</span><span class="p">,</span><span class="w">
</span><span class="n">subtitle</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Attempt to re-create the UN population projections from population in 2020, fertility and mortality rates"</span><span class="p">,</span><span class="w">
</span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Population"</span><span class="p">,</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">""</span><span class="p">)</span><span class="w">
</span><span class="c1">#--------------Compare population pyramids-------------------------</span><span class="w">
</span><span class="n">d</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">tibble</span><span class="p">(</span><span class="n">value</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="w"> </span><span class="n">revised_proj</span><span class="o">$</span><span class="n">PopM</span><span class="p">[,</span><span class="w"> </span><span class="m">31</span><span class="p">],</span><span class="w"> </span><span class="n">revised_proj</span><span class="o">$</span><span class="n">PopF</span><span class="p">[,</span><span class="w"> </span><span class="m">31</span><span class="p">],</span><span class="w">
</span><span class="n">van_orig</span><span class="o">$</span><span class="n">un_proj</span><span class="o">$</span><span class="n">PopM</span><span class="p">[,</span><span class="w"> </span><span class="m">31</span><span class="p">],</span><span class="w"> </span><span class="n">van_orig</span><span class="o">$</span><span class="n">un_proj</span><span class="o">$</span><span class="n">PopF</span><span class="p">[,</span><span class="w"> </span><span class="m">31</span><span class="p">]),</span><span class="w">
</span><span class="n">sex</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">rep</span><span class="p">(</span><span class="nf">c</span><span class="p">(</span><span class="s2">"Male"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Female"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Male"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Female"</span><span class="p">),</span><span class="w"> </span><span class="n">each</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">121</span><span class="p">),</span><span class="w">
</span><span class="n">model</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">rep</span><span class="p">(</span><span class="nf">c</span><span class="p">(</span><span class="s2">"Revised projections with 2020 census, made in 2024"</span><span class="p">,</span><span class="w"> </span><span class="s2">"UN projections, made in 2022"</span><span class="p">),</span><span class="w"> </span><span class="n">each</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">242</span><span class="p">),</span><span class="w">
</span><span class="n">age</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">rep</span><span class="p">(</span><span class="m">0</span><span class="o">:</span><span class="m">120</span><span class="p">,</span><span class="w"> </span><span class="m">4</span><span class="p">))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">mutate</span><span class="p">(</span><span class="n">agef</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">fct_reorder</span><span class="p">(</span><span class="nf">as.character</span><span class="p">(</span><span class="n">age</span><span class="p">),</span><span class="w"> </span><span class="n">age</span><span class="p">),</span><span class="w">
</span><span class="n">model</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">fct_rev</span><span class="p">(</span><span class="n">model</span><span class="p">))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">filter</span><span class="p">(</span><span class="n">age</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="m">100</span><span class="p">)</span><span class="w">
</span><span class="n">d</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">filter</span><span class="p">(</span><span class="n">sex</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s2">"Female"</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">ggplot</span><span class="p">(</span><span class="n">aes</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">value</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">agef</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">facet_wrap</span><span class="p">(</span><span class="o">~</span><span class="n">model</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">geom_col</span><span class="p">(</span><span class="n">fill</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"brown"</span><span class="p">,</span><span class="w"> </span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">NA</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">geom_col</span><span class="p">(</span><span class="n">data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">filter</span><span class="p">(</span><span class="n">d</span><span class="p">,</span><span class="w"> </span><span class="n">sex</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s2">"Male"</span><span class="p">),</span><span class="w"> </span><span class="n">aes</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">-</span><span class="n">value</span><span class="p">),</span><span class="w"> </span><span class="n">fill</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"orange"</span><span class="p">,</span><span class="w"> </span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">NA</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">geom_vline</span><span class="p">(</span><span class="n">xintercept</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"white"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">labs</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Number of people"</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w">
</span><span class="n">title</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Comparison of UN original and revised population projections"</span><span class="p">,</span><span class="w">
</span><span class="n">subtitle</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Population age distribution in 2050"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">scale_x_continuous</span><span class="p">(</span><span class="n">breaks</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">-4000</span><span class="p">,</span><span class="w"> </span><span class="m">-2000</span><span class="p">,</span><span class="w"> </span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="m">2000</span><span class="p">,</span><span class="w"> </span><span class="m">4000</span><span class="p">),</span><span class="w"> </span><span class="n">labels</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"4,000"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Male"</span><span class="p">,</span><span class="w"> </span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="s2">"Female"</span><span class="p">,</span><span class="w"> </span><span class="s2">"4,000"</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">theme</span><span class="p">(</span><span class="n">panel.grid</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">element_blank</span><span class="p">())</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">scale_y_discrete</span><span class="p">(</span><span class="n">breaks</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1</span><span class="o">:</span><span class="m">20</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="m">5</span><span class="p">)</span></code></pre></figure>
<p>And that’s what gets us these results:</p>
<object type="image/svg+xml" data="https:/freerangestats.info/img/0262-vanuatu-revised.svg" width="100%"><img src="https:/freerangestats.info/img/0262-vanuatu-revised.png" width="100%" /></object>
<object type="image/svg+xml" data="https:/freerangestats.info/img/0262-vanuatu-pyramid.svg" width="100%"><img src="https:/freerangestats.info/img/0262-vanuatu-pyramid.png" width="100%" /></object>
<p>I’m hoping this might be actually useful for pragmatic updates of the UN population projections when more current data is available, without having to revise everything from scratch.</p>
<p>OK, that’s all for today.</p>
</description>
<pubDate>Sun, 05 May 2024 00:00:00 +0000</pubDate>
<link>https://freerangestats.info/blog/2024/05/05/pop-projections</link>
<guid isPermaLink="true">https://freerangestats.info/blog/2024/05/05/pop-projections</guid>
</item>
<item>
<title>The 'V20' group of vulnerable countries and the MVI by @ellis2013nz</title>
<description><p>Just a brief blog post that is basically an addendum to <a href="/blog/2023/09/30/mvi">the one I wrote a few weeks ago</a> on the United Nations Multidimensional Vulnerability Index. I found myself wondering about the <a href="https://www.v-20.org/about">Vulnerable Twenty (V20) Group of Ministers of Finance of the Climate Vulnerable Forum</a>, which is now (despite the ‘20’ in its name) a collection of 68 economies.</p>
<p>How vulnerable do these 68 economies look on the proposed MVI? I imagine they and others will be interested. After all, while ‘vulnerable to climate change’ (for the V20) is not the same as ‘vulnerable to anything’ (for the MVI), they are both using the same word. Given how prominently and frequently ‘climate change’ and ‘vulnerability’ are connected in this context, I suspect some stakeholders would be expecting the two approaches to have a similar set of vulnerable countries</p>
<p>It turns out that the V20 economies are (according to the MVI) only slightly more ‘vulnerable’ than the average of the 142 countries that have an MVI score. On the other hand, they are materially poorer.</p>
<p>Consider this table of median values:</p>
<table class="table" style="margin-left: auto; margin-right: auto;">
<thead>
<tr>
<th style="text-align:left;"> </th>
<th style="text-align:right;"> Structural vulnerability </th>
<th style="text-align:right;"> Lack of structural resilience </th>
<th style="text-align:right;"> Multidimensional vulnerability </th>
<th style="text-align:right;"> GDP per capita, PPP </th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left;"> Member of V20 </td>
<td style="text-align:right;"> 49.2 </td>
<td style="text-align:right;"> 57.1 </td>
<td style="text-align:right;"> 54.4 </td>
<td style="text-align:right;"> $5,500 </td>
</tr>
<tr>
<td style="text-align:left;"> Not a member of V20 </td>
<td style="text-align:right;"> 48.4 </td>
<td style="text-align:right;"> 55.0 </td>
<td style="text-align:right;"> 52.4 </td>
<td style="text-align:right;"> $13,700 </td>
</tr>
</tbody>
</table>
<p>In fact, many countries in the V20 have below-average MVI scores; and there are also countries that aren’t in the V20 but have notably above-average MVI scores. Consider this chart:</p>
<object type="image/svg+xml" data="https:/freerangestats.info/img/0257-discrepancies.svg" width="100%"><img src="https:/freerangestats.info/img/0257-discrepancies.png" width="100%" /></object>
<p>The blue labelled countries are non-members of the V20 with an MVI of above 65. The red labelled countries are members of the V20 with an MVI below 50 (by construction, 50 is the average MVI score, so below 50 means below average). The GDP per capita, in purchasing power parity (PPP) terms in 2017 international dollars, is just for contextual information; it isn’t used for determining which countries are labelled or not.</p>
<p>So clearly the countries that have self-identified as ‘vulnerable’ to climate change are not the same as the set you would choose based on the new Multidimensional Vulnerability Index with its broader concept of vulnerability. I’m not going to say which is right and which wrong, or whether both are right in their own way; just pointing out the fact.</p>
<p>That’s really all for today.</p>
<p>Here’s the R code that does this analysis. You can’t just copy it and run it in a fresh R session however, contrary to my usual practice; you need to have run the code for the last post’s analysis first, or be running this in a clone of my whole <a href="https://github.com/ellisp/blog-source">blog source repository</a>.</p>
<figure class="highlight"><pre><code class="language-r" data-lang="r"><span class="c1"># This is a comparison of membership of the V20 with the MVI and GDP per capita</span><span class="w">
</span><span class="c1">#------------Data prep-----------</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">WDI</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">kableExtra</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">clipr</span><span class="p">)</span><span class="w">
</span><span class="c1"># run the script from the previous blog, to load in the MVI data in particular,</span><span class="w">
</span><span class="c1"># and to load in all the standard R packages (tidyverse in particular)</span><span class="w">
</span><span class="n">source</span><span class="p">(</span><span class="s2">"0255-mvi-pacific.R"</span><span class="p">)</span><span class="w">
</span><span class="c1"># get the world Banks' GDP data</span><span class="w">
</span><span class="c1"># "GDP per capita, PPP (constant 2017 international $)":</span><span class="w">
</span><span class="n">gdp_ppp_pc</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">WDI</span><span class="p">(</span><span class="n">indicator</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"NY.GDP.PCAP.PP.KD"</span><span class="p">,</span><span class="w"> </span><span class="n">start</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">2000</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">drop_na</span><span class="p">()</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">group_by</span><span class="p">(</span><span class="n">iso3c</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="c1"># just get the latest year for each country:</span><span class="w">
</span><span class="n">arrange</span><span class="p">(</span><span class="n">desc</span><span class="p">(</span><span class="n">year</span><span class="p">))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">slice</span><span class="p">(</span><span class="m">1</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">ungroup</span><span class="p">()</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">select</span><span class="p">(</span><span class="n">iso3c</span><span class="p">,</span><span class="w">
</span><span class="n">gdp_year</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">year</span><span class="p">,</span><span class="w">
</span><span class="n">gdp_pc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">NY.GDP.PCAP.PP.KD</span><span class="p">)</span><span class="w">
</span><span class="c1"># List of members of the V20 taken from</span><span class="w">
</span><span class="c1"># https://www.v-20.org/v20-ministerial-dialogue-xi-communique#_ftnref5</span><span class="w">
</span><span class="n">v20</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"Afghanistan"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Bangladesh"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Barbados"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Benin"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Bhutan"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Burkina Faso"</span><span class="p">,</span><span class="w">
</span><span class="s2">"Cambodia"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Chad"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Colombia"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Comoros"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Costa Rica"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Côte D'Ivoire"</span><span class="p">,</span><span class="w">
</span><span class="s2">"Democratic Republic of the Congo"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Dominica"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Dominican Republic"</span><span class="p">,</span><span class="w">
</span><span class="s2">"Eswatini"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Ethiopia"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Fiji"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Gambia"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Ghana"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Grenada"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Guatemala"</span><span class="p">,</span><span class="w">
</span><span class="s2">"Guinea"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Guyana"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Haiti"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Honduras"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Jordan"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Kenya"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Kiribati"</span><span class="p">,</span><span class="w">
</span><span class="s2">"Kyrgyzstan"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Lebanon"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Liberia"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Madagascar"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Malawi"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Maldives"</span><span class="p">,</span><span class="w">
</span><span class="s2">"Marshall Islands"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Mongolia"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Morocco"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Mozambique"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Namibia"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Nepal"</span><span class="p">,</span><span class="w">
</span><span class="s2">"Nicaragua"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Niger"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Pakistan"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Palau"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Palestine**"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Papua New Guinea"</span><span class="p">,</span><span class="w">
</span><span class="s2">"Paraguay"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Philippines"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Rwanda"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Saint Lucia"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Samoa"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Senegal"</span><span class="p">,</span><span class="w">
</span><span class="s2">"Sierra Leone"</span><span class="p">,</span><span class="w"> </span><span class="s2">"South Sudan"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Sri Lanka"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Sudan"</span><span class="p">,</span><span class="w"> </span><span class="s2">"United Republic of Tanzania"</span><span class="p">,</span><span class="w">
</span><span class="s2">"Timor-Leste"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Togo"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Tonga"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Trinidad and Tobago"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Tunisia"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Tuvalu"</span><span class="p">,</span><span class="w">
</span><span class="s2">"Uganda"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Vanuatu"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Viet Nam"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Yemen"</span><span class="p">)</span><span class="w">
</span><span class="c1"># A few hand edits were made so country names match those in the MVI (eg</span><span class="w">
</span><span class="c1"># D'Ivoire rather than d'Ivoire, etc)</span><span class="w">
</span><span class="c1"># any non-matches? Yes, Palestine:</span><span class="w">
</span><span class="n">v20</span><span class="p">[</span><span class="o">!</span><span class="n">v20</span><span class="w"> </span><span class="o">%in%</span><span class="w"> </span><span class="n">mvi</span><span class="o">$</span><span class="n">Country</span><span class="p">]</span><span class="w">
</span><span class="c1"># Palestine not in the mvi.</span><span class="w">
</span><span class="c1"># Mark which countries are in the V20, and join to the GDP data:</span><span class="w">
</span><span class="n">mvi2</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">mvi</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">mutate</span><span class="p">(</span><span class="n">type</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ifelse</span><span class="p">(</span><span class="n">Country</span><span class="w"> </span><span class="o">%in%</span><span class="w"> </span><span class="n">v20</span><span class="p">,</span><span class="w"> </span><span class="s2">"Member of V20"</span><span class="p">,</span><span class="w"> </span><span class="s2">"Not a member of V20"</span><span class="p">))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">left_join</span><span class="p">(</span><span class="n">gdp_ppp_pc</span><span class="p">,</span><span class="w"> </span><span class="n">by</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"ISO"</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"iso3c"</span><span class="p">))</span><span class="w">
</span><span class="c1"># note there are seven countries with no GDP PPP per capita values:</span><span class="w">
</span><span class="n">filter</span><span class="p">(</span><span class="n">mvi2</span><span class="p">,</span><span class="w"> </span><span class="nf">is.na</span><span class="p">(</span><span class="n">gdp_pc</span><span class="p">))</span><span class="w">
</span><span class="c1">#===============comparisons============</span><span class="w">
</span><span class="c1">#---------Table------------</span><span class="w">
</span><span class="c1"># Average values by v20 membership or not:</span><span class="w">
</span><span class="n">mvi2</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">group_by</span><span class="p">(</span><span class="n">type</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">summarise</span><span class="p">(</span><span class="n">`Structural vulnerability`</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">median</span><span class="p">(</span><span class="n">svi</span><span class="p">),</span><span class="w">
</span><span class="n">`Lack of structural resilience`</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">median</span><span class="p">(</span><span class="n">lsri</span><span class="p">),</span><span class="w">
</span><span class="n">`Multidimensional vulnerability`</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">median</span><span class="p">(</span><span class="n">`MVI - Score`</span><span class="p">),</span><span class="w">
</span><span class="n">`GDP per capita, PPP`</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">dollar</span><span class="p">(</span><span class="n">median</span><span class="p">(</span><span class="n">gdp_pc</span><span class="p">,</span><span class="w"> </span><span class="n">na.rm</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">TRUE</span><span class="p">),</span><span class="w"> </span><span class="n">accuracy</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">100</span><span class="p">))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">rename</span><span class="p">(</span><span class="n">` `</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">type</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">kable</span><span class="p">(</span><span class="n">digits</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="n">format.args</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">list</span><span class="p">(</span><span class="n">big.mark</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">","</span><span class="p">),</span><span class="w"> </span><span class="n">align</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"l"</span><span class="p">,</span><span class="w"> </span><span class="s2">"r"</span><span class="p">,</span><span class="w"> </span><span class="s2">"r"</span><span class="p">,</span><span class="w"> </span><span class="s2">"r"</span><span class="p">,</span><span class="w"> </span><span class="s2">"r"</span><span class="p">))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">kable_styling</span><span class="p">()</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">write_clip</span><span class="p">()</span><span class="w">
</span><span class="c1"># V20 members are very slightly more vulnerable, and notably poorer,</span><span class="w">
</span><span class="c1"># than non-members</span><span class="w">
</span><span class="c1">#-------------Plot-------------------</span><span class="w">
</span><span class="n">pal</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"Member of V20"</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"darkred"</span><span class="p">,</span><span class="s2">"Not a member of V20"</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"darkblue"</span><span class="p">)</span><span class="w">
</span><span class="n">p3</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">mvi2</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">ggplot</span><span class="p">(</span><span class="n">aes</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">gdp_pc</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">`MVI - Score`</span><span class="p">,</span><span class="w"> </span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">type</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">geom_point</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">geom_text_repel</span><span class="p">(</span><span class="n">data</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">filter</span><span class="p">(</span><span class="n">mvi2</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="n">`MVI - Score`</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="m">50</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="n">type</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s2">"Member of V20"</span><span class="p">)</span><span class="o">|</span><span class="w">
</span><span class="p">(</span><span class="n">`MVI - Score`</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="m">60</span><span class="w"> </span><span class="o">&amp;</span><span class="w"> </span><span class="n">type</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="s2">"Member of V20"</span><span class="p">)),</span><span class="w">
</span><span class="n">aes</span><span class="p">(</span><span class="n">label</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Country</span><span class="p">),</span><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">2.8</span><span class="p">,</span><span class="w"> </span><span class="n">seed</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">123</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">annotate</span><span class="p">(</span><span class="s2">"label"</span><span class="p">,</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">800</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">37</span><span class="p">,</span><span class="w"> </span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pal</span><span class="p">[</span><span class="m">1</span><span class="p">],</span><span class="w"> </span><span class="n">fontface</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"italic"</span><span class="p">,</span><span class="w">
</span><span class="n">label.size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="n">fill</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"grey90"</span><span class="p">,</span><span class="w"> </span><span class="n">hjust</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span><span class="p">,</span><span class="w">
</span><span class="n">label</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Member of V20 but lower than average vulnerability according to MVI"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">annotate</span><span class="p">(</span><span class="s2">"label"</span><span class="p">,</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">800</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">73</span><span class="p">,</span><span class="w"> </span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pal</span><span class="p">[</span><span class="m">2</span><span class="p">],</span><span class="w"> </span><span class="n">fontface</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"italic"</span><span class="p">,</span><span class="w">
</span><span class="n">label.size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="n">fill</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"grey90"</span><span class="p">,</span><span class="w"> </span><span class="n">hjust</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span><span class="p">,</span><span class="w">
</span><span class="n">label</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Not a member of V20 but high vulnerability according to MVI"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">scale_x_log10</span><span class="p">(</span><span class="n">label</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">dollar</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">scale_colour_manual</span><span class="p">(</span><span class="n">values</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pal</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">labs</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"GDP per capita, PPP, 2017 prices"</span><span class="p">,</span><span class="w">
</span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Multidimensional Vulnerability Index"</span><span class="p">,</span><span class="w">
</span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w">
</span><span class="n">title</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Membership of the 'V20' group of vulnerable coutries"</span><span class="p">,</span><span class="w">
</span><span class="n">subtitle</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Compared to scores on the UN's Multidimensional Vulnerability Index (MVI)"</span><span class="p">,</span><span class="w">
</span><span class="n">caption</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Source: UN https://www.un.org/ohrlls/mvi (MVI), World Bank World Development Indicators (GDP), analysis by freerangestats.info
Palestine is a member of V20 but does not have a MVI. Seven countries have an MVI but are missing GDP data."</span><span class="p">)</span><span class="w">
</span><span class="n">print</span><span class="p">(</span><span class="n">p3</span><span class="p">)</span></code></pre></figure>
</description>
<pubDate>Tue, 17 Oct 2023 00:00:00 +0000</pubDate>
<link>https://freerangestats.info/blog/2023/10/17/mvi-and-v20</link>
<guid isPermaLink="true">https://freerangestats.info/blog/2023/10/17/mvi-and-v20</guid>
</item>
<item>
<title>The UN's proposed Multidimensional Vulnerability Index by @ellis2013nz</title>
<description><p>The United Nations President of the General Assembly’s <a href="https://www.un.org/ohrlls/mvi">High-Level Panel</a> on the development of a Multidimensional Vulnerability Index have (September 2023) released an <a href="https://www.un.org/ohrlls/sites/www.un.org.ohrlls/files/final_mvi_report.pdf">Advanced Unedited Version of their Final Report</a>, and along with it the scores on that index for 142 countries. This is relevant for my work; it’s pretty complex; and I wanted to understand it fully so I downloaded it and drew some charts.</p>
<p>A good measure of “vulnerability” has been sought for at least 30 years as a supplement to measures of economic prosperity, with a number of parties (particularly small island developing states) advocating for its inclusion in eligibility decisions for financial and other forms of assistance. Vulnerability has formally been a factor in determining Least Developed Country status for some time now. <a href="https://www.un.org/ohrlls/mvi/history-of-mvi">This High Level Panel was commissioned</a> to resolve the contradictions in the various measures out there and address the “lack of international consensus on how to characterize and, by extension, mitigate their (small states’) vulnerabilities”.</p>
<p>There is (I think) an awkward contradiction between acknowledging the multidimensional nature of vulnerability and the desire for a single index that can be used for financing decisions. The High Level Panel deal with this by creating an elegant hierarchy where increasingly abstract indexes are created out of other indexes, which themselves are made out of actual indicators that have been scaled from 0 to 100, with 100 meaning the most vulnerable (or least resilient). All the details are in the report linked to above.</p>
<p>Numbers are combined to form the index in the next level up of the hierarchy by taking the square root of the mean of the squares of the original numbers, which has the effect of pushing the average a bit towards the higher numbers in the inputs; this is acknowledgement of the common judgement that you don’t need to be vulnerable against all the inputs to be vulnerable overall. Consider that the arithmetic mean of (2, 6) is 4; the geometric mean is 2.8 (pushed downwards); but the square root of the mean of the squares is 4.5 (pushed upwards). If that “6” meant you were vulnerable to something and the “2” you weren’t to something else, using 4.5 as your combined measure is giving a bit more importance to the variable that you are vulnerable to.</p>
<h2 id="visualising-the-results">Visualising the results</h2>
<p>First lets look at some results for the Pacific, the area I’m working on in my day job. Here are the values on the final, single Multidimensional Vulnerability Index (MVI) for the 12 Pacific Island countries in the dataset, compared to other countries in grey:</p>
<object type="image/svg+xml" data="https:/freerangestats.info/img/0255-overall-index.svg" width="100%"><img src="https:/freerangestats.info/img/0255-overall-index.png" width="100%" /></object>
<p>Unlike most of my posts, I haven’t interspersed my text and output with code creating it, because I want the results to be easy to focus on without distraction in talking about how the visualisations are done. But that code is still <a href="https://github.com/ellisp/blog-source/blob/master/_working/0255-mvi-pacific.R">available in one spot here</a>.</p>
<p>A few surprises in that first plot, for example that Vanuatu (often used as a case study of a vulnerable country, that has had a bad run recently with cyclones) is only very slightly above world median vulnerability.</p>
<p>Next level down from the main index we have two important component indexes - “Structural Vulnerability” and “Lack of Structural Resilience”. The final index for each country is their average of scores on these two, so let’s look again at the Pacific countries on the two indexes at once, again with the rest of the world’s countries shown in grey:</p>
<object type="image/svg+xml" data="https:/freerangestats.info/img/0255-two-indexes.svg" width="100%"><img src="https:/freerangestats.info/img/0255-two-indexes.png" width="100%" /></object>
<p>Hmm ok, that’s interesting; for example we can see that Tuvalu gets it’s relatively high overall score (that we saw in the first plot where it was ranked second most vulnerable of Pacific countries) almost entirely from “lack of structural resilience” and in contrast is actually slightly below the median score for “Structural vulnerability”.</p>
<p>The next two charts let us see what the concepts are behind these two indexes.</p>
<p>First, here’s “structural vulnerability”. There are two levels of concepts I’ve merged into one chart here; the first three (economic, environmental and social vulnerability) are themselves made up of the more detailed remaining nine. We’re still dealing with abstracts, not down to any actual data here. But at least we can see what it is that conceptually is leading to high or low scores. In the case of Nauru for example we see a particularly high score for “exposure to entrance of international forced displacement of people”. Hmm, there’s some complicated history behind that one.</p>
<object type="image/svg+xml" data="https:/freerangestats.info/img/0255-sv-concepts.svg" width="100%"><img src="https:/freerangestats.info/img/0255-sv-concepts.png" width="100%" /></object>
<p>And here’s the concepts making up “lack of structural resilience”:</p>
<object type="image/svg+xml" data="https:/freerangestats.info/img/0255-lsr-concepts.svg" width="100%"><img src="https:/freerangestats.info/img/0255-lsr-concepts.png" width="100%" /></object>
<p>We can see that these “resilience” concepts are about the ability of a society to respond to shocks they will get as a result of vulnerability; for example the lack economies of scale, adequate water supply, or a resilient agricultural system.</p>
<p>Finally, one more level down, here are the actual measureable indicators that are turned into those concepts, and ultimately the index itself:</p>
<object type="image/svg+xml" data="https:/freerangestats.info/img/0255-sv-variables.svg" width="100%"><img src="https:/freerangestats.info/img/0255-sv-variables.png" width="100%" /></object>
<object type="image/svg+xml" data="https:/freerangestats.info/img/0255-lsr-variables.svg" width="100%"><img src="https:/freerangestats.info/img/0255-lsr-variables.png" width="100%" /></object>
<h2 id="visualising-the-hierarchy-of-concepts">Visualising the hierarchy of concepts</h2>
<p>But which variables feed in to which concepts, and how to grasp this all at once? To help me understand how the variables get aggregated into concepts, then into higher level concepts, then into two indexes and finally one index, I constructed a network graph to illustrate the hierarchy:</p>
<p><a href="https:/freerangestats.info/img/0255-construction.png"><img src="https:/freerangestats.info/img/0255-construction.png" width="100%" /></a></p>
<p>This visualisation works for me - at least on a reasonable sized screen. But this, and all of the following network charts, are a bit fiddly to read in-line in the blog so I’d recommend opening them in another tab (with right mouse button) or clicking on them to navigate straight there (and then you can use the back key to come back here to the main text).</p>
<p>This layout suggests a nice option - we can colour-code the nodes (representing variables, concepts or index scores) according to an actual country’s scores, and see what’s pushing the country’s vulnerability scores up and down and how they add up to the overall score. Here’s such visualisations for each of our 12 Pacific countries, grouped by subregion:</p>
<h3>Melanesia</h3>
<h4>Papua New Guinea</h4>
<p><a href="https:/freerangestats.info/img/0255-mvi-Papua New Guinea.png"><img src="https:/freerangestats.info/img/0255-mvi-Papua New Guinea.png" width="100%" /></a></p>
<p>Most vulnerable scores (bright yellow) for PNG coming from gender equity, and lack of access to sanitation. Non-vulnerable scores coming from no problem with drylands, coastal zones, and access to freshwater.</p>
<h4>Fiji</h4>
<p><a href="https:/freerangestats.info/img/0255-mvi-Fiji.png"><img src="https:/freerangestats.info/img/0255-mvi-Fiji.png" width="100%" /></a></p>
<p>Fiji scores higher for vulnerability on exposure to natural hazards, rainfall shocks, low connectivity and low integration wutih international markets.</p>
<h4>Vanuatu</h4>
<p><a href="https:/freerangestats.info/img/0255-mvi-Vanuatu.png"><img src="https:/freerangestats.info/img/0255-mvi-Vanuatu.png" width="100%" /></a></p>
<p>Vanuatu also scores high on vulnerability to natural hazards, low connectivity, and gender equity. But it is scored with a fairly high level of enviornmental resilience, and not too socially vulnerable.</p>
<p>… and so on. I won’t write commentary on each individual country, but for completion they are all here:</p>
<h4>Solomon Islands</h4>
<p><a href="https:/freerangestats.info/img/0255-mvi-Solomon Islands.png"><img src="https:/freerangestats.info/img/0255-mvi-Solomon Islands.png" width="100%" /></a></p>
<h3>Micronesia</h3>
<h4>Federated States of Micronesia</h4>
<p><a href="https:/freerangestats.info/img/0255-mvi-Micronesia (Federated States of).png"><img src="https:/freerangestats.info/img/0255-mvi-Micronesia (Federated States of).png" width="100%" /></a></p>
<h4>Marshall Islands</h4>
<p><a href="https:/freerangestats.info/img/0255-mvi-Marshall Islands.png"><img src="https:/freerangestats.info/img/0255-mvi-Marshall Islands.png" width="100%" /></a></p>
<h4>Kiribati</h4>
<p><a href="https:/freerangestats.info/img/0255-mvi-Kiribati.png"><img src="https:/freerangestats.info/img/0255-mvi-Kiribati.png" width="100%" /></a></p>
<h4>Tuvalu</h4>
<p><a href="https:/freerangestats.info/img/0255-mvi-Tuvalu.png"><img src="https:/freerangestats.info/img/0255-mvi-Tuvalu.png" width="100%" /></a></p>
<h4>Nauru</h4>
<p><a href="https:/freerangestats.info/img/0255-mvi-Nauru.png"><img src="https:/freerangestats.info/img/0255-mvi-Nauru.png" width="100%" /></a></p>
<h4>Palau</h4>
<p><a href="https:/freerangestats.info/img/0255-mvi-Palau.png"><img src="https:/freerangestats.info/img/0255-mvi-Palau.png" width="100%" /></a></p>
<h3>Polynesia</h3>
<h4>Samoa</h4>
<p><a href="https:/freerangestats.info/img/0255-mvi-Samoa.png"><img src="https:/freerangestats.info/img/0255-mvi-Samoa.png" width="100%" /></a></p>
<h4>Tonga</h4>
<p><a href="https:/freerangestats.info/img/0255-mvi-Tonga.png"><img src="https:/freerangestats.info/img/0255-mvi-Tonga.png" width="100%" /></a></p>
<p>OK, that was interesting. I certainly feel I understand both a) how the index is constructed and b) the ratings it is giving to Pacific Island countries.</p>
</description>
<pubDate>Sat, 30 Sep 2023 00:00:00 +0000</pubDate>
<link>https://freerangestats.info/blog/2023/09/30/mvi</link>
<guid isPermaLink="true">https://freerangestats.info/blog/2023/09/30/mvi</guid>
</item>
<item>
<title>Finding a circle in a chart by @ellis2013nz</title>
<description><p>So <a href="https://twitter.com/iwontoffendyou/status/1704935240907518367">this tweet</a> came across my feed. To save you going there it is about a selection exercise for a job for (I think) an IT start up, described proudly by its author as “insanely hard”; and the job is to find the radius of the brown circle in this diagram:</p>
<object type="image/svg+xml" data="https:/freerangestats.info/img/0254-circles.svg" width="100%"><img src="https:/freerangestats.info/img/0254-circles.png" width="100%" /></object>
<p>At first it just annoyed me, and my reaction was a) I’d never want to work for this guy and b) this is a really dumb way to select your team, unless you’re recruiting for the maths department at a university. I strongly believe that recruitment exercises should be:</p>
<ul>
<li>as similar as possible to the real work required</li>
<li>easy enough that any reasonable candidate can do it, but with enough complexity that some of them will do it really well</li>
<li>reasonable to do in the time available</li>
</ul>
<p>…and I don’t think this does any of those things.</p>
<p>But then I got sufficiently interested to think about how I’d do the answer. I’m not good enough to work it out with pen and paper in a reasonable time frame. There is of course an optimal professional way to go about it, which is to throw all the relevant equations including that of the brown circle into a machine that can solve them for you, as posted by one user on Twitter <a href="(https://www.wolframalpha.com/input?i=%28x-a%29%5E2%2B%28y-r%29%5E2%3Dr%5E2%2C+y%3Dx%5E2%2C+%28x-a%29%2F%28x%29%3D-2%28y-r%29%2F1%2C+a%5E2%2Br%5E2%3D%281-r%29%5E2%2C+a%3E0
)">here with WolframAlpha working it out for you</a>. The answer is r = 0.213842. (Am I dreaming or did WolframAlpha used to be called Mathematica? Or is that a different thing? Ah ok <a href="https://en.wikipedia.org/wiki/WolframAlpha#:~:text=r%C9%99m%2D%2F%20WUULf%2Dr%C9%99m,answers%20from%20externally%20sourced%20data.&amp;text=WolframAlpha%20was%20released%20on%20May,Mathematica%2C%20a%20technical%20computing%20platform.">Wikipedia shows me</a> that the answer is ‘sort of’ - WolframAlpha is based on the earlier product, Mathematica.)</p>
<p>My own intuition on how to find the answer - because I’m not fluent in WolframAlpha, which I now see is by far the best way in absolute terms - was to find the centre point of the circle first. Basically use computing power to search for a point that has its shortest point equidistant from the three lines shown. This also made me think that the work isn’t <em>that</em> different from what I can imagine being required in jobs I can think of in the real world (less likely to be mathematical, but I can imagine looking for the largest circle that fits between some boundaries), so perhaps I was a bit harsh in dismissing the exercise entirely.</p>
<p>Here’s how I do this brute force method in R:</p>
<p><em>Post continues after R code</em></p>
<figure class="highlight"><pre><code class="language-r" data-lang="r"><span class="n">library</span><span class="p">(</span><span class="n">tidyverse</span><span class="p">)</span><span class="w">
</span><span class="c1"># Define some values of the red line (y = sqrt(x)) and purple line (unit circle)</span><span class="w">
</span><span class="c1"># for 1000 values of x:</span><span class="w">
</span><span class="n">d1</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">tibble</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">seq</span><span class="p">(</span><span class="n">from</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="n">to</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="n">length.out</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1000</span><span class="p">))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">mutate</span><span class="p">(</span><span class="n">line1_y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">sqrt</span><span class="p">(</span><span class="n">x</span><span class="p">),</span><span class="w">
</span><span class="n">line2_y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">sqrt</span><span class="p">(</span><span class="m">1</span><span class="w"> </span><span class="o">-</span><span class="n">x</span><span class="w"> </span><span class="o">^</span><span class="m">2</span><span class="w"> </span><span class="p">))</span><span class="w">
</span><span class="c1"># As above but finer grid, for 5000 values of x</span><span class="w">
</span><span class="n">d1_fine</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">tibble</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">seq</span><span class="p">(</span><span class="n">from</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="n">to</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="n">length.out</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">5000</span><span class="p">))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">mutate</span><span class="p">(</span><span class="n">line1_y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">sqrt</span><span class="p">(</span><span class="n">x</span><span class="p">),</span><span class="w">
</span><span class="n">line2_y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">sqrt</span><span class="p">(</span><span class="m">1</span><span class="w"> </span><span class="o">-</span><span class="n">x</span><span class="w"> </span><span class="o">^</span><span class="m">2</span><span class="w"> </span><span class="p">))</span><span class="w">
</span><span class="c1"># Cut down versions of that for just the visually plausible part on the left of the chart</span><span class="w">
</span><span class="n">d2</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">filter</span><span class="p">(</span><span class="n">d1</span><span class="p">,</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="m">0.6</span><span class="p">)</span><span class="w">
</span><span class="n">d2_fine</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">filter</span><span class="p">(</span><span class="n">d1_fine</span><span class="p">,</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="m">0.6</span><span class="p">)</span><span class="w">
</span><span class="c1"># Function to search a rectangle (defined by first four parameters), calculate the</span><span class="w">
</span><span class="c1"># distance of each point in the rectangle from 3 lines (vertical at 0, y = sqrt(x),</span><span class="w">
</span><span class="c1"># and unit circle) and return the 100 points with the highest value of the</span><span class="w">
</span><span class="c1"># lowest of the differences from the three lines</span><span class="w">
</span><span class="n">get_dc</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="k">function</span><span class="p">(</span><span class="n">x_from</span><span class="p">,</span><span class="w"> </span><span class="n">x_to</span><span class="p">,</span><span class="w"> </span><span class="n">y_from</span><span class="p">,</span><span class="w"> </span><span class="n">y_to</span><span class="p">,</span><span class="w"> </span><span class="n">d2</span><span class="p">,</span><span class="w"> </span><span class="n">length</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">100</span><span class="p">){</span><span class="w">
</span><span class="n">possibilities</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">expand_grid</span><span class="p">(</span><span class="n">can_x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">seq</span><span class="p">(</span><span class="n">from</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">x_from</span><span class="p">,</span><span class="w"> </span><span class="n">to</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">x_to</span><span class="p">,</span><span class="w"> </span><span class="n">length.out</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">length</span><span class="p">),</span><span class="w">
</span><span class="n">can_y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">seq</span><span class="p">(</span><span class="n">from</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">y_from</span><span class="p">,</span><span class="w"> </span><span class="n">to</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">y_to</span><span class="p">,</span><span class="w"> </span><span class="n">length.out</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">length</span><span class="p">))</span><span class="w">
</span><span class="c1"># Distances from the points on the y = sqrt(x) line</span><span class="w">
</span><span class="n">distances1</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">expand_grid</span><span class="p">(</span><span class="n">d2</span><span class="p">[,</span><span class="w"> </span><span class="m">1</span><span class="o">:</span><span class="m">2</span><span class="p">],</span><span class="w"> </span><span class="n">possibilities</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">mutate</span><span class="p">(</span><span class="n">distance_1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">sqrt</span><span class="p">((</span><span class="n">x</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">can_x</span><span class="p">)</span><span class="w"> </span><span class="o">^</span><span class="w"> </span><span class="m">2</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="p">(</span><span class="n">line1_y</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">can_y</span><span class="p">)</span><span class="w"> </span><span class="o">^</span><span class="w"> </span><span class="m">2</span><span class="p">))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">group_by</span><span class="p">(</span><span class="n">can_x</span><span class="p">,</span><span class="w"> </span><span class="n">can_y</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">arrange</span><span class="p">(</span><span class="n">distance_1</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">slice</span><span class="p">(</span><span class="m">1</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">ungroup</span><span class="p">()</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">select</span><span class="p">(</span><span class="n">can_x</span><span class="p">,</span><span class="w"> </span><span class="n">can_y</span><span class="p">,</span><span class="w"> </span><span class="n">distance_1</span><span class="p">)</span><span class="w">
</span><span class="c1"># Distances from the points in the unit circle</span><span class="w">
</span><span class="n">distances2</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">expand_grid</span><span class="p">(</span><span class="n">d2</span><span class="p">[,</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="m">3</span><span class="p">)],</span><span class="w"> </span><span class="n">possibilities</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">mutate</span><span class="p">(</span><span class="n">distance_2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">sqrt</span><span class="p">((</span><span class="n">x</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">can_x</span><span class="p">)</span><span class="w"> </span><span class="o">^</span><span class="w"> </span><span class="m">2</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="p">(</span><span class="n">line2_y</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">can_y</span><span class="p">)</span><span class="w"> </span><span class="o">^</span><span class="w"> </span><span class="m">2</span><span class="p">))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">group_by</span><span class="p">(</span><span class="n">can_x</span><span class="p">,</span><span class="w"> </span><span class="n">can_y</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">arrange</span><span class="p">(</span><span class="n">distance_2</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">slice</span><span class="p">(</span><span class="m">1</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">ungroup</span><span class="p">()</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">select</span><span class="p">(</span><span class="n">can_x</span><span class="p">,</span><span class="w"> </span><span class="n">can_y</span><span class="p">,</span><span class="w"> </span><span class="n">distance_2</span><span class="p">)</span><span class="w">
</span><span class="n">dc</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">distances1</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">left_join</span><span class="p">(</span><span class="n">distances2</span><span class="p">,</span><span class="w"> </span><span class="n">by</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">c</span><span class="p">(</span><span class="s2">"can_x"</span><span class="p">,</span><span class="w"> </span><span class="s2">"can_y"</span><span class="p">))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="c1"># add the distance to the vertical black line</span><span class="w">
</span><span class="n">mutate</span><span class="p">(</span><span class="n">distance_3</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">can_x</span><span class="p">,</span><span class="w">
</span><span class="c1"># which is the smallest of the three distances:</span><span class="w">
</span><span class="n">smallest</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pmin</span><span class="p">(</span><span class="n">distance_1</span><span class="p">,</span><span class="w"> </span><span class="n">distance_2</span><span class="p">,</span><span class="w"> </span><span class="n">distance_3</span><span class="p">))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">arrange</span><span class="p">(</span><span class="n">desc</span><span class="p">(</span><span class="n">smallest</span><span class="p">))</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">slice</span><span class="p">(</span><span class="m">1</span><span class="o">:</span><span class="m">100</span><span class="p">)</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="c1"># coarse search:</span><span class="w">
</span><span class="n">dc1</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">get_dc</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="m">0.5</span><span class="p">,</span><span class="w"> </span><span class="m">0.5</span><span class="p">,</span><span class="w"> </span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="n">d2</span><span class="p">)</span><span class="w">
</span><span class="n">dc1</span></code></pre></figure>
<p>That gets me these results. The first two columns are the candidate values for the centre of the brown circle. The next three columns are the shortest distance from that candidate center to a set of points on the lines for the red (y=sqrt(x)), purple (unit circle), and vertical black lines. The final column is the smallest of those three values - hence the smallest circle that could be drawn from that candidate point without crossing one of the three lines. The output is ordered so the candidate points with the highest value of <code class="language-plaintext highlighter-rouge">smallest</code> come first:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># A tibble: 100 × 6
can_x can_y distance_1 distance_2 distance_3 smallest
&lt;dbl&gt; &lt;dbl&gt; &lt;dbl&gt; &lt;dbl&gt; &lt;dbl&gt; &lt;dbl&gt;
1 0.212 0.758 0.216 0.213 0.212 0.212
2 0.217 0.758 0.213 0.212 0.217 0.212
3 0.212 0.753 0.212 0.218 0.212 0.212
4 0.222 0.758 0.209 0.211 0.222 0.209
5 0.217 0.753 0.209 0.217 0.217 0.209
6 0.212 0.763 0.220 0.208 0.212 0.208
7 0.212 0.747 0.208 0.223 0.212 0.208
8 0.207 0.742 0.207 0.229 0.207 0.207
9 0.207 0.747 0.211 0.224 0.207 0.207
10 0.207 0.753 0.215 0.220 0.207 0.207
</code></pre></div></div>
<p>I’d deliberately written the work above into a function so I could easily iterate from this rough effort. Taking a much finer grid using the range of 100 candidate values of my first effort, and comparing to a more detailed set of points on the red and blue lines gets me a more precise estimate of the best circle centre, and ultimately the number we were asked to find, the radius of the cirle at that point that touches the three lines.</p>
<figure class="highlight"><pre><code class="language-r" data-lang="r"><span class="c1"># more precise search:</span><span class="w">
</span><span class="n">dc2</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">get_dc</span><span class="p">(</span><span class="nf">min</span><span class="p">(</span><span class="n">dc1</span><span class="o">$</span><span class="n">can_x</span><span class="p">),</span><span class="w"> </span><span class="nf">max</span><span class="p">(</span><span class="n">dc1</span><span class="o">$</span><span class="n">can_x</span><span class="p">),</span><span class="w"> </span><span class="nf">min</span><span class="p">(</span><span class="n">dc1</span><span class="o">$</span><span class="n">can_y</span><span class="p">),</span><span class="w"> </span><span class="nf">max</span><span class="p">(</span><span class="n">dc1</span><span class="o">$</span><span class="n">can_y</span><span class="p">),</span><span class="w">
</span><span class="n">d2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">d2_fine</span><span class="p">,</span><span class="w"> </span><span class="n">length</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">200</span><span class="p">)</span><span class="w">
</span><span class="n">dc2</span><span class="p">[</span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="p">]</span><span class="o">$</span><span class="n">smallest</span></code></pre></figure>
<p>Which gets me this value:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[1] 0.2138219
</code></pre></div></div>
<p>This is the same as the answer from WolframAlpha to 4 decimal places. I will note that this took me about 40 lines of code whereas the WolframAlpha solution is done in 1 (or 4, depending how you lay it out). Which shows the value of using the right tool for the job… definitely WolframAlpha when you can express those boundary lines with mathematical formula. My method has advantage that it could work with arbitrary lines (e.g. country borders or something?), not just those expressed by an equation, which is actually a pretty big advantage in what seem to me anything like a realistic application.</p>
<p>Now, to draw the plot. This is simple, the only trick is to note the <code class="language-plaintext highlighter-rouge">parse = TRUE</code> argument to <code class="language-plaintext highlighter-rouge">geom_text</code> when annoting with equations, and a handy function (thanks Trevor!) for drawing a circle on a ggplot2 plot:</p>
<figure class="highlight"><pre><code class="language-r" data-lang="r"><span class="c1">#----------------plot----------------</span><span class="w">
</span><span class="c1"># See Trevor's answer at</span><span class="w">
</span><span class="c1"># https://stackoverflow.com/questions/6862742/draw-a-circle-with-ggplot2</span><span class="w">
</span><span class="c1"># for this convenient function for drawing circles in a ggplot2 chart:</span><span class="w">
</span><span class="n">gg_circle</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="k">function</span><span class="p">(</span><span class="n">r</span><span class="p">,</span><span class="w"> </span><span class="n">xc</span><span class="p">,</span><span class="w"> </span><span class="n">yc</span><span class="p">,</span><span class="w"> </span><span class="n">color</span><span class="o">=</span><span class="s2">"black"</span><span class="p">,</span><span class="w"> </span><span class="n">fill</span><span class="o">=</span><span class="kc">NA</span><span class="p">,</span><span class="w"> </span><span class="n">...</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="n">x</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">xc</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">r</span><span class="o">*</span><span class="nf">cos</span><span class="p">(</span><span class="n">seq</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="nb">pi</span><span class="p">,</span><span class="w"> </span><span class="n">length.out</span><span class="o">=</span><span class="m">100</span><span class="p">))</span><span class="w">
</span><span class="n">ymax</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">yc</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">r</span><span class="o">*</span><span class="nf">sin</span><span class="p">(</span><span class="n">seq</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="nb">pi</span><span class="p">,</span><span class="w"> </span><span class="n">length.out</span><span class="o">=</span><span class="m">100</span><span class="p">))</span><span class="w">
</span><span class="n">ymin</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">yc</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">r</span><span class="o">*</span><span class="nf">sin</span><span class="p">(</span><span class="n">seq</span><span class="p">(</span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="o">-</span><span class="nb">pi</span><span class="p">,</span><span class="w"> </span><span class="n">length.out</span><span class="o">=</span><span class="m">100</span><span class="p">))</span><span class="w">
</span><span class="n">annotate</span><span class="p">(</span><span class="s2">"ribbon"</span><span class="p">,</span><span class="w"> </span><span class="n">x</span><span class="o">=</span><span class="n">x</span><span class="p">,</span><span class="w"> </span><span class="n">ymin</span><span class="o">=</span><span class="n">ymin</span><span class="p">,</span><span class="w"> </span><span class="n">ymax</span><span class="o">=</span><span class="n">ymax</span><span class="p">,</span><span class="w"> </span><span class="n">color</span><span class="o">=</span><span class="n">color</span><span class="p">,</span><span class="w"> </span><span class="n">fill</span><span class="o">=</span><span class="n">fill</span><span class="p">,</span><span class="w"> </span><span class="n">...</span><span class="p">)</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="n">lw</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="m">1</span><span class="w"> </span><span class="c1"># linewidth</span><span class="w">
</span><span class="n">p</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">d1</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
</span><span class="n">ggplot</span><span class="p">(</span><span class="n">aes</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">x</span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">geom_line</span><span class="p">(</span><span class="n">aes</span><span class="p">(</span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">line1_y</span><span class="p">),</span><span class="w"> </span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"red"</span><span class="p">,</span><span class="w"> </span><span class="n">linewidth</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">lw</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">geom_line</span><span class="p">(</span><span class="n">aes</span><span class="p">(</span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">line2_y</span><span class="p">),</span><span class="w"> </span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"purple"</span><span class="p">,</span><span class="w"> </span><span class="n">linewidth</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">lw</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">geom_vline</span><span class="p">(</span><span class="n">xintercept</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span><span class="p">,</span><span class="w"> </span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"black"</span><span class="p">,</span><span class="w"> </span><span class="n">linewidth</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">lw</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">gg_circle</span><span class="p">(</span><span class="n">xc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">dc2</span><span class="p">[</span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="p">]</span><span class="o">$</span><span class="n">can_x</span><span class="p">,</span><span class="w"> </span><span class="n">yc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">dc2</span><span class="p">[</span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="p">]</span><span class="o">$</span><span class="n">can_y</span><span class="p">,</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">dc2</span><span class="p">[</span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="p">]</span><span class="o">$</span><span class="n">can_x</span><span class="p">,</span><span class="w">
</span><span class="n">color</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"orange"</span><span class="p">,</span><span class="w"> </span><span class="n">fill</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"orange"</span><span class="p">,</span><span class="w"> </span><span class="n">alpha</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0.5</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">coord_equal</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">labs</span><span class="p">(</span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="n">title</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Find the radius of the brown circle"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">annotate</span><span class="p">(</span><span class="s2">"text"</span><span class="p">,</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0.8</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0.95</span><span class="p">,</span><span class="w"> </span><span class="n">label</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"y==sqrt(x)"</span><span class="p">,</span><span class="w"> </span><span class="n">parse</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">TRUE</span><span class="p">,</span><span class="w"> </span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"red"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
</span><span class="n">annotate</span><span class="p">(</span><span class="s2">"text"</span><span class="p">,</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0.8</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0.70</span><span class="p">,</span><span class="w"> </span><span class="n">label</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"x^2 + y^2 == 1"</span><span class="p">,</span><span class="w"> </span><span class="n">parse</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">TRUE</span><span class="p">,</span><span class="w"> </span><span class="n">colour</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"purple"</span><span class="p">)</span></code></pre></figure>
<p>That’s all for today. Take care out there.</p>
</description>
<pubDate>Sat, 23 Sep 2023 00:00:00 +0000</pubDate>
<link>https://freerangestats.info/blog/2023/09/23/circle</link>
<guid isPermaLink="true">https://freerangestats.info/blog/2023/09/23/circle</guid>
</item>
<item>
<title>Model life tables by @ellis2013nz</title>
<description><p>
I am working to improve my knowledge of demography. This is something I've only had a relatively superficial engagement with but it's an important part of the responsibilities of the team where I work.
</p>
<p>
A key tool in demography is a "life table", which is basically a table where rows are ages or age groups and columns are different calculations relating to the chance of the cohort in that age group dying in a given year. The cumulative probability of survival lets you directly calculate life expectancy from any given age.
</p>
<p>
In a country with a very effective statistical system, these life tables can be estimated pretty directly. You take the number of people dying at each age from the death registrations, and the denominator of people per age cohort from the latest population projection.
</p>
<p>
But if your death registry data is incomplete or your population projection is unreliable, it is a much tougher job. And death registration is incomplete in many countries; enough so that indicator 17.19.2 against the Sustainable Development Goal "Partnerships for the Goals" includes a target for 80% of deaths to be registered; a target that many countries are going to struggle to meet by 2030.
</p>
<p>
To meet this use case (very common in developing countries), the United Nations provides a set of <a href = 'https://www.un.org/development/desa/pd/data/model-life-tables'>model life tables</a>:
</p>
<blockquote>
"The United Nations and the demographic research community at large commonly use two sets of standard model life table families to derive a variety of mortality indicators and underlying mortality patterns for estimation and projection (Coale-Demeny, 1966 and 1989; United Nations, 1982). These two sets of model life tables, designed primarily for use in developing countries or for estimating historic populations, are limited to mortality patterns for a life span from age 20 to 75. A revised set of model life tables, extending the initials sets from life expectancy at birth (e(0)) from age 75.0 up to 92.5, uses both a limited life table as an asymptotic pattern and the classic Lee-Carter approach to derive intermediate age patterns (Buettner, 2002)."
</blockquote>
<p>
The basic procedure to use these, as I understand it, is that you:
<ul>
<li>get one or more statistics that you *can* measure - like infant or under five mortality (which can be estimated with care from survey or census data) and probability of surviving to age 60 if you are 15</li>
<li>use your judgement and demographer community wisdom to decide the "family" of life tables that is most appropriate for your country, and </li>
<li>then from that family you pick the particular model life table that most closely matches the statistic or statistics that you do have. </li>
</ul>
</p>
<p>Alternatively it is possible to model the curves (of death rate ~ age) directly with a logistic function of some sort - using the curves of the model tables as a starting point and modifying the parameters according to the statistics available. That takes me beyond today's scope I think.</p>
<p>In essence, either way, you are relying on a "typical" shape for the mortality at the ages that you can't measure mortality directly.</p>
<p>These are the families available, grouped under the two types of "Coale-Demeny" or "United Nations":</p>
<pre>
type family n
<chr> <chr> <int>
1 CD East East 21222
2 CD North North 21222
3 CD South South 21222
4 CD West West 21222
5 UN Chilean Chilean 21222
6 UN Far_East_Asian Far_East_Asian 21222
7 UN General General 21222
8 UN Latin Latin 21222
9 UN South_Asian South_Asian 21222
</pre>
<p>Those values of 'n' are the number of rows of data associated with each family. Each family has 81 complete life tables for each of male and female - a life table for each value of "life expectancy at birth" from 20 to 100. The life tables contain mortalities for 131 ages, from 0 to 130. And 81 * 131 * 2 = 21222:</p>