Nothing
## Ch15-twtb.r
## drunk.s
## glasses.s
## glasses.exact.s
## blyth.s
## hypothermia.s
## -rwx------+ 1 rmh None 56332 2004-05-25 01:03 twtb/twtb.tex
## salk-mh.s
## salk.s
## -rwx------+ 1 rmh None 3818 2004-04-03 23:07 twtb/twtb-cmh.tex
## drunk.s
data(drunk)
prop.female <- drunk["females",]/apply(drunk,2,sum)
ages <- ordered(dimnames(drunk)$age, levels=dimnames(drunk)$age)
if.R(s=
print(position=c(.2,0,.8,.4),
t(barchart(ages ~ prop.female, ref=0, xlim=c(0,.13),
xlab="", main="proportion female",
col=55))
)
,r=
barchart(as.numeric(prop.female) ~ ages,
horizontal=FALSE, origin=0,
ylab="", main="proportion female",
col=55)
)
## export.eps(hh("twtb/figure/drunk.prop.fem.eps"))
drunk.er <- apply(drunk,1,sum)
drunk.ec <- apply(drunk,2,sum)
drunk.n <- sum(drunk.er)
drunk.e <- outer(drunk.er, drunk.ec) / drunk.n
chi2.ij <- (drunk -drunk.e)^2/drunk.e
chi2 <- sum(chi2.ij)
chi1.ij <- sqrt(chi2.ij) * sign(drunk -drunk.e)
chi1.ij
if.R(s=
chi1.ij.vec <- as.vector(chi1.ij)
,r=
chi1.ij.vec <- as.vector(data.matrix(chi1.ij))
)
chi1 <- data.frame(chi=chi1.ij.vec,
sex=rep(dimnames(drunk)[[1]], 5),
age=rep(ages, rep(2,5)))
if.R(s=
print(position=c(.2,0,.8,.7),
t(barchart(age ~ chi | sex, data=chi1, ref=0,
par.strip.text=list(cex=1.2),
scales=list(cex=1.2, alternating=FALSE),
layout=c(1,2),
between=list(y=1),
xlab=list(cex=1.2),
ylab=list("age", cex=1.2),
main=list("chi deviations for drunk.dat", cex=1.4),
col=55))
)
,r=
barchart(chi ~ age | sex, data=chi1, origin=0,
horizontal=FALSE,
par.strip.text=list(cex=1.2),
scales=list(cex=1.2, alternating=FALSE),
layout=c(1,2),
between=list(y=1),
ylab=list(cex=1.2),
xlab=list(cex=1.2),
main=list("chi deviations for drunk.dat", cex=1.4),
col=55)
)
## export.eps(hh("twtb/figure/drunk.chi.eps"))
chisq.test(data.matrix(drunk)) ## warning from cell [2,5] having expected value less than 5.
## glasses.s
data(glasses)
## draw the iso-odds ratio plot with 50% CI and 95% CI,
plotOddsRatio(glasses)
## export.eps(hh("twtb/figure/glasses.ci.eps"))
## display the 95% CI and supporting values
OddsRatio(glasses)
## calculate values in text
tmp <- log(20) + c(-1,1) * 1.96 * sqrt(1/1 + 1/5 + 1/8 + 1/2)
exp(tmp)
c(1.416116, 282.462689) / 8
2.5/3.5
c(0.1770145, 35.3078361)/(1+c(0.1770145, 35.3078361))
## glasses.exact.s
fisher.test(glasses)
## study the construction of the Fisher Exact test
## construct all possible two-way tables with the same margins as the
## initial table
all.tables <- function(x) {
xx <- x
result <- list()
r.margin <- apply(x,1,sum)
c.margin <- apply(x,2,sum)
for (x11 in 0:r.margin[1]) {
xx[1,1] <- x11
xx[1,2] <- r.margin[1] - xx[1,1]
xx[2,1] <- c.margin[1] - xx[1,1]
xx[2,2] <- sum(x) - (xx[1,1] + xx[1,2] + xx[2,1])
if (min(xx) >= 0) result[[as.character(x11)]] <- xx
}
result
}
glasses.all <- all.tables(glasses)
glasses.all
## Format the glasses.all table in LaTeX as it will appear in the book.
## We did additional editing of the file after it was automatically constructed.
library("Hmisc") ## access latex() function
glasses.latex <-
latex(do.call("cbind", glasses.all),
cgroup=names(glasses.all),
rowlabel="glasses",
file="glasses.exact.tex")
if.R(s=
detach("Hmisc")
,r=
detach("package:Hmisc")
)
## format end
## find hypergeometric probability for each table
g.p <-
do.call("rbind",
lapply(glasses.all,
function(x)
c(prob=dhyper(x[1,1], sum(x[1,]), sum(x[2,]), sum(x[,1])),
min=min(x))))
g.p
g.p2 <- if.R(s=
data.frame(g.p, which="", stringsAsFactors=FALSE)
,r=
data.frame(g.p, which=I(""))
)
## intitial table
g.p2[as.character(glasses[1,1]),"which"] <- "*"
## more extreme tables (min value is smaller)
g.p2[g.p2[as.character(glasses[1,1]),"min"] > g.p2[,"min"],"which"] <- "<"
g.p2
g.p2$cumsum <- cumsum(g.p2$prob)
g.p2$rev.cumsum <- rev(cumsum(rev(g.p2$prob)))
g.p2
if.R(s=
print(position=c(.1,0,.9,.4),
t(barchart(0:6 ~ g.p2$prob, col=55))
)
,r=
barchart(g.p2$prob ~ factor(0:6), col=55, horizontal=FALSE)
)
if.R(s=
print(position=c(0,0,1,.4),
t(barchart(0:6 ~ g.p2$prob, ref=0,
col=55,
xlab="",
main="probability of table with specified [1,1] position",
panel=function(x, y, ...) {
panel.barchartt(x, y, ...)
axis(1, line=1.5, at=x, label=g.p2$which, ticks=FALSE)
},
key=list(
text=c("observed","more extreme"),
text=c("*","<"),
border=TRUE,
space="right")
))
)
,r=
barchart(g.p2$prob ~ factor(0:6), col=55, horizontal=FALSE,
ylab=NULL, origin=0,
main=list(labels=
"probability of table with specified [1,1] position"),
scales=list(x=list(at=0:6, labels=paste(0:6,g.p2$which))),
key=list(
text=list(c("observed","more extreme")),
text=list(c("*","<")),
border=TRUE,
space="right")
)
)
## export.eps(hh("twtb/figure/glasses.exact.eps"))
## blyth.s
data(blyth)
## append the location margin
blyth.t <- cbind(blyth, standard=blyth[,1]+blyth[,3], new=blyth[,2]+blyth[,4])
blyth.t
## proportion
print(format(
round(blyth.t[2,] / apply(blyth.t, 2, sum), 2)
), quote=FALSE)
{
## count
blyth.t.tmp <- blyth.t
## simplify the column names by suppressing the location
dimnames(blyth.t.tmp)[[2]] <- dimnames(blyth.t.tmp)[[2]][c(5,6,5,6,5,6)]
tmp <-
barplot(blyth.t.tmp,
##angle=c(45, 135),
col=c(55,80),
legend=dimnames(blyth.t)[[1]],
names=as.character(dimnames(blyth.t.tmp)[[2]]),
ylab="count", ylim=c(0,13000),
main="Blyth's example of Simpson's paradox")
abline(v=sum(tmp[4:5])/2)
mtext(side=1, line=2, at=sum(tmp[1:2])/2, "location A", adj=.5)
mtext(side=1, line=2, at=sum(tmp[3:4])/2, "location B", adj=.5)
mtext(side=1, line=2, at=sum(tmp[5:6])/2, "combined locations", adj=.5)
## export.eps(hh("twtb/figure/blyth.count.eps"))
}
{
## proportion
blyth.t.tmp.p <- blyth.t.tmp[2,] / apply(blyth.t.tmp, 2, sum)
blyth.t.tmp.p
tmp <-
barplot(blyth.t.tmp.p,
##angle=135,
col=55,
legend=dimnames(blyth.t)[[1]][2],
names=as.character(dimnames(blyth.t.tmp)[[2]]),
ylab="proportion surviving", ylim=c(0,1),
main="Blyth's example of Simpson's paradox")
abline(v=sum(tmp[4:5])/2)
mtext(side=1, line=2, at=sum(tmp[1:2])/2, "location A", adj=.5)
mtext(side=1, line=2, at=sum(tmp[3:4])/2, "location B", adj=.5)
mtext(side=1, line=2, at=sum(tmp[5:6])/2, "combined locations", adj=.5)
mtext(side=3, at=tmp, as.character(apply(blyth.t.tmp, 2, sum)))
mtext(side=3, at=0, "count", adj=1)
## export.eps(hh("twtb/figure/blyth.proportion.eps"))
}
{
## odds
blyth.t.tmp.o <- blyth.t.tmp[2,] / blyth.t.tmp[1,]
tmp <-
barplot(blyth.t.tmp.o,
##angle=135,
col=55,
legend=dimnames(blyth.t)[[1]][2],
names=as.character(dimnames(blyth.t.tmp)[[2]]),
ylab="odds in favor of surviving", ylim=c(0,20),
main="Blyth's example of Simpson's paradox")
abline(v=sum(tmp[4:5])/2)
mtext(side=1, line=2, at=sum(tmp[1:2])/2, "location A", adj=.5)
mtext(side=1, line=2, at=sum(tmp[3:4])/2, "location B", adj=.5)
mtext(side=1, line=2, at=sum(tmp[5:6])/2, "combined locations", adj=.5)
mtext(side=3, at=tmp, as.character(apply(blyth.t.tmp, 2, sum)))
mtext(side=3, at=0, "count", adj=1)
## export.eps(hh("twtb/figure/blyth.odds.eps"))
}
{
## logit
blyth.t.tmp.l <- log(blyth.t.tmp.o)
tmp <-
barplot(blyth.t.tmp.l,
##angle=135,
col=55,
legend=dimnames(blyth.t)[[1]][2],
names=as.character(dimnames(blyth.t.tmp)[[2]]),
ylab="logit in favor of surviving",
main="Blyth's example of Simpson's paradox")
abline(v=sum(tmp[4:5])/2)
mtext(side=1, line=2, at=sum(tmp[1:2])/2, "location A", adj=.5)
mtext(side=1, line=2, at=sum(tmp[3:4])/2, "location B", adj=.5)
mtext(side=1, line=2, at=sum(tmp[5:6])/2, "combined locations", adj=.5)
mtext(side=3, at=tmp, as.character(apply(blyth.t.tmp, 2, sum)))
mtext(side=3, at=0, "count", adj=1)
## export.eps(hh("twtb/figure/blyth.logit.eps"))
}
## hypothermia.s
hypothermia <- matrix(c(75,54,61,83),
nrow=2,
dimnames=list(
c("treated","control"),
c("favorable","not.favorable")))
plotOddsRatio(hypothermia)
## export.eps(hh("twtb/figure/hypothermia.ci.eps"))
## count
barplot(t(hypothermia),
ylim=c(0,160), ylab="count",
legend=dimnames(hypothermia)[[2]],
names=as.character(dimnames(hypothermia)[[1]]))
## proportion
barplot(hypothermia[,1] / apply(hypothermia, 1, sum),
ylim=c(0,.6), ylab="proportion favorable",
legend=dimnames(hypothermia)[[2]][1],
names=as.character(dimnames(hypothermia)[[1]]))
## odds
barplot(hypothermia[,1] / hypothermia[,2],
ylim=c(0,1.4), ylab="odds favorable",
legend=dimnames(hypothermia)[[2]][1],
names=as.character(dimnames(hypothermia)[[1]]))
## logit
barplot(log(hypothermia[,1] / hypothermia[,2]),
ylim=c(-.6,.3), ylab="logit favorable",
legend=dimnames(hypothermia)[[2]][1],
names=as.character(dimnames(hypothermia)[[1]]))
## salk.s
data(salk)
if.R(r={
require(vcd)
structable(~ age + vaccine + paralyze, data=salk, direction=c("v","v","h"),
main="Recommended display---specified, paralyze split last")
detach("package:vcd")
}, s={
tmp <- tapply(salk$Freq, salk[, c(2,3,1)], c)
names(dimnames(tmp)) <- c("vaccine","paralyze", "age")
class(tmp) <- "table"
print(tmp)
rm(tmp)
})
salk2 <- tapply(salk$Freq, salk[c(2,3,1)], c)
if.R(r=class(salk2) <- "table",
s={})
salk2
mantelhaen.test(salk2)
mantelhaen.test(salk2, correct=FALSE)
## salk-mh.s
## Use latex() to generate the table in latex format.
## Then lots of editing to smooth out the appearance.
library("Hmisc")
for (i in 1:6) {
tmp <- salk2[,,i]
latex(tmp, file=paste("salk",i,"tex", sep="."),
caption=dimnames(salk2)[[3]][i],
label=dimnames(salk2)[[3]][i])
}
if.R(s=
detach("Hmisc")
,r=
detach("package:Hmisc")
)
##
## counts
salk2
## proportion without paralysis
pp <- apply(salk2, c(3,1),
function(x) x[1]/(x[1]+x[2]))
pp
## binomial variance for proportion without paralysis
apply(salk2, c(3,1),
function(x) (x[1]/(x[1]+x[2]))*(x[1]/(x[1]+x[2])) / (x[1]+x[2]))
## average proportion without paralysis
p <- apply(salk2, 3,
function(x) sum(x[,1])/sum(x))
p
## weight per table
w <- apply(salk2, 3,
function(x) 1/sum(1/(x[,1]+x[,2])))
w
## diff of proportion without paralysis
dp <- pp[,1] - pp[,2]
dp
## binomial variance for difference of proportions without paralysis
p*(1-p)
sum(w*dp) / sqrt(sum(w*p*(1-p)))
## chi-square for each table
chisq.table <-
t(apply(salk2, 3,
function(x) {
e <- (x[,1]+x[,2]) %o% (x[1,]+x[2,]) / sum(x)
chisq <- sum((x-e)^2/e)
p <- 1-pchisq(chisq,1)
c(chisq=chisq, p.chisq=p)
}))
chisq.table
## expected counts under independence for each table
E <- apply(salk2, 3,
function(x) {
(x[,1]+x[,2]) %o% (x[1,]+x[2,]) / sum(x)
})
dimnames(E) <- NULL
dim(E) <- dim(salk2)
dimnames(E) <- dimnames(salk2)
E
## latex
library("Hmisc")
for (i in 1:6) {
tmp <- E[,,i]
latex(tmp, file=paste("E",i,"tex", sep="."),
caption=dimnames(E)[[3]][i],
label=dimnames(E)[[3]][i])
}
if.R(s=
detach("Hmisc")
,r=
detach("package:Hmisc")
)
##
## mh chi-square for each table (hypergeometric assumption)
apply(salk2, 3,
function(x) {
e <- (x[,1]+x[,2]) %o% (x[1,]+x[2,]) / sum(x)
v <- prod(x[,1]+x[,2], x[1,]+x[2,]) / (sum(x)^2 * (sum(x)-1))
(x-e)[1,1]^2 / v
})
## Mantel-Haenszel chi-square components for each table
## (hypergeometric assumption)
mh.c <-
t(apply(salk2, 3,
function(x) {
e <- (x[,1]+x[,2]) %o% (x[1,]+x[2,]) / sum(x)
v <- prod(x[,1]+x[,2], x[1,]+x[2,]) / (sum(x)^2 * (sum(x)-1))
c(O=x[1,1], E=e[1,1], O.E=(x-e)[1,1], v=v, n=sum(x),
dev=(x-e)[1,1]/sqrt(v), mh=(x-e)[1,1]^2 / v)
}))
mh.c
## Cochran-Mantel-Haenszel test statistic
sum(mh.c[,"O.E"])^2 / sum(mh.c[,"v"])
## plot the dev values for each table.
if.R(r={
ages <- ordered(dimnames(mh.c)[[1]], levels=dimnames(mh.c)[[1]])
barchart(mh.c[,"dev"] ~ ages, origin=0, horizontal=FALSE,
scales=list(y=list(axs="s"), cex=1.4),
ylab="standardized table deviations", col=55)
}, s=
print(position=c(0,0,1,.7),
t(barchart( ~ mh.c[,"dev"], ref=0,
scales=list(x=list(axs="s"), cex=1.4),
xlab="", col=55,
panel=function(x,y,...) {
panel.barchartt(x,y,...)
axis(3, at=x, labels=mh.c[,"n"],
ticks=FALSE, cex=1.4)
axis(3, at=.3, labels="count",
ticks=FALSE, xpd=TRUE, adj=1, cex=1.4)
mtext(side=2, "standardized table deviations",
cex=1.4, line=4.5)
}
))
)
)
## export.eps(hh("twtb/figure/salk.dev.eps"))
## prepare to print the table with LaTeX
abind::abind(salk2, E, along=2)
tmp <-
abind::abind(salk2, round(E,2), "p(no.par)"=round(t(pp),3),
abind::abind(round(t(chisq.table),3),
array(NA, dim=dim(t(chisq.table))),
along=.1),
abind::abind(round(t(mh.c),2), array(NA, dim=dim(t(mh.c))), along=.1),
along=2)
tmp
tmp4 <- aperm(tmp, c(1,3,2))
dn <- dimnames(tmp4)
dimnames(tmp4) <- NULL
dim(tmp4) <- c(prod(dim(tmp4)[1:2]), dim(tmp4)[3])
dimnames(tmp4) <- list( as.vector(t(outer(dn[[2]], dn[[1]], paste))), dn[[3]] )
dimnames(tmp4)[[1]] <- rep(dn[[1]],6)
tmp4
##
library("Hmisc")
salk.latex <-
latex(tmp4, rgroup=dn[[2]], n.rgroup=rep(2,6), rowlabel="", na.blank=TRUE,
cdec=c(0,0,2,2,3,3,3,0,2,2,2,0,2,2),
cgroup=c("Observed","Expected","","Chi-Square",
"[1,1] position for Mantel--Haenszel test"),
n.cgroup=c(2,2,1,2,7),
file="salk.tex")
if.R(s=
detach("Hmisc")
,r=
detach("package:Hmisc")
)
## Edit the latex output into Table
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.