https://github.com/cran/Epi
Raw File
Tip revision: 2fdf3dc5a9fc3a20c1958288fd48fae421770db8 authored by Bendix Carstensen on 31 March 2024, 09:00:02 UTC
version 2.48
Tip revision: 2fdf3dc
mod.Lexis.Rd
\name{mod.Lexis}
\alias{glm.Lexis}
\alias{gam.Lexis}
\alias{coxph.Lexis}
\title{Fit intensity models to follow-up data in Lexis objects  
}
\description{
Modeling intensities based on Lexis objects, exploiting the structure of the
Lexis objects where the events and risk time have predefined
representations. This allows a simpler syntax than the
traditional explicit modeling using \code{\link{glm}}, \code{\link{gam}}
and \code{\link{coxph}}. Requires that \code{lex.Cst} and \code{lex.Xst}
are defined as factors.

But it is just a set of wrappers fro
\code{glm}, \code{gam} and \code{coxph}.
}
\usage{
  glm.Lexis( Lx,         # Lexis object	
        formula,         # ~ model	
           from = preceding(Lx,to), # 'from' states
             to = absorbing(Lx)   , # 'to' states
         paired = FALSE, # only the pairwise
           link = "log", # link function
          scale = 1,     # scaling of PY
        verbose = TRUE,  # report what is done?
            \dots )        # further arguments to glm
  gam.Lexis( Lx,         # Lexis object	
        formula,         # ~ model	
           from = preceding(Lx,to), # 'from' states
             to = absorbing(Lx)   , # 'to' states	
         paired = FALSE, # only the pairwise
           link = "log", # link function
          scale = 1,     # scaling of PY
        verbose = TRUE,  # report what is done?
            \dots )        # further arguments to gam
coxph.Lexis( Lx,         # Lexis object	
        formula,         # timescale ~ model	
           from = preceding(Lx,to), # 'from' states
             to = absorbing(Lx)   , # 'to' states	
         paired = FALSE, # only the pairwise
        verbose = TRUE,  # report what is done?
            \dots )        # further arguments to coxph
}
\arguments{
  \item{Lx}{A \code{\link{Lexis}} object representing cohort follow-up.
}
  \item{formula}{Model formula describing the model for the
    intensity(-ies). For \code{glm} and \code{gam}, the formula should be
    one-sided; for \code{coxph} the formula should be two-sided and have
    the name of the time-scale used for baseline hazard as the l.h.s.
}
  \item{from}{Character vector of states \bold{from} which transitions
    are considered. May also be an integer vector in which case the
    reference will be to the position of levels of
    \code{lex.Cst}. Defaults to the collection of transient states
    immediately preceding the absorbing states. 
}
  \item{to}{Character vector of states \bold{to} which a transition is
    considered an event. May also be an integer vector in which case the
    reference will be to the position of levels of \code{lex.Xst}.
    Defaults to the set of absorbing states.  
}
  \item{paired}{Logical. Should the states mentioned in \code{to},
    rep. \code{from} be taken as pairs, indicating the only transitions
    modeled. If \code{FALSE} all transitions from any of the states in
    \code{from} to any states in \code{to} are modeled.
}
  \item{link}{Character; name of the link function used, allowed values
    are \code{'log'} (the default), \code{'identity'} and \code{'sqrt'},
    see the family \code{\link{poisreg}}. 
}
  \item{scale}{Scalar. \code{lex.dur} is divided by this number before 
    analysis, so that you can get resulting rates on a scale of your wish. 
}
  \item{verbose}{Print information on the states modeled?
}
  \item{\dots}{Further arguments passed on to \code{glm}, \code{glm} or
    \code{coxph} 
}
}

\details{
  The \code{glm} and \code{gam} models are fitted using the family
  \code{\link{poisreg}} which is a bit faster than the traditional
  \code{poisson} family. The response variable for this family is a
  two-column vector of events and person-time respectively, so the
  predictions, for example using \code{\link{ci.pred}} does not require
  \code{lex.dur} (and would ignore this) as variable in the
  \code{newdata}. \code{ci.pred} will return the estimated rates in
  units of the \code{lex.dur} in the \code{Lexis} object, scaled by
  \code{scale}, which has a default value of 1.

  The default is to model all transitions into any absorbing state by
  the same model (how wise is that??). If only \code{from} is given,
  \code{to} is set to all states reachable from \code{from}, which may
  be a really goofy model and if so a warning is issued. If only
  \code{to} is given, \code{from} is set to the collection of states
  from which \code{to} can be reached directly --- see
  \code{\link{preceding}} and its cousins. This convention means that if
  you have a \code{\link{Lexis}} object representing a simple survival
  analysis, with states, say, "alive" and "dead", you can dispense with
  the \code{from} and \code{to} arguments.

  Occasionally you only want to model a subset of the possible
  transitions from states in \code{from} to states in \code{to}, in
  which case you specify \code{from} and \code{to} as character vectors
  of the same length and set \code{paired=TRUE}. Then only transitions
  \code{from[i]} to \code{to[i]}, \code{i}=1,2,... will be modeled.
  
  There is no working \code{update} functions for these objects (yet). 
  
  Strictly speaking, it is a bit counter-intuitive to have the time-scale
  on the l.h.s. of the formula for the \code{coxph} since the time scale
  is also a predictor of the occurrence rate. On the other hand, calling
  \code{coxph} directly would also entail having the name of the time
  scale in the \code{Surv} object on the l.h.s. of the formula. So the
  inconsistency is merely carried over from \code{coxph}.
}

