## ----setup, include = FALSE--------------------------------------------------- knitr::opts_chunk$set( collapse = TRUE, comment = "#>", fig.width = 6, fig.height = 6 ) ## ---- echo = TRUE, eval = TRUE------------------------------------------------ library("detectseparation") ## ---- tiny_example------------------------------------------------------------ data <- data.frame(a = c(1, 0, 3, 2, 3, 4), b = c(2, 1, 1, 4, 6, 8), y = c(0, 0, 0, 1, 1, 1)) ## ---- tiny_example_sep-------------------------------------------------------- glm(y ~ a + b, data = data, family = binomial("logit"), method = "detect_separation") ## ---- tiny_example_sep_lbrm--------------------------------------------------- glm(y ~ a + b, data = data, family = binomial("log"), method = "detect_separation") ## ---- tiny_example_inf_est---------------------------------------------------- glm(y ~ a + b, data = data, family = binomial("logit"), method = "detect_infinite_estimates") ## ----------------------------------------------------------------------------- glm(y ~ a + b, data = data, family = binomial("log"), method = "detect_infinite_estimates") ## ---- glm_fit----------------------------------------------------------------- fit <- try(glm(y ~ a + b, data = data, family = binomial("log"))) ## ----------------------------------------------------------------------------- args(glm.control) ## ---- tiny_example_inf_esti_log_separation------------------------------------ formula <- y ~ a + b start <- c(-1, double(ncol(model.matrix(formula, data = data)) - 1L)) ctrl = glm.control(epsilon = 1e-8, maxit = 10000, trace = FALSE) suppressWarnings( fit <- glm(formula, data = data, family = binomial("log"), start = start, control = ctrl) ) summary(fit) ## ----------------------------------------------------------------------------- print(mm <- drop(model.matrix(formula, data) %*% coef(fit))) abs(drop(mm)) < 1e-6 ## ---- explain_output_detect_separation---------------------------------------- glm(y ~ a + b, data = data, family = binomial("logit"), method = "detect_separation") ## ---- explain_output_detect_infinite_estimates-------------------------------- glm(y ~ a + b, data = data, family = binomial("log"), method = "detect_infinite_estimates") ## ----------------------------------------------------------------------------- find_start_simple <- function(formula, data) { c(-1, double(ncol(model.matrix(formula, data = data)) - 1L)) } find_start_simple(formula, data) max(model.matrix(formula, data = data) %*% find_start_simple(formula, data)) ## ----------------------------------------------------------------------------- find_start_poisson <- function(formula, data, delta = 1) { b0 <- coef(glm(formula, data, family = poisson(link = "log"))) mX <- -model.matrix(formula, data = data)[, -1L, drop = FALSE] b0[1] <- min(mX %*% b0[-1]) - delta b0 } find_start_poisson(formula, data) max(model.matrix(formula, data = data) %*% find_start_poisson(formula, data))