Good Ways to Visualize Longitudinal Categorical Data in R

后端 未结 3 1747
爱一瞬间的悲伤
爱一瞬间的悲伤 2021-01-29 23:42

[Update: Although I\'ve accepted an answer, please add another answer if you have additional visualization ideas (whether in R or another language/program). Tex

3条回答
  •  长情又很酷
    2021-01-30 00:31

    I wish I had found @bdemarest's answer before I wrote an R package to solve this problem, but since the OP requested additional updates, I'll share one more solution. What bdemarest suggested in Figure 4 is what I have been calling a type of horizontal line plot.

    In developing the longCatEDA R package, we found that sorting the data was crucial to making useful plots (see example(sorter) and the report linked in the comment below for technical details), especially as the size of the problem became large. For example, we started the problem with daily drinking data (abstinent, use, abuse) for several thousand participants over 3 years (>1000 days).

    The code to apply the horizontal line plot to @eipi10's data is below. Figure 1 stratifies by term, and Figure 2 stratifies by first status as with Figure 4 of @bdemarest, though the results are not identical due to within strata sorting.

    Figure 1

    Horizontal Line Plot Stratified by Term

    Figure 2

    Horizontal Line Plot Stratified by Initial Status

    # libraries
    install.packages('longCatEDA')
    library(longCatEDA)
    library(RColorBrewer)
    
    # transform data long to wide
    dfw <- reshape(df1,
               timevar = 'term',
               idvar = c('id', 'cohort'),
               direction = 'wide')
    
    # set up objects required by longCat()
    y <- dfw[,seq(3,15,by=2)]
    Labels <- levels(df1$standing)
    tLabels <- levels(df1$term)
    groupLabels <- levels(dfw$cohort)
    
    # use the same colors as bdemarest
    cols <- brewer.pal(7, "Set1")
    
    # plot the longCat object
    png('plot1.png', width=10, height=6.25, units='in', res=100)
    par(bg='cornsilk3', mar=c(5.1, 4.1, 4.1, 8.1), xpd=TRUE)
    lc <- longCat(y=y, Labels=Labels, tLabels=tLabels, id=dfw$id) 
    longCatPlot(lc, cols=cols, xlab='Term', lwd=8, legendBuffer=0)
    legend(8.1, 25, legend=Labels, col=cols, lty=1, lwd=4)
    dev.off()
    
    # stratify by term
    png('plot2.png', width=10, height=6.25, units='in', res=100)
    par(bg='cornsilk3', mar=c(5.1, 4.1, 4.1, 8.1), xpd=TRUE)
    lc.g <- sorter(lc, group=dfw$cohort, groupLabels=groupLabels)
    longCatPlot(lc.g, cols=cols, xlab='Term', lwd=8, legendBuffer=0) 
    legend(8.1, 25, legend=Labels, col=cols, lty=1, lwd=4)
    dev.off()
    
    # stratify by first status, akin to Figure 4 by bdemarest
    png('plot2.png', width=10, height=6.25, units='in', res=100)
    par(bg='cornsilk3', mar=c(5.1, 4.1, 4.1, 8.1), xpd=TRUE)
    first <- apply(!is.na(y), 1, function(x) which(x)[1])
    first <- y[cbind(seq_along(first), first)]
    lc.1 <- sorter(lc, group=factor(first), groupLabels = sort(unique(first)))
    longCatPlot(lc.1, cols=cols, xlab='Term', lwd=8, legendBuffer=0) 
    legend(8.1, 25, legend=Labels, col=cols, lty=1, lwd=4)
    dev.off()
    

提交回复
热议问题