\documentclass[a4paper, oneside, 10pt]{article}
\usepackage[unicode]{hyperref}
\usepackage[utf8x]{inputenc}
\usepackage[english]{babel}
\usepackage{listings}
\date{\today}
\title{}
\author{}
\begin{document}



\section{\texorpdfstring{Função compara.rep}{Funao compararep}}
\label{sec:funao_compararep}


\subsection{\texorpdfstring{Página de ajuda da função}{Pagina de ajuda da funao}}
\label{sec:pagina_de_ajuda_da_funao}
\lstset{frame=single}
\begin{lstlisting}
 compara.rep			package:unknown			R Documentation

Teste de associação de dois conjuntos de dados.

Description

Faz a correlação de dois conjuntos de dados e produz o boxplot e gráfico de dispersão dos dados.  

Usage:

compara.rep(x,y=NULL,type="Dados",sob=0.75,metodo="pearson",pvalor=0.05,te=0.7)

Arguments:

x         Um data frame em que as linhas são os nomes de cada observação (ex:  gene1,gene2...,especie1,especie2...) e as colunas são as diferentes amostras (ex: replicata1, replicata2...).

y         Com este argumento, a função aceita dados em tabelas separadas (as duas tabelas serão mescladas para realizar os cálculos). 

type      Texto para adicionar aos gráficos (o que são seus dados? expressão gênica, espécies....?). 

sob       Valor mínimo que se deseja da proporção de sobreposição.

método    Método do teste de correlação: “pearson", “spearman" ou “kendall".

pvalor	  Valor mínimo que se deseja do p-valor do teste de correlação.

te        Valor mínimo que se deseja do tamanho de efeito.

Details:

A função compara.rep, testa a associação de dois conjuntos de dados através do p-valor, do tamanho de efeito (calculados no teste de correlação) e a proporção em que os dados se sobrepõe (quanto o conjunto 1 está dentro do conjunto 2 e vice-versa). Além disso, gera o boxplot com a distribuição dos dados e um gráfico de dispersão. 

Esta função teve como motivação testar réplicas (biológicas ou técnicas) em quaisquer tipos de dados numéricos, por isso, apresenta um teste embutido que, de acordo com o padrão da função ou com os argumentos fornecidos pelo usuário, retorna se a replicata foi aprovada ou não.

Value:

A função compara.rep cria três arquivos de saída:

boxplots: todos os boxplots gerados pela função serão adicionados em um arquivo pdf

correlações: todos os gráficos de dispersão serão adicionados em um pdf.

Resultados: um arquivo de texto com os resultados gerados que também são retornados na tela. 

Warning(s):

Se fornecido o argumento y, a coluna com o tipo de dado deve ter o mesmo nome  do argumento x, caso contrario a função para e solta uma mensagem de erro.


Note(s): 

Valores faltantes (NAs) serão sempre substituídos por 0. 


Author(s): Gisele Antoniazzi Cardoso (para dúvidas e perguntas:  gi_antoni@yahoo.com.br) 

Example(s):

##Exemplo para dados em apenas uma tabela

Dados <- seq(1:20)
a <- c(20,53,1000,35,1,2548,20000,546,12,47,80,54,75,0,5,695,1,1,25,88)
b <- c(25,55,1050,33,1,2541,12487,540,10,42,61,525,73,1,3,690,1,1,27,95)
c <-c(40,60,78,15,45,78,12,58,12,25,95,63,547,874,12,45,7,45,74,62)
d <- c(34,70,85,20,46,79,9,57,11,23,93,60,540,880,14,48,8,52,70,65)
x <- data.frame(Dados,a,b,c,d)

compara.rep(x)

##Adicione o argumento y para mesclar tabelas

Dados <-  seq(1:20)
e <- sample(1:20)
f <- sample(1:20)
y <- data.frame(Dados,e,f)

compara.rep(x,y) \end{lstlisting}



