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…