Skip to content

Commit

Permalink
#47 adds new_expr_vec to model update
Browse files Browse the repository at this point in the history
  • Loading branch information
aylapear committed Jun 19, 2023
1 parent 9febc4e commit 14862ab
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 5 deletions.
9 changes: 4 additions & 5 deletions R/update-model.R
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
update_model <- function(model, code = NULL, gen_inits = NULL,
random_effects = NULL, fixed = NULL, derived = NULL, select_data = NULL,
center = NULL, scale = NULL, modify_data = NULL,
nthin = NULL, new_expr = NULL, modify_new_data = NULL,
nthin = NULL, new_expr = NULL, new_expr_vec = NULL, modify_new_data = NULL,
drops = NULL, ...) {
UseMethod("update_model")
}
Expand All @@ -19,11 +19,9 @@ update_model <- function(model, code = NULL, gen_inits = NULL,
update_model.mb_model <- function(model, code = NULL, gen_inits = NULL,
random_effects = NULL, fixed = NULL, derived = NULL, select_data = NULL,
center = NULL, scale = NULL, modify_data = NULL,
nthin = NULL, new_expr = NULL, modify_new_data = NULL,
nthin = NULL, new_expr = NULL, new_expr_vec = NULL, modify_new_data = NULL,
drops = NULL, ...) {



if (is.null(code)) code <- code(model)
if (is.null(gen_inits)) gen_inits <- model$gen_inits
if (is.null(random_effects)) random_effects <- model$random_effects
Expand All @@ -34,7 +32,7 @@ update_model.mb_model <- function(model, code = NULL, gen_inits = NULL,
if (is.null(scale)) scale <- model$scale
if (is.null(modify_data)) modify_data <- model$modify_data
if (is.null(nthin)) nthin <- model$nthin
new_expr <- enexpr_new_expr({{ new_expr }}, default = model$new_expr)
new_expr <- enexpr_new_expr({{ new_expr }}, default = model$new_expr, vectorize = new_expr_vec)
if (is.null(modify_new_data)) modify_new_data <- model$modify_new_data
if (is.null(drops)) drops <- model$drops

Expand All @@ -50,6 +48,7 @@ update_model.mb_model <- function(model, code = NULL, gen_inits = NULL,
modify_data = modify_data,
nthin = nthin,
new_expr = !!new_expr,
new_expr_vec = new_expr_vec,
modify_new_data = modify_new_data,
drops = drops
))
Expand Down
12 changes: 12 additions & 0 deletions tests/testthat/_snaps/new-expr-update.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,15 @@
residual <- res_lnorm(Density, fit, exp(log_sDensity))
}

# add new_expr_vec argument to update model

Code
new_expr(analysis)
Output
for (i in 1:length(Density)) {
fit[i] <- bIntercept + bYear * Year[i] + bHabitatQuality[HabitatQuality[i]] +
bSiteYear[Site[i], YearFactor[i]]
log(prediction[i]) <- fit[i]
residual[i] <- res_lnorm(Density[i], fit[i], exp(log_sDensity))
}

76 changes: 76 additions & 0 deletions tests/testthat/test-new-expr-update.R
Original file line number Diff line number Diff line change
Expand Up @@ -142,3 +142,79 @@ random_effects = list(bSiteYear = c("Site", "YearFactor")))
local_edition(3)
expect_snapshot(new_expr(analysis))
})

test_that("add new_expr_vec argument to update model", {
skip_if_not_installed("jmbr")

set_analysis_mode("quick")

data <- embr::density99
data$YearFactor <- factor(data$Year)

model <- model("model{
bIntercept ~ dnorm(0, 5^-2)
bYear ~ dnorm(0, .5^-2) # bYear2 ~ dnorm(0, .5^-2)
bHabitatQuality[1] <- 0
for(i in 2:nHabitatQuality) {
bHabitatQuality[i] ~ dnorm(0, 5.^-2) T(0,)
}
log_sSiteYear ~ dlnorm(0, 5^-2)
log_sDensity ~ dt(0, 5^-2, 4.5)
log(sSiteYear) <- log_sSiteYear
log(sDensity) <- log_sDensity
for(i in 1:nSite) {
for(j in 1:nYearFactor) {
bSiteYear[i,j] ~ dnorm(0, sSiteYear^-2)
}
}
for(i in 1:length(Density)) {
eDensity[i] <- bIntercept + bYear * Year[i] + bHabitatQuality[HabitatQuality[i]] + bSiteYear[Site[i], YearFactor[i]]
Density[i] ~ dlnorm(eDensity[i], sDensity^-2)
}
}",
new_expr = "
for(i in 1:length(Density)) {
fit[i] <- bIntercept + bYear * Year[i] + bHabitatQuality[HabitatQuality[i]] + bSiteYear[Site[i], YearFactor[i]]
log(prediction[i]) <- fit[i]
residual[i] <- res_lnorm(Density[i], fit[i], exp(log_sDensity))
}",
new_expr_vec = TRUE,
select_data = list("Year+" = numeric(), YearFactor = factor(),
Site = factor(), Density = numeric(),
HabitatQuality = factor()),
fixed = "^(b|l)", derived = "eDensity",
random_effects = list(bSiteYear = c("Site", "YearFactor")))

model <- update_model(
model,
new_expr =
"
for(i in 1:length(Density)) {
fit[i] <- bIntercept + bYear * Year[i] + bHabitatQuality[HabitatQuality[i]] + bSiteYear[Site[i], YearFactor[i]]
log(prediction[i]) <- fit[i]
residual[i] <- res_lnorm(Density[i], fit[i], exp(log_sDensity))
}",
new_expr_vec = FALSE
)
expect_output(expect_warning(analysis <- analyse(model, data = data)))

year <- predict(analysis, new_data = "Year")

expect_is(year, "tbl")
expect_identical(colnames(year), c("Site", "HabitatQuality", "Year", "Visit",
"Density", "YearFactor",
"estimate", "lower", "upper", "svalue"))
expect_true(all(year$lower < year$estimate))
expect_false(is.unsorted(year$estimate))

local_edition(3)
expect_snapshot(new_expr(analysis))
})


0 comments on commit 14862ab

Please sign in to comment.