\subsubsection{\texorpdfstring{Código da função}{Codigo da funao}}
\label{sec:codigo_da_funao}
\lstset{frame=single}
\begin{lstlisting}
 compara.rep <- function(x,y=NULL,type="Dados",sob=0.75,metodo="pearson",pvalor=0.05,te=0.7) { #funcao com seus respectivos argumentos (y= para dados em tabelas separadas,type= nome para dar titulo aos graficos,sob=threshold de sobreposicao dos dados,metododo=metodo para o teste de correlacao, pvalor= threshold do pvalor do teste de correlacao,te= threshold do tamanho de efeito da correlacao dos dados)
  
  
#Testando o argumento y
  
if(is.object(y)) { #a presenca do argumento y e opcional, portanto devemos testar se ele existe ou nao
  
  if(colnames(x[1]) != colnames(y[1])) { #se y existir precisamos mesclar as duas tabelas e para isso as colunas contendo o tipo de dado devem ter mesmo nome
    
    stop("O nome da coluna de seus dados deve ser o mesmo nas duas tabelas") #se as colunas tiverem nomes diferentes a funcao solta uma mensagem de erro
      
    } else { #se os nomes forem iguais as tabelas sao mescladas 
      
      x <- merge(x,y,by = colnames(x[1]),incomparables=NA,all.x=TRUE,all.y=TRUE) #mescla as tabelas(se uma linha existir em uma tabela e na outra nao teremos a insercao de NAs)
      x[is.na(x)] <- 0 #os NAs sao trocados por 0
      
    } 
  
} else { #se o y nao existir, devemos tirar os NAs tambem

  x[is.na(x)] <- 0 #os NAs sao trocados por 0
  
} 


#Criando boxplots dos dados

pdf("boxplots.pdf") #todos os boxplots gerados serao guardados em um mesmo arquivo pdf

for (i in seq(2,ncol(x),2)) { #loop para criar boxplot pegando de duas em duas colunas sem repeticao (ex: 1-2,3-4,5-6,etc); i sempre sera as colunas pares (a coluna 1 equivale ao "nome" dos dados, por isso todos os loops comecarao pela coluna 2)
  
    j <- i+1 #j sempre sera as colunas impares
    
  	boxplot(x[,i],x[,j],names=c(colnames(x[i]),colnames(x[j])),main=paste("Distribuicao dos dados de",colnames(x[i]),"e",colnames(x[j])),ylab=type) #cria os boxplots de duas em duas colunas, colocando sempre o nome das colunas no titulo
  	
} 

dev.off() 

#Sobreposicao dos dados

sob.1 <- rep(NA,(ncol(x)/2)) #objeto para guardar a proporcao de sobreposicao dos dados do conjunto 1 em relacao ao 2 dentro de um loop
sob.2 <- rep(NA,(ncol(x)/2)) #objeto para guardar a proporcao de sobreposicao dos dados do conjunto 2 em relacao ao 1 dentro de um loop

d <- 1 #primeira posição dos resultados que guardam os valores da proporcao de sobreposicao (sob.1 e sob.2)

for (i in seq(2,ncol(x),2)) { #loop2 para pegar as colunas de dois em dois sem repeticao (ex: 1-2,3-4,5-6,etc); i sempre sera as colunas pares
	
	a <- 0 #objeto para contar quantos numeros de um conjunto 1 estao entre o valor minimo e maximo do conjunto 2
	b <- 0 #objeto para contar quantos numeros de um conjunto 2 estao entre o valor minimo e maximo do conjunto 1
	j <- i+1 #j sempre será as colunas impares
	
	for(c in 1:nrow(x)) { #loop para fazer os testes de sobreposicao dos dados (conjunto 1 esta dentro dos limites do 2 e vice-versa)
		
        if(x[c,i] >= min(x[,j]) & x[c,i] <= max(x[,j])) { #testa se um valor do conjunto 1 esta entre min e o max do conjunto 2
        	
        	a <- a+1 #para cada numero dentro da condicao acima, e acrescido um ao valor do objeto a
        	
        	} 
        	
        if(x[c,j] >= min(x[,i]) & x[c,j] <= max(x[,i])) { #testa se um valor do conjunto 2 esta entre min e o max do conjunto 1
        	
       	    b <- b+1 #para cada numero dentro da condicao acima, e acrescido um ao valor do objeto b
       	    
        	} 
    } 
    
	sob.1[d] <- round(a/nrow(x),2) #calculo da proporcao de sobreposicao do conjunto 1 em relacao ao 2
	sob.2[d] <- round(b/nrow(x),2) #calculo da proporcao de sobreposicao do conjunto 2 em relacao ao 1
	
	d <- d+1 #todas vez que acaba o loop, os resultados de sob.1 e sob.2 sao guardados em uma nova posicao dentro do objeto  
	
} 


#Teste de correlacao dos dados

cor.pvalue<-rep(NA,(ncol(x)/2)) #objeto para guardar os p-valores da correlacao dentro de um loop
cor.estimate <-rep(NA,(ncol(x)/2)) #objeto para guardar os valores de te da correlacao dentro de um loop

k <- 1 #primeira posicao dos resultados de correlacao (p-valor e tamanho de efeito) dentro dos objetos

for (i in seq(2,ncol(x),2)) { #loop para fazer os testes de correlacao de duas em duas colunas sem repeticao (ex: 1-2,3-4,5-6,etc); i sempre sera as colunas pares
  
  j<- i+1 #j sempre sera as colunas impares
  
  if(metodo == "spearman" & metodo == "kendall") { #se o metodo de spearman ou kendall for usado usaremos o argumento exact=FALSE para evitar o aviso "Cannot compute exact p-values with ties"
    
  cor.pvalue[k] <- cor.test(x[,i],x[,j],method=metodo,exact=FALSE)$p.value #faz o teste de correlacao e guarda no objeto apenas os p-valores
  cor.estimate[k] <- cor.test(x[,i],x[,j],method=metodo,exact=FALSE)$estimate #faz o teste de correlacao e guarda no objeto apenas os valores de te
        
  } else { #se o metodo for pearson, nao precisamos inserir o argumento exact=FALSE
    
    cor.pvalue[k] <- cor.test(x[,i],x[,j],method=metodo)$p.value #faz o teste de correlacao e guarda no objeto apenas os p-valores
    cor.estimate[k] <- cor.test(x[,i],x[,j],method=metodo)$estimate #faz o teste de correlacao e guarda no objeto apenas os valores de te
        
  } 
  
k <- k+1 #todas vez que acaba o loop, os resultados de correlacao sao guardados em uma nova posicao dentro do objeto  
  
} 


#Criando os graficos de dispersao com suas respectivas ablines

pdf("correlacoes.pdf") #todas os graficos de dispersao gerados serao guardados em um mesmo arquivo pdf

k <- 1 #valor da primeira posicao dos resultados de correlacao a serem testados dentro do loop

for (i in seq(2,ncol(x),2)) { #loop para fazer os graficos de dispersao e desenhar as linhas de duas em duas colunas sem repeticao (ex: 1-2,3-4,5-6,etc); i sempre sera as colunas pares
  
    j<- i+1 #j sempre sera as colunas impares
    
  	plot(x[,i],x[,j],xlab=colnames(x[i]),ylab=colnames(x[j]),main=paste("Correlacao de",colnames(x[i]),"e",colnames(x[j]))) #cria os graficos de dispersao de duas em duas colunas
  	
    if (cor.pvalue[k] <= pvalor & cor.estimate[k] >= te) {#teste para criar a linha no grafico de dispersao de acordo com o default ou os argumentos do usuario
    	
    	abline(lm(x[,i]~x[,j])) #desenha a linha no grafico de dispersao caso o teste acima seja verdadeiro
    	
    } 
    
    k<- k+1 #todas vez que acaba o loop, o objeto é acrescido de valor para testar uma nova posicao dos resultados de correlacao (p-valor e tamanho de efeito)  
    
} 

dev.off() 


#Seu resultado foi como o usuario desejava?

Resultado <- rep(NA,length(cor.pvalue)) #objeto para guardar o resultado "aprovado" ou "revisar" dentro de um loop 

for(i in 1:length(cor.pvalue)) { #loop para testar se o resultado foi aprovado ou nao
	
	if(sob.1[i] >= sob & sob.2[i] >= sob) { #testa se a sobreposicao dos dados esta dentro do default ou sugerido pelo usuario 
    
    if(cor.pvalue[i] <= pvalor & cor.estimate[i] >= te) { #testa se o pvalor e o tamanho de efeito dos dados estao dentro do default ou sugerido pelo usuario
      
      Resultado[i] <- "APROVADO" #caso as condicoes acima seja verdadeiras as replicatas serao aprovadas
  
		} else { #se o pvalor e o tamanho de efeito nao satisfazerem a condicao a replicata e reprovada
		  
		  Resultado[i] <- "REVISAR" #caso UMA das condicoes acima seja falsa, as replicatas serao reprovadas e precisam ser revidas pelo usuario		
		  
		} 
    
    
	} else { #se o os valores de sobreposicao nao satisfazerem a condicao a replicata e reprovada 
    
	  Resultado[i] <- "REVISAR" #caso o threshold de sobreposicao dos dados seja falso, as replicatas serao reprovadas e precisam ser revidas pelo usuario
    
	} 
	  
} 


#Saida dos resultados de acordo com o metodo utilizado de correlacao

if(metodo == "pearson") { #se o metodo de pearson foi escolhido a coluna de tamanho de efeito sera intutulada r2
  
  resultados <- list(p.value=cor.pvalue,r2=cor.estimate,Sobreposicao1=sob.1,Sobreposicao2=sob.2) #criar uma lista com resultados para tranforma-los em tabela
  
}

if(metodo == "spearman") { #se o metodo de spearman foi escolhido a coluna de tamanho de efeito sera intutulada rho
  
  resultados <- list(p.value=cor.pvalue,rho=cor.estimate,Sobreposicao1=sob.1,Sobreposicao2=sob.2) #criar uma lista com resultados para tranforma-los em tabela
  
} 

if(metodo == "kendall") { #se o metodo de kendall foi escolhido a coluna de tamanho de efeito sera intutulada tau
  
  resultados <- list(p.value=cor.pvalue,tau=cor.estimate,Sobreposicao1=sob.1,Sobreposicao2=sob.2) #criar uma lista com resultados para tranforma-los em tabela

} 

names <- rep(NA,length(cor.pvalue)) #objeto para guardar os nomes das linhas da tabela dentro de um loop 

k<- 1 #valor da primeira posicao dos nomes das linhas da tabela que sera criada dentro do loop

for (i in seq(2,ncol(x),2)) { #loop para pegar o nome das colunas par a par sem repeticao (ex: 1-2,3-4,5-6,etc); i sempre sera as colunas pares
  
  j<- i+1 #j sempre sera as colunas impares
  
  names[k] <- paste0(colnames(x[i]),"-",colnames(x[j])) #coloca os nomes dos pares testados no objeto
  
  k <- k+1 #todas vez que acaba o loop, o objeto é acrescido de valor para guardar um novo nome em uma nova posicao de names  
   
} 

tabela <- data.frame(resultados,Resultado) #cria a tabela de resultados
row.names(tabela) <- names #coloca o nome das linhas da tabela

write.table(tabela,file="resultados.txt",sep="\t") #cria um arquivo com a tabela dos resultados

#Imprimindo avisos e a tabela de resultados

print("100% completado!") #imprimi o primeiro aviso na tela
print("Resultados finais no arquivo: resultados.txt") #imprimi o segundo aviso na tela

return(tabela) #Retorna a tabela de resultados na tela

} \end{lstlisting}



\end{document}
