[S] competing risks and cumulative conditional probability of cause-s

Abdolell, Mohamed (Mohamed_Abdolell@pmh.toronto.on.ca)
Mon, 19 Oct 1998 10:50:22 -0400


The posting of this question has generated a considerable number of requests
for passing on any solution(s).

I apologize for taking so long to post this follow-up to my original
inquiry, but I have simply had very little
time to post anything in the last few weeks. However, I'm happy to report
that some-one did pass on an
Splus implementation of the Pepe and Mori code!

Specifically the response from Sandra Rae at the Canadian HIV Trials Network
provided the Splus code
written by a former Master's student (Lori Low, currently at Statistics
Canada) translated from the original
GAUSS code of Pepe and Mori.

The code forwarded to me was presented as a specific application to a
particular problem and therefore
the call to the function will be slightly different depending on the data
being analysed.

Sandra has provided a description of the data set which makes reference to
the actual S-code used
(appears after the description below), and you can figure out how to modify
the code for your particular
analyses -- in fact, I believe that you will need to alter only the intial
setup code (the first 15-20 lines)
that reads the data from SAS and calls the actual functions.

Thanks to Sandra Rae and her colleagues at the Canadian HIV Trials Network
for sharing this code
with the s-news community.

Judging from the number of requests for a solution, I think there will be
many happy people!

Mohamed Abdolell

============================================================================
==

THE DATA
----------------

The program was to read in data from an an AIDS clinical trial. The event
of interest was
time to New AIDS defining illness. However, an AIDS diagnosis could result
from one of several
illnesses. We considered this a situation with competing risks.

In order of appearance in the source code I sent you:

There is only one observation / subject in this data set.

INFDS: Date of infection (new AIDS diagnosis)
RANDDS: Date of randomization in the trial
to<-infds - randds is the time to event, provided an event occurred

ENDDEF: binary variable indicating whether an event occured
LASTDAY: last day of followup.
to[enddef==0] <- lastday[enddef==0] subjects who did not have an event
have the event time as their last
day of followup (and this is
censored).

NEWCODE: treatment code in the trial
rlpsi <- rep(0, length(newcode)) just creates an "empty" vector as long as
the
original data set.

OICODE: Each of the illnesses (about 17 different ones) were given a code.

One of these was the event of interest, all of the others were
competing
risks.
code <-101 (at the beginning of the file) identifies which illness is the
event
of interest. (We repeated the analysis for several illnesses).

rlpsi[oicode==code & enddef==1] <- 1
drsurvi[!is.na(oicode) & rlpsi != 1 & enddef == 1] <- 1

These lines identify events of interest and competing risks.
[oicode==code & enddef==1] indicates that a subject had and event and it
was the one of interest

[!is.na(oicode) & rlpsi != 1 & enddef == 1] identifies subjects who had an
event
but not the one of interest.

Subjects who reached the end of follow-up with no event would have rlpsi and
drsuri == 0.

========================================================================

THE ALGORITHMS
----------------------------

This is Pepe and Mori's program. The documentation
is terse at best. The variable names are consistent with
the original GUASS program but probably aren't so meaningful
without that background.

Also, the files are not as generalizable as what you would recieve
from the S library. Hopefully I've added enough detail for you to
sort it out, but feel free to email if you have questions
about how to adapt it to your data set.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

This function sets up the data ...

#Set up data to use in ci.fun.s

data <- sas.get('your directory','yourfile') #reads in a SAS data set
containing
#the data
attach(data)
code <- 101 #Change code to Event of
interest
to <- infds - randds # time of event
to[enddef==0] <- lastday[enddef==0] #enddef=0 if no event of any
kind, censor
#at last day of follow-up, 1
otherwise
rlpsi <- rep(0, length(newcode))
drsurvi <- rlpsi
rlpsi[oicode==code & enddef==1] <- 1 #oicode is code for all events only
one
#of which is of interest
drsurvi[!is.na(oicode) & rlpsi != 1 & enddef == 1] <- 1

grp <- newcode #treatment group

source("ci.fun.s")

cuminc(grp, to, rlpsi, drsurvi)
detach("data")
rm(to, rlpsi,drsurvi, data, code,grp,omit)
rm(cuminc)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

# ci.fun.s
#
#This program was translated from the GAUSS program based on Margaret Pepe
#and M. Mori's paper, 'Kaplan-Meier, Marginal or Conditional Probability
#Curves in Summarizing Competing Risks Failure Time Data?' (Stat Med
#1993:12;737-751). Notation in this program correspond approximately to
#that in the original GAUSS program, which corresponds to that in the paper
#(unless otherwise noted).
#
#This 'cuminc' function plots the marginal and conditional probability for
#the event of interest and the competing risk event (ie. 4 plots altogether)
#for two groups.
#It also calculates their respective (two sided) pvalues for the test of
#equality between the two groups.
#
#Pepe and Mori include a variance term for the conditional probabilities
#in the appendix of their article. It's calculation is included in this
#function (although not in the original GAUSS program) but not used.
#
#The default is for this function to put 4 plots on an open graphics
window.
#The function will crash if there is not an open graphics window.
#
############################################################################
#

