Nothing
library(bayesPop)
start.test <- function(name) cat('\n<=== Starting test of', name,'====\n')
test.ok <- function(name) cat('\n==== Test of', name, 'OK.===>\n')
test.prediction <- function(parallel = FALSE) {
test.name <- paste('Running prediction', if(parallel) 'in parallel' else '')
start.test(test.name)
set.seed(1)
sim.dir <- tempfile()
pred <- pop.predict(countries=c(528,218,450),
nr.traj = 3, verbose=FALSE, output.dir=sim.dir, parallel = parallel)
s <- summary(pred)
stopifnot(s$nr.traj == 3)
stopifnot(s$nr.countries == 3)
stopifnot(length(s$projection.years) == 16)
test.ok(test.name)
# aggregate
test.name <- 'Running aggregation (country type)'
start.test(test.name)
aggr <- pop.aggregate(pred, c(900,904))
stopifnot(nrow(aggr$countries) == 2)
test.ok(test.name)
# aggregate with user-defined groupings
test.name <- 'Running aggregation with user-defined groupings'
start.test(test.name)
UNlocs <- cbind(UNlocations[,1:7], agcode_10=99)
UNlocs[UNlocs$country_code %in% c(218,528), 'agcode_10'] <- 9000
UNlocs <- rbind(UNlocs,
data.frame(name='my_aggregation', country_code=9000, reg_code=-1, reg_name='', area_code=-1, area_name='',
location_type=10, agcode_10=-1))
locfile <- tempfile()
write.table(UNlocs, file=locfile, sep='\t')
aggr1 <- pop.aggregate(pred, 9000, my.location.file=locfile)
unlink(locfile)
stopifnot(length(aggr1$aggregated.countries[['9000']]) == 2)
stopifnot(all(is.element(c(218, 528), aggr1$aggregated.countries[['9000']])))
test.name <- paste('Running prediction with 1 trajectory', if(parallel) 'in parallel' else '')
start.test(test.name)
pred <- pop.predict(countries=528, keep.vital.events=TRUE,
nr.traj = 1, verbose=FALSE, output.dir=sim.dir, replace.output=TRUE, end.year=2040,
parallel = parallel)
# check that it took the median TFR and not high or low
tfr <- get.pop("F528", pred)
# extract data from wpp2019
data(tfrprojMed, package = "wpp2019")
tfr.should.be <- round(subset(tfrprojMed, country_code == 528)[3:6], 2)
stopifnot(all(round(tfr[1,1,2:dim(tfr)[3],1],2) == tfr.should.be))
# check that writing summary is OK
write.pop.projection.summary(pred, what=c("popsexage"), output.dir=sim.dir)
t <- read.table(file.path(sim.dir, 'projection_summary_tpopsexage.csv'), sep=',', header=TRUE)
s <- summary(pred, country = 528)
stopifnot(round(s$projections[1,1]) == sum(t[t$variant == "median", "X2020"]))
pred <- pop.predict(countries=528, keep.vital.events=TRUE,
nr.traj = 3, verbose=FALSE, output.dir=sim.dir, replace.output=TRUE, end.year=2040,
inputs=list(tfr.file='median_', e0M.file='median_'), parallel = parallel)
tfr <- get.pop("F528", pred)
stopifnot(all(round(tfr[1,1,2:dim(tfr)[3],1],2) == tfr.should.be))
stopifnot(pred$nr.traj==1) # even though we want 3 trajectories, only one is available, because we take TFR median
# check that writing summary is OK
write.pop.projection.summary(pred, what=c("popsexage"), output.dir=sim.dir)
t <- read.table(file.path(sim.dir, 'projection_summary_tpopsexage.csv'), sep=',', header=TRUE)
s <- summary(pred, country = 528)
stopifnot(round(s$projections[1,1]) == sum(t[t$variant == "median", "X2020"]))
test.ok(test.name)
unlink(sim.dir, recursive=TRUE)
}
test.expressions <- function(parallel = FALSE) {
test.name <- paste('Population expressions', if(parallel) 'in parallel' else '')
start.test(test.name)
sim.dir <- tempfile()
pred <- pop.predict(countries=c(528,218,450, 242, 458), nr.traj = 3, verbose=FALSE,
output.dir=sim.dir, parallel = parallel)
filename <- tempfile()
png(filename=filename)
pop.trajectories.plot(pred, expression='P528_F[1]')
pop.byage.plot(pred, expression='P528_F{} / PNL_M{}')
dev.off()
size <- file.info(filename)['size']
unlink(filename)
stopifnot(size > 0)
pop.trajectories.table(pred, expression='P242 / (P528 + P218 + P450 + P242 + P458)')
write.pop.projection.summary(pred, expression="PXXX[1] / PXXX", output.dir=sim.dir, include.observed=TRUE)
t <- read.table(file.path(sim.dir, 'projection_summary_expression.csv'), sep=',', header=TRUE)
stopifnot(all(dim(t) == c(25,34)))
write.pop.projection.summary(pred, expression="GXXX[1:10]", output.dir=sim.dir, include.observed=TRUE) # migration
t <- read.table(file.path(sim.dir, 'projection_summary_expression.csv'), sep=',', header=TRUE)
stopifnot(all(dim(t) == c(25,34)))
aggr <- pop.aggregate(pred, 900)
pop.trajectories.table(pred, expression='P528_M / P900')
write.pop.projection.summary(pred, expression="PXXX_M / P900_M", output.dir=sim.dir)
t <- read.table(file.path(sim.dir, 'projection_summary_expression.csv'), sep=',', header=TRUE)
stopifnot(all(dim(t) == c(25,20)))
test.ok(test.name)
unlink(sim.dir, recursive=TRUE)
}
test.expressions.with.VE <- function(map=TRUE, parallel = FALSE) {
test.name <- paste('Expressions with vital events', if(parallel) 'in parallel' else '')
start.test(test.name)
sim.dir <- tempfile()
pred <- pop.predict(countries=c(528, 218), nr.traj = 3, verbose=FALSE, output.dir=sim.dir,
keep.vital.events=TRUE, parallel = parallel)
filename <- tempfile()
png(filename=filename)
pop.trajectories.plot(pred, expression='F528_F[10]')
dev.off()
size <- file.info(filename)['size']
unlink(filename)
stopifnot(size > 0)
pop.trajectories.table(pred, expression='D528 / (DNLD + D218)')
pop.trajectories.table(pred, expression='F528_F[4]/(R528_F[4]/100)') # gives TFR
pop.trajectories.table(pred, expression=mac.expression("ECU")) # MAC
write.pop.projection.summary(pred, expression="FXXX", output.dir=sim.dir, include.observed=TRUE) # TFR
tb <- read.table(file.path(sim.dir, 'projection_summary_expression.csv'), sep=',', header=TRUE)
stopifnot(all(tb[, 5:ncol(tb)] < 7))
write.pop.projection.summary(pred, expression="BXXX[5] / BXXX", output.dir=sim.dir)
t1 <- read.table(file.path(sim.dir, 'projection_summary_expression.csv'), sep=',', header=TRUE)
stopifnot(all(dim(t1) == c(10,20))) # 2 countries 5 rows each
write.pop.projection.summary(pred, expression="pop.combine(BXXX[5], BXXX, '/')", output.dir=sim.dir)
t2 <- read.table(file.path(sim.dir, 'projection_summary_expression.csv'), sep=',', header=TRUE)
stopifnot(identical(t1, t2))
t <- pop.byage.table(pred, expression='M528_M{}')
stopifnot(all(dim(t) == c(27,5)))
write.pop.projection.summary(pred, expression="SXXX_M{0}", output.dir=sim.dir)
t <- read.table(file.path(sim.dir, 'projection_summary_expression.csv'), sep=',', header=TRUE)
stopifnot(all(dim(t) == c(10,20)))
filename <- tempfile()
png(filename=filename)
pop.byage.plot(pred, expression='log(QEC_M{age.index01(27)})', year=2050)
pop.byage.plot(pred, expression='log(QECU_M{age.index01(21)})', year=2018)
pop.byage.plot(pred, expression='M218_F{age.index05(27)}', year=2050)
pop.trajectories.plot(pred, expression="pop.apply(P528_F{4:10}, gmedian, cats=seq(15, by=5, length=8))")
pop.byage.plot(pred, expression="pop.combine(M218_F{age.index05(27)}, P218, '/')", year=2050)
pop.byage.plot(pred, expression="pop.combine(M218_F{age.index05(27)}, P218, '/')", year=1990)
pop.trajectories.plot(pred, expression="pop.combine(B218 - D218, G218, '+', split.along='traj')")
pop.trajectories.plot(pred, expression="pop.combine(G218, P218, '/', split.along='traj')")
if(map) {
pop.map(pred, expression="pop.combine(PXXX_M, P528, '/', split.along='country')", year=1980)
pop.ggmap(pred, expression="pop.combine(PXXX_M, P528, '/', split.along='country')", year=2050)
}
dev.off()
size <- file.info(filename)['size']
unlink(filename)
stopifnot(size > 0)
write.pop.projection.summary(pred, expression="QXXX_F[0]", output.dir=sim.dir)
t <- read.table(file.path(sim.dir, 'projection_summary_expression.csv'), sep=',', header=TRUE)
stopifnot(all(dim(t) == c(10,20)))
filename <- tempfile()
png(filename=filename)
pop.pyramid(pred, 218)
pop.pyramid(pred, 528, year=2052, proportion=TRUE)
pop.pyramid(pred, 218, indicator='D')
pop.pyramid(pred, 218, indicator='B', year=2100)
pop.pyramid(pred, 218, indicator='D', proportion=TRUE, year=2100)
pop.trajectories.pyramid(pred, 218, proportion=TRUE)
pop.trajectories.pyramid(pred, 528, year=2052, proportion=TRUE)
pop.trajectories.pyramid(pred, 218, indicator='B')
pop.trajectories.pyramid(pred, 218, indicator='D', year=2100)
pop.trajectories.pyramid(pred, 218, indicator='B', year=2100)
pop.trajectories.pyramid(pred, 218, indicator='B', proportion=TRUE, year=2100)
dev.off()
size <- file.info(filename)['size']
unlink(filename)
stopifnot(size > 0)
write.pop.projection.summary(pred, output.dir=sim.dir)
t <- read.table(file.path(sim.dir, 'projection_summary_tpop.csv'), sep=',', header=TRUE)
stopifnot(all(dim(t) == c(10,20)))
t <- read.table(file.path(sim.dir, 'projection_summary_asfrage.csv'), sep=',', header=TRUE)
stopifnot(all(dim(t) == c(70,21)))
write.pop.projection.summary(pred, output.dir=sim.dir, include.observed=TRUE)
t <- read.table(file.path(sim.dir, 'projection_summary_tpop.csv'), sep=',', header=TRUE)
stopifnot(all(dim(t) == c(10,34)))
test.ok(test.name)
unlink(sim.dir, recursive=TRUE)
}
test.prediction.with.prob.migration <- function(parallel = FALSE) {
test.name <- paste('Running prediction with probabilistic migration', if(parallel) 'in parallel' else '')
start.test(test.name)
set.seed(1)
# create migration files with two countries and two trajectories
migMfile <- tempfile()
migFfile <- tempfile()
sim.dir <- tempfile()
nr.traj <- 1
time <- 5
ncountries <- 2
write.migration <- function(nr.traj) {
nrows.country <- nr.traj*21*time
mig <- data.frame(LocID=rep(c(528,218), each=nrows.country), Year=rep(rep(seq(2013, by=5, length=time), each=21), times=nr.traj*ncountries),
Trajectory=rep(rep(1:nr.traj, each=21*time), times=ncountries),
Age=c(paste(seq(0,95,by=5), seq(4,99,by=5), sep='-'), '100+'), Migration=0)
migM <- migF <- mig
migM$Migration <- rnorm(nrow(mig), mean=rep(c(3,0), each=nrows.country), sd=rep(c(2, 1), each=nrows.country))
migF$Migration <- rnorm(nrow(mig), mean=rep(c(3,0), each=nrows.country), sd=rep(c(2, 1), each=nrows.country))
write.csv(migM, file=migMfile, row.names=FALSE)
write.csv(migF, file=migFfile, row.names=FALSE)
}
write.migration(nr.traj=2)
pred <- pop.predict(countries=c(528,218), end.year=2033,
verbose=FALSE, output.dir=sim.dir, keep.vital.events=TRUE, replace.output=TRUE,
inputs=list(migMtraj=migMfile, migFtraj=migFfile), parallel = parallel)
s <- summary(pred)
# should have 3 trajectories because TFR has 3
stopifnot(s$nr.traj == 3)
stopifnot(s$nr.countries == 2)
stopifnot(length(s$projection.years) == 3)
mgr <- get.pop("G528", pred)
stopifnot(dim(mgr)[4] == 3) # migration is re-sampled to 3 trajs
write.migration(nr.traj=5)
pred <- pop.predict(countries=c(528,218), end.year=2033,
verbose=FALSE, output.dir=sim.dir, keep.vital.events=TRUE, replace.output=TRUE,
inputs=list(migMtraj=migMfile, migFtraj=migFfile), parallel = parallel)
stopifnot(pred$nr.traj == 5)
stopifnot(dim(get.pop("G218", pred))[4] == 5)
pred <- pop.predict(countries=c(528,218), end.year=2033,
verbose=FALSE, output.dir=sim.dir, keep.vital.events=TRUE, replace.output=TRUE,
inputs=list(migMtraj=migMfile, migFtraj=migFfile), nr.traj=1, parallel = parallel)
stopifnot(pred$nr.traj == 1)
stopifnot(dim(get.pop("G218", pred))[4] == 1)
write.migration(nr.traj=1)
pred <- pop.predict(countries=c(528,218), end.year=2033,
verbose=FALSE, output.dir=sim.dir, keep.vital.events=TRUE, replace.output=TRUE, parallel = parallel,
inputs=list(migMtraj=migMfile)) # female is taken the default one (only works if male has 1 trajectory)
stopifnot(pred$nr.traj == 3)
stopifnot(dim(get.pop("G218_M", pred))[4] == 3)
pred <- pop.predict(countries=c(528,218), end.year=2033,
verbose=FALSE, output.dir=sim.dir, keep.vital.events=TRUE, replace.output=TRUE, parallel = parallel,
inputs=list(migFtraj=migFfile)) # male is taken the default one (only works if male has 1 trajectory)
stopifnot(pred$nr.traj == 3)
stopifnot(dim(get.pop("G218_F", pred))[4] == 3)
test.ok(test.name)
unlink(sim.dir, recursive=TRUE)
unlink(migMfile)
unlink(migFfile)
}
test.regional.aggregation <-function(parallel = FALSE) {
test.name <- paste('Regional aggregation', if(parallel) 'in parallel' else '')
start.test(test.name)
regions <- c(900, 908, 904)
sim.dir.tfr <- tempfile()
sim.dir.e0 <- tempfile()
sim.dir.pop <- tempfile()
# Estimate TFR parameters
run.tfr.mcmc(iter=25, nr.chains=1, output.dir=sim.dir.tfr, seed=1)
run.tfr.mcmc.extra(sim.dir=sim.dir.tfr, countries=regions, burnin=0)
# Predict TFR
tfr.predict(sim.dir=sim.dir.tfr, burnin=5, save.as.ascii=0, use.tfr3=FALSE)
# Estimate e0 parameters
run.e0.mcmc(sex='F', iter=25, nr.chains=1, thin=1, output.dir=sim.dir.e0, seed=1)
run.e0.mcmc.extra(sim.dir=sim.dir.e0, countries=regions, burnin=0)
# Predict female and male e0
warn <- options('warn'); options(warn=-1) # the joined estimation and pop projection has some warnings which can be ignored
e0.predict(sim.dir=sim.dir.e0, burnin=5, save.as.ascii=0)
# Population prediction
pred <- pop.predict(output.dir=sim.dir.pop, verbose=TRUE, parallel = parallel,
inputs = list(tfr.sim.dir=sim.dir.tfr,
e0F.sim.dir=sim.dir.e0, e0M.sim.dir='joint_'))
options(warn=warn$warn)
stopifnot(pred$nr.traj==20)
aggr <- pop.aggregate(pred, regions=regions, input.type="region", verbose=TRUE)
stopifnot(setequal(aggr$countries$code, regions))
test.ok(test.name)
unlink(sim.dir.tfr, recursive=TRUE)
unlink(sim.dir.e0, recursive=TRUE)
unlink(sim.dir.pop, recursive=TRUE)
}
test.life.table <- function(parallel = FALSE){
test.name <- paste('Life Tables', if(parallel) 'in parallel' else '')
start.test(test.name)
sim.dir <- tempfile()
# this is the Example from LifeTableMx
pred <- pop.predict(countries="Ecuador", output.dir=sim.dir, wpp.year=2015, parallel = parallel,
present.year=2015, keep.vital.events=TRUE, fixed.mx=TRUE, fixed.pasfr=TRUE)
# get male mortality rates from current year for age groups 0-1, 1-4, 5-9, ...
mx <- pop.byage.table(pred, expression="MEC_M{c(-1,0,2:27)}")[,1]
LT <- LifeTableMx(mx)
stopifnot(all(dim(LT) == c(28,10)))
stopifnot(!any(is.na(LT)))
mxf <- pop.byage.table(pred, expression="MEC_F{age.index01(27)}", year=2020)[,1]
LT <- LifeTableMx(mxf, sex="Female", include01=FALSE)
stopifnot(all(dim(LT) == c(27,10)))
stopifnot(!any(is.na(LT)))
sx1 <- as.double(LifeTableMxCol(mx, 'sx', age05=c(FALSE, FALSE, TRUE)))
sx2 <- get.pop.exba("SEC_M{1:27}", pred, observed=TRUE)
sx2 <- as.double(sx2[,ncol(sx2)])
sxpred <- get.pop.exba("SEC_M{1:27}", pred, observed=FALSE)
sx3 <- as.double(sxpred[,1,1])
stopifnot(all.equal(sx1[1:19], sx2[1:19]) && all.equal(sx2[1:19], sx3[1:19]))
sx4 <- as.double(LifeTableMxCol(pop.byage.table(pred, expression="MEC_M{age.index01(27)}", year=2053)[,1], 'sx', age05=c(FALSE, FALSE, TRUE)))
sx5 <- as.double(sxpred[,"2053",1])
stopifnot(all.equal(sx4, sx5))
test.ok(test.name)
unlink(sim.dir, recursive=TRUE)
}
test.adjustment <- function() {
test.name <- 'Adjustments'
start.test(test.name)
sim.dir <- file.path(find.package("bayesPop"), "ex-data", "Pop")
pred <- get.pop.prediction(sim.dir)
med <- pop.trajectories.table(pred, "Ecuador")[,"median"]
adj.med <- pop.trajectories.table(pred, "Ecuador", adjust=TRUE)[,"median"]
# from wpp2017 popproj dataset:
#data(popproj, package="wpp2017")
#should.be <- unlist(subset(popproj, name=="Ecuador")[,c("2080", "2090", "2100")])
should.be <- c(24876.80, 24725.84, 24320.58)
stopifnot(all.equal(adj.med[c("2080", "2090", "2100")], should.be,
tolerance = 0.01, check.attributes = FALSE))
test.ok(test.name)
}
test.subnat <- function() {
test.name <- "Subnational projections with national TFR"
start.test(test.name)
data.dir <- file.path(find.package("bayesPop"), "extdata")
# Use national data for tfr and e0
sim.dir <- tempfile()
pred <- pop.predict.subnat(output.dir = sim.dir,
locations = file.path(data.dir, "CANlocations.txt"),
inputs = list(popM = file.path(data.dir, "CANpopM.txt"),
popF = file.path(data.dir, "CANpopF.txt"),
patterns = file.path(data.dir, "CANpatterns.txt")
))
ct <- get.countries.table(pred)
stopifnot(nrow(ct) == 13) # 13 sub-regions of Canada
stopifnot(dim(get.pop("P658", pred))[3] == 9) # projection until 2060
aggr <- pop.aggregate.subnat(pred, regions = 124,
locations = file.path(data.dir, "CANlocations.txt"))
ct <- get.countries.table(aggr)
stopifnot(nrow(ct) == 1)
stopifnot(dim(get.pop("P124", aggr))[3] == 9) # projection until 2060
unlink(sim.dir, recursive=TRUE)
test.ok(test.name)
}
test.subnat.with.subnat.tfr.e0 <- function() {
test.name <- "Subnational projections with subnational TFR and e0"
start.test(test.name)
# TFR projections
data.dir <- file.path(find.package("bayesPop"), "extdata")
my.subtfr.file <- file.path(find.package("bayesTFR"), 'extdata', 'subnational_tfr_template.txt')
tfr.nat.dir <- file.path(find.package("bayesTFR"), "ex-data", "bayesTFR.output")
tfr.reg.dir <- tempfile()
tfr.preds <- tfr.predict.subnat(124, my.tfr.file = my.subtfr.file,
sim.dir = tfr.nat.dir, output.dir = tfr.reg.dir, start.year = 2013)
# e0 projections
my.sube0.file <- file.path(find.package("bayesLife"), 'extdata', 'subnational_e0_template.txt')
e0.nat.dir <- file.path(find.package("bayesLife"), "ex-data", "bayesLife.output")
e0.reg.dir <- tempfile()
e0.preds <- e0.predict.subnat(124, my.e0.file=my.sube0.file,
sim.dir=e0.nat.dir, output.dir=e0.reg.dir,
predict.jmale = TRUE, my.e0M.file = my.sube0.file)
# Pop projections
sim.dir <- tempfile()
pred <- pop.predict.subnat(output.dir = sim.dir,
locations = file.path(data.dir, "CANlocations.txt"),
inputs = list(popM = file.path(data.dir, "CANpopM.txt"),
popF = file.path(data.dir, "CANpopF.txt"),
patterns = file.path(data.dir, "CANpatterns.txt"),
tfr.sim.dir = file.path(tfr.reg.dir, "subnat", "c124"),
e0F.sim.dir = file.path(e0.reg.dir, "subnat_ar1", "c124"),
e0M.sim.dir = "joint_"
), verbose = FALSE)
stopifnot(all(dim(get.pop("P658", pred)) == c(1,1,9,30))) # 30 trajectories because TFR example has 30 national trajs.
aggr <- pop.aggregate.subnat(pred, regions = 124,
locations = file.path(data.dir, "CANlocations.txt"))
tbl <- pop.trajectories.table(aggr, "Canada")
stopifnot(nrow(tbl) == 28)
stopifnot(summary(aggr)$nr.traj == 30)
unlink(sim.dir, recursive = TRUE)
unlink(tfr.reg.dir, recursive = TRUE)
unlink(e0.reg.dir, recursive = TRUE)
test.ok(test.name)
}
test.prediction.with.patterns <- function() {
test.name <- paste('Running prediction with different patterns')
start.test(test.name)
data("vwBaseYear2019")
patterns <- vwBaseYear2019
cntries <- c(528,218,450)
patterns <- subset(patterns, country_code %in% cntries)
#patterns$AgeMortProjMethod1[] <- "LC"
patterns$AgeMortProjMethod1[] <- "modPMD"
patterns$AgeMortProjMethod2[] <- ""
patterns$SmoothDFLatestAgeMortalityPattern <- c(4, 0, 19)
patterns$SmoothLatestAgeMortalityPattern[] <- 1
patterns$LatestAgeMortalityPattern <- c("c(-2, 3)", -2, "c(1, 1)") # the last one should give a warning
pattern.file <- tempfile()
write.table(patterns, file = pattern.file, sep = "\t", row.names = FALSE)
set.seed(1)
sim.dir <- tempfile()
pred <- pop.predict(countries = cntries,
nr.traj = 3, verbose=TRUE, output.dir=sim.dir,
inputs = list(patterns = pattern.file),
keep.vital.events = TRUE, lc.for.all = FALSE, replace.output = TRUE
)
# there isn't really a way to test that the patterns were used,
# apart from exploring the resulting mx, e.g.
# pop.byage.plot(pred, expression = "log(M218_M{age.index01(27)})", year = 2023)
# pop.byage.plot(pred, expression = "log(M218_M{age.index01(27)})", add = TRUE)
s <- summary(pred)
stopifnot(s$nr.traj == 3)
stopifnot(s$nr.countries == 3)
stopifnot(length(s$projection.years) == 16)
unlink(sim.dir, recursive = TRUE)
unlink(pattern.file)
test.ok(test.name)
}
test.age.specific.migration <- function(){
test.name <- paste('Generating age-specific migration')
start.test(test.name)
# Taken from Examples which are "dontrun"
asmig <- age.specific.migration()
stopifnot(all(dim(asmig$male) == c(4221, 33)))
stopifnot(all(dim(asmig$female) == c(4221, 33)))
# disaggregate WPP 2019 migration for all countries, one sex
data(migration, package = "wpp2019")
# assuming equal sex migration ratio
asmig.all <- migration.totals2age(migration, scale = 0.5, method = "rc")
# result for the US in 2095-2100
mig1sex.us <- subset(asmig.all, country_code == 840)[["2095-2100"]]
stopifnot(length(mig1sex.us) == 21)
stopifnot(mig1sex.us[1] > 2*mig1sex.us[3] && 8*mig1sex.us[3] < mig1sex.us[5] && mig1sex.us[21] == 0)
# check that the sum is half of the original total
stopifnot(sum(mig1sex.us) == subset(migration, country_code == 840)[["2095-2100"]]/2)
test.ok(test.name)
}
#TODO: test project.pasfr function
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.