Considerações estatísticas em estudos de microarranjos e afins Parte III Antonio Guilherme F Pacheco Na conversa de hoje Discussão Testes de permutação FDR Outras questões Exemplo do paper sobre q-valor prático Usando o R Programação (S) Testes de permutação Antes de entrarmos no paper propriamente dito, vamos ver como funciona um teste de permutação Vamos demonstrar como podemos obter uma curva de distribuições de médias amostrais empírica para ser usada no lugar da nossa curva teórica Nesse caso, sob a H0 Isso é feito a partir dos nossos próprios dados Para facilitar, vamos usar um exemplo com duas amostras (mas pode ser estendido para mais amostras) Testes de permutação A idéia é simples Sob H0, qualquer valor que seja achado, muito afastado do valor de H0 ou não serão meramente uma questão de termos selecionado determinada amostra Mesma idéia que já vimos anteriormente Mas se isso representa apenas um erro aleatório, e na verdade ambas as amostras representam uma mesma população (i.e. a diferença de suas médias é zero)… Posso construir uma curva de diferenças de médias apenas “embaralhando” aleatoriamente os valores das duas amostras muitas vezes Testes de permutação Sem entrar em detalhes por enquanto, vamos ver como ficaria uma distribuição teórica (que já vimos como se faz) com uma empírica obtidas dessa forma Em vez da diferença das médias propriamente ditas, podemos fazer a mesma coisa para uma transformação qualquer dessas diferenças, como a estatística T Esse procedimento incorpora de maneira correta a variabilidade que seria estimada a partir da amostra 0.0 0.0 0.2 0.1 0.4 P(t<=T) 0.2 Density 0.6 0.8 0.3 1.0 0.4 Testes de permutação PDF -4 -2 0 t CDF 2 4 -4 -2 0 t 2 4 Testes de permutação Uma vez tendo essa distribuição empírica, podemos calcular um p-valor empírico, baseado nessa distribuição No nosso caso, existe uma vantagem nesse procedimento que é incorporar os testes de todas as comparações ao mesmo tempo, o que nos permite incorporar a variabilidade total do sistema nessa distribuição, dando conta, pelo menos em parte, do problema da correlação entre os testes Veremos isso melhor depois O artigo É mais um resumão de um trabalho teórico anterior com uma aplicação prática Explica o conceito de FDR e as dificuldades Propõe o q-valor como uma medida interessante para a FDR para muitas comparações simultâneas O artigo Quatro exemplos de possíveis usos Só para mostrar a aplicabilidade ampla do método Eles acabam trabalhando mesmo com o Exemplo 1 Esse exemplo é bem parecido com o que vamos ver adiante Vamos ver agora os conceitos com calma, começando pela FDR FDR Agora, vamos ver um pouco melhor a idéia da FDR Vamos ver a tabela do artigo Parece com a que nós vimos para o Erro Tipo I Só que aqui será para m testes diferentes O principal é entender a diferença entre o e a FDR Vamos usar a notação do artigo FDR PNAS 2003, 100(16) 9440-5 Não é difícil ver a diferença nesse caso Só muda o denominador E F m F FDR E S FDR Mas o ‘pulo do gato’ da FDR não é esse apenas Se fosse só isso não faria diferença para o ajuste clássico de Bonferroni A FDR é na verdade um relaxamento da idéia que nós vimos de que todos são inocentes até que se prove o contrário Não só vamos partir do princípio que alguns são ‘culpados’ (são realmente diferentes), como vamos fazer as contas baseadas nos dados – data driven Recordando... Já tínhamos visto as características de uma Binomial e que o conjunto de testes falsamente positivos poderia ser descrito por ela Recordando, em geral... X ~ B(n, p) n x n x P( X x) p (1 p) x E ( X ) np FDR F ~ B(m, ) Já tínhamos visto isso para o Bonferroni Fazendo com a notação do artigo m x P( F x) (1 ) m x x E ( F ) m Então, de maneira geral, com o rigor anterior, com de 0.05, queremos achar m P( F 0) 0.050 (0.95) m 0 E o número esperado de testes errados será… E F E ( F ) m m FDR Só que agora, eu não vou mais assumir que todos as H0 são verdadeiras Algumas não são, mas não sei exatamente quantas Então, Como é preciso estimar E(F) no artigo ele está interessado em demonstrar o q-valor, um ponto de corte (t) é introduzido na notação FDR F (t ) EF (t ) FDR(t ) E S (t ) ES (t ) O denominador é observável, pois são os testes que são de fato rejeitados O problema é o numerador, já que agora eu não assumo mais que todos os testes são nulos Então, é preciso estimar E(F) E isso pode ser feito estimando-se 0 m0 m FDR Agora, notem que se 0 = 1, m0 = m Recaímos então no nosso caso clássico!!! É por isso que é dito no artigo que essa situação é mais conservadora A questão então é estimar essa quantia, balanceando viés e variabilidade Não vamos entrar em detalhes, mas eles propõem usar um alisamento com splines para essa estimativa Na verdade existem outras maneiras de estimar Vamos olhar rapidamente como funciona essa escolha do FDR PNAS 2003, 100(16) 9440-5 FDR PNAS 2003, 100(16) 9440-5 FDR Um ponto importante é que não importa o teste a ser usado – desde que seja o mesmo O q-valor então será um valor associado a um determinado p-valor de um teste feito, sendo que dentre todos os testes que tiveram esse p-valor ou menor, (q x 100)% serão falso-positivos Esse procedimento está implementado no R, em um pacote chamado “q-value” Ele apenas exige um vetor com os p-valores encontrados R Antes de entrar na parte de análise propriamente dita, vamos ver alguns conceitos básicos sobre o R Como ele é um pouco diferente dos pacotes estatísticos tradicionais, é melhor ver rapidamente como ele funciona, só para não ficar boiando nos exemplos Vamos ver um resumo rápido do material que vocês leram... Introdução O que é o R? O R utiliza menus para fazer análises estatísticas? Isso é uma vantagem ou uma desvantagem? Mesmo sendo um software gratuito, o R é confiável? O que são os módulos adicionais do R? Quais as vantagens de usar o R para análise de dados genéticos? Entendendo a ajuda do R Como acessar a ajuda? Tipos de ajuda no R Como realizar uma consulta? Entendendo o resultado da consulta: Uma janela será aberta com os seguintes itens: 1. Description (Descrição) 2. Usage (Sintaxe) 3. Arguments (Argumentos) 4. Details (Detalhes) 5. Value (Valores) 6. See Also (Ver também) 7. Examples (Exemplos) Cálculos e Funções O R pode ser usado como uma simples calculadora onde os operadores matemáticos são + , - , * , / e ^ ; Função: É uma expressão (programa) que retorna um valor ou uma lista de valores,usualmente depois de realizar algumas operações. Cálculos e Funções Características básicas das funções disponíveis no R: > função (argumento(s) obrigatório(s), argumento(s) opcional(is)) Exemplos: > log (2187, base=3) > log ( , base=3) > log (2187, ) Para entender os argumentos da função, busque na ajuda: >?log Objetos Objeto: toda e qualquer informação armazenada no R, tal como: funções, vetores, matrizes, listas, data frames; Para criar um objeto, deve-se usar sempre o operador assignment (<-); Exemplo: > x <- 3 > x [1] 3 Além disso, para visualizar todos os objetos existentes, basta fazer: >ls( ) Objetos O R salva todos os objetos num mesmo arquivo com extensão “.Rdata”; Assim, o R salva apenas os OBJETOS, não recuperando dessa maneira os resultados de funções e saídas gráficas (mais tarde veremos como salvar essas saídas); Podemos também, salvar um histórico com os comandos que usados anteriormente; Vetores Vetor: É uma seqüência, em uma ordem específica de valores de um mesmo tipo de dados; Esses valores podem ser: numéricos, lógicos, caracteres ou complexos; Exemplos: > z<-alho Error: Object "alho" not found > z<-"alho" > z [1] "alho" > Y<-25 > Y [1] 25 > y Error: Object "y" not found Vetores ATENÇÃO! > x <- “aluno” > x [1] aluno > x <- 25 > x [1] 25 Repare que o R faz todas as substituições que pedimos, sem nos notificar de que estamos substituindo o conteúdo de um objeto. Por isso, devemos ficar sempre atentos aos ‘nomes’ dos objetos que estamos trabalhando... Vetores Para entrar com seqüências que tenham mais de um valor, basta usar a função c(): > vec1 <- c(1, 2, 3, 4, 5) > vec1 [1] 1 2 3 4 5 > vec2 <- c("Ana", "Pedro", "Léo", "Joana", NA) > vec2 [1] "Ana" "Pedro" "Léo" "Joana" NA Vetores Outras maneiras de se gerar uma seqüência: Função seq() Função rep() Seleção de partes de um vetor Operações básicas apenas Mais detalhes no decorrer do curso Operações com Vetores Podemos fazer operações vetoriais no R Evitando erros devem ter o mesmo tamanho (mas pode não ter – lei da reciclagem) > x <- 1:10 > y <- c(1,2) > x+y [1] 2 4 4 6 6 8 8 10 10 12 x : 1 2 3 4 5 6 7 8 9 10 y : 1 2 1 2 1 2 1 2 1 2 ----------------------------------x+y : 2 4 4 6 6 8 8 10 10 12 (note como foi repetido) Operações com Vetores Evitando erros respeite a precedência aprendida no ensino fundamental > peso <- c(62, 70, 52, 98, 90, 70) > altura <- c(1.70, 1.82, 1.75, 1.94, 1.84, 1.61) > (peso/altura)^2 # Errado [1] 1330.1038 1479.2899 882.9388 2551.8121 2392.4858 1890.3592 > peso/(altura^2) # Certo [1] 21.45329 21.13271 16.97959 26.03890 26.58318 27.00513 Operações com Vetores Operações lógicas > x <- 1:10 > x[x > 5] [1] 6 7 8 9 10 > x <- c(3, 5, 3, 2, 5, 7, 5) > y <- c(23, 21, 20, 12, 20, 30, 29) > x == 5 [1] FALSE TRUE FALSE FALSE TRUE FALSE > y[x == 5] [1] 21 20 29 TRUE Fatores Armazenamento de dados Possuem níveis (levels) > c5 <> c5 [1] "M" > f5 <> f5 [1] M F Levels: categóricos c('M','F','F','F','M','M') "F" "F" "F" "M" "M" as.factor(c5) F F M M F M Podem ser modificados > levels(f5) <- c("Female","Male") > f5 [1] Male Levels: Female Female Female Male Female Male Male Gerando Distribuições e Gráficos No R, podemos gerar valores aleatórios vindos de uma distribuição de probabilidade específica, por exemplo random normal: > x <- rnorm (100, mean=10, sd=sqrt(4)) Tamanho do vetor Média Desvio Padrão Mas será que há um default para essa função? > y <- rnorm (100) > mean (y) > sd(y) Sim, a Normal Padrão com média 0 e variância 1 Gerando Distribuições e Gráficos A função Outras funções gráficas hist() boxplot() stem() par() Outras genérica plot() distribuições rbinom() Gerando Distribuições e Gráficos Outras características de gráficos Tipos de gráficos Símbolos Tipos de linha Textos Matrizes Somente numéricas Seleção de linhas e colunas > x[1:2,] [,1] [,2] [,3] [1,] 1 5 9 [2,] 2 6 10 Outras operações com matrizes Lendo dados no R Entrada de dados A função read.table() • Função genérica A função read.csv() • Problema com a versão do Excel Importanto com a biblioteca foreign A função read.spss() Outras funções Data frames e listas Data Frames Bancos de dados Selecionando variáveis Anexando um banco de dados Listas Objeto mais complexo Gerenciamento de dados no R Não é adequado, mas muitas vezes necessário Troca de tipo de variável Recodificação Funções ajudam summary() table() Loops Loops são uma parte importante de qualquer linguagem de programação Permite realizar tarefas de maneira repetida Existem várias formas de Loop Vamos ver apenas uma: for Funciona com índice (mais comum) > for (i in 1:10) { do something } Vai fazer alguma coisa 10 vezes nesse caso Condicionais Permite realizar tarefas de maneira condicional Funciona com valores lógicos > if (x == y) { do something } else { do something else } Vai fazer alguma coisa se x=y e outra caso contrário O teste de permutação Vamos ver agora então como foi feito aquele teste de permutação simples que vimos no início da aula Primeiro, vamos escrever uma função para calcular um teste T t.test.antonio<-function(x,y){ m1<-mean(x) m2<-mean(y) sn1<-var(x)/length(x) sn2<-var(y)/length(y) tstat<-(m1-m2)/sqrt(sn1+sn2) tstat } O teste de permutação Agora vamos fazer uma função com um loop para que possamos fazer uma simulação muitas vezes t.test.permuta<-function (x,y, B=1000){ tstat<-NULL z<-c(x,y) for (i in 1:B){ mn<-sample(1:length(z),length(x),replace=F) x1<-z[mn] y1<-z[-mn] tstat[i]<-t.test.antonio(x1,y1) } tstat } A análise Agora, vamos ver como foi feita a análise com os dados do Richard As funções são um pouco mais complexas porque os dados exigem algumas adaptações Vamos usar praticamente tudo o que vimos nessas noções de R Vamos ver na prática…