This arithmetic smoothing technique aims to eliminate irregularities of the population pyramid by averaging values in a moving window of user-defined width.
mav(Value, Age, n = 3, OAG = TRUE, tails = FALSE)
Value | numeric. A vector of demographic counts in single age groups. |
---|---|
Age | integer. A vector of ages corresponding to the lower integer bound of the counts. |
n | integer. A single number, (often 3 or 5), indicating the number of years taken to smooth the population distribution by single ages. |
OAG | logical. Whether or not the top age group is open. Default |
tails | logical. If set to |
Vector with the smoothed demographic counts.
The moving window is applied symmetrically. By default (tails = FALSE
) data endpoints are imputed with NA
s in output: the is nothing under 0 or over the highest closed age group to average with. The open age group is not used in averaging, and it is returned as-is. Age intervals are assumed uniform. This function could be used with either single or 5-year age groups.
If tails
is set to TRUE
, then tails have been imputed using moving averages with successively smaller values of n
, the cascade method.
Roger G, Waltisperger D, Corbille-Guitton C (1981). Les structures par sexe et âge en Afrique. GDA, Paris, France.
Pop <-c(303583,390782,523903,458546,517996,400630,485606,325423,471481,189710, 385442,143205,270890,145105,138078,157444,153035,91566,247160,73115, 384222,83551,198555,111347,129851,477510,149272,100814,178465,50684, 577167,51878,97788,55544,58011,393200,85048,51131,80336,31246, 454698,34864,51810,31146,26618,228718,38504,23616,40836,15589, 339158,21349,26997,17590,17513,119763,22704,12336,17635,8485, 323263,9535,13906,9063,8294,90459,9817,6376,8884,3773,160609) Age <- 0:70 # final age group assumed open mav(Pop, n = 3, Age = Age)#> 0 1 2 3 4 5 6 #> NA 406089.333 457743.667 500148.333 459057.333 468077.333 403886.333 #> 7 8 9 10 11 12 13 #> 427503.333 328871.333 348877.667 239452.333 266512.333 186400.000 184691.000 #> 14 15 16 17 18 19 20 #> 146875.667 149519.000 134015.000 163920.333 137280.333 234832.333 180296.000 #> 21 22 23 24 25 26 27 #> 222109.333 131151.000 146584.333 239569.333 252211.000 242532.000 142850.333 #> 28 29 30 31 32 33 34 #> 109987.667 268772.000 226576.333 242277.667 68403.333 70447.667 168918.333 #> 35 36 37 38 39 40 41 #> 178753.000 176459.667 72171.667 54237.667 188760.000 173602.667 180457.333 #> 42 43 44 45 46 47 48 #> 39273.333 36524.667 95494.000 97946.667 96946.000 34318.667 26680.333 #> 49 50 51 52 53 54 55 #> 131861.000 125365.333 129168.000 21978.667 20700.000 51622.000 53326.667 #> 56 57 58 59 60 61 62 #> 51601.000 17558.333 12818.667 116461.000 113761.000 115568.000 10834.667 #> 63 64 65 66 67 68 69 #> 10421.000 35938.667 36190.000 35550.667 8359.000 6344.333 NA #> 70 #> 160609.000if (FALSE) { odds <- seq(3, 11, by = 2) nwindows <- sapply(odds, mav, Value = Pop, Age = Age, OAG = TRUE, tails = FALSE) cols <- gray(seq(.8, 0, length = 5)) lwds <- seq(3, 1, length = 5) plot(Age,Pop, col = "red", xlab = "Age", ylab = "The counts", pch=16, main = "Moving average windows and extreme heaping") matplot(Age,nwindows,type='l',col=cols, lwd=lwds, add=TRUE,lty=1) legend("topright", lty=1, col = cols, lwd = lwds, legend = paste0("n=",seq(3,11,by=2))) } # For cascading smoothing on the tails: mav(Pop, Age, tails = TRUE)#> 0 1 2 3 4 5 6 7 #> 303583.00 402262.50 457743.67 500148.33 459057.33 468077.33 403886.33 427503.33 #> 8 9 10 11 12 13 14 15 #> 328871.33 348877.67 239452.33 266512.33 186400.00 184691.00 146875.67 149519.00 #> 16 17 18 19 20 21 22 23 #> 134015.00 163920.33 137280.33 234832.33 180296.00 222109.33 131151.00 146584.33 #> 24 25 26 27 28 29 30 31 #> 239569.33 252211.00 242532.00 142850.33 109987.67 268772.00 226576.33 242277.67 #> 32 33 34 35 36 37 38 39 #> 68403.33 70447.67 168918.33 178753.00 176459.67 72171.67 54237.67 188760.00 #> 40 41 42 43 44 45 46 47 #> 173602.67 180457.33 39273.33 36524.67 95494.00 97946.67 96946.00 34318.67 #> 48 49 50 51 52 53 54 55 #> 26680.33 131861.00 125365.33 129168.00 21978.67 20700.00 51622.00 53326.67 #> 56 57 58 59 60 61 62 63 #> 51601.00 17558.33 12818.67 116461.00 113761.00 115568.00 10834.67 10421.00 #> 64 65 66 67 68 69 70 #> 35938.67 36190.00 35550.67 8359.00 6979.25 8884.00 160609.00if (FALSE) { # Compare nwindows_tails <- sapply(odds, mav, Value = Pop, Age = Age, OAG = TRUE, tails = TRUE) colnames(nwindows) <- odds colnamaes(nwindows_tails) <- odds # NA triangles are completed with # successively smaller ns. head(nwindows) head(nwindows_tails) tail(nwindows) tail(nwindows_tails) }