library("cotram")
library("survival")
set.seed(25)
### some basic checks for predictions wrt discrete distributions
n <- 50
d <- data.frame(x1 = 0:n, x2 = sample(0:n) + 1, q = sample(0:n))
mc3 <- cotram(q ~ x1 + x2, data = d, log_first = log_first <- FALSE)
di <- d
di$qleft <- with(di, q - 1L)
di$qleft[di$qleft < 0] <- -Inf
di$q <- with(di, Surv(qleft + log_first, q + log_first, type = "interval2"))
m3 <- Colr(q ~ x1 + x2, data = di, support = mc3$support, bounds = mc3$bounds, log_first = log_first)
.chk <- function(x)
stopifnot(max(abs(x), na.rm = TRUE) < sqrt(.Machine$double.eps))
nd <- d
nd$q <- NULL
q <-0:(n+1)
p <- predict(mc3, newdata = nd, q = q, type = "distribution")
s <- predict(mc3, newdata = nd, q = q, type = "survivor")
## check discrete distribution & survivor function
.chk(predict(mc3, newdata = nd, q = q, type = "distribution", log = TRUE) - log(p))
.chk(predict(mc3, newdata = nd, q = q, type = "distribution", lower.tail = FALSE) - s)
.chk(predict(mc3, newdata = nd, q = q, type = "distribution",
lower.tail = FALSE, log = TRUE) - log(s))
## check discrete odds function
o <- predict(mc3, newdata = nd, q = q, type = "odds")
.chk(o - p / s)
## check discrete density function
dd <- predict(mc3, newdata = nd, q = q, type = "density")
.chk(apply(p, 2, function(x) diff(c(0, x))) - dd)
## check discrete (cum)-hazard function
h <- predict(mc3, newdata = nd, q = q , type = "hazard")
.chk(dd / (1 - (p - dd)) - h)
.chk(apply(h, 2, function(x) cumprod(1 - x)) - s)
H <- predict(mc3, newdata = nd, q = q, type = "cumhazard")
.chk(H + log(s))
## simple checks for predict of smooth functions (cotram vs tram)
.check_spr <- function(mc, m) {
plus_one <- ifelse(type == "quantile", log_first, FALSE)
.chk(predict(mc, type = type, q = 1:50, newdata = model.frame(mc), smooth = TRUE, prob = 1:9/10) -
(predict(m, type = type, q = 1:50 + log_first, newdata = model.frame(mc), prob = 1:9/10) - plus_one))
}
for (type in c("trafo", "distribution", "survivor", "density", "logdensity",
"hazard", "loghazard", "cumhazard", "quantile")) {
print(type)
.check_spr(mc3, m3)
}
### unconditional model for visual checks
y <- rpois(1000, lambda = 2)
## interval-censored response
yleft <- y - 1L
yleft[yleft < 0] <- -Inf
## quantiles & probabilities
q <- 0:10
yy <- seq(from = min(q), to = max(q), length.out = 50)
pr <- 1:9/10
## simple checks for predict wrt to newdata / q (log_first)
.check_prd <- function(mc) {
## check q
stopifnot(all.equal(predict(mc, newdata = data.frame(q), type = "density"),
predict(mc, newdata = data.frame(1), q = q, type = "density")))
## check q[1] density vs distribution
stopifnot(all.equal(predict(mc, newdata = data.frame(1), q = 0, type = "density"),
predict(mc, newdata = data.frame(1), q = 0, type = "distribution")))
## rough check discrete density function
stopifnot(all.equal(predict(mc, newdata = data.frame(1), q = q, type = "density"),
predict(mc, newdata = data.frame(1), q = q, type = "distribution") -
c(0, predict(mc, newdata = data.frame(1), q = q[-1] - 1 , type = "distribution"))))
stopifnot(all.equal(predict(mc, newdata = data.frame(y = q), type = "density"),
predict(mc, newdata = data.frame(y = q), type = "distribution") -
c(0, predict(mc, newdata = data.frame(y = q[-1] - 1), type = "distribution"))))
}
## cotram: log_first = FALSE
mc1 <- cotram(y ~ 1, log_first = FALSE, prob = prob <- .99, extrapolate = TRUE)
.check_prd(mc1)
m1 <- Colr(yi ~ 1, data = data.frame(yi = Surv(yleft, y, type = "interval2")), extrapolate = TRUE,
log_first = FALSE, support = c(0, quantile(y, prob = prob)), bounds = c(-.01, Inf))
## cotram: log_first = TRUE
mc2 <- cotram(y ~ 1, log_first = TRUE, extrapolate = TRUE, prob = .99)
.check_prd(mc2)
## works in package "tram" -- but should it?
try(predict(mc1, type = "quantile", prob = pr, smooth = TRUE, q = 1:10))
## when problems with one newdata configuration, can't predict at all.
## (This comes from "tram")
try(predict(mc, type = "quantile", prob = pr, smooth = TRUE))
if (FALSE) {
layout(matrix(c(1:4), nrow = 2, byrow = TRUE))
main <- "predict - density: log_first = FALSE"
plot(q, predict(mc1, newdata = data.frame(1), q = q , type = "density"),
type = "h", main = main)
points(q, predict(mc1, newdata = data.frame(1), q = q, type = "density"), pch = 20)
points(q, dpois(q, lambda = 2), col = "blue")
lines(yy, predict(mc1, newdata = data.frame(1), q = yy, type = "density", smooth = TRUE), col = "grey")
lines(yy, predict(mc1, newdata = data.frame(y = yy), type = "density", smooth = TRUE),
col = "red")
plot(mc1, newdata = data.frame(1), type = "density", smooth = TRUE,
col = "red", add = TRUE)
plot(mc1, newdata = data.frame(1), type = "density",
col = "red", add = TRUE)
main <- "predict - distribution: log_first = FALSE"
plot(q, predict(mc1, newdata = data.frame(1), q = q, type = "distribution"),
type = "s", ylim = c(0, 1), main = main)
lines(yy, predict(mc1, newdata = data.frame(1), q = yy, type = "distribution", smooth = TRUE), col = "grey")
points(q, ppois(q, lambda = 2), col = "blue")
points(predict(mc1, newdata = data.frame(1), q = q, prob = pr, type = "quantile",
smooth = TRUE), pr, col = "darkgreen")
legend("bottomright", legend = c("ppois", "quantiles"), pch = 1,
col = c("blue", "green"))
plot(mc1, newdata = data.frame(1), type = "distribution",
col = "red", smooth = TRUE, add = TRUE)
plot(mc1, newdata = data.frame(1), q = q, type = "distribution",
col = "red", add = TRUE)
main <- "predict - density: log_first = TRUE"
plot(q, predict(mc2, newdata = data.frame(1), q = q, type = "density"),
type = "h", main = main)
points(q, predict(mc2, newdata = data.frame(1), q = q, type = "density"), pch = 20)
points(q, dpois(q, lambda = 2), col = "blue")
lines(yy, predict(mc2, newdata = data.frame(1), type = "density", q = yy, smooth = TRUE))
plot(mc2, newdata = data.frame(1), type = "density",
col = "red", smooth = TRUE, add = TRUE, ylim = c(0, .3))
plot(mc2, newdata = data.frame(1), q = q, type = "density",
col = "red", add = TRUE)
main <- "predict - distribution: log_first = TRUE"
plot(q, predict(mc2, newdata = data.frame(1), q = q, type = "distribution"),
type = "s", ylim = c(0, 1), main = main)
points(q, ppois(q, lambda = 2), col = "blue")
lines(yy, predict(mc2, newdata = data.frame(1), q = yy, type = "distribution", smooth = TRUE))
points(predict(mc2, newdata = data.frame(1),
smooth = TRUE, prob = pr, type = "quantile"), pr, col = "green")
legend("bottomright", legend = c("ppois", "quantiles"), pch = 1,
col = c("blue", "green"))
plot(mc2, newdata = data.frame(1), type = "distribution", q = 0:3,
col = "red", smooth = TRUE, add = TRUE)
plot(mc2, newdata = data.frame(1), type = "distribution",
col = "red", add = TRUE)
layout(matrix(c(1:6), nrow = 2, byrow = TRUE))
plot(mc3, newdata = nd, type = "density", col = rgb(.3, .3, .3, .3))
# plot(m3, newdata = nd, type = "density", col = 2, add = TRUE)
abline(v = 0)
plot(mc3, newdata = nd, type = "logdensity", ylim = c(-6, 0), col = rgb(.3, .3, .3, .3))
# plot(m3, newdata = nd, type = "logdensity", col = 2, add = TRUE, ylim = c(-6, 0))
abline(v = 0)
plot(mc3, newdata = nd, type = "distribution", col = rgb(.3, .3, .3, .3))
# plot(m3, newdata = nd, type = "distribution", col = 2, add = TRUE)
abline(v = 0)
plot(mc3, newdata = nd, type = "trafo", col = rgb(.3, .3, .3, .3))
# plot(m3, newdata = nd, type = "trafo", col = 2, add = TRUE)
abline(v = 0)
plot(mc3, newdata = nd, type = "survivor", col = rgb(.3, .3, .3, .3))
# plot(m3, newdata = nd, type = "survivor", col = 2, add = TRUE)
abline(v = 0)
plot(mc3, newdata = nd, type = "cumhazard", col = rgb(.3, .3, .3, .3))
# plot(m3, newdata = nd, type = "cumhazard", col = 2, add = TRUE)
abline(v = 0)
}