|
@@ -127,11 +127,26 @@ test_that("get_changepoints", {
|
|
|
cp <- m$changepoints.t
|
|
|
expect_equal(length(cp), m$n.changepoints)
|
|
|
expect_true(min(cp) > 0)
|
|
|
- expect_true(max(cp) < N)
|
|
|
+ expect_true(max(cp) <= history$t[ceiling(0.8 * length(history$t))])
|
|
|
+})
|
|
|
+
|
|
|
+test_that("set_changepoint_range", {
|
|
|
+ history <- train
|
|
|
+ m <- prophet(history, fit = FALSE, changepoint.range = 0.4)
|
|
|
+
|
|
|
+ out <- prophet:::setup_dataframe(m, history, initialize_scales = TRUE)
|
|
|
+ history <- out$df
|
|
|
+ m <- out$m
|
|
|
+ m$history <- history
|
|
|
|
|
|
- mat <- prophet:::get_changepoint_matrix(m)
|
|
|
- expect_equal(nrow(mat), floor(N / 2))
|
|
|
- expect_equal(ncol(mat), m$n.changepoints)
|
|
|
+ m <- prophet:::set_changepoints(m)
|
|
|
+
|
|
|
+ cp <- m$changepoints.t
|
|
|
+ expect_equal(length(cp), m$n.changepoints)
|
|
|
+ expect_true(min(cp) > 0)
|
|
|
+ expect_true(max(cp) <= history$t[ceiling(0.4 * length(history$t))])
|
|
|
+ expect_error(prophet(history, changepoint.range = -0.1))
|
|
|
+ expect_error(prophet(history, changepoint.range = 2))
|
|
|
})
|
|
|
|
|
|
test_that("get_zero_changepoints", {
|
|
@@ -147,10 +162,6 @@ test_that("get_zero_changepoints", {
|
|
|
cp <- m$changepoints.t
|
|
|
expect_equal(length(cp), 1)
|
|
|
expect_equal(cp[1], 0)
|
|
|
-
|
|
|
- mat <- prophet:::get_changepoint_matrix(m)
|
|
|
- expect_equal(nrow(mat), floor(N / 2))
|
|
|
- expect_equal(ncol(mat), 1)
|
|
|
})
|
|
|
|
|
|
test_that("override_n_changepoints", {
|
|
@@ -239,7 +250,7 @@ test_that("piecewise_logistic", {
|
|
|
})
|
|
|
|
|
|
test_that("holidays", {
|
|
|
- holidays = data.frame(ds = c('2016-12-25'),
|
|
|
+ holidays <- data.frame(ds = c('2016-12-25'),
|
|
|
holiday = c('xmas'),
|
|
|
lower_window = c(-1),
|
|
|
upper_window = c(0))
|
|
@@ -250,12 +261,14 @@ test_that("holidays", {
|
|
|
out <- prophet:::make_holiday_features(m, df$ds)
|
|
|
feats <- out$holiday.features
|
|
|
priors <- out$prior.scales
|
|
|
+ names <- out$holiday.names
|
|
|
expect_equal(nrow(feats), nrow(df))
|
|
|
expect_equal(ncol(feats), 2)
|
|
|
expect_equal(sum(colSums(feats) - c(1, 1)), 0)
|
|
|
expect_true(all(priors == c(10., 10.)))
|
|
|
+ expect_equal(names, c('xmas'))
|
|
|
|
|
|
- holidays = data.frame(ds = c('2016-12-25'),
|
|
|
+ holidays <- data.frame(ds = c('2016-12-25'),
|
|
|
holiday = c('xmas'),
|
|
|
lower_window = c(-1),
|
|
|
upper_window = c(10))
|
|
@@ -263,9 +276,11 @@ test_that("holidays", {
|
|
|
out <- prophet:::make_holiday_features(m, df$ds)
|
|
|
feats <- out$holiday.features
|
|
|
priors <- out$prior.scales
|
|
|
+ names <- out$holiday.names
|
|
|
expect_equal(nrow(feats), nrow(df))
|
|
|
expect_equal(ncol(feats), 12)
|
|
|
expect_true(all(priors == rep(10, 12)))
|
|
|
+ expect_equal(names, c('xmas'))
|
|
|
# Check prior specifications
|
|
|
holidays <- data.frame(
|
|
|
ds = prophet:::set_date(c('2016-12-25', '2017-12-25')),
|
|
@@ -277,7 +292,9 @@ test_that("holidays", {
|
|
|
m <- prophet(holidays = holidays, fit = FALSE)
|
|
|
out <- prophet:::make_holiday_features(m, df$ds)
|
|
|
priors <- out$prior.scales
|
|
|
+ names <- out$holiday.names
|
|
|
expect_true(all(priors == c(5., 5.)))
|
|
|
+ expect_equal(names, c('xmas'))
|
|
|
# 2 different priors
|
|
|
holidays2 <- data.frame(
|
|
|
ds = prophet:::set_date(c('2012-06-06', '2013-06-06')),
|
|
@@ -290,7 +307,9 @@ test_that("holidays", {
|
|
|
m <- prophet(holidays = holidays2, fit = FALSE)
|
|
|
out <- prophet:::make_holiday_features(m, df$ds)
|
|
|
priors <- out$prior.scales
|
|
|
+ names <- out$holiday.names
|
|
|
expect_true(all(priors == c(8, 8, 5, 5)))
|
|
|
+ expect_true(all(sort(names) == c('seans-bday', 'xmas')))
|
|
|
holidays2 <- data.frame(
|
|
|
ds = prophet:::set_date(c('2012-06-06', '2013-06-06')),
|
|
|
holiday = c('seans-bday', 'seans-bday'),
|
|
@@ -353,7 +372,8 @@ test_that("auto_weekly_seasonality", {
|
|
|
expect_equal(m$weekly.seasonality, 'auto')
|
|
|
m <- fit.prophet(m, train.w)
|
|
|
expect_true('weekly' %in% names(m$seasonalities))
|
|
|
- true <- list(period = 7, fourier.order = 3, prior.scale = 10)
|
|
|
+ true <- list(
|
|
|
+ period = 7, fourier.order = 3, prior.scale = 10, mode = 'additive')
|
|
|
for (name in names(true)) {
|
|
|
expect_equal(m$seasonalities$weekly[[name]], true[[name]])
|
|
|
}
|
|
@@ -372,7 +392,8 @@ test_that("auto_weekly_seasonality", {
|
|
|
m <- prophet(train.w)
|
|
|
expect_false('weekly' %in% names(m$seasonalities))
|
|
|
m <- prophet(DATA, weekly.seasonality = 2, seasonality.prior.scale = 3)
|
|
|
- true <- list(period = 7, fourier.order = 2, prior.scale = 3)
|
|
|
+ true <- list(
|
|
|
+ period = 7, fourier.order = 2, prior.scale = 3, mode = 'additive')
|
|
|
for (name in names(true)) {
|
|
|
expect_equal(m$seasonalities$weekly[[name]], true[[name]])
|
|
|
}
|
|
@@ -385,7 +406,8 @@ test_that("auto_yearly_seasonality", {
|
|
|
expect_equal(m$yearly.seasonality, 'auto')
|
|
|
m <- fit.prophet(m, DATA)
|
|
|
expect_true('yearly' %in% names(m$seasonalities))
|
|
|
- true <- list(period = 365.25, fourier.order = 10, prior.scale = 10)
|
|
|
+ true <- list(
|
|
|
+ period = 365.25, fourier.order = 10, prior.scale = 10, mode = 'additive')
|
|
|
for (name in names(true)) {
|
|
|
expect_equal(m$seasonalities$yearly[[name]], true[[name]])
|
|
|
}
|
|
@@ -397,7 +419,8 @@ test_that("auto_yearly_seasonality", {
|
|
|
m <- prophet(train.y, yearly.seasonality = TRUE)
|
|
|
expect_true('yearly' %in% names(m$seasonalities))
|
|
|
m <- prophet(DATA, yearly.seasonality = 7, seasonality.prior.scale = 3)
|
|
|
- true <- list(period = 365.25, fourier.order = 7, prior.scale = 3)
|
|
|
+ true <- list(
|
|
|
+ period = 365.25, fourier.order = 7, prior.scale = 3, mode = 'additive')
|
|
|
for (name in names(true)) {
|
|
|
expect_equal(m$seasonalities$yearly[[name]], true[[name]])
|
|
|
}
|
|
@@ -410,7 +433,8 @@ test_that("auto_daily_seasonality", {
|
|
|
expect_equal(m$daily.seasonality, 'auto')
|
|
|
m <- fit.prophet(m, DATA2)
|
|
|
expect_true('daily' %in% names(m$seasonalities))
|
|
|
- true <- list(period = 1, fourier.order = 4, prior.scale = 10)
|
|
|
+ true <- list(
|
|
|
+ period = 1, fourier.order = 4, prior.scale = 10, mode = 'additive')
|
|
|
for (name in names(true)) {
|
|
|
expect_equal(m$seasonalities$daily[[name]], true[[name]])
|
|
|
}
|
|
@@ -422,7 +446,8 @@ test_that("auto_daily_seasonality", {
|
|
|
m <- prophet(train.y, daily.seasonality = TRUE)
|
|
|
expect_true('daily' %in% names(m$seasonalities))
|
|
|
m <- prophet(DATA2, daily.seasonality = 7, seasonality.prior.scale = 3)
|
|
|
- true <- list(period = 1, fourier.order = 7, prior.scale = 3)
|
|
|
+ true <- list(
|
|
|
+ period = 1, fourier.order = 7, prior.scale = 3, mode = 'additive')
|
|
|
for (name in names(true)) {
|
|
|
expect_equal(m$seasonalities$daily[[name]], true[[name]])
|
|
|
}
|
|
@@ -446,7 +471,8 @@ test_that("custom_seasonality", {
|
|
|
prior_scale = c(4))
|
|
|
m <- prophet(holidays=holidays)
|
|
|
m <- add_seasonality(m, name='monthly', period=30, fourier.order=5)
|
|
|
- true <- list(period = 30, fourier.order = 5, prior.scale = 10)
|
|
|
+ true <- list(
|
|
|
+ period = 30, fourier.order = 5, prior.scale = 10, mode = 'additive')
|
|
|
for (name in names(true)) {
|
|
|
expect_equal(m$seasonalities$monthly[[name]], true[[name]])
|
|
|
}
|
|
@@ -458,12 +484,25 @@ test_that("custom_seasonality", {
|
|
|
)
|
|
|
m <- add_seasonality(m, name='weekly', period=30, fourier.order=5)
|
|
|
# Test priors
|
|
|
- m <- prophet(holidays = holidays, yearly.seasonality = FALSE)
|
|
|
+ m <- prophet(
|
|
|
+ holidays = holidays, yearly.seasonality = FALSE,
|
|
|
+ seasonality.mode = 'multiplicative')
|
|
|
m <- add_seasonality(
|
|
|
- m, name='monthly', period=30, fourier.order=5, prior.scale = 2)
|
|
|
+ m, name='monthly', period=30, fourier.order=5, prior.scale = 2,
|
|
|
+ mode = 'additive')
|
|
|
m <- fit.prophet(m, DATA)
|
|
|
- prior.scales <- prophet:::make_all_seasonality_features(
|
|
|
- m, m$history)$prior.scales
|
|
|
+ expect_equal(m$seasonalities$monthly$mode, 'additive')
|
|
|
+ expect_equal(m$seasonalities$weekly$mode, 'multiplicative')
|
|
|
+ out <- prophet:::make_all_seasonality_features(m, m$history)
|
|
|
+ prior.scales <- out$prior.scales
|
|
|
+ component.cols <- out$component.cols
|
|
|
+ expect_equal(sum(component.cols$monthly), 10)
|
|
|
+ expect_equal(sum(component.cols$special_day), 1)
|
|
|
+ expect_equal(sum(component.cols$weekly), 6)
|
|
|
+ expect_equal(sum(component.cols$additive_terms), 10)
|
|
|
+ expect_equal(sum(component.cols$multiplicative_terms), 7)
|
|
|
+ expect_equal(sum(component.cols$monthly[1:11]), 10)
|
|
|
+ expect_equal(sum(component.cols$weekly[11:17]), 6)
|
|
|
expect_true(all(prior.scales == c(rep(2, 10), rep(10, 6), 4)))
|
|
|
})
|
|
|
|
|
@@ -472,10 +511,13 @@ test_that("added_regressors", {
|
|
|
m <- prophet()
|
|
|
m <- add_regressor(m, 'binary_feature', prior.scale=0.2)
|
|
|
m <- add_regressor(m, 'numeric_feature', prior.scale=0.5)
|
|
|
+ m <- add_regressor(
|
|
|
+ m, 'numeric_feature2', prior.scale=0.5, mode = 'multiplicative')
|
|
|
m <- add_regressor(m, 'binary_feature2', standardize=TRUE)
|
|
|
df <- DATA
|
|
|
df$binary_feature <- c(rep(0, 255), rep(1, 255))
|
|
|
df$numeric_feature <- 0:509
|
|
|
+ df$numeric_feature2 <- 0:509
|
|
|
# Require all regressors in df
|
|
|
expect_error(
|
|
|
fit.prophet(m, df)
|
|
@@ -483,7 +525,9 @@ test_that("added_regressors", {
|
|
|
df$binary_feature2 <- c(rep(1, 100), rep(0, 410))
|
|
|
m <- fit.prophet(m, df)
|
|
|
# Check that standardizations are correctly set
|
|
|
- true <- list(prior.scale = 0.2, mu = 0, std = 1, standardize = 'auto')
|
|
|
+ true <- list(
|
|
|
+ prior.scale = 0.2, mu = 0, std = 1, standardize = 'auto', mode = 'additive'
|
|
|
+ )
|
|
|
for (name in names(true)) {
|
|
|
expect_equal(true[[name]], m$extra_regressors$binary_feature[[name]])
|
|
|
}
|
|
@@ -492,6 +536,7 @@ test_that("added_regressors", {
|
|
|
expect_equal(true[[name]], m$extra_regressors$numeric_feature[[name]],
|
|
|
tolerance = 1e-5)
|
|
|
}
|
|
|
+ expect_equal(m$extra_regressors$numeric_feature2$mode, 'multiplicative')
|
|
|
true <- list(prior.scale = 10., mu = 0.1960784, std = 0.3974183)
|
|
|
for (name in names(true)) {
|
|
|
expect_equal(true[[name]], m$extra_regressors$binary_feature2[[name]],
|
|
@@ -506,97 +551,92 @@ test_that("added_regressors", {
|
|
|
out <- prophet:::make_all_seasonality_features(m, df2)
|
|
|
seasonal.features <- out$seasonal.features
|
|
|
prior.scales <- out$prior.scales
|
|
|
- expect_true('binary_feature' %in% colnames(seasonal.features))
|
|
|
- expect_true('numeric_feature' %in% colnames(seasonal.features))
|
|
|
- expect_true('binary_feature2' %in% colnames(seasonal.features))
|
|
|
- expect_equal(ncol(seasonal.features), 29)
|
|
|
- expect_true(all(sort(prior.scales[27:29]) == c(0.2, 0.5, 10.)))
|
|
|
+ component.cols <- out$component.cols
|
|
|
+ modes <- out$modes
|
|
|
+ expect_equal(ncol(seasonal.features), 30)
|
|
|
+ r_names <- c('binary_feature', 'numeric_feature', 'binary_feature2')
|
|
|
+ true.priors <- c(0.2, 0.5, 10.)
|
|
|
+ for (i in seq_along(r_names)) {
|
|
|
+ name <- r_names[i]
|
|
|
+ expect_true(name %in% colnames(seasonal.features))
|
|
|
+ expect_equal(sum(component.cols[[name]]), 1)
|
|
|
+ expect_equal(sum(prior.scales * component.cols[[name]]), true.priors[i])
|
|
|
+ }
|
|
|
# Check that forecast components are reasonable
|
|
|
future <- data.frame(
|
|
|
- ds = c('2014-06-01'), binary_feature = c(0), numeric_feature = c(10))
|
|
|
+ ds = c('2014-06-01'),
|
|
|
+ binary_feature = c(0),
|
|
|
+ numeric_feature = c(10),
|
|
|
+ numeric_feature2 = c(10)
|
|
|
+ )
|
|
|
expect_error(predict(m, future))
|
|
|
future$binary_feature2 <- 0.
|
|
|
fcst <- predict(m, future)
|
|
|
- expect_equal(ncol(fcst), 31)
|
|
|
+ expect_equal(ncol(fcst), 37)
|
|
|
expect_equal(fcst$binary_feature[1], 0)
|
|
|
- expect_equal(fcst$extra_regressors[1],
|
|
|
+ expect_equal(fcst$extra_regressors_additive[1],
|
|
|
fcst$numeric_feature[1] + fcst$binary_feature2[1])
|
|
|
- expect_equal(fcst$seasonalities[1], fcst$yearly[1] + fcst$weekly[1])
|
|
|
- expect_equal(fcst$seasonal[1],
|
|
|
- fcst$seasonalities[1] + fcst$extra_regressors[1])
|
|
|
- expect_equal(fcst$yhat[1], fcst$trend[1] + fcst$seasonal[1])
|
|
|
- # Check fails if constant extra regressor
|
|
|
- df$constant_feature <- 5
|
|
|
+ expect_equal(fcst$extra_regressors_multiplicative[1],
|
|
|
+ fcst$numeric_feature2[1])
|
|
|
+ expect_equal(fcst$additive_terms[1],
|
|
|
+ fcst$yearly[1] + fcst$weekly[1]
|
|
|
+ + fcst$extra_regressors_additive[1])
|
|
|
+ expect_equal(fcst$multiplicative_terms[1],
|
|
|
+ fcst$extra_regressors_multiplicative[1])
|
|
|
+ expect_equal(
|
|
|
+ fcst$yhat[1],
|
|
|
+ fcst$trend[1] * (1 + fcst$multiplicative_terms[1]) + fcst$additive_terms[1]
|
|
|
+ )
|
|
|
+ # Check works with constant extra regressor of 0
|
|
|
+ df$constant_feature <- 0
|
|
|
+ m <- prophet()
|
|
|
+ m <- add_regressor(m, 'constant_feature', standardize = TRUE)
|
|
|
+ m <- fit.prophet(m, df)
|
|
|
+ expect_equal(m$extra_regressors$constant_feature$std, 1)
|
|
|
+})
|
|
|
+
|
|
|
+test_that("set_seasonality_mode", {
|
|
|
+ skip_if_not(Sys.getenv('R_ARCH') != '/i386')
|
|
|
m <- prophet()
|
|
|
- m <- add_regressor(m, 'constant_feature')
|
|
|
- expect_error(fit.prophet(m, df))
|
|
|
+ expect_equal(m$seasonality.mode, 'additive')
|
|
|
+ m <- prophet(seasonality.mode = 'multiplicative')
|
|
|
+ expect_equal(m$seasonality.mode, 'multiplicative')
|
|
|
+ expect_error(prophet(seasonality.mode = 'batman'))
|
|
|
})
|
|
|
|
|
|
-test_that("copy", {
|
|
|
+test_that("seasonality_modes", {
|
|
|
skip_if_not(Sys.getenv('R_ARCH') != '/i386')
|
|
|
+ holidays <- data.frame(ds = c('2016-12-25'),
|
|
|
+ holiday = c('xmas'),
|
|
|
+ lower_window = c(-1),
|
|
|
+ upper_window = c(0))
|
|
|
+ m <- prophet(seasonality.mode = 'multiplicative', holidays = holidays)
|
|
|
+ m <- add_seasonality(
|
|
|
+ m, name = 'monthly', period = 30, fourier.order = 3, mode = 'additive')
|
|
|
+ m <- add_regressor(m, name = 'binary_feature', mode = 'additive')
|
|
|
+ m <- add_regressor(m, name = 'numeric_feature')
|
|
|
+ # Construct seasonal features
|
|
|
df <- DATA
|
|
|
- df$cap <- 200.
|
|
|
df$binary_feature <- c(rep(0, 255), rep(1, 255))
|
|
|
- inputs <- list(
|
|
|
- growth = c('linear', 'logistic'),
|
|
|
- yearly.seasonality = c(TRUE, FALSE),
|
|
|
- weekly.seasonality = c(TRUE, FALSE),
|
|
|
- daily.seasonality = c(TRUE, FALSE),
|
|
|
- holidays = c('null', 'insert_dataframe')
|
|
|
+ df$numeric_feature <- 0:509
|
|
|
+ out <- prophet:::setup_dataframe(m, df, initialize_scales = TRUE)
|
|
|
+ df <- out$df
|
|
|
+ m <- out$m
|
|
|
+ m$history <- df
|
|
|
+ m <- prophet:::set_auto_seasonalities(m)
|
|
|
+ out <- prophet:::make_all_seasonality_features(m, df)
|
|
|
+ component.cols <- out$component.cols
|
|
|
+ modes <- out$modes
|
|
|
+ expect_equal(sum(component.cols$additive_terms), 7)
|
|
|
+ expect_equal(sum(component.cols$multiplicative_terms), 29)
|
|
|
+ expect_equal(
|
|
|
+ sort(modes$additive),
|
|
|
+ c('additive_terms', 'binary_feature', 'extra_regressors_additive',
|
|
|
+ 'monthly')
|
|
|
+ )
|
|
|
+ expect_equal(
|
|
|
+ sort(modes$multiplicative),
|
|
|
+ c('extra_regressors_multiplicative', 'holidays', 'multiplicative_terms',
|
|
|
+ 'numeric_feature', 'weekly', 'xmas', 'yearly')
|
|
|
)
|
|
|
- products <- expand.grid(inputs)
|
|
|
- for (i in 1:length(products)) {
|
|
|
- if (products$holidays[i] == 'insert_dataframe') {
|
|
|
- holidays <- data.frame(ds=c('2016-12-25'), holiday=c('x'))
|
|
|
- } else {
|
|
|
- holidays <- NULL
|
|
|
- }
|
|
|
- m1 <- prophet(
|
|
|
- growth = as.character(products$growth[i]),
|
|
|
- changepoints = NULL,
|
|
|
- n.changepoints = 3,
|
|
|
- yearly.seasonality = products$yearly.seasonality[i],
|
|
|
- weekly.seasonality = products$weekly.seasonality[i],
|
|
|
- daily.seasonality = products$daily.seasonality[i],
|
|
|
- holidays = holidays,
|
|
|
- seasonality.prior.scale = 1.1,
|
|
|
- holidays.prior.scale = 1.1,
|
|
|
- changepoints.prior.scale = 0.1,
|
|
|
- mcmc.samples = 100,
|
|
|
- interval.width = 0.9,
|
|
|
- uncertainty.samples = 200,
|
|
|
- fit = FALSE
|
|
|
- )
|
|
|
- out <- prophet:::setup_dataframe(m1, df, initialize_scales = TRUE)
|
|
|
- m1 <- out$m
|
|
|
- m1$history <- out$df
|
|
|
- m1 <- prophet:::set_auto_seasonalities(m1)
|
|
|
- m2 <- prophet:::prophet_copy(m1)
|
|
|
- # Values should be copied correctly
|
|
|
- args <- c('growth', 'changepoints', 'n.changepoints', 'holidays',
|
|
|
- 'seasonality.prior.scale', 'holidays.prior.scale',
|
|
|
- 'changepoints.prior.scale', 'mcmc.samples', 'interval.width',
|
|
|
- 'uncertainty.samples')
|
|
|
- for (arg in args) {
|
|
|
- expect_equal(m1[[arg]], m2[[arg]])
|
|
|
- }
|
|
|
- expect_equal(FALSE, m2$yearly.seasonality)
|
|
|
- expect_equal(FALSE, m2$weekly.seasonality)
|
|
|
- expect_equal(FALSE, m2$daily.seasonality)
|
|
|
- expect_equal(m1$yearly.seasonality, 'yearly' %in% names(m2$seasonalities))
|
|
|
- expect_equal(m1$weekly.seasonality, 'weekly' %in% names(m2$seasonalities))
|
|
|
- expect_equal(m1$daily.seasonality, 'daily' %in% names(m2$seasonalities))
|
|
|
- }
|
|
|
- # Check for cutoff and custom seasonality and extra regressors
|
|
|
- changepoints <- seq.Date(as.Date('2012-06-15'), as.Date('2012-09-15'), by='d')
|
|
|
- cutoff <- as.Date('2012-07-25')
|
|
|
- m1 <- prophet(changepoints = changepoints)
|
|
|
- m1 <- add_seasonality(m1, 'custom', 10, 5)
|
|
|
- m1 <- add_regressor(m1, 'binary_feature')
|
|
|
- m1 <- fit.prophet(m1, df)
|
|
|
- m2 <- prophet:::prophet_copy(m1, cutoff)
|
|
|
- changepoints <- changepoints[changepoints <= cutoff]
|
|
|
- expect_equal(prophet:::set_date(changepoints), m2$changepoints)
|
|
|
- expect_true('custom' %in% names(m2$seasonalities))
|
|
|
- expect_true('binary_feature' %in% names(m2$extra_regressors))
|
|
|
})
|