<div dir="ltr"><div class="gmail_default" style="font-family:'courier new',monospace;color:rgb(0,0,102)">Amigos de R,</div><div class="gmail_default" style="font-family:'courier new',monospace;color:rgb(0,0,102)">

<br></div><div class="gmail_default" style="font-family:'courier new',monospace;color:rgb(0,0,102)">Estou fazendo umas análises iniciais de trajetórias de biomarcadores ao longo de um tempo em que pacientes receberam um tratamento. Eu gostaria de ter uma percepção do conjunto de trajetórias sem ajuste e procurei por ai formas de faze-lo. Encontrei stats::interaction.plot e epicalc::followup.plot. Mas por algum motivo desconhecido, essas duas funções estavam truncando as trajetórias em 120 dias, mesmo solicitando para mostrar as trajetórias em 180 dias que eu sei o que é o maximo de tempo observado contido nos dados que tenho. Assim, depois de bater cabeça um tanto investi um dia inteiro para fazer a função abaixo e compartilho com voces. </div>

<div class="gmail_default" style="font-family:'courier new',monospace;color:rgb(0,0,102)"><br></div><div class="gmail_default" style="font-family:'courier new',monospace;color:rgb(0,0,102)">Essa função é bem semelhante a followup.plot, mas, quando se deseja não plotar todos os sujeitos para não poluir o gráfico, ao inves de selecionar sujeitos aleatórios, eu coloquei um argumento chamado zap que seleciona n sujeitos como valores iniciais, minimo, maximo e mediano. </div>

<div class="gmail_default" style="font-family:'courier new',monospace;color:rgb(0,0,102)"><br></div><div class="gmail_default" style="font-family:'courier new',monospace;color:rgb(0,0,102)"><br></div><div class="gmail_default">

<div class="gmail_default"><font color="#000066" face="courier new, monospace"># data = dataset in long format</font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace"># id = character indicating the name of an unique id variable for each patient in data  (tested with numeric variable)</font></div>

<div class="gmail_default"><font color="#000066" face="courier new, monospace"># time = a character indicating the name of a numeric variable representing the time of the measure</font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace"># outcome = a character indicating the name of a numeric variable representing the outcome</font></div>

<div class="gmail_default"><font color="#000066" face="courier new, monospace"># plot.arg =  a list of arguments to pass to plot.default</font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace"># line.arg  = one or more  lists of arguments to pass to lines (one list to each strata of by)</font></div>

<div class="gmail_default"><font color="#000066" face="courier new, monospace"># zap = if auto then the n subjects with the lower, median, higher initial outcome values will be ploted, anything different from "auto" will plot all subjects</font></div>

<div class="gmail_default"><font color="#000066" face="courier new, monospace"># n = number of subject to use in zap</font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace"># by = a character indicating the name of a factor/character variable representing strata for ploting</font></div>

<div class="gmail_default"><font color="#000066" face="courier new, monospace"><br></font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace"># think about making conditions for zap such as only the median, only the lowest or only the highest, the final highest, final lowest, final median etc</font></div>

<div class="gmail_default"><font color="#000066" face="courier new, monospace"><br></font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace">zapplot <- function(data,id,time,outcome,</font></div>

<div class="gmail_default"><font color="#000066" face="courier new, monospace">                    plot.arg=list(xlab='time',ylab=outcome),</font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace">                    line.arg=list(list(lty=2,col='blue'),list(lty=3,col='red')),</font></div>

<div class="gmail_default"><font color="#000066" face="courier new, monospace">                    leg.args=list(x='top',inset=c(0,-.15),</font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace">                                  horiz=TRUE,xjust=.5,col=c('blue','red'),lty=2:3,</font></div>

<div class="gmail_default"><font color="#000066" face="courier new, monospace">                                  bty='n',xpd=T),</font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace">                    zap='auto',n=1,by=NULL){</font></div>

<div class="gmail_default"><font color="#000066" face="courier new, monospace">#  if(!is.null(by)){</font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace">#    if(length(line.arg)!=nlevels(by)){</font></div>

<div class="gmail_default"><font color="#000066" face="courier new, monospace">#      stop('If by is porvided, number of lists in line.arg and number of levels in by should be the same! Try improving the lists in line.arg.')}</font></div>

<div class="gmail_default"><font color="#000066" face="courier new, monospace">#  }</font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace">  data <- data[which(!<a href="http://is.na">is.na</a>(data[,time]) & !<a href="http://is.na">is.na</a>(data[,outcome])),]</font></div>

<div class="gmail_default"><font color="#000066" face="courier new, monospace">  plot.arg <- c(list(x = data[,time],y = data[,outcome],type = 'n'),plot.arg)</font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace">  do.call(plot,plot.arg)</font></div>