\value{\code{glm.Lexis} returns a \code{\link{glm}} object, which is
  also of class \code{glm.lex},
  \code{gam.Lexis} returns a \code{\link[mgcv]{gam}} object, which is
  also of class \code{gam.lex}, and
  \code{coxph.Lexis} returns a \code{\link[survival]{coxph}} object, which is
  also of class \code{coxph.lex}. These extra class attributes are meant
  to facilitate the (still pending) implementation of an \code{update} function.

  The returned objects all have an extra attribute, \code{Lexis} which
  is a list with entries
  \code{data}, the name of the \code{Lexis} object modeled (note that it
  is \emph{not} the object, only the name of it, which may not be portable);
  \code{trans}, a character vector of transitions modeled;
  \code{formula}, the model formula; and
  \code{scale}, the scaling applied to \code{lex.dur} before modeling. 
  
  Only the \code{glm} and \code{gam} objects have the \code{scale} element
  in the list; a scalar indicating the scaling of \code{lex.dur} before
  modeling. Note that the formula component of the \code{Lexis}
  attribute of a \code{coxph} object is a
  two-sided formula with the baseline time scale as the l.h.s.
}

\author{
Bendix Carstensen, \url{http://bendixcarstensen.com}.
}

\seealso{
  \code{\link{Lexis}},
  \code{\link{cutLexis}},
  \code{\link{mcutLexis}},
  \code{\link{addCov.Lexis}},
  \code{\link{absorbing}},
  \code{\link{transient}}
}

\examples{
library( Epi )
library( survival )
data( DMlate )

# Lexis object of total follow-up
mL <- Lexis( entry = list(age=dodm-dobth,per=dodm),
              exit = list(per=dox),
       exit.status = factor(!is.na(dodth),labels=c("Alive","Dead")),
              data = DMlate )

# Cut follow-up at start of insulin use
cL <- cutLexis( mL, cut = mL$doins,
              timescale = "per",
              new.state = "Ins",
       precursor.states = "Alive" )

# Split follow-up on age-axis
system.time( sL <- splitLexis( cL, breaks=0:25*4, time.scale="age") )
# ( consider splitMulti from the popEpi package )
summary( sL )

# glm models for rates based on the time-split dataset by insulin and sex

# Proportional hazards model with insulin as time-dependent variable
# - uses the defaul of modeling all transitions from both transient
# states ("Alive" and "Ins") to the absorbing state ("Dead"). 
mt <- glm.Lexis( sL, ~ sex + lex.Cst + Ns(age,knots=c(15,3:8*10)) )

# prediction of mortality rates from "Alive" with and without PH assumption
nA <- data.frame( age=40:70, sex="M", lex.Cst="Alive" )
nI <- data.frame( age=40:70, sex="M", lex.Cst="Ins" )
matshade( nA$age, cbind( ci.pred(mt,nA),
                         ci.pred(mt,nI) )*1000, plot=TRUE,
          lwd=3, lty=1, log="y", col=c("black","blue","red"),
          xlab="Age", ylab="Mortality per 1000 PY" )
 
# gam models may take some time to run so we leave it out
\dontrun{
mt.gam <- gam.Lexis( sL, ~ sex + lex.Cst + s(age), to="Dead",
                     scale=1000 )
        }

# Fit a Cox model for mortality with age as baseline time scale and
# insulin (lex.Cst) as time-dependent covariate 
mt.cox <- coxph.Lexis( sL, age ~ sex + lex.Cst, c("Alive","Ins"), "Dead" )

# Pretty much the same results for regression paramters as the glm:
  ci.exp( mt    , subset="ex" )
# ci.exp( mt.gam, subset="ex" )
  ci.exp( mt.cox, subset="ex" )
}
\keyword{models}
back to top