tests/constancy.R

 library(aster2)

 ##### parm.type = "theta"

 data(echinacea)
 cmat <- constancy(echinacea, parm.type = "theta")
 nrow(cmat) == 0

 data(test1)
 fred <- asterdata(test1,
     vars = c("m1", "m2", "m3", "n1", "n2", "b1", "p1", "z1"),
     pred = c(0, 0, 0, 1, 1, 2, 3, 6), group = c(0, 1, 2, 0, 4, 0, 0, 0),
     code = c(1, 1, 1, 2, 2, 3, 4, 5),
     families = list(fam.multinomial(3), "normal.location.scale",
     "bernoulli", "poisson", "zero.truncated.poisson"))
 is.validasterdata(fred)

 cmat <- constancy(fred, parm.type = "theta")
 multinomial.ind <- sort(unique(fred$redata$id[fred$recode == 1]))
 mycmat <- matrix(NA, nrow = length(multinomial.ind), ncol = nrow(fred$redata))
 for (ind in seq(along = multinomial.ind))
     mycmat[ind, ] <- as.numeric(fred$redata$id == ind & fred$recode == 1)
 mycmat <- mycmat[rev(multinomial.ind), ]
 identical(cmat, Matrix(mycmat))
 
 sally <- fred
 y <- sally$redata[[sally$response.name]]
 v <- as.character(sally$redata$varb)
 ind <- sally$redata$id
 ind.save <- numeric(0)
 cmat.extra <- NULL
 is.zero <- rep(FALSE, length(y))

 i.buddy <- sally$regroup
 i.buddy[i.buddy == 0] <- NA
 i.buddy.buddy <- sally$regroup[i.buddy]
 i.buddy.buddy[i.buddy.buddy == 0] <- NA
 y.buddy <- y[i.buddy]
 y.buddy.buddy <- y[i.buddy.buddy]

 # find an individual for whom to constrain m1 == 0
 ok <- y == 0 & v == "m1"
 if (any(ok)) {
     i <- seq(along = ok)[ok]
     i <- i[1]
     sally$redelta[i] <- (-1)
     is.zero[i] <- TRUE
     ind.save <- c(ind.save, ind[i])
     foo <- rep(0, length(y))
     foo[i] <- 1
     cmat.extra <- rbind(cmat.extra, foo)
 }
 # find another individual for whom to constrain m2 == 0
 ok <- y == 0 & v == "m2" & (! (ind %in% ind.save))
 if (any(ok)) {
     i <- seq(along = ok)[ok]
     i <- i[1]
     sally$redelta[i] <- (-1)
     is.zero[i] <- TRUE
     ind.save <- c(ind.save, ind[i])
     foo <- rep(0, length(y))
     foo[i] <- 1
     cmat.extra <- rbind(cmat.extra, foo)
 }
 # find another individual for whom to constrain m3 == 0
 ok <- y == 0 & v == "m3" & (! (ind %in% ind.save))
 if (any(ok)) {
     i <- seq(along = ok)[ok]
     i <- i[1]
     sally$redelta[i] <- (-1)
     is.zero[i] <- TRUE
     ind.save <- c(ind.save, ind[i])
     foo <- rep(0, length(y))
     foo[i] <- 1
     cmat.extra <- rbind(cmat.extra, foo)
 }
 # find another individual for whom to constrain m1 == 0 and m2 == 0
 ok <- y != 0 & y.buddy == 0 & y.buddy.buddy == 0 & (! (ind %in% ind.save))
 ok[is.na(ok)] <- FALSE
 if (any(ok)) {
     k <- seq(along = ok)[ok]
     k <- k[1]
     j <- i.buddy[k]
     i <- i.buddy.buddy[k]
     sally$redelta[i] <- (-1)
     sally$redelta[j] <- (-1)
     is.zero[i] <- TRUE
     is.zero[j] <- TRUE
     ind.save <- c(ind.save, ind[i])
     foo <- rep(0, length(y))
     foo[i] <- 1
     cmat.extra <- rbind(cmat.extra, foo)
     foo <- rep(0, length(y))
     foo[j] <- 1
     cmat.extra <- rbind(cmat.extra, foo)
 }
 # find another individual for whom to constrain m1 == 0 and m3 == 0
 ok <- y == 0 & y.buddy != 0 & y.buddy.buddy == 0 & (! (ind %in% ind.save))
 ok[is.na(ok)] <- FALSE
 if (any(ok)) {
     k <- seq(along = ok)[ok]
     k <- k[1]
     j <- i.buddy[k]
     i <- i.buddy.buddy[k]
     sally$redelta[i] <- (-1)
     sally$redelta[k] <- (-1)
     is.zero[i] <- TRUE
     is.zero[k] <- TRUE
     ind.save <- c(ind.save, ind[i])
     foo <- rep(0, length(y))
     foo[i] <- 1
     cmat.extra <- rbind(cmat.extra, foo)
     foo <- rep(0, length(y))
     foo[k] <- 1
     cmat.extra <- rbind(cmat.extra, foo)
 }
 # find another individual for whom to constrain m2 == 0 and m3 == 0
 ok <- y == 0 & y.buddy == 0 & y.buddy.buddy != 0 & (! (ind %in% ind.save))
 ok[is.na(ok)] <- FALSE
 if (any(ok)) {
     k <- seq(along = ok)[ok]
     k <- k[1]
     j <- i.buddy[k]
     i <- i.buddy.buddy[k]
     sally$redelta[j] <- (-1)
     sally$redelta[k] <- (-1)
     is.zero[j] <- TRUE
     is.zero[k] <- TRUE
     ind.save <- c(ind.save, ind[i])
     foo <- rep(0, length(y))
     foo[j] <- 1
     cmat.extra <- rbind(cmat.extra, foo)
     foo <- rep(0, length(y))
     foo[k] <- 1
     cmat.extra <- rbind(cmat.extra, foo)
 }
 # find another individual for whom to constrain b1 == 0
 ok <- y == 0 & v == "b1" & (! (ind %in% ind.save))
 if (any(ok)) {
     i <- seq(along = ok)[ok]
     i <- i[1]
     sally$redelta[i] <- (-1)
     is.zero[i] <- TRUE
     ind.save <- c(ind.save, ind[i])
     foo <- rep(0, length(y))
     foo[i] <- 1
     cmat.extra <- rbind(cmat.extra, foo)
 }
 # find another individual for whom to constrain b1 == 1
 ok <- y == 1 & v == "b1" & (! (ind %in% ind.save))
 if (any(ok)) {
     i <- seq(along = ok)[ok]
     i <- i[1]
     sally$redelta[i] <- (+1)
     ind.save <- c(ind.save, ind[i])
     foo <- rep(0, length(y))
     foo[i] <- 1
     cmat.extra <- rbind(cmat.extra, foo)
 }
 # find another individual for whom to constrain p1 == 0
 ok <- y == 0 & v == "p1" & (! (ind %in% ind.save))
 if (any(ok)) {
     i <- seq(along = ok)[ok]
     i <- i[1]
     sally$redelta[i] <- (-1)
     is.zero[i] <- TRUE
     ind.save <- c(ind.save, ind[i])
     foo <- rep(0, length(y))
     foo[i] <- 1
     cmat.extra <- rbind(cmat.extra, foo)
 }
 # find another individual for whom to constrain z1 == 1
 ok <- y == 1 & v == "z1" & (! (ind %in% ind.save))
 if (any(ok)) {
     i <- seq(along = ok)[ok]
     i <- i[1]
     sally$redelta[i] <- (-1)
     ind.save <- c(ind.save, ind[i])
     foo <- rep(0, length(y))
     foo[i] <- 1
     cmat.extra <- rbind(cmat.extra, foo)
 }
 is.validasterdata(sally)

 i.pred <- sally$repred
 i.pred[i.pred == 0] <- NA
 anc.is.zero <- rep(FALSE, length(y))
 repeat {
     anc.is.zero.save <- anc.is.zero
     anc.is.zero <- is.zero[i.pred] | anc.is.zero[i.pred]
     anc.is.zero[is.na(anc.is.zero)] <- FALSE
     if (identical(anc.is.zero, anc.is.zero.save)) break
 }
 cmat.extra.extra <- matrix(0, sum(anc.is.zero), length(y))
 j <- seq(along = anc.is.zero)[anc.is.zero]
 for (i in 1:nrow(cmat.extra.extra)) {
     cmat.extra.extra[i, j[i]] <- 1
 }
 
 dimnames(cmat.extra) <- NULL
 cmat.sally <- constancy(sally, parm.type = "theta")
 mycmat.sally <- rbind(cmat, cmat.extra, cmat.extra.extra)
 cmat.sally.char <- apply(cmat.sally, 1, paste, collapse = "*")
 mycmat.sally.char <- apply(mycmat.sally, 1, paste, collapse = "*")
 identical(sort(cmat.sally.char), sort(mycmat.sally.char))

 ##### is.same parm.type = "theta"

 theta1 <- rnorm(length(fred$repred))
 theta2 <- rnorm(length(fred$repred))
 ! is.same(theta1, theta2, fred)
 theta2 <- theta1 + t(cmat) %*% rnorm(nrow(cmat))
 theta2 <- as.numeric(theta2)
 is.same(theta1, theta2, fred)

 ##### parm.type = "phi"

 rm(list = ls())

 data(echinacea)
 cmat <- constancy(echinacea, parm.type = "phi")
 nrow(cmat) == 0

 data(test1)
 fred <- asterdata(test1,
     vars = c("m1", "m2", "m3", "n1", "n2", "b1", "p1", "z1"),
     pred = c(0, 0, 0, 1, 1, 2, 3, 6), group = c(0, 1, 2, 0, 4, 0, 0, 0),
     code = c(1, 1, 1, 2, 2, 3, 4, 5),
     families = list(fam.multinomial(3), "normal.location.scale",
     "bernoulli", "poisson", "zero.truncated.poisson"))
 is.validasterdata(fred)

 cmat <- constancy(fred, parm.type = "phi")
 multinomial.ind <- sort(unique(fred$redata$id[fred$recode == 1]))
 mycmat <- matrix(NA, nrow = length(multinomial.ind), ncol = nrow(fred$redata))
 for (ind in seq(along = multinomial.ind))
     mycmat[ind, ] <- as.numeric(fred$redata$id == ind & fred$recode == 1)
 mycmat <- mycmat[rev(multinomial.ind), ]
 identical(cmat, Matrix(mycmat))

 # (from the help page for the R function asterdata) "note that the
 # conditional canonical parameter vector is always used here [for delta and
 # redelta], regardless of whether conditional or unconditional canonical
 # affine submodels are to be used

 sally <- fred
 y <- sally$redata[[sally$response.name]]
 v <- as.character(sally$redata$varb)
 ind <- sally$redata$id
 ind.save <- numeric(0)
 cmat.extra <- NULL
 is.zero <- rep(FALSE, length(y))

 i.buddy <- sally$regroup
 i.buddy[i.buddy == 0] <- NA
 i.buddy.buddy <- sally$regroup[i.buddy]
 i.buddy.buddy[i.buddy.buddy == 0] <- NA
 y.buddy <- y[i.buddy]
 y.buddy.buddy <- y[i.buddy.buddy]

 i.pred <- sally$repred
 i.pred[i.pred == 0] <- NA
 y.pred <- y[i.pred]
 y.pred[is.na(y.pred)] <- 1

 # find an individual for whom to constrain m1 == 0
 ok <- y == 0 & v == "m1"
 if (any(ok)) {
     i <- seq(along = ok)[ok]
     i <- i[1]
     sally$redelta[i] <- (-1)
     is.zero[i] <- TRUE
     ind.save <- c(ind.save, ind[i])
     foo <- rep(0, length(y))
     foo[i] <- 1
     cmat.extra <- rbind(cmat.extra, foo)
 }
 # find another individual for whom to constrain m2 == 0
 ok <- y == 0 & v == "m2" & (! (ind %in% ind.save))
 if (any(ok)) {
     i <- seq(along = ok)[ok]
     i <- i[1]
     sally$redelta[i] <- (-1)
     is.zero[i] <- TRUE
     ind.save <- c(ind.save, ind[i])
     foo <- rep(0, length(y))
     foo[i] <- 1
     cmat.extra <- rbind(cmat.extra, foo)
 }
 # find another individual for whom to constrain m3 == 0
 ok <- y == 0 & v == "m3" & (! (ind %in% ind.save))
 if (any(ok)) {
     i <- seq(along = ok)[ok]
     i <- i[1]
     sally$redelta[i] <- (-1)
     is.zero[i] <- TRUE
     ind.save <- c(ind.save, ind[i])
     foo <- rep(0, length(y))
     foo[i] <- 1
     cmat.extra <- rbind(cmat.extra, foo)
 }
 # find another individual for whom to constrain m1 == 0 and m2 == 0
 ok <- y != 0 & y.buddy == 0 & y.buddy.buddy == 0 & (! (ind %in% ind.save))
 ok[is.na(ok)] <- FALSE
 if (any(ok)) {
     k <- seq(along = ok)[ok]
     k <- k[1]
     j <- i.buddy[k]
     i <- i.buddy.buddy[k]
     sally$redelta[i] <- (-1)
     sally$redelta[j] <- (-1)
     is.zero[i] <- TRUE
     is.zero[j] <- TRUE
     ind.save <- c(ind.save, ind[i])
     foo <- rep(0, length(y))
     foo[i] <- 1
     cmat.extra <- rbind(cmat.extra, foo)
     foo <- rep(0, length(y))
     foo[j] <- 1
     cmat.extra <- rbind(cmat.extra, foo)
 }
 # find another individual for whom to constrain m1 == 0 and m3 == 0
 ok <- y == 0 & y.buddy != 0 & y.buddy.buddy == 0 & (! (ind %in% ind.save))
 ok[is.na(ok)] <- FALSE
 if (any(ok)) {
     k <- seq(along = ok)[ok]
     k <- k[1]
     j <- i.buddy[k]
     i <- i.buddy.buddy[k]
     sally$redelta[i] <- (-1)
     sally$redelta[k] <- (-1)
     is.zero[i] <- TRUE
     is.zero[k] <- TRUE
     ind.save <- c(ind.save, ind[i])
     foo <- rep(0, length(y))
     foo[i] <- 1
     cmat.extra <- rbind(cmat.extra, foo)
     foo <- rep(0, length(y))
     foo[k] <- 1
     cmat.extra <- rbind(cmat.extra, foo)
 }
 # find another individual for whom to constrain m2 == 0 and m3 == 0
 ok <- y == 0 & y.buddy == 0 & y.buddy.buddy != 0 & (! (ind %in% ind.save))
 ok[is.na(ok)] <- FALSE
 if (any(ok)) {
     k <- seq(along = ok)[ok]
     k <- k[1]
     j <- i.buddy[k]
     i <- i.buddy.buddy[k]
     sally$redelta[j] <- (-1)
     sally$redelta[k] <- (-1)
     is.zero[j] <- TRUE
     is.zero[k] <- TRUE
     ind.save <- c(ind.save, ind[i])
     foo <- rep(0, length(y))
     foo[j] <- 1
     cmat.extra <- rbind(cmat.extra, foo)
     foo <- rep(0, length(y))
     foo[k] <- 1
     cmat.extra <- rbind(cmat.extra, foo)
 }
 # find another individual for whom to constrain b1 == 0
 ok <- y == 0 & v == "b1" & y.pred > 0 & (! (ind %in% ind.save))
 if (any(ok)) {
     i <- seq(along = ok)[ok]
     i <- i[1]
     sally$redelta[i] <- (-1)
     is.zero[i] <- TRUE
     ind.save <- c(ind.save, ind[i])
     foo <- rep(0, length(y))
     foo[i] <- 1
     cmat.extra <- rbind(cmat.extra, foo)
 }
 # find another individual for whom to constrain b1 == 1
 ok <- y == 1 & v == "b1" & y.pred > 0 & (! (ind %in% ind.save))
 if (any(ok)) {
     i <- seq(along = ok)[ok]
     i <- i[1]
     sally$redelta[i] <- 1
     ind.save <- c(ind.save, ind[i])
     foo <- rep(0, length(y))
     foo[i] <- 1
     foo[i.pred[i]] <- (-1)
     cmat.extra <- rbind(cmat.extra, foo)
 }
 # find another individual for whom to constrain p1 == 0
 ok <- y == 0 & v == "p1" & y.pred > 0 & (! (ind %in% ind.save))
 if (any(ok)) {
     i <- seq(along = ok)[ok]
     i <- i[1]
     sally$redelta[i] <- (-1)
     is.zero[i] <- TRUE
     ind.save <- c(ind.save, ind[i])
     foo <- rep(0, length(y))
     foo[i] <- 1
     cmat.extra <- rbind(cmat.extra, foo)
 }
 # find another individual for whom to constrain z1 == 1
 ok <- y == 1 & v == "z1" & y.pred > 0 & (! (ind %in% ind.save))
 if (any(ok)) {
     i <- seq(along = ok)[ok]
     i <- i[1]
     sally$redelta[i] <- (-1)
     ind.save <- c(ind.save, ind[i])
     foo <- rep(0, length(y))
     foo[i] <- 1
     foo[i.pred[i]] <- (-1)
     cmat.extra <- rbind(cmat.extra, foo)
 }
 is.validasterdata(sally)

 anc.is.zero <- rep(FALSE, length(y))
 repeat {
     anc.is.zero.save <- anc.is.zero
     anc.is.zero <- is.zero[i.pred] | anc.is.zero[i.pred]
     anc.is.zero[is.na(anc.is.zero)] <- FALSE
     if (identical(anc.is.zero, anc.is.zero.save)) break
 }
 cmat.extra.extra <- matrix(0, sum(anc.is.zero), length(y))
 j <- seq(along = anc.is.zero)[anc.is.zero]
 for (i in 1:nrow(cmat.extra.extra)) {
     cmat.extra.extra[i, j[i]] <- 1
 }
 
 dimnames(cmat.extra) <- NULL
 cmat.sally <- constancy(sally, parm.type = "phi")
 mycmat.sally <- rbind(cmat, cmat.extra, cmat.extra.extra)
 cmat.sally.char <- apply(cmat.sally, 1, paste, collapse = "*")
 mycmat.sally.char <- apply(mycmat.sally, 1, paste, collapse = "*")
 identical(sort(cmat.sally.char), sort(mycmat.sally.char))

 ##### is.same parm.type = "phi"

 phi1 <- rnorm(length(fred$repred))
 phi2 <- rnorm(length(fred$repred))
 ! is.same(phi1, phi2, fred, parm.type = "phi")
 phi2 <- phi1 + t(cmat) %*% rnorm(nrow(cmat))
 phi2 <- as.numeric(phi2)
 is.same(phi1, phi2, fred, parm.type = "phi")

Try the aster2 package in your browser

Any scripts or data that you put into this service are public.

aster2 documentation built on May 2, 2019, 11:02 a.m.