To cite the hyper2 package in publications, please use Hankin (2017).
hepatitis_table <- read.table("hepatitis.txt",header=TRUE)
hepatitis_table[,1:3] <- hepatitis_table[,1:3] > 0
wanted <- !(apply(hepatitis_table[,1:3],1,sum) %in% c(0,3))
hepatitis_table <- hepatitis_table[wanted,]
hepatitis_table
## P Q E OC LNF
## 2 FALSE FALSE TRUE 63 61
## 3 FALSE TRUE FALSE 55 58
## 4 FALSE TRUE TRUE 18 17
## 5 TRUE FALSE FALSE 69 68
## 6 TRUE FALSE TRUE 17 20
## 7 TRUE TRUE FALSE 21 19
W <- hyper2(pnames=c("P","Q","E"))
Wi <- list()
for(i in seq_len(nrow(hepatitis_table))){
jj <- unlist(hepatitis_table[i,1:3])
negative <- names(jj)[jj==0]
positive <- names(jj)[jj==1]
Wi[[i]] <- ggrl(W,positive,negative)
}
hepatitis <- lsl(Wi,powers= hepatitis_table$OC)
hepatitis
## $suplists
## $suplists[[1]]
## [[1]]
## log( E * (E + P + Q)^-1 * P * (P + Q)^-1)
##
## [[2]]
## log( E * (E + P + Q)^-1 * (P + Q)^-1 * Q)
##
## attr(,"class")
## [1] "list" "suplist"
##
## $suplists[[2]]
## [[1]]
## log((E + P)^-1 * (E + P + Q)^-1 * P * Q)
##
## [[2]]
## log( E * (E + P)^-1 * (E + P + Q)^-1 * Q)
##
## attr(,"class")
## [1] "list" "suplist"
##
## $suplists[[3]]
## [[1]]
## log( E * (E + P)^-1 * (E + P + Q)^-1 * Q)
##
## [[2]]
## log( E * (E + P + Q)^-1 * (P + Q)^-1 * Q)
##
## attr(,"class")
## [1] "list" "suplist"
##
## $suplists[[4]]
## [[1]]
## log((E + P + Q)^-1 * (E + Q)^-1 * P * Q)
##
## [[2]]
## log( E * (E + P + Q)^-1 * (E + Q)^-1 * P)
##
## attr(,"class")
## [1] "list" "suplist"
##
## $suplists[[5]]
## [[1]]
## log( E * (E + P + Q)^-1 * (E + Q)^-1 * P)
##
## [[2]]
## log( E * (E + P + Q)^-1 * P * (P + Q)^-1)
##
## attr(,"class")
## [1] "list" "suplist"
##
## $suplists[[6]]
## [[1]]
## log((E + P + Q)^-1 * (E + Q)^-1 * P * Q)
##
## [[2]]
## log((E + P)^-1 * (E + P + Q)^-1 * P * Q)
##
## attr(,"class")
## [1] "list" "suplist"
##
##
## $powers
## [1] 63 55 18 69 17 21
##
## attr(,"class")
## [1] "lsl"
There are several natural BT strengths to consider. First, we could simply count how many times each clinician gives a positive diagnosis:
hepatitis_count <- colSums(sweep(hepatitis_table[,1:3],1,hepatitis_table$OC,"*"))
names(hepatitis_count) <- colnames(hepatitis_table)[1:3]
hepatitis_count <- hepatitis_count/sum(hepatitis_count)
hepatitis_count
## P Q E
## 0.35786 0.31438 0.32776
Secondly, Zipf:
z <- zipf(3)
names(z) <- c("P","Q","E")
z
## P Q E
## 0.54545 0.27273 0.18182
Thirdly, equal probabilities:
e <- equalp(W)
e
## P Q E
## 0.33333 0.33333 0.33333
To find the maximum likelihood estimate we would use:
hepatitis_maxp <- maxp_lsl(hepatitis,startp=indep(hepatitis_count), control=list(trace=110))
## Nelder-Mead direct search function minimizer
## function value for initial parameters = 266.484793
## Scaled convergence tolerance is 3.97093e-06
## Stepsize computed as 0.035786
## BUILD 3 267.523381 266.484793
## LO-REDUCTION 5 267.358872 266.484793
## LO-REDUCTION 7 266.834672 266.484793
## HI-REDUCTION 9 266.635763 266.484793
## LO-REDUCTION 11 266.585986 266.484793
## LO-REDUCTION 13 266.502366 266.484793
## HI-REDUCTION 15 266.492180 266.480687
## LO-REDUCTION 17 266.484793 266.480687
## HI-REDUCTION 19 266.480765 266.479273
## HI-REDUCTION 21 266.480687 266.478818
## HI-REDUCTION 23 266.479273 266.478498
## HI-REDUCTION 25 266.478818 266.478494
## REFLECTION 27 266.478498 266.478346
## HI-REDUCTION 29 266.478494 266.478271
## HI-REDUCTION 31 266.478346 266.478247
## HI-REDUCTION 33 266.478271 266.478247
## LO-REDUCTION 35 266.478248 266.478231
## HI-REDUCTION 37 266.478247 266.478225
## HI-REDUCTION 39 266.478231 266.478225
## LO-REDUCTION 41 266.478230 266.478224
## Exiting from Nelder Mead minimizer
## 43 function evaluations used
## Nelder-Mead direct search function minimizer
## function value for initial parameters = 266.478224
## Scaled convergence tolerance is 3.97083e-06
## Stepsize computed as 0.036093
## BUILD 3 267.616723 266.478224
## LO-REDUCTION 5 267.535829 266.478224
## LO-REDUCTION 7 266.919989 266.478224
## LO-REDUCTION 9 266.617501 266.478224
## HI-REDUCTION 11 266.602328 266.478224
## LO-REDUCTION 13 266.535345 266.478224
## LO-REDUCTION 15 266.495953 266.478224
## HI-REDUCTION 17 266.493181 266.478224
## LO-REDUCTION 19 266.485370 266.478224
## LO-REDUCTION 21 266.480583 266.478224
## LO-REDUCTION 23 266.480007 266.478224
## LO-REDUCTION 25 266.479105 266.478224
## LO-REDUCTION 27 266.478482 266.478224
## HI-REDUCTION 29 266.478436 266.478224
## LO-REDUCTION 31 266.478319 266.478224
## LO-REDUCTION 33 266.478253 266.478224
## HI-REDUCTION 35 266.478250 266.478224
## LO-REDUCTION 37 266.478234 266.478224
## Exiting from Nelder Mead minimizer
## 39 function evaluations used
hepatitis_maxp
## P Q E
## 0.36093 0.31396 0.32511
With this, we are now in a position to compare these four points:
lz <- loglik_lsl(z,hepatitis)
le <- loglik_lsl(e,hepatitis)
lm <- loglik_lsl(hepatitis_maxp,hepatitis)
lc <- loglik_lsl(hepatitis_count,hepatitis)
(results <- c(zipf=lz, equal=le, maxlike=lm, count=lc))
## zipf equal maxlike count
## -289.21 -266.96 -266.48 -266.48
results <- results - max(results)
results
## zipf equal maxlike count
## -22.7281642 -0.4846714 0.0000000 -0.0065688
We can use Wilks here to assess the null of hepatitis_count. We
have \(-2\log(\Lambda/\Lambda_0)\sim\chi^2_6\), giving us a \(p\)-value of
pchisq(-2*results[4],df=2,lower.tail=FALSE)
## count
## 0.99345
Agresti, table 13.1, p542.
Following lines create hepatitis.rda, residing in the data/
directory of the package.
save(hepatitis_table, hepatitis, hepatitis_count, hepatitis_maxp, file="hepatitis.rda")
hyper2 Package: Likelihood Functions for Generalized Bradley-Terry Models.” The R Journal 9 (2): 429–39.