
R Under development (unstable) (2021-01-28 r79896) -- "Unsuffered Consequences"
Copyright (C) 2021 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.

> options(na.action=na.exclude) # preserve missings
> options(contrasts=c('contr.treatment', 'contr.poly')) #ensure constrast type
> library(survival)
> 
> #
> # A test to exercise the "infinity" check on 2 variables
> #
> test3 <- data.frame(futime=1:12, fustat=c(1,0,1,0,1,0,0,0,0,0,0,0),
+ 		   x1=rep(0:1,6), x2=c(rep(0,6), rep(1,6)))
> 
> # This will produce a warning message, which is the point of the test.
> # The variance is close to singular and gives different answers 
> #  on different machines
> fit3 <- coxph(Surv(futime, fustat) ~ x1 + x2, test3, iter=25)
Warning message:
In coxph.fit(X, Y, istrat, offset, init, control, weights = weights,  :
  Loglik converged before variable  1,2 ; coefficient may be infinite. 
> 
> all(fit3$coef < -22)
[1] TRUE
> all.equal(round(fit3$log, 4),c(-6.8669, -1.7918))
[1] TRUE
> 
> #
> # Actual solution
> #  time 1, 12 at risk,  3 each of x1/x2 = 00, 01, 10, 11
> #  time 2, 10 at risk,                     2, 3,  2 ,  3
> #  time 5, 8  at risk,                     1, 3,  1,   3
> # Let r1 = exp(beta1), r2= exp(beta2)
> # loglik = -log(3 + 3r1 + 3r2 + 3 r1*r2) - log(2 + 2r1 + 3r2 + 3 r1*r2) -
> #           log(1 + r1  + 3r2 + 3 r1*r2)
> true <- function(beta) {
+     r1 <- exp(beta[1])
+     r2 <- exp(beta[2])
+     loglik <- -log(3*(1+ r1+ r2+ r1*r2)) - log(2+ 2*r1 + 3*r2 + 3*r1*r2) -
+                log(1 + r1 + 3*r2 + 3*r1*r2)
+     loglik
+ }
> 
> all.equal(fit3$loglik[2], true(fit3$coef), check.attributes=FALSE)
[1] TRUE
> 
> proc.time()
   user  system elapsed 
  0.828   0.048   0.867 