<div class="gmail_default"><font color="#000066" face="courier new, monospace">  if(!is.null(by)){</font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace">    if(!is.factor(data[,by])){</font></div>

<div class="gmail_default"><font color="#000066" face="courier new, monospace">      data[,by] <- as.factor(data[,by])</font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace">    }</font></div>

<div class="gmail_default"><font color="#000066" face="courier new, monospace">    tmp2 <- data</font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace">    for(j in 1:nlevels(data[,by])){ # i=2</font></div>

<div class="gmail_default"><font color="#000066" face="courier new, monospace">      data <- tmp2</font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace">      data <- data[which(data[,by]==levels(data[,by])[j]),]</font></div>

<div class="gmail_default"><font color="#000066" face="courier new, monospace">      tmp <- data[which(data[,time]==min(data[,time])),]  </font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace">      tmp <- tmp[order(tmp[,outcome]),] # tmp[,c(id,time,outcome)]</font></div>

<div class="gmail_default"><font color="#000066" face="courier new, monospace">      id.max <- tmp[(nrow(tmp)-(n-1)):nrow(tmp),id] # </font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace">      id.min <- tmp[(1:n),id] # data[which(data$id==id.min),outcome]</font></div>

<div class="gmail_default"><font color="#000066" face="courier new, monospace">      tmp$med <- abs(tmp[,outcome]-median(tmp[,outcome],TRUE))</font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace">      tmp <- tmp[order(tmp$med),]</font></div>

<div class="gmail_default"><font color="#000066" face="courier new, monospace">      id.med <- tmp[1:n,id]</font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace">      if(zap=='auto'){</font></div>

<div class="gmail_default"><font color="#000066" face="courier new, monospace">        for(i in 1:length(id.min)){</font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace">          line.arg.min <- c(list(x = data[which(data[,id]==id.min[i]),time],y = data[which(data[,id]==id.min[i]),outcome]),line.arg[[j]])</font></div>

<div class="gmail_default"><font color="#000066" face="courier new, monospace">          do.call(lines,line.arg.min)</font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace">        }</font></div>

<div class="gmail_default"><font color="#000066" face="courier new, monospace">        for(i in 1:length(id.med)){</font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace">          line.arg.med <- c(list(x = data[which(data[,id]==id.med[i]),time],y = data[which(data[,id]==id.med[i]),outcome]),line.arg[[j]])</font></div>

<div class="gmail_default"><font color="#000066" face="courier new, monospace">          do.call(lines,line.arg.med)</font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace">        }  </font></div>

<div class="gmail_default"><font color="#000066" face="courier new, monospace">        for(i in 1:length(id.max)){</font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace">          line.arg.max <- c(list(x = data[which(data[,id]==id.max[i]),time],y = data[which(data[,id]==id.max[i]),outcome]),line.arg[[j]])</font></div>

<div class="gmail_default"><font color="#000066" face="courier new, monospace">          do.call(lines,line.arg.max)</font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace">        }</font></div>

<div class="gmail_default"><font color="#000066" face="courier new, monospace">      }</font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace">      else{</font></div><div class="gmail_default">

<font color="#000066" face="courier new, monospace">        uni <- unique(data[,id])</font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace">        for(i in 1:length(uni)){</font></div>

<div class="gmail_default"><font color="#000066" face="courier new, monospace">          line.arg.all <- c(list(x=data[which(data[,id]==uni[i]),time],y=data[which(data[,id]==uni[i]),outcome]),line.arg[[j]])</font></div>

<div class="gmail_default"><font color="#000066" face="courier new, monospace">          do.call(lines,line.arg.all)</font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace">        }</font></div>

<div class="gmail_default"><font color="#000066" face="courier new, monospace">      }</font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace">    }</font></div><div class="gmail_default">

<font color="#000066" face="courier new, monospace">    # COLOCAR AQUI OS COMANDOS DE LEGENDA para identificar as diferentes categorias do by</font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace">    leg.args <- c(legend=list(levels(data[,by])),leg.args) </font></div>

<div class="gmail_default"><font color="#000066" face="courier new, monospace">    do.call(legend,leg.args)</font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace">  }</font></div><div class="gmail_default">

<font color="#000066" face="courier new, monospace">  else{</font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace">    tmp <- data[which(data[,time]==min(data[,time])),]  </font></div>

<div class="gmail_default"><font color="#000066" face="courier new, monospace">    tmp <- tmp[order(tmp[,outcome]),] # tmp[,c(id,time,outcome)]</font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace">    id.max <- tmp[(nrow(tmp)-(n-1)):nrow(tmp),id] # </font></div>

<div class="gmail_default"><font color="#000066" face="courier new, monospace">    id.min <- tmp[(1:n),id] # data[which(data$id==id.min),outcome]</font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace">    tmp$med <- abs(tmp[,outcome]-median(tmp[,outcome],TRUE))</font></div>

<div class="gmail_default"><font color="#000066" face="courier new, monospace">    tmp <- tmp[order(tmp$med),]</font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace">    id.med <- tmp[1:n,id]</font></div>

<div class="gmail_default"><font color="#000066" face="courier new, monospace">    if(zap=='auto'){</font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace">      for(i in 1:length(id.min)){</font></div>

<div class="gmail_default"><font color="#000066" face="courier new, monospace">        line.arg.min <- c(list(x = data[which(data[,id]==id.min[i]),time],y = data[which(data[,id]==id.min[i]),outcome]),line.arg[[1]])</font></div>

<div class="gmail_default"><font color="#000066" face="courier new, monospace">        do.call(lines,line.arg.min)</font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace">      }</font></div>

<div class="gmail_default"><font color="#000066" face="courier new, monospace">      for(i in 1:length(id.med)){</font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace">        line.arg.med <- c(list(x = data[which(data[,id]==id.med[i]),time],y = data[which(data[,id]==id.med[i]),outcome]),line.arg[[1]])</font></div>

<div class="gmail_default"><font color="#000066" face="courier new, monospace">        do.call(lines,line.arg.med)</font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace">      }  </font></div>

<div class="gmail_default"><font color="#000066" face="courier new, monospace">      for(i in 1:length(id.max)){</font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace">        line.arg.max <- c(list(x = data[which(data[,id]==id.max[i]),time],y = data[which(data[,id]==id.max[i]),outcome]),line.arg[[1]])</font></div>

<div class="gmail_default"><font color="#000066" face="courier new, monospace">        do.call(lines,line.arg.max)</font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace">      }</font></div>

<div class="gmail_default"><font color="#000066" face="courier new, monospace">    }</font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace">    else{</font></div><div class="gmail_default">

<font color="#000066" face="courier new, monospace">      uni <- unique(data[,id])</font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace">      for(i in 1:length(uni)){</font></div>
<div class="gmail_default">
<font color="#000066" face="courier new, monospace">        line.arg.all <- c(list(x=data[which(data[,id]==uni[i]),time],y=data[which(data[,id]==uni[i]),outcome]),line.arg[[1]])</font></div><div class="gmail_default">
<font color="#000066" face="courier new, monospace">        do.call(lines,line.arg.all)</font></div>
<div class="gmail_default"><font color="#000066" face="courier new, monospace">      }</font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace">    }  </font></div><div class="gmail_default">

<font color="#000066" face="courier new, monospace">  }</font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace">}</font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace"><br>

</font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace"><br></font></div><div class="gmail_default"><font color="#000066" face="courier new, monospace"># zapplot(b,'pront','dia','HLA',zap='all',n=2,by='CD4cod') # </font></div>

</div><div class="gmail_default" style="font-family:'courier new',monospace;color:rgb(0,0,102)"><br></div><div class="gmail_default" style="font-family:'courier new',monospace;color:rgb(0,0,102)">Abraço forte e que a força esteja com voces, </div>

<div class="gmail_default" style="font-family:'courier new',monospace;color:rgb(0,0,102)"><br></div><div><font face="'courier new', monospace" style="background-color:rgb(255,255,255)" color="#000066">Dr. Pedro Emmanuel A. A. do Brasil</font><div>

<font face="'courier new', monospace" style="background-color:rgb(255,255,255)" color="#000066">Curriculum Lattes: 
<span style="text-align:left"><a href="http://lattes.cnpq.br/6597654894290806" target="_blank">http://lattes.cnpq.br/6597654894290806</a></span> <br>Instituto de Pesquisa Clínica Evandro Chagas<br>Fundação Oswaldo Cruz<br>

Rio de Janeiro - Brasil<br>Av. Brasil 4365, <br>CEP 21040-360,<br>Tel 55 21 3865-9648<br>email: <a href="mailto:pedro.brasil@ipec.fiocruz.br" target="_blank">pedro.brasil@ipec.fiocruz.br</a><br>email: <a href="mailto:emmanuel.brasil@gmail.com" target="_blank">emmanuel.brasil@gmail.com</a><br>

<br>---Apoio aos softwares livres<br><a href="http://www.zotero.org" target="_blank">www.zotero.org</a> - gerenciamento de referências bibliográficas. <br><a href="http://www.broffice.org" target="_blank">www.broffice.org</a> ou <a href="http://www.libreoffice.org/" target="_blank">www.libreoffice.org</a> - textos, planilhas ou apresentações.<br>

<a href="http://www.epidata.dk" target="_blank">www.epidata.dk</a> - entrada de dados.<br><a href="http://www.r-project.org" target="_blank">www.r-project.org</a> - análise de dados.<br><a href="http://www.ubuntu.com" target="_blank">www.ubuntu.com</a> - sistema operacional</font></div>

</div>
</div>