Nothing
skip_if(!is_slendr_env_present())
seed <- 42 # random seed
seq_len <- 2e5 # amount of sequence to simulate
rec_rate <- 1e-8 # uniform recombination rate
mut_rate <- 1e-8 # mutation rate
# forward models ----------------------------------------------------------
o <- population("o", time = 1, N = 1)
b <- population("b", parent = o, time = 500, N = 10)
c <- population("c", parent = b, time = 1000, N = 10)
x1 <- population("x1", parent = c, time = 2000, N = 10)
x2 <- population("x2", parent = c, time = 2000, N = 10)
a <- population("a", parent = b, time = 1500, N = 10)
forward_model_dir <- paste0(tempfile(), "_forward")
forward_model <- compile_model(populations = list(a, b, x1, x2, c, o), path = forward_model_dir,
generation_time = 1, overwrite = TRUE, force = TRUE, simulation_length = 2200,
description = "The most incredible popgen model ever")
forward_samples <- rbind(
schedule_sampling(forward_model, times = 2200, list(a, 1), list(b, 1), list(x1, 10), list(x2, 10), list(c, 1), list(o, 1)),
schedule_sampling(forward_model, times = c(2000, 2050, 1123), list(a, 1), list(b, 1), list(x1, 10), list(x2, 10), list(c, 1), list(o, 1))
)
ts_forward_slim <- tempfile(fileext = ".trees")
ts_forward_msprime <- tempfile(fileext = ".trees")
slim(forward_model, sequence_length = seq_len, recombination_rate = rec_rate, output = ts_forward_slim, samples = forward_samples, random_seed = seed)
msprime(forward_model, sequence_length = seq_len, recombination_rate = rec_rate, output = ts_forward_msprime, samples = forward_samples, random_seed = seed)
forward_sts <- ts_load(model = forward_model, file = ts_forward_slim)
forward_mts <- ts_load(model = forward_model, file = ts_forward_msprime)
test_that("msprime and SLiM metadata is exactly the same (forward model)", {
fields <- c("version", "description", "sampling")
s_meta <- ts_metadata(forward_sts)[fields]
m_meta <- ts_metadata(forward_mts)[fields]
expect_true(all(sapply(fields, function(f) all(s_meta[[f]] == m_meta[[f]]))))
args <- c("RECOMB_RATE", "SEED", "SEQUENCE_LENGTH", "SIMULATION_LENGTH")
s_args <- ts_metadata(forward_sts)$arguments[args]
m_args <- ts_metadata(forward_mts)$arguments[args]
expect_true(all(sapply(args, function(f) all(s_args[[f]] == m_args[[f]]))))
})
test_that("msprime and SLiM sampling tables are exactly the same (forward model)", {
expect_true(all(ts_samples(forward_sts) == ts_samples(forward_mts)))
})
test_that("sampling more individuals than is the current N triggers warning (forward model)", {
forward_samples <- schedule_sampling(forward_model, times = c(2000, 2050, 1123), list(a, 1), list(x1, 1000), list(x2, 1000))
expect_warning(
slim(forward_model, sequence_length = seq_len, recombination_rate = rec_rate, samples = forward_samples, random_seed = seed),
"There were some warnings during the simulation run"
)
})
# backward models ---------------------------------------------------------
o <- population("o", time = 2500, N = 1)
b <- population("b", parent = o, time = 2000, N = 10)
c <- population("c", parent = b, time = 1500, N = 10)
x1 <- population("x1", parent = c, time = 500, N = 10)
x2 <- population("x2", parent = c, time = 500, N = 10)
a <- population("a", parent = b, time = 1000, N = 10)
backward_model_dir <- paste0(tempfile(), "_backward")
backward_model <- compile_model(populations = list(a, b, x1, x2, c, o), path = backward_model_dir,
generation_time = 1, overwrite = TRUE, force = TRUE,
description = "The most incredible backward model ever")
# lets not fuss about the exact sampling -- this doesn't match exactly the
# forward model in the previous section, but we do want to make some samplings
# predate the appearance of certain populations to make the sampling schedule a
# bit more complex
# TODO: check what exactly happens if more individuals are scheduled for
# sampling than the number of individuals in the simulation being present (SLiM
# should only sample the maximum that is available, but what does msprime do
# here?)
backward_samples <- rbind(
schedule_sampling(backward_model, times = 0, list(a, 1), list(b, 1), list(x1, 10), list(x2, 10), list(c, 1), list(o, 1)),
schedule_sampling(backward_model, times = c(123, 250, 1000), list(a, 1), list(b, 1), list(x1, 10), list(x2, 10), list(c, 1), list(o, 1))
)
ts_backward_slim <- tempfile(fileext = ".trees")
ts_backward_msprime <- tempfile(fileext = ".trees")
slim(backward_model, output = ts_backward_slim, sequence_length = seq_len, recombination_rate = rec_rate, samples = backward_samples, random_seed = seed)
msprime(backward_model, output = ts_backward_msprime, sequence_length = seq_len, recombination_rate = rec_rate, samples = backward_samples, random_seed = seed)
backward_sts <- ts_load(model = backward_model, file = ts_backward_slim)
backward_mts <- ts_load(model = backward_model, file = ts_backward_msprime)
test_that("msprime and SLiM metadata is exactly the same (backward model)", {
fields <- c("version", "description", "sampling")
s_meta <- ts_metadata(backward_sts)[fields]
m_meta <- ts_metadata(backward_mts)[fields]
expect_true(all(sapply(fields, function(f) all(s_meta[[f]] == m_meta[[f]]))))
args <- c("RECOMB_RATE", "SEED", "SEQUENCE_LENGTH", "SIMULATION_LENGTH")
s_args <- ts_metadata(backward_sts)$arguments[args]
m_args <- ts_metadata(backward_mts)$arguments[args]
expect_true(all(sapply(args, function(f) all(s_args[[f]] == m_args[[f]]))))
})
test_that("msprime and SLiM sampling tables are exactly the same (backward model)", {
expect_true(all(ts_samples(backward_sts) == ts_samples(backward_mts)))
})
test_that("sampling more individuals than is the current N triggers warning (backward model)", {
backward_samples <- schedule_sampling(backward_model, times = c(123, 250, 1000), list(a, 1000), list(x1, 10), list(x2, 10), list(c, 1000))
expect_warning(
slim(backward_model, sequence_length = seq_len, recombination_rate = rec_rate, samples = backward_samples, random_seed = seed),
"There were some warnings during the simulation run"
)
})
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.