cuminc <- function (grp, to, rlpsi, drsurvi){

#grp: group code
#to: time
#rlpsi: event indicator (=1 for event, 0 otherwise)
#drsurvi: competing risk event indicator (=1 for comp risk event, 0
# otherwise)

n <- length(grp)
# From 'readdata.ci'
# extract group 1 info
grpcode <- sort(unique(grp))
to1 <- to[grp == grpcode[1]]
r1 <- rlpsi[grp == grpcode[1]]
dr1 <- drsurvi[grp == grpcode[1]]

# extract group 2 info
to2 <- to[grp == grpcode[2]]
r2 <- rlpsi[grp == grpcode[2]]
dr2 <- drsurvi[grp == grpcode[2]]

# From 'main'
# no choice of upper time limit for test statistic

tau <- min(max(to1), max(to2))

# From 'setup'
n1 <- length(to1)
n2 <- length(to2)
tt <- c(0, to1, to2)
tt <- sort(unique(tt))
ttau <- tt * (tt <= tau) + tau * (tt > tau)
dT <- c(ttau, ttau[length(ttau)])
dT <- dT[2:length(dT)] - ttau # checked :)
dT <- c(0, dT[1:length(ttau) - 1])

setupc <- function (t, r, dr, tt) {
y <- rep(0, length(tt))
dnr <- y
dndr <- y
ct <- y
i <- 1;
while (i <= length(tt)) {
y[i] <- sum(t >= tt[i])
dnr[i] <- sum(r == 1 & t == tt[i])
dndr[i] <- sum(dr ==1 & t == tt[i])
ct[i] <- sum(dr ==1 & r == 1 &t == tt[i])
i <- i + 1
} # end while
list (y = y, dnr = dnr, dndr = dndr, ct = ct)
} # end function setupc

temp <- setupc (to1,r1, dr1, tt)
y1 <- temp$y
dnr1 <- temp$dnr
dndr1 <- temp$dndr
ct1 <- temp$ct

temp <- setupc(to2, r2, dr2, tt)
y2 <- temp$y
dnr2 <- temp$dnr
dndr2 <- temp$dndr
ct2 <- temp$ct

# From 'Func'

skm1 <- cumprod(1-(dnr1+dndr1)/(y1 + (y1 == 0))) # disease free survival
skm1m <- c(1, skm1)
skm1m <- skm1m[1:length(skm1)] # left continuous
ckm1 <- cumprod(1-(ct1)/(y1 + (y1 ==0))) # censoring K-M
ckm1m <- c(1, ckm1)
ckm1m <- ckm1m[1:length(ckm1)] # left continuous

skm2 <- cumprod(1-(dnr2+dndr2)/(y2 + (y2 == 0))) # same for group 2
skm2m <- c(1, skm2)
skm2m <- skm2m[1:length(skm2)]
ckm2 <- cumprod(1-ct2/(y2 + (y2 ==0))) # censoring K-M
ckm2m <- c(1, ckm2)
ckm2m <- ckm2m[1:length(ckm2)]

pr1 <- cumsum(skm1m * dnr1/(y1 + (y1 == 0))) # cum incidence relapse
pdr1 <- cumsum(skm1m * dndr1/(y1 + (y1 ==0))) # ci non-relapse death
cpr1 <- pr1 / (1 - pdr1 + (pdr1 == 1)) # cond prob of relapse
cpdr1 <- pdr1 / (1 - pr1 + (pr1 == 1)) # cp of non-relapse death

pr2 <- cumsum(skm2m * dnr2/(y2 + (y2 == 0))) # cum incidence relapse
pdr2 <- cumsum(skm2m * dndr2/(y2 + (y2 ==0))) # ci non-relapse death
cpr2 <- pr2 / (1 - pdr2 + (pdr2 == 1)) # cond prob of relapse
cpdr2 <- pdr2 / (1 - pr2 + (pr2 == 1)) # cp of non-relapse death

# From 'wpr' and 'wpdr'
wt <- (ckm1m * ckm2m) / ((n1/n) * (ckm1m + (ckm1m==0)) + (n2/n) *
(ckm2m + (ckm2m == 0)))

WPstat <- function(wt, pevent1, pcr1, pevent2, pcr2, dT, tt, tau, devent1,
dcr1, devent2, dcr2, n1, n2, y1, y2) {

# notation differs slightly from Pepe's program in that it uses a generic
# term, "pevent" for prob of event and "pcr" for prob of competing risk
event.
# Pepe wrote separate modules for the test statistics WPR and WPDR. This
# general function is called to calculate WPR and WPDR.

int1 <- function(wt, pevent, pcr, dT, tt, tau)
{
temp1 <- (tt <= tau) * wt * (1 - pevent) * dT
temp1 <- sum(temp1) - cumsum(temp1) + temp1
temp2 <- (tt <= tau) * wt * dT
temp2 <- sum(temp2) - cumsum(temp2) + temp2
temp <- temp1 - pcr * temp2
temp
} # End function int1

int2 <- function(wt, pevent, dT, tt, tau)
{
temp <- (tt <= tau) * wt * pevent * dT
temp <- sum(temp) - cumsum(temp) + temp
temp
} # End function int2

WP <- sqrt(n1*n2/(n1+n2)) * sum(wt * (pevent1 - pevent2) *dT )

v1 <- int1(wt, pevent1, pcr1, dT, tt, tau)^2 * devent1 + (int2(wt,
pevent1, dT, tt, tau)^2) * dcr1
v1 <- n1 * sum((tt <= tau) * (y1 >1) * v1 /(y1*(y1-1) + (y1<=1)))
v2 <- (int1(wt, pevent2, pcr2, dT, tt, tau)^2) * devent2 + (int2(wt,

pevent2, dT, tt, tau)^2) * dcr2
v2 <- n2 * sum((tt <= tau) * (y2 >1) * v2 /(y2*(y2-1) + (y2<=1)))
z <- WP/sqrt((n2/(n1+n2))*v1+(n1/(n1+n2))*v2)

list(WP = WP, z = z)

} #End function WPstat

temp <- WPstat(wt, pr1, pdr1, pr2, pdr2, dT, tt, tau, dnr1,
dndr1, dnr2, dndr2, n1, n2, y1, y2)

WPR <- temp$WP
zpr <- temp$z

temp <- WPstat(wt, pdr1, pr1, pdr2, pr2, dT, tt, tau, dndr1,
dnr1, dndr2, dnr2, n1, n2, y1, y2)

WPDR <- temp$WP
zpdr <- temp$z

# From wcpr and wcpdr

WCPstat <- function (wt, skm1, skm2, cpevent1, cpevent2, pevent1, pevent2,
pcr1, pcr2, tt, tau, devent1, dcr1, devent2, dcr2, n1, n2, y1,
y2,dT)
{

int3 <- function(wt, skm, pcr, dT)
{
temp <- wt * skm * dT/((1-pcr+(pcr==1))*
(1-pcr+(pcr==1)))
temp <- sum(temp) - cumsum(temp) + temp
temp
} #End function int3

v1 <- (tt<=tau)*(int3(wt, skm1, pcr1, dT)^2)
v1 <- v1 * (y1>1) * (((1-pcr1)^2)*devent1 + (pevent1^2)*dcr1)/
(y1 * (y1-1) + (y1 <= 1))
v1 <- n1*sum(v1)
v2 <- (tt <= tau)*(int3(wt, skm2, pcr2, dT)^2)
v2 <- v2 * (y2 > 1) * (((1-pcr2)^2)*devent2 + (pevent2^2)*dcr2)/
(y2 * (y2-1) + (y2 <= 1))
v2 <- n2 * sum(v2)

WP <- sqrt(n1*n2/(n1+n2)) * sum(wt*(cpevent1-cpevent2)*dT)
z <- WP/sqrt((n2/(n1+n2)) * v1 + (n1/(n1+n2))*v2)
list(WP=WP, z=z)
} # End function WCPstat

temp <- WCPstat(wt, skm1, skm2, cpr1, cpr2, pr1, pr2, pdr1, pdr2, tt,
tau, dnr1, dndr1, dnr2, dndr2, n1, n2, y1, y2, dT)

WCPR <- temp$WP
zcpr <- temp$z

temp <- WCPstat(wt, skm1, skm2, cpdr1, cpdr2, pdr1, pdr2, pr1, pr2, tt,
tau, dndr1, dnr1, dndr2, dnr2, n1, n2, y1, y2, dT)

WCPDR <- temp$WP
zcpdr <- temp$z

pwpr <- 2*pnorm(-abs(zpr))
pwpdr <- 2*pnorm(-abs(zpdr))
pwcpr <- 2*pnorm(-abs(zcpr))
pwcpdr <- 2*pnorm(-abs(zcpdr))

pvalue <- list(pwpr,pwpdr, pwcpr, pwcpdr)
names(pvalue) <- c("Marginal Probability of Event",
"Marginal Probability of Competing Risk",
"Conditional Probability of Event",
"Conditional Probability of Competing Risk")
print("2 sided p-values for differences between groups")
print(pvalue)

############################################################################
##
#
# Calculates the variance of the conditinal probabilities (cpr and cpdr)
# Not in Pepe's GAUSS program. (Theory is on pp 747 of Stat in Med article)
#
# Upper and lower confidence limits can be calculated from the values
# returned from this function
# -> CP +/- 1.96 * sqrt(var(CP))
#
varcp <- function (y1, y2, skm1m, skm2m, devent1, devent2, dcr1, dcr2, pcr1,
pcr2, pevent1, pevent2, n)
{
v1 <- (y1 > 1) * (((((1-pcr1)^2)*devent1) + ((pevent1^2)*dcr1))/
((y1*(y1-1))+(y1<=1)))
varcp1 <- (skm1m^2/(1-pcr1)^4) * length(y1) * cumsum(v1)

v2 <- (y2 > 1) * (((((1-pcr2)^2)*devent2) + ((pevent2^2)*dcr2))/
((y2*(y2-1))+(y2<=1)))
varcp2 <- (skm2m^2/(1-pcr2)^4) * length(y2) * cumsum(v2)

list(varcp1 = varcp1, varcp2 = varcp2)
} # End function varcp

############################################################################
###
#
#Get variance of Conditional Probability of the Event of Interest
#
#temp <- varcp(y1, y2, skm1, skm2, dnr1, dnr2, dndr1, dndr2, pdr1, pdr2,
pr1,
# pr2, n)
#
#varcpr1 <- temp$varcp1
#varcpr1 <- varcpr1[tt<=tau]
#varcpr1 <- c(unique(varcpr1), max(varcpr1))

#varcpr2 <- temp$varcp2
#varcpr2 <- varcpr2[tt <=tau]
#varcpr2 <- c(unique(varcpr2), max(varcpr2))

#Get variance of Conditional Probability of the Competing Risk
#
#temp <- varcp(y1, y2, skm1, skm2, dndr1, dndr2, dnr1, dnr2, pr1, pr2,
# pdr1, pdr2, n)
#
#varcpdr1 <- temp$varcp1
#varcpdr1 <- varcpdr1[tt<=tau]
#varcpdr1 <- c(unique(varcpdr1), max(varcpdr1))

#varcpdr2 <- temp$varcp2
#varcpdr2 <- varcpdr2[tt <=tau]
#varcpdr2 <- c(unique(varcpdr2), max(varcpdr2))

############################################################################
#####

#Graph marginal and conditional probabilities of event
tt1 <- tt[tt <= tau]
pr1 <- pr1[tt <= tau]
tt1 <- c(tt1[!duplicated(pr1)], tau)
pr1 <- c(unique(pr1), max(pr1))

ctt1 <- tt[tt <= tau]
cpr1 <- cpr1[tt <= tau]
ctt1 <- c(ctt1[!duplicated(cpr1)], tau)
cpr1 <- c(unique(cpr1), max(cpr1))

tt2 <- tt[tt <= tau]
pr2 <- pr2[tt <= tau]
tt2 <- c(tt2[!duplicated(pr2)], tau)
pr2 <- c(unique(pr2), max(pr2))

ctt2 <- tt[tt <= tau]
cpr2 <- cpr2[tt <= tau]
ctt2 <- c(ctt2[!duplicated(cpr2)], tau)
cpr2 <- c(unique(cpr2), max(cpr2))

#Plots marginal probability of the event

par(mfrow=c(2,2))
par(cex=0.8)

#Plots Marginal probability of the event
plot(tt1, pr1, type = "s", xlab="Length of Follow-up", ylab="Probability",
ylim = c(0,max(pr1,pr2)),
xlim = c(0, max(tt1,tt2)),
main="Marginal Probability of Event")
lines(tt2, pr2, type = "s", lty = 2)
legend(0, max(pr1,pr2), bty="n",
c("Group 1", "Group 2"), lty = c(1, 2))

#Plots conditional probability of the event
plot(ctt1,cpr1, type = "s", xlab="Length of Follow-up", ylab="Probability",
ylim= c (0, max(cpr1,cpr2)),
xlim = c(0, max(ctt1,ctt2)),
main="Conditional Probability of Event")

lines(ctt2, cpr2, type = "s", lty = 2)
legend(0, max(cpr1,cpr2), bty="n",
c("Group 1", "Group 2"), lty = c(1, 2))


#Graph marginal and conditional probabilities of competing risk event
tt1 <- tt[tt <= tau]
pdr1 <- pdr1[tt <= tau]
tt1 <- c(tt1[!duplicated(pdr1)], tau)
pdr1 <- c(unique(pdr1), max(pdr1))

ctt1 <- tt[tt <= tau]
cpdr1 <- cpdr1[tt <= tau]
ctt1 <- c(ctt1[!duplicated(cpdr1)], tau)
cpdr1 <- c(unique(cpdr1), max(cpdr1))

tt2 <- tt[tt <= tau]
pdr2 <- pdr2[tt <= tau]
tt2 <- c(tt2[!duplicated(pdr2)], tau)
pdr2 <- c(unique(pdr2), max(pdr2))

ctt2 <- tt[tt <= tau]
cpdr2 <- cpdr2[tt <= tau]
ctt2 <- c(ctt2[!duplicated(cpdr2)], tau)
cpdr2 <- c(unique(cpdr2), max(cpdr2))

#Plots marginal probability of the competing risk event
plot(tt1, pdr1, type = "s", xlab="Length of Follow-up", ylab="Probability",
ylim = c(0,max(pdr1,pdr2)),
xlim = c(0, max(tt1,tt2)),
main="Marginal Probability of Competing Risk")
lines(tt2, pdr2, type = "s", lty = 2)
legend(0, max(pdr1,pdr2), bty="n",
c("Group 1", "Group 2"), lty = c(1, 2))

#Plots conditional probability of the competing risk event
plot(ctt1,cpdr1, type = "s", xlab="Length of Follow-up", ylab="Probability",
ylim = c(0,max(cpdr1,cpdr2)),
xlim = c(0,max(ctt1,ctt2)),
main="Conditional Probability of Competing Risk")
lines(ctt2, cpdr2, type="s", lty = 2)
legend(0, max(cpdr1,cpdr2), bty="n",
c("Group 1", "Group 2"), lty = c(1, 2))
}

############################################################################
###

___________________________________________
Ontario Cancer Institute / Princess Margaret Hospital
Biostatistics Department
610 University Ave., Rm 15-422
Toronto, ON M5G 2M9
Tel. (416)946-2000 x4879

begin 600 winmail.dat
M>)\^(AH.`0:0"``$```````!``$``0>0!@`(````Y`0```````#H``$(@`<`
M&````$E032Y-:6-R;W-O9G0@36%I;"Y.;W1E`#$(`06``P`.````S@<*`!,`
M"@`R`!8``0!%`0$@@`,`#@```,X'"@`3``H`,@`8``$`1P$!"8`!`"$````T
M.#@Q,SA%03`V-C5$,C$Q.38T1#`P.#`U1CE&-S(S.0#M!@$$@`$`40```&-O
M;7!E=&EN9R!R:7-K<R!A;F0@8W5M=6QA=&EV92!C;VYD:71I;VYA;"!P<F]B
M86)I;&ET>2!O9B!C875S92US<&5C:69I8R!F86EL=7)E`-H>`0V`!``"````
M`@`"``$#D`8`>"(``"T````#``6`""`&``````#`````````1@````!2A0``
M%1(``!X`(X`((`8``````,````````!&`````%2%```!````!0```#@N,#,`
M`````P`<@`@@!@``````P````````$8``````84````````+``"`""`&````
M``#`````````1@`````#A0````````L`)X`((`8``````,````````!&````
M``Z%`````````P`"@`@@!@``````P````````$8`````$(4````````#`"B`
M""`&``````#`````````1@`````1A0````````,`*H`((`8``````,``````
M``!&`````!B%````````'@`Y@`@@!@``````P````````$8`````-H4```$`
M```!`````````!X`.H`((`8``````,````````!&`````#>%```!`````0``
M```````>`#N`""`&``````#`````````1@`````XA0```0````$`````````
M`@$)$`$```#:'```UAP``,%-``!,6D9UMJ7#MP,`"@!R8W!G,3(UTC(`^S,V
M`>@@`J0#XPD"`&-H"L!S970P_B`'$P*#`%`#U1%H#E`"\K$0N51A:`-Q`H!]
M"H!I",@@.PEO,`*`"H%U+F,`4`L#"V!N#A`P,](S#&!L;@(@90NF%#"`:&4@
M<&]S=`N`@&<@;V8@=&@$`-P@<0I0&9$"("`0X`0@)F<)\`20870)@"!A7B`%
MH`"!!($!H&P94&[^=0;0!)`9XA7`&G,$(`(0/P7`"K`$$!FS`Z``<'D@"G,&
M\'4:LBAS*2[O"J(*A`LQ(!))&]`9<`D`N&=I>AE0'@(!D&L9LNT?,"`)`!G!
M="*`&7(:%(4"$&P)`'<M=7`BXE9M'Q`%L&DA<&X'0"`#"X`:<&ER>2P@8FT?
M8"`A`!#@=AE0`)!M?PM0'Q`0X!O`)F`EH"*0:?\"0!R@'_09H`>`(N<>\1HA
MOQG!"X`:$1E0"V`C068'T0)W">!K<RX@($B-)`!E)T$EP$DG;1KQ_'!P'Q`B
M\17`&7``(!H1EQN0'R$'@"T8<2!D'$#7'C,>M!_T4PM0=00@)J)^90>``C`;
MD!K"&?,94%#O+*`94`!P&\!-),$;\0$`WB$?^"`U!@`Q`&,&D`W@[P=`)M$I
MXA7`<QEP`(`AH=L#808"9!N`!_!A,1$C4CT94$,`<"<0!S`#H$A)3E84,`<B
M!Z)T=P6P:_L98`-@=AQ!&\`IXB\D,<+["N,*@'<%$`)`"?`ET!\0OQO@'@$'
M@`7!*C$$D"<$((T9D'4!``(P("A,,8+U/$!W)<!C"'`5P`(P)M%M+2%3,`(9
MD6,$(#9#8?XI&A`;@`"`"V`;HC33*>+#),8?]$=!55,%\#DS?QGQ,.L?Z0J`
M&3(Y,QX!=_\+$3AB)'$94$1`!"`X``>0_R_A&[($(!O@-&`S5"$1"U#_,Y$:
MLR+Q&^`*L3X1&$`*P?\X`1R1*^`Q,BGA%<`>`3EF#RGB,Z(BXBGB9G5N8S\:
MLP/P2K$=`!\@)Y!G:/\]0BW@`2!)<3P!`0`Q`#%`_QZ%*>(^H`&03"$9LC91
M)M#]$1!D0KLU)1L".`<;X`$`_P3T,#E.HQ$1*J`:,!#0)(#O(A`'D4F!33)C
M*(,IX@#0\SO`)2%3+3DS+U`;L1_T^B@L$640\1O0`8`=$4YCMU(9'0`C\2DE
MP#$R>0A@]TJ!`Z`S@&<(<$`!)?$48/\'X"1B!'`&D#/D0\99PAXB3T@&'_1/
M500@+2TIHF;_59$KH5D"")`F82T#6=)+X_\8@$2$!T!7T@(@,]4+@!F@[R4A
M$1$D,3DS*$L3)9`C0?@Q-2T9`2>0&(`?P$GVORTA%<`G$`0@3F<TU$$%\/\Q
M,C.B9<15E4M6*O!"S`!P_RK@(N(U*C%!26$;\2/@5V#?6G`'D37?-N\=\W,0
MX1FR/QHC,<(YA2>@5``IXG,M91B`=SD2;6U+8">@>?D?[PI*.]`D\1G0/Y<<
MW_\=Y$8A'T5?,BE2-^!)4TO7[P.!)N(L(C$`;R^A,@\*@(\Q<!#@!X`;P$%B
M9`;P]UD@0)4R>CU[SWS??>]^_P-_ET++2$4@1$%4?D%QM%Z0@DQZKPC0$?(Q
M_QDD`V`)P'G010,L8R<1*;''9B@#D0.104E$04%D<?\SDC[1!S$K`1DR*V$\
M`1GQ_V)!27$C0441)_P'PH>#`0%_A_$I@B/@9)$J^X=6;.%G_QA@`)`Y$AA`
M&\`T01A`*E'_-.(MHAGQ$1`G04"&C'4'D/TK`5=#HAPD.&,:048A)Z!_5<!+
ME7`Q<1$Q`!FC!1!S^RKA@TI),%%$870C5S0`</]4\2FU'S`(<%3Q.3,A`$6"
M?5G".D+-2<$:06&SC^-B*1$0<G8P%"\?('5B?FH%D`5`*;,:05,VE1Q.^D:'
MH#J!D!N1B70J<$N$#BAPP8W-9,5204Y$]YYZ/O%Z0&TA@#`4*;6(8_$G]6\\
M+9\Q9;%>H*)R_V6QI9(:0:.#*&6)(R7`45B[`Z"))6,\XR"5<;1%H9'T14:>
MD&(E`2=AFV`'(?\<D@N`+>!'(AG!4\`1(&M"JZ?<J,9,9M!4@:!9GI#_*B,^
MH"2A&@`CQ"0P<:4B\(Y;3<$!`7^0,%T@I)#_*A.ND;`:I9*;]00@4\`B@/\M
MXAA@6N$F4J?6<;2ED[4__[9/)C0IXHDD*%.%HAE`)9#_*A.TG[J/NUJNG3P@
M210:07]O0@GP'S`5P1_0*Q"#2D[P15=#3ZG0GI`^T5=@#G0OTCDDHU\*<FQP
MYP"0L,(LD2@P)<`<H!?0MQH@G](QPBD^P"L0:B]0;\#1P&)L`@.@(B_`!3!Y
M_B(G,4N`=1($("*CN+0Y=9^[7\C?)+B<_S(X3TF_Y?Y%`-!4`#!UD2>]40;@
M)?'\,3=,Z1AQ'\`JH4G!(7#?B3$;TP$`OL?(]T^/]"GA_S2AA9.(_QJ167%*
ML3!ULY#_26&RX7:BE"C'?93*.3.DD/\7\(2P5R!L1'0`)/&,(S!U_S.`'*`^
MP!Q!8E$S@`>14\2_C'6EUK1/R:6)F"L`*)'A_RR1Q0(X=$]4(Y-N@9!DS8CS
M']K"15MO#>`$<7^0.3/V)M-`L#4QL+,70PJ`-5!7CT";4.,P(00`+B40*,_C
M5#[`Y"#"9"$]9`#D%_][L60`Y-I#)S2A9'/:UA\0_]-3+E&)F6<#E#\@$N-/
MY%C_JQ8'D2T#1B&<!2<",3+35/\Q,B>@TL>/Y8FV@TKF#^<?_^@HVMJR>_$T
MW-_Z;_M_^^3_)>*S@O+/WN%/Z[**98$0T/\X94W!KL@D(G`3&&#313>P?X[B
M)D/"9#$RY9,QH.AA,']"NW^?!L\'WPCO@&^!<4$@3$=/4DF!8$U3_X'O#.]"
MS+W4,.L[@845B+7_>D`\X"_7D,5EP=5A-;-T`/_>XA#3JI<E$+B`DO'5PQPA
MGSM!`L)P(4GX),='56;0?V;@A18EXDB2JM$Z<3T1)_\M,D31/P`>@4M00)63
MTLYB\RT#&&!C:X5`SF`Q0$*[^D$W4&\EP-I&%)2S@L:!_F=4T.$RHM&JXL:!
M4\!@%G^.U3-@*V'YQ#^79N`GD&+_X4`EH"L#,0`9T2;1*\"SXO>P0?&1CF!U
M3)!-@3``VI#_7&:%P?G$OF&<48EA=9`\P/_\\BIP62`TP2K`II-4("1Q_TT`
M6<.W<W23:*)=I<Y36P5_/I%8L/)"A=%<L\J?>*XE_RV/+I\OKS!8#@]+5V*Q
MDO";`>%.9RXT$(-*(U-3D;\!X4ZCA=%6<9="1G`N2U%>+HIEY35.LNC!<\:`
M+G$>4'0H)RLD8\#&(WFL)RPXL]J")\11(V6$_X914>!FPE,WDA$D48PB^<_?
M/<\^WSJ`3F9=I701D`!P_BA.HL^PU^MD`-C!0M]#[[PC0VG!'E!<%(7118D^
M_Z06Z+*DM*4,20\_TKA4D"'_^7FO_[$/LA0_I4O59%`GX?<"9Y9R=X%KJR'#
M0+XT/,__4A]3+SJ`;#&N3P'"PT#V8/_5,Y/08K#"#\,?Q"+E.U=C_U<CXI_N
M3^2V/]);1+WSP0+_=0-@H>L6FI51'V#//UI/X?_;E>MKY3_T__8/Z&B^ZX5`
MOP'PZ,'#U3_3P&<;<G"#2NF7Q"@B-G8BH077Y7/@^8908RAHL1SA'-%F`U?P
M;V1U608D04$Q(H:";(9R_&TH;BAD=6ZQAI%0D661]BQMTJ*Q='"(;61LFRS/
M_W9?=V]X?S!O-%HV;4I0?&^_?7]^6S2E#L.%&Y;Q<U20X]^R(2='05472L:`
MIZ'UHR%-EN!G%+'.@`]"-*6?#Y.,X`_6EJ"-8B=+EJ#Q5)!N+4VY`(UB@Y+*
M0[U>84//<,[0HP(6X5`80^O:D"7P>32E0V2AZE+08.W_<&TGD.T@>NSBA]#6
M%O)2E-(@1B1AK1$0T*9BT9ZQ83\GWQ!3$9$/P`&M-B,Q.3DS.C$`,CLW,S<M
M-S7Z,;ZR3K.0HOE_^=7PJ*'<<W"'X9:2IU!XIF#?H?\BX24F0`'9`9=5%HB"
M.E?P?]N4D1C2\2I`DSJ%LS2E*/\;H!UAFF%6-K-ROI(TI7]J_B=M9(TP,G>&
M4+.0TO2*@?\6M.Q$A_@8-(CSX+*2Q],_;^P5_7+LC)_E*/?P$+`TOYP5P>`U
MT#AQU5%TA2->4LYT`O!J9.UF(TGP<1RQ_Q3@P>`10($RN,:10O#QT#'?WQ"E
M$N"`(X'$4'"JD(Q`O\4QI-/!@NP"3^`TI64HH/\>H9[AV7"E$";`P56E+S2E
M^P]+ZZ%CC$#!$3O`$\,RD/^J$G#PJ:>=GXCC]_$TI<%%\Y'!`0%I>-H%N1$4
ML.S0_Z[PT-*F,!`1IK:/TSKBKO/_\C&0)*1F,H;8\*/`&I$D`?\=XI./@CK$
M4/SV-@$;P']']W]G$0$BH&$9X"71J9824?LR:#71</T!HS:/X?E!(H'[T&""
ML7"5@?BA[Z$!L!"P_[QY,G<"$-21Q.#&@-O1VB/_C&$241WCP#_!1)G<QO_(
M#^_)'\HORK9LKV/HLK>X;=_M;N9[-$MHL3IJ9$5TDL;^;]!@2G(TI68#T&"?
M].^E_5YA*.2PX+.?\U?P3P"8Q_^D5F1UT&"AG],OX+/6LJ(I]]31F=81D&+5
M"6?KP`!,@M]8)&BQI%:,`(&B)SJB.Y+.+B!PC3!Z]F5X@.'Q`?_0A&:01]$E
M-6BQ0B8EHIA!_FDHH=TC=(4UT&:0Z,%+H==HL@2QX45;]T!=5K7C@_]:Y.0/
MY14$0..#9';F3^45^]\OT),RX)/!I370ZY#CK_WDLC+E!^R#Y>_MNP1`[(/_
MZ#_MG?+?W<<GD1CPWQ=/4?\`<%UA2J,!X(712F0>L'-1_[!$H-(3,!&A*-',
MT,O*$9#7*##,\6V!*">0>'$1CS#[5_#Z-#)8]MU\.^$!X-\&_F[C@U@5^G+<
M%>R#_=?[,/]+1;]0S/%ML%?AXV'-\O_<W^'Z00#BY_F%`%$JJ&$`8;=F</F!
M.F`K!.($53X$X[UD%50`=`.R'.'Y@5O]UKT$\EU!I@;$!L#MX#I8%7\&P`B@
M2#$#LTHR]>"H`&N](Y$Z.F$&;%?A":$Q">;_"&-(,5RP=(O\H\S=)D&%\?]9
M<`>"0:'/57Y0&*!7?P,8^7Y09&Y><,SQB343\EEPSQ1+W_$46E=3,3M?QF+1
M/Q\!HN`$LA+I$7D2`5MIWUS#69!Q`07P!-%T&E$3A_\3\QI97G!G0EP!OU!G
M01M?_Q4A&ED5,5R1'9]?];?@'U]_9=(=12"??E)74V9`!4`Q^5_(7'U*(V;1
M%_5?QK(`[52Q**N`9G!Y;K$4(69P_Q01*)(@`A4#4)$CP181$X??)E$FI#)Z
M#Y'XRV7903@"^P]T^F(LY8!NL@$B$5)`H_9YXX0M@22)-101+_@4$=\PIN?%
M,859<,PE="_XM^#_++\MQ_L"SC$VD?#!$2,OA?_LA#!<-_@QVSDZ,V@W^#2L
MG=W61BO1WP9K)6MMXX/#S(&"@60H,2U!4#$1\BLR8RDO*#!FD`5`01+]9T$P
M6/`+\'Q0B`"9,(,1_X&!J^`:L62QJ4$^R('``(/_`2$_(G2%1`=$`PU81.--
MRKM)Y[2P9K]0L-&AX76XD/^U,#.%/S]T$#/P0/Q!Y5"T_:'R2X:02:E$2$H2
M=(5."/]&/$[C1V](;TEX/L?L@S^L_C)`D_LP00'KD$%2ZY!!MOT+,7."T%XT
MZS94*$1+_];_63=9,T9[^S#E%4H15+T[X?]6:TQ?36M9:5T"3RA995ML_V&S
M9X`\RH*`/U8B<D0$!&#_,0)!#POQ7V+,D*["J-&OPN\2<(9@;H#1%G#GQ66/
MY\'_2X]?8B5@N."&@&D&;["20.^XP#.%915E$B^X,",`;O'_Y\)!46GC'5)G
MLU]BD8*>4O^@0FD,;I#GQ6GC;U9OY7!J_WM1V5"@46T?9$U4MF6U66'_9E->
M3&>/:)QIAW@?:R5>3_]LKVV_[(-W\F]8><-\LW"?_W&O<K>!E/#"<^>"Q(,Z
M=9_S=J\\[R=WD)"-,*XSBY'[SL#?!G<`8U$#9C)@TPOPY6]1*/UP+VX+\`1A
M3@3_05%.`U\#04+^X([4BF7:PA]CTX^&66%7%8H/"E=0^_@BS.HHC1`2P*?P
MHI(!(;\/H"ZRE>0VD99Q-M)4!X+?S?$'8K:0E@21.626@YB4_S;2EW/]<)KQ
M-I$OX)MQ^S"?$7?U./@RM>'8(&9FVS#-M3!SL@"XL'1LJX!"T/\]P:WRM2&Z
MA;;$E+'W8;N1_Z.1Q1"S<-LPV##J-K`"$L#Z(I7D(K!#A';7I*Y"HF#_PT"B
MW-:_U\'&%I[S%_"ZD-\M<"WA,Y&)P*_@;>E@O6#?H,&P5O?<M3"4<%*N,Y1P
M_$12M-'"(+XQZC:A$[%A_[>WOC&U4;2P*Z"_`;56K^#_JHN36]K"MM`S])4?
MU+*6<?^7J]N7VL&S\QF6L_8P,^.#_P2*!&"-$01A;X/7HX[R#(#_LYRUB!K#
MM:(.,FIENB4%0?^UHKAOI9#L@[8ON"^\V;GF[YOANIN;X;N4,K2?+86UE']N
M\9:`!%'"*;C+LYTK0D7_*YJPHJ^?L*'L@[$OU+*RRO^SG\4_+:.]CP1@E>2^
MC\-)_[GFNGV[=M"/QC_'3\FBDU^WD82K`"VS<>(1_7`JD+']CJ$K_N"#H01@
M(G*W!)7EN[=WF^$J#(&33,WB=N.#[["BE9\NPK+97NN09E';-?]!4<FBWE/3
M[97GWYRX`Y:!W]T/_7':9,ZL9L(^NF$$8.O=L6:R*F;!+;MC9L$$P/^#D<PI
MW:"]--X=ES_CZ>M$_^$?XB_K_^1%Q1GJ)?[AY@^_YQ-Z(.>%@@%YH>A1,NB6
MVC+I+WH/PJL`+]DCD*+UV=8JW;`KCJ+WZ)OBM`+WS$B12"?B*-C!'6"K`!+`
M^_;0'6!ZW)\K,L>+E'0TS__V\ZG2WE26DR[S=_$!$Y>?_S$1F051EC)C*),V
MTCIRFO_?D[RJH#@6JP`EM'J+L#@'_GK^_P`-`44!!.N2`@\$1?\#;@1T`?0$
MPP6/D]JK(`=O[PAP%30([SUV=VZ1I`,4\?LI@9.[0Y2/C6#>8C\B6?3_3L&5
MYQCUZY*5]^M%D3F6==^7<Y@/F;^:SS?@+++`S"K[S2JP"S/)[S\ALE?,+]/O
M_RV4MP,_(=`S9K!`$<1Q^)#WQ'&0((.1*B1]D:,G[21MO]%OTG_3C]2?U:?'
MCC/<K__=M,ZAYJ#FTNA0(E(7Z=\V_^02,D_=L><CYX2.D"?40."_Y"'<4."X
ME>4X0S@"+RZ-_V;"YR/HE^:2@Y$UO]EQ:I+_W;#I?\Z:,^SKF35^P`/J,?_S
MQ8.!-WE60#A(@L3K1#FE_U9!.D]#)?4W/%_R#OEQ,>__V,_9W^A0&/9>$-O&
MW%%)(/_Z;/;?32G=L9""^,P#;/M%^CW[XSW\9]7/_E,6M`E/_U#"%K07[VZ2
M6F,,$P%I"[?_LP$#;`+(!#\>[T%T%>T1S_\(8!4"$S]83UE?&-(-@X73_UO,
M6TA<KPT:#K]?CV"?%K!_$;]BPQ,/=X:+H2*2].!PDXC@HB`H+9&P<R@(<?^3
M-G#!;T1Q316P<DAB]7%,OUJ!=&IR_W8C=$A\57:LD-YUJ6"-0?M#<,(L<L/>
M@>\4\GLT=$'"=&Z?P*#`@P"'>;-_<(U!8R@B37E@MF>?\*R14(2!D;!I^T#V
M=)Z0B+%%HI,-OH!9?<_U?M9#I8=2IB%_KX"Z@O#_%5"@<!>A@=]_3XA/A9^"
M3S^#5W)6IA#0$'VP0X!S:?/@H*W0<"UYLZCDG:2L4,ICH,%BI;!W9:Q0H0#Q
MGL!U<'.,#'SU$\N1_[^3#Y0?E2^5QZO%J\9#KC;_JF"I0GFPIA"D$([`HW*I
M0M^E<(F3B?*C,H:D::#!3D%W%21[Z12`3J>PG^*?!4>P05534Y]FJT`HJW!>
M9:3`BM"KD<@A<,Y0-[0T-XKB4Q;BG.%-K<'?A_"J,:VPG!:KQE6?4*QPN:0#
M;&^/,*30F;%FC2'[F0+[0&V&X*UBCV"/`*X8/\>A%+*8=(VRJ\:.D'1UOG*L
M8*5'JY'^!JO&+4.@"Q:PNX`OY;`Q+CDV]]I23(*8L2@6L'C&%(#"=/^8L5J`
M%QQL1C22(\$8DB/!_QU('DD=I.N4`TWKQ!H_Y<#_4ZTE6C+FYU)#MS>_&G$[
MX]\Y+T:6B%\WD>@W*?B0Z0Q_`\6KPS,$K7/@4">PM@8T_S=BH0"#8)EP/"$W
M8BU5/DC_`WOJ-4-[1"_<`[=(1@BXC_^YB_3FNM+UM;.BP$RKTC\T_ZWCO5=$
MD;X;Y#._-OF"`W3_4[^J0[R"2."\5`_`R17.M?\&5U9/J\.1/],OU#_53]9?
M^Y9_J,%'BV"8JXE_AKB9<ON'4XKB28>`CH'[8);<+!;_J\.LZQAV:I9>]FK(
M9VZHAO^P]6N#H2VKPSH`;V>\5.0?Z[Q$.@!;,V5=Y>]]D2+@/&EQ>>#.-#H!
M#\!M8?YXZ:>1+.2$0L/E./%5Z^K_Z_7G<?,QY\]"P^DMRZ#J.O]-<4L+V%_9
M;]I_I=""_-R__]W/WM[@FM^Z6T?B7.%+XX__J](-@>3__S__AN=__YGI+/\-
M@>HJ!4+K'V;S[&\'#P=6_^[O!UH$;O&;#2*1+P]?$&\_$7\2C]=-%#_S5YX@
M<&C_ZD&!E9N3].F:;(KQ&D-D)?LXT6]R=`IT/^+G]>3%YT2/&IP9U7V@&=%;
M(62/L-^CT*2PI2&W<#H!76BA0`'_&QOI)^GXZM\Q0!GOY^;HI_\;[R))?:`B
M<AWKZ>,>^^BO_^GIZL\9P0?$(P^,<4+#[K?_''L+]2NA'>W+H![]"_SQ>/_R
M7R)Q*\\CN`OT+;\T&29S?R^L\6,G_@O\\6GR3PZV4/^BP*01%H>::-L7&2EY
M1:IQ\FVE87<]?:!HD#R'01+!CL!X/3`N.`Y</>3_@7<^WS_K'B"<L!VB6R6&
M\%NQL,ZA(H_0:Z!XI0!B&#TB3+YSBN)&;VSMHL$MC["'H7E(HXHYAZ?/2E"C
MX,ZA?:`P+"$E>M#_Q,*'MDB03!?J0T<R-%%-6/_J4(&P2-"!?X;K586CT*<@
M[W'P-%%H5D?I;(;Q(V#0-GVA`&>'<!Z03H5,YFN@8ON&\$C0;H>@(A5]L!8@
MCZ'WJ9"'H5?5,HP`5%9]H&Q1OPX^/>077T5?1FLB<BPDHO]'OTC/2=]*Z$N8
M3$&\X$Z%_UZ3/%1-?V.67E-//U_P]-__44\.:E*T-$*P$#9R4Y]4K_]CCU:I
MR!97OUC/6=_,JQ8?_Q<O&#V9L(M&C)"+X!D?-*__C$,#]0)E'$\=7QYD!4(>
M_/\#_@4Y!BIOEGB_(YD#]GK?_R6_)LY]SP/?AP4J)H"O*Y__>;LM9`I'+D\O
M7WV3,*X+WO\-&0X*@5B+CX,)-B6-GS>?_X9/.:\+W@T*#?NK53U_1+__7-5W
M'T9?X39>_V`/81]+#_],'/K"#@1DOTZ/3Y]0K_2C__;J4C_^!FO/;-^`.*B4
M;N__;_]Q#W(?6M^?3Z!?H6]>)_^B_Z0/I1]AWZ=/N_0-]>)%_ZF)9?YG#V@?
MK2^N/FL&KY?_O6"P;VU?P8A6O[0_M4^V6?Y]#F_1;])_TX_4GQ/?T+/`9%QC
M9C!<UT'6+P)F[4!F<S$W(%]OV3_:3]K6T,1/0##T(6^#]K#T4G(@26YSQ6#D
M='7X@"`O:'&L,$+`#G-$5'-0\^%(;W-P]W:`==#0Q$+%<-U0AL"Z8"7%8&.W
MH$1E>]%T;<%`)S8Q,"!5B0!`$%1R<_8204`0+J+`4D%E8#$U+30R[454EF]!
M<$`P;Z+`3T[]0$A--4?.H$TYX[5E!&PN8W`T,38I.6`T-BTR,.:@O1`TW#@W
MY4785==1<^:0T,0*?7P``.D````#`"8```````,`-@``````"P`"``$````>
M`'```0```%$```!C;VUP971I;F<@<FES:W,@86YD(&-U;75L871I=F4@8V]N
M9&ET:6]N86P@<')O8F%B:6QI='D@;V8@8V%U<V4M<W!E8VEF:6,@9F%I;'5R
M90`````"`7$``0```!8````!O?MO>M<.[Z4"9#L1TK-#``C'$&">``!``#D`
M<!)*S&_[O0$#`/$_"00``!X`,4`!````"````%0R,D))4UH``P`:0``````>
M`#!``0````@```!4,C)"25-:``,`&4```````P#]/^0$```#`(`0_____P(!
M1P`!````-0```&,]55,[83T@.W`]2$5!3%1(0T%213ML/5142$U!24PQ+3DX
M,3`Q.3$T-3`R,EHM,3DY.#4``````@'Y/P$```!.`````````-RG0,C`0A`:
MM+D(`"LOX8(!`````````"]//4A%04Q42$-!4D4O3U4]5%1(+5!-2"]#3CU2
M14-)4$E%3E13+T-./50R,D))4UH````>`/@_`0```!(```!!8F1O;&5L;"P@
M36]H86UE9````!X`.$`!````"````%0R,D))4UH``@'[/P$```!.````````
M`-RG0,C`0A`:M+D(`"LOX8(!`````````"]//4A%04Q42$-!4D4O3U4]5%1(
M+5!-2"]#3CU214-)4$E%3E13+T-./50R,D))4UH````>`/H_`0```!(```!!
M8F1O;&5L;"P@36]H86UE9````!X`.4`!````"````%0R,D))4UH`0``',%R$
M6)IG^[T!0``(,%:9Q\UO^[T!'@`]``$````!`````````!X`'0X!````40``
M`&-O;7!E=&EN9R!R:7-K<R!A;F0@8W5M=6QA=&EV92!C;VYD:71I;VYA;"!P
M<F]B86)I;&ET>2!O9B!C875S92US<&5C:69I8R!F86EL=7)E`````!X`-1`!
M````,@```#PP.44U1D(X.$4U0T9$,3$Q.38S,3`P.#`U1CE&-S(S.3,T1#A%
M.$!45$A-04E,,3X````+`"D```````L`(P```````P`&$$<L$T4#``<0JS(`
M``,`$!```````P`1$``````>``@0`0```&4```!42$503U-424Y'3T942$E3
M455%4U1)3TY(05-'14Y%4D%4141!0T].4TE$15)!0DQ%3E5-0D523T9215%5
M15-44T9/4E!!4U-)3D=/3D%.65-/3%5424].*%,I24%03TQ/1TE:``````(!
M?P`!````,@```#PP.44U1D(X.$4U0T9$,3$Q.38S,3`P.#`U1CE&-S(S.3,T
31#A%.$!45$A-04E,,3X```#3A`==
`
end
-----------------------------------------------------------------------
This message was distributed by s-news@wubios.wustl.edu. To unsubscribe
send e-mail to s-news-request@wubios.wustl.edu with the BODY of the
message: unsubscribe s-news