
R version 3.6.2 Patched (2020-02-12 r77795) -- "Dark and Stormy Night"
Copyright (C) 2020 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

> ## Example in which the fit for the null deviance fails to converge:
> # https://stat.ethz.ch/pipermail/r-help/2012-May/313161.html
> Y <- c(rep(0,35),1,2,0,6,8,16,43)
> beta <- 42:1
> cst <- lchoose(42, beta)
> tau <- (beta^2)/2
> fit <- glm(formula = Y ~ offset(cst) + beta + tau, family = poisson)
Warning messages:
1: glm.fit: algorithm did not converge 
2: In glm(formula = Y ~ offset(cst) + beta + tau, family = poisson) :
  fitting to calculate the null deviance did not converge -- increase 'maxit'?
> 
> ## Ensure make.link() consistency:
> linkNames <- c("logit", "probit", "cauchit", "cloglog",
+                "identity",
+                "log",  "sqrt",  "1/mu^2", "inverse")
> links <- lapply(setNames(,linkNames), make.link)
> fns <- c("linkfun", "linkinv", "mu.eta", "valideta")
> stopifnot(exprs = {
+     is.matrix(nms <- sapply(links, names)) # matching number & type
+     is.character(nms)
+     nms[,1] == nms ## all columns are the same
+     identical(setNames(,linkNames), vapply(links, `[[`, "", "name"))
+     fns %in% nms[,1]
+ })
> links <- lapply(links, `[`, fns) # functions only
> stopifnot(unlist(lapply(links, function(L) vapply(L, is.function, NA))))
> ## all functions having consistent arguments :
> lf <- lapply(links, function(L) lapply(L, formals))
> stopifnot(exprs = { ## all functions have 1 argument
+     unlist(lapply(lf, lengths), recursive=FALSE) == 1L
+     is.matrix(argNms <- sapply(lf, function(L) vapply(L, names, "")))
+     argNms[,1] == argNms ## all columns are the same
+ })
> noquote(t(argNms))
         linkfun linkinv mu.eta valideta
logit    mu      eta     eta    eta     
probit   mu      eta     eta    eta     
cauchit  mu      eta     eta    eta     
cloglog  mu      eta     eta    eta     
identity mu      eta     eta    eta     
log      mu      eta     eta    eta     
sqrt     mu      eta     eta    eta     
1/mu^2   mu      eta     eta    eta     
inverse  mu      eta     eta    eta     
> 
> ## Calling all functions
> ## 1. valideta
> stopifnot(vv <- vapply(links, function(L) L$valideta((1:3)/4), NA))
> ## 2. all others
> other <- fns != "valideta"
> str(linkO <- lapply(links, function(L) L[other]))
List of 9
 $ logit   :List of 3
  ..$ linkfun:function (mu)  
  ..$ linkinv:function (eta)  
  ..$ mu.eta :function (eta)  
 $ probit  :List of 3
  ..$ linkfun:function (mu)  
  ..$ linkinv:function (eta)  
  ..$ mu.eta :function (eta)  
 $ cauchit :List of 3
  ..$ linkfun:function (mu)  
  ..$ linkinv:function (eta)  
  ..$ mu.eta :function (eta)  
 $ cloglog :List of 3
  ..$ linkfun:function (mu)  
  ..$ linkinv:function (eta)  
  ..$ mu.eta :function (eta)  
 $ identity:List of 3
  ..$ linkfun:function (mu)  
  ..$ linkinv:function (eta)  
  ..$ mu.eta :function (eta)  
 $ log     :List of 3
  ..$ linkfun:function (mu)  
  ..$ linkinv:function (eta)  
  ..$ mu.eta :function (eta)  
 $ sqrt    :List of 3
  ..$ linkfun:function (mu)  
  ..$ linkinv:function (eta)  
  ..$ mu.eta :function (eta)  
 $ 1/mu^2  :List of 3
  ..$ linkfun:function (mu)  
  ..$ linkinv:function (eta)  
  ..$ mu.eta :function (eta)  
 $ inverse :List of 3
  ..$ linkfun:function (mu)  
  ..$ linkinv:function (eta)  
  ..$ mu.eta :function (eta)  
> v <- sapply(linkO, function(L) sapply(L, function(F) F((0:4)/4)),
+             simplify = "array")
> stopifnot(exprs = {
+     is.numeric(v)
+     identical(dim(v), c(5L, sum(other), length(links)))
+     identical(dimnames(v)[[2]], fns[other])
+     ## check that all functions are monotone (incr. _or_ decr.) <==>
+     ## signs of differences are constant <==> var(*) == 0
+     apply(v, 2:3, function(f) var(sign(diff(f))) == 0)
+ })
> 
> ## Could further check  [for 'okLinks' of given families]:
> ##	<family>(          "<linkname>")  ==
> ##      <family>(make.link("<linkname>"))
> 
> 
> ## <family>$aic() vs logLik() vs AIC() -- for Gamma:
> # From example(glm) :
> clotting <- data.frame(
+     u    = c( 5, 10,15,20,30,40,60,80,100),
+     lot1 = c(118,58,42,35,27,25,21,19,18),
+     lot2 = c(69, 35,26,21,18,16,13,12,12))
> summary(fm1 <- glm(lot1 ~ log(u), data = clotting, family = Gamma))

Call:
glm(formula = lot1 ~ log(u), family = Gamma, data = clotting)

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-0.04008  -0.03756  -0.02637   0.02905   0.08641  

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) -0.0165544  0.0009275  -17.85 4.28e-07 ***
log(u)       0.0153431  0.0004150   36.98 2.75e-09 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for Gamma family taken to be 0.002446059)

    Null deviance: 3.51283  on 8  degrees of freedom
Residual deviance: 0.01673  on 7  degrees of freedom
AIC: 37.99

Number of Fisher Scoring iterations: 3

> summary(fm2 <- glm(lot2 ~ log(u), data = clotting, family = Gamma))

Call:
glm(formula = lot2 ~ log(u), family = Gamma, data = clotting)

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-0.05574  -0.02925   0.01030   0.01714   0.06371  

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) -0.0239085  0.0013265  -18.02 4.00e-07 ***
log(u)       0.0235992  0.0005768   40.91 1.36e-09 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for Gamma family taken to be 0.001813354)

    Null deviance: 3.118557  on 8  degrees of freedom
Residual deviance: 0.012672  on 7  degrees of freedom
AIC: 27.032

Number of Fisher Scoring iterations: 3

> 
> hasDisp <- 1 # have dispersion (here, but not e.g., for binomial, poisson)
> for(fm in list(fm1, fm2)) {
+     print(ll <- logLik(fm))
+     p <- attr(ll, "df")
+     A0 <- AIC(fm)
+     A1 <- -2*c(ll) + 2*p
+     aic.v <- fm$family$aic(y  = fm$y, mu = fitted(fm),
+                            wt = weights(fm), dev= deviance(fm))
+     stopifnot(p == (p. <- length(coef(fm))) + hasDisp,
+               all.equal(-2*c(ll) + 2*hasDisp, aic.v)) # <fam>$aic() = -2 * loglik + 2s
+     A2 <- aic.v + 2 * p.
+     stopifnot(exprs = {
+         all.equal(A0, A1)
+         all.equal(A1, A2)
+         all.equal(A1, fm$aic)
+     })
+ }
'log Lik.' -15.99496 (df=3)
'log Lik.' -10.51608 (df=3)
> 
> 
> 
> proc.time()
   user  system elapsed 
  0.250   0.051   0.277 
