You are on page 1of 224

Escola Nacional de Sade Pblica Fiocruz

Departamento de Epidemiologia e Mtodos Quantitativos em Sade

Aprendendo
R

Antonio Guilherme Fonseca Pacheco


Geraldo Marcelo da Cunha
Valeska Lima Andreozzi
O objetivo desse material introduzir o ambiente R para alunos de ps-
graduao em Sade Pblica e mostrar suas vantagens e desvantagens. Estamos
considerando que os alunos que esto fazendo uso deste material j tiveram algum
contato mesmo que bsico com o computador e que j tenham algum conhecimento de
noes bsicas de operao do Windows.
Gostaramos de iniciar a apresentao do R a partir de algumas perguntas que
so comuns (e que na maioria das vezes foram feitas por ns mesmos antes de termos
nos tornados amantes do R)
;-)
O que o R?
O R um sistema desenvolvido a partir da linguagem S (que tambm usada
numa verso comercial o S-Plus), que tem suas origens nos laboratrios da AT&T no
final dos anos 80. Em 1995 dois professores de estatstica da Universidade de Auckland,
na Nova Zelndia, iniciaram o Projeto R, com o intuito de desenvolver um programa
estatstico poderoso baseado em S, e de domnio pblico.

Com o R posso utilizar menus para fazer anlises estatsticas, como no


SPSS, SAS e S-Plus?
No. O R em verso para Windows at provido de menus, mas todos so
usados para realizar tarefas no estatsticas (como atualizar a verso ou salvar um
grfico). Todas as funes estatsticas que acompanham o R devem ser chamadas a
partir do cursor do programa (seja digitando um comando ou copiando e colando um
comando previamente digitado).

O fato do R no possuir menus no seria uma desvantagem em relao a


outros pacotes estatsticos?
Depende. Muitos iro certamente interpretar esse fato como uma desvantagem,
mas a gente entende que na verdade esta uma vantagem forte do R. A utilizao do R
para realizar anlises estatsticas exige muito mais do que simplesmente apertar alguns
botes em srie e dar alguns cliques no mouse: para trabalhar dados com o R preciso
PENSAR e ENTENDER o que se est fazendo. Ao contrrio de muitos pacotes
estatsticos clssicos, o R permite uma grande flexibilidade em relao s funes
estatsticas pr-existentes, i.e. as funes so editveis, alm da possibilidade de voc
mesmo poder criar as suas prprias funes personalizadas (como ser mostrado mais
tarde).

Quanto custa para ter uma cpia oficial do R?


No custa nada: ele de graa MESMO, ou seja, ningum precisa gastar US$
1.349, o que seria necessrio para comprar o mdulo bsico do SPSS, por exemplo; nem
ser obrigado a cometer um pequeno delito para usar o R.

Se ningum est ganhando dinheiro para manter o R atualizado, como


posso ter certeza que se trata de um produto confivel?
Esta uma outra vantagem do R: o Projeto R de uma colaborao internacional de
vrios pesquisadores que se comunicam atravs de uma eficiente lista de discusso pela
Internet. Com isso, no s bugs (defeitos de programao) so detectados e
corrigidos, como tambm novos mdulos contendo mtodos estatsticos recentemente
implementados so regularmente disponibilizados e atualizados na rede.

2
O que so esses mdulos adicionais?
Os mdulos adicionais funcionam da seguinte forma: um pesquisador em algum
lugar do mundo precisou desenvolver uma aplicao numa rea que no coberta nem
pelo mdulo bsico nem pelos mdulos de colaboradores existentes. O que esse
pesquisador faz desenvolver o que chamada de uma biblioteca para o R com as
funes que ele criou e utilizou, disponibilizando-a na rede. A vantagem que a
biblioteca pode ser usada por diferentes pessoas, que iro eventualmente reportar erros
nas funes, que podem ento ser atualizadas pelo seu criador.

Que plataformas (sistemas operacionais) suportam o R?


Atualmente o R est disponvel para a famlia UNIX (incluindo LINUX), a
maior parte dos Mac OS e ainda Windows 95, 98, NT, 2000, Me, XP.

Onde posso conseguir o R?


O R est disponvel na internet no website do CRAN que o Comprehensive
R Archive Network ou Rede Completa de Arquivos do R, no seguinte endereo:
http://www.r-project.org/
J sei, no gostou da traduo do website, n? Bem, se algum tiver uma
traduo melhor para comprehensive, por favor me avise...
;-)

Muito bem. Agora que j ganhamos uma certa noo do que vem a ser o R,
vamos ver como esse material est dividido.
A idia desse documento separar em mdulos diferentes assuntos estatsticos
que so tratados pelo R; desse modo, pessoas que tenham interesses em tipos de anlises
diferentes podero consultar partes especficas do material, sem ter o trabalho de
pagin-lo exaustivamente para encontrar o que se quer.
O primeiro mdulo, Baixando e Instalando o R, bastante curto e trata da
pgina da internet que abriga todo o material necessrio para baixar e instalar o R
chamada CRAN. O segundo mdulo, chamado Bsico serve para dar uma noo geral
do funcionamento do R, desde uma simples calculadora at uma poderosa ferramenta de
programao em estatsticas, sempre usando exemplos intuitivos e em um nvel bastante
inicial. Esses dois mdulos no exigem o uso de qualquer dado externo ou pacotes que
j no estejam includos na verso mais bsica do R aquela que voc ir instalar
inicialmente na sua mquina.
O terceiro mdulo trata da entrada e sada de dados no R. Nesse caso no s ser
mostrado como o R l dados externos, mas tambm como se exportam dados, sadas em
texto e sadas grficas. O uso de um pacote prprio para esse fim tambm mostrada e
dados externos sero necessrios para a parte de importao de dados.
Esses trs mdulos so os nicos que podem ser encarados como seqenciais e
tambm fundamentais para uma compreenso inicial do ambiente. A partir da, uma
srie de mdulos j esto e sero mais tarde desenvolvidos para aulas ou assuntos
especficos e ficaro guardados em arquivos separados, permitindo um acesso rpido e
interativo aos assuntos de interesse.
Portanto, divirta-se...

3
Mdulo Baixando e Instalando o R
Autor: Antonio Guilherme Fonseca Pacheco

Pr-requisitos: Conhecimentos bsicos de informtica e acesso internet (preferencialmente.)

Pacotes e arquivos necessrios: Nenhum.

Esse mdulo inicial tem o objetivo de capacitar pessoas a navegar mais facilmente no
webwsite do R, chamado CRAN (Comprehensive R Archive Network) e ainda orientar a instalao
do R para Windows e fazer uma configurao inicial bsica do programa, incluindo a instalao de
pacotes adicionais. Como esse material poder estar acompanhado de um CD-ROM j com o
programa de instalao do R e os seus pacotes, abordaremos tambm esse tpico. No CRAN
possvel baixar no s o pacote principal do R, mas tambm os pacotes opcionais (chamados de
contribudos) e tambm uma srie de manuais. Vale lembrar que no s a verso para Windows est
disponvel no CRAN, mas tambm verses para a famlia UNIX (incluindo Linux) e ainda para
Mac.
Dispensvel dizer que a correta utilizao desse mdulo pressupe que a mquina do
usurio esteja conectada internet.

Conhecendo o CRAN
O primeiro macete encontrar o website do CRAN, que no muito fcil de achar se voc
no souber o endereo (que por sinal no l muito intuitivo). A dica ir no website de uma dessas
ferramentas de busca na internet (como por exemplo o Google) e procurar por CRAN.
Certamente uma das primeiras respostas ser o endereo do CRAN. claro que no somos to
maus assim para fazermos voc voltar primeira parte desse documento para procurar o endereo
sem usar o Google... V em:
http://cran.r-project.org/
Uma vez l, voc ver algo como a figura abaixo.
Nessa pgina voc vai encontrar praticamente tudo que voc precisa saber sobre o R e tudo
que voc precisar baixar para a sua mquina para instalar o R e seus pacotes adicionais, alm de
informao sobre a excelente lista de discusso que mantida na internet e da qual participam as
pessoas do ncleo de desenvolvimento do R.
Na parte central da pgina voc vai observar uma lista de pginas mais usadas e uma
pequena explicao do R e do CRAN abaixo. Como essa parte da pgina pode mudar, vamos
utilizar os atalhos que esto listados esquerda, que acabaro levando para as mesmas pginas
listadas como mais freqentes.
esquerda da pgina, ento, voc vai encontrar vrios links para os diversos recursos
disponveis no CRAN... Vamos ver aonde alguns deles nos levaro e depois de aberto o caminho,
sugerimos que voc mesmo, imbudo de seu esprito aventureiro de surfista da rede, explore os
demais atalhos. Inicialmente, repare que eles esto divididos em 5 grupos. Ns iremos abordar
apenas os atalhos dos grupos Software e Documentation.

1
Apesar de voc provavelmente estar fazendo esse curso em um laboratrio que j tem
instalado o R em uma plataforma Windows, sempre bom instalar uma cpia do programa em uma
outra mquina que voc tenha acesso (seja em casa ou no trabalho). O atalho para baixar o
programa que instala o R para Windows na sua mquina o R Binaries que fica no grupo Software.
Uma vez clicando nesse atalho, uma pgina se abrir com o ttulo de Index of /bin. Observe que os
atalhos sua esquerda permanecem l. Nessa pgina (que mais parece uma estrutura de diretrios
o que de fato ), a escolha bvia se voc vai instalar o R para Windows clicar em windows/.
Ao clicar no atalho, uma nova pgina ser mostrada com 3 atalhos: base, contrib e
unsupported. O primeiro atalho (que o que estamos procurando) nos levar a uma nova pgina
onde poderemos baixar o executvel para a instalao. Os outros atalhos ns iremos deixar de lado,
pois so para acessar pacotes contribudos para o R, um assunto que vamos abordar em outros
mdulos. Apesar de ser possvel baixar cada um dos pacotes e instal-los manualmente no R, ns
veremos que uma vez instalado o R, existe uma maneira muito mais simples de instalar pacotes do
CRAN usando o prprio R como interface.
Muito bem, clicando ento em base uma nova pgina se abrir e voc deve procurar pelo
atalho rwXXXX.exe, onde os XXXX representam a verso atualmente disponvel. Por exemplo,
quando esse material estava sendo escrito, a verso disponvel era a 1.6.2 e o atalho era rw1062.exe.
Basta agora clicar nesse atalho e o seu browser ir automaticamente perguntar onde voc deseja
salvar o arquivo. Salve onde voc estiver mais acostumado (e.g no desktop ou em Meus
Documentos) e aguarde. Ateno: esse arquivo tem em torno de 20 Mb de tamanho e dependendo
da sua velocidade de conexo com a internet, o download pode demorar at mais de uma hora.
Uma vez baixado o programa de instalao, basta dar um duplo-clique em seu cone e seguir
as instrues de instalao (veja as instrues mais detalhadas abaixo.)
Bem, vamos passar agora para a documentao do R. Observe os grupos de menus
esquerda e procure o grupo Documentation. Primeiramente, o atalho Manual ir lev-lo para uma

2
pgina de onde possvel baixar vrios materiais em formato PDF (que pode ser lido pelo Adobe
Acrobat Reader, um programa que pode ser baixado gratuitamente da rede na verdade se a sua
mquina j tem o Reader instalado, o documento aparecer automaticamente na tela do seu
browser. No vamos nos estender aqui explicando cada um dos materiais. Experimente baixar
alguns e divirta-se...
O atalho seguinte chamado FAQs, que voc j deve ter ouvido falar em algum lugar, mas
que se no sabe o que significa, aqui vai: so perguntas feitas com freqncia, sobre algum
assunto que naturalmente aqui sobre o R (FAQ em ingls abreviao de Frequently Asked
Questions). Ao clicar nesse atalho, vai se abrir uma pgina com links para a FAQ do R (que uma
FAQ geral) e tambm FAQs especficas para usurios de Windows e Mac. Clique e boa leitura...
O terceiro atalho desse grupo chamado Contributed e contm diversos manuais escritos
por pessoas que no fazem parte do ncleo de desenvolvimento do R, mas que so
reconhecidamente boas contribuies para o entendimento do programa. Voc encontrar inclusive
materiais em outras lnguas que no o ingls. O leitor convidado a explorar esses diversos
materiais para ver se algum do seu interesse.
Finalmente o ltimo atalho nesse grupo o Newsletter, onde voc encontrar uma coleo
de documentos sobre o desenvolvimento do R alm de comentrios sobre pacotes relevantes
adicionados ao programa, dentre outras informaes.
Por fim, no deixe de se aventurar pelos demais atalhos do CRAN que uma fonte muito
grande para informao sobre o R. Quanto ajuda do programa, num outro mdulo vamos falar
sobre a documentao em html que acompanha o mdulo bsico do R. At l, boa sorte...

Instalando e Configurando o R para Windows


Como mencionado anteriormente, a instalao do R mesmo no tem grandes mistrios:
basta dar um duplo-clique no cone do programa de instalao e seguir as instrues que aparecem

Aqui est o cone do R!

na tela. Ao fazer isso, o programa ser instalado no diretrio padro (geralmente c:\Program
Files\R\rwXXXX\) e ser criada uma pasta dentro do seu menu Iniciar Programas chamada R.
Adicionalmente, um cone ser colocado na sua rea de trabalho.
3
Para iniciar o programa, d um duplo-clique no cone do R localizado na rea de trabalho...
Olhe um exemplo a em cima em um computador qualquer...
Ao fazer isso, o programa ser executado e uma janela com o programa ser aberta. Voc
deve notar que o programa se parece bastante com outros programas que voc j deve estar
habituado a usar: ele tem uma barra de menus, uma de cones e uma janela aberta, com o prompt de
comando. Por enquanto, ns estaremos interessados no menu Packages, onde iremos ver como
instalar pacotes adicionais diretamente do CRAN, usando o prprio R. Observe a figura:

Ao clicar na opo Installing package from CRAN, uma janela se abrir com uma lista de
todos os pacotes disponveis no CRAN para download. Voc pode ento escolher um ou vrios
pacotes para serem baixados e instalados automaticamente na sua mquina, incluindo a ajuda em
HTML para esses pacotes. As tcnicas de seleo mltipla que voc deve conhecer para programas
como o Windows Explorer funcionam nessa janela, ou seja, para selecionar um intervalo de
pacotes, clique no primeiro, pressione a tecla Shift e ento clique no ltimo pacote do intervalo;
para selecionar pacotes salteados, clique nos pacotes, com a tecla Control (Ctrl) pressionada. Claro
que uma opo pode ser selecionar todos os pacotes (selecionando do primeiro ao ltimo com a
ajuda da tecla Shift), mas ateno: ao selecionar todos os pacotes, voc estar optando por baixar
uma grande quantidade de dados, o que, num computador que est ligado internet via modem,
pode demorar muitas horas.

Ao final da instalao, o R vai perguntar se voc deseja apagar o(s) pacote (s) baixados (a
pergunta mais ou menos: Delete downloaded files (y/N)? Para a qual voc deve, geralmente
responder y, a no ser que voc deseje ter o pacote compactado para instalar em uma outra

4
mquina. Confundiu? Eu explico: os pacotes so na verdade arquivos compactados no formato
.zip, que pode ser lido com o popularssimo Winzip. O que o programa faz baixar esse arquivo
do CRAN para um diretrio temporrio, e em seguida instalar o pacote a partir desse arquivo .zip.
O que ele pergunta no final se voc deseja manter esse arquivo gravado no seu computador ou no
(claro que isso DEPOIS do pacote j ter sido instalado.)
Bem, uma vez instalados os pacotes, uma outra opo nesse mesmo menu pode ser usada
para atualizar verses de pacotes instalados na sua mquina, mas que j possuem verses mais
atualizadas no CRAN. a ltima opo do menu Update packages from CRAN que ao ser acionada
ir procurar os pacotes instalados na sua mquina, compar-los com as verses desses pacotes no
CRAN e perguntar se voc deseja atualizar (um a um). Note que ele no vai perguntar se voc quer
atualizar um pacote que ainda no est instalado na sua mquina!!! Para isso, voc deve instalar o
pacote, como descrito anteriormente.
Voc agora deve estar se perguntando: mas e se eu no tiver acesso internet e tiver tanto o
programa de instalao do R quanto os pacotes em uma mdia de distribuio qualquer um CD-
ROM por exemplo?
Nesse caso, no h problema algum. Para instalar o R basta, a partir do prprio CD-ROM
executar o programa de instalao do R (que deve ter um instrutivozinho junto com o CD,
naturalmente, mas que deve consistir apenas de explicar em que diretrio dentro do CD-ROM esse
arquivo s encontra e dar um duplo-clique no seu cone.
J para instalar os pacotes (depois naturalmente de instalado o R) o procedimento muito
semelhante. A terceira opo do mesmo menu que estvamos falando Install package from local zip
files ir abrir uma janela para voc escolher pacotes compactados nas suas unidades locais (que
pode ser o seu disco rgido ou uma outra mdia qualquer) para serem instalados na sua mquina.
Esse procedimento tambm depende de onde esto guardados os arquivos. Nesse caso, se por
exemplo esses arquivos estiverem em um CD-ROM distribudo para voc, este deve vir
acompanhando como instrutivo indicando a partir de que diretrio os pacotes devem ser instalados,
mas basicamente, tudo o que deve ser feito escolher os pacotes e deixar o R fazer o resto.
Ento, boa sorte...

5
Mdulo Bsico

Autores: Antonio Guilherme Fonseca Pacheco; Geraldo Marcelo da Cunha; Valeska Lima
Andreozzi

Pr-requisitos: Por se tratar de um mdulo bsico, no existem pr-requisitos para iniciar o


treinamento em R com este documento, se o leitor tiver acesso ao R j instalado em sua mquina.
Caso contrrio, a leitura do Mdulo Baixando e Instalando o R deve ser feita anteriormente (e
claro, proceder a dita instalao). Foi feito um esforo tambm para tornar este material
independente de qualquer arquivo ou banco que j no exista na distribuio bsica do R, e por isso
alguns exemplos ficaram um pouco prejudicados...
;-)

Pacotes e arquivos necessrios: Nenhum.

Material extra: Um disquete (ou qualquer mdia regravvel) para salvar o seu trabalho

Este mdulo tem por objetivo apresentar as caractersticas bsicas de funcionamento do R e


introduzir o leitor a um primeiro contato com o ambiente R, sem referncia especfica a um tpico
de estatstica. Por ora, assumimos que o R j est instalado no seu computador, e que um cone j
aparece na rea de trabalho (caso isso no seja verdade, leia o mdulo Baixando e Instalando o R
para instrues sobre como baixar, instalar e configurar o R em sua mquina.)
Para iniciar uma sesso do R, d um duplo-clique no cone do R que deve estar localizado
na sua rea de trabalho. Uma vez iniciado o programa, uma janela contendo o prompt de comando
aberta:

Prompt de
comando

1
Observe que h uma janela dentro do programa com o prompt de comando. As sadas no
grficas no R aparecero nesta mesma janela enquanto que as grficas sero geradas em uma janela
separada.

Entendendo a Ajuda do R
Se voc me perguntasse qual o conhecimento fundamental que uma pessoa que deseja
saber usar qualquer programa de computador deve ter, a resposta seria contundente: o que
diferencia a capacidade de um usurio se tornar familiarizado com qualquer software a capacidade
de usar de maneira racional e eficiente a ajuda desse programa. O R possui diversas formas
diferentes de obter ajuda sobre o programa em geral e ainda sobre funes e conjuntos de dados
disponveis.
Uma caracterstica muito til do R sem dvida nenhuma a ajuda baseada em HTML que
ele possui. Para quem no entendeu o que isso quer dizer, o R tem uma ajuda que pode ser acessada
atravs do seu browser favorito... Ah, para quem no sabe, browser aquele programa que voc usa
para navegar na internet, como o Internet Explorer ou o Netscape, para citar os mais usados...
Para acessar essa ajuda, clique na barra de menus em Help e, em seguida, R language
(html), como na figura abaixo:

Ao fazer isso, o seu browser ser automaticamente executado e a pgina inicial da ajuda vai
aparecer na sua tela. Voc ver algo assim:

2
O grupo de links que dizem respeito ajuda do R o de referncias (Reference). O link de
packages vai levar voc pagina com todos os pacotes que esto instalados na sua mquina, alm
claro do pacote base (que o pacote bsico do R que automaticamente instalado quando voc
instala o R). Ao clicar em cada um dos links com os nomes dos pacotes, voc ser levado ento a
uma pgina com todas as funes e bancos de dados que compem o pacote. Por que voc no tenta
acessar as funes do pacote base?
O segundo link em interesse para ns aqui o de Search Engine & Keywords, algo como
Ferramenta de Procura e Palavras-chave.
Ao clicar neste segundo link voc encontrar a seguinte tela que est dividida em duas
partes: Search e Keywords.

Na primeira parte podemos procurar uma ou mais palavras que estejam no ttulo das pginas
de ajuda (Help page titles), por palavras-chave (keywords) ou pelo nome de funes ou objetos
(Object names). Vamos experimentar procurar ajuda sobre como fazer um teste t de Student. Digite,
em ingls claro, t-test e clique no boto Search ou aperte somente a tecla enter no seu teclado. O
help HTML abrir outra pgina com uma lista de comandos e uma pequena descrio do que cada
uma delas faz. Clique no nome do comando e outra janela ser aberta com todos os detalhes do
respectivo comando, como mostra a figura abaixo:

3
No canto superior esquerdo encontramos o nome do comando e entre chaves o nome do
pacote no qual este comando se encontra (mas a frente vamos entender um pouco melhor sobre o
tpico pacotes). Esta janela composta por 7 tens:

1. Description (Descrio)
Descreve o que o comando faz
2. Usage (Sintaxe forma de uso)
Mostra como devemos usar o comando, quais os seus argumentos e respectivos valores
padres
3. Arguments
Descreve cada argumento listado na sintaxe do comando.
4. Details (Detalhes)
Descreve com um pouco mais de detalhe o comando e/ou argumentos.
5. Value (Valores)
Descreve o que o comando retorna
6. See Also (Ver tambm)
Cita alguns comandos que tenham alguma ligao com o comando em questo
7. Examples (Exemplos)
Exemplifica o comando. Podemos selecionar os comando listados no exemplo, depois colar
e copiar na janela do R para executa-los.
O critrio de procura do help HTML pode gerar dvidas algumas vezes. Nas situaes em
que voc no encontrar o que esteja procurando o conselho : tente pesquisar de uma forma
diferente. S para exemplificar tente procurar a palavra t test (sem hfem) e test t. Voc vai observar
que o help ir retornar listas de comandos que so diferentes de quando usamos a palavra t-test.
Ah, mas como volto para a tela inicial (ou qualquer tela anterior)? Para voltar para a pgina
inicial ou qualquer pgina anterior, use o boto voltar para (usualmente representado por uma
setinha) do seu web browser.

4
A segunda parte da tela Keyword lista diversos links por assunto. Ao clicar em um desses
links uma janela ser aberta com todos os comandos relacionados aquele assunto.
No momento acho que este tpico pode no ser muito til, mas com certeza voc ir voltar
nele mas a frente assim que comear a usar o R. Na verdade a gente aprende que a melhor maneira
de trabalhar no R e estar sempre com o help HTML aberto, pois decorar todos os comando e suas
sintaxes e algo impossvel.

A partir deste ponto, vamos comear a discutir coisas que so feitas no R propriamente dito.
Isto consiste basicamente em entrar comandos no prompt de comando, que j foi apresentado
anteriormente. O leitor tem duas opes para conferir as sadas aqui apresentadas no R: ou escreve
a partir do teclado o mesmo comando apresentado, ou ento copia e cola o comando no R. Para
copiar, basta marcar o texto com o mouse e ento pressionar a tecla Ctrl seguida da tecla c no seu
teclado. Para colar, pressione a tecla Ctrl seguida da tecla v no seu teclado. Para isso,
evidentemente voc deve ter o programa onde voc est lendo este material aberto e tambm o R,
alternando entre um e outro. Um detalhe importante deve ser mencionado de uma vez: o prompt do
R, como voc j deve ter notado, comea com o smbolo de maior (>). Sempre que neste material
o comando for mostrado juntamente com a sada correspondente, o sinal > estar tambm no
texto, como nesse primeiro exemplo abaixo:

> 3+7
[1] 10

Se voc quiser copiar e colar esse comando de soma de dois nmeros no R, NO COPIE O
SINAL DE MAIOR, pois se o fizer, voc receber uma mensagem de erro. Veja s:

> > 3+7


Error: syntax error

E, claro, no copie a sada tambm, s o comando. Ah, e s vezes depois de colar, voc
dever pressionar a tecla enter no teclado para o R executar o comando. claro que voc livre
para copiar o que quiser, mas sempre que a recomendao for copiar e colar, os comandos viro
sem o smbolo > antes do comando.
Muito bem, ento d um duplo-clique no cone do R para abri-lo e boa sorte...

Clculos e Funes
Vamos iniciar mostrando o R como calculadora. Por exemplo, tente fazer uma conta
simples:

> 3+7
[1] 10

Repare que o resultado da operao precedido por um [1]. Isto apenas para indicar que o
resultado 10 o primeiro (e nesse caso nico) elemento retornado pelo programa. Bem, essa
uma excelente deixa para dizer que o R pode funcionar como uma calculadora, como a que voc j
deve ter usado em cursos passados. Porque a gente no experimenta outras operaes simples?
Tente:

> 3-7
[1] -4

> 3*7
[1] 21

5
> 3/7
[1] 0.4285714

> 3^7
[1] 2187

Como em outros programas (e.g. Excel), os operadores matemticos simples so +, -,


*, / e ^ este ltimo para potenciao. Voc pode estar se perguntando agora, depois de
algumas aulas de matemtica: como o inverso do operador potncia? Ou melhor, como descobrir
a que potncia um certo nmero foi elevado para obtermos um determinado resultado?
Bom, nesse caso temos que lanar mo de uma funo, j que como voc deve se lembrar o
operador inverso da potenciao a funo logartmica. Recordando:
7
Se 3 =2187 log 3 2187= 7 , ou seja, o logaritmo de 2187 na base 3 igual a 7.
Lembrou? Ser complicado obter esse resultado no R, sem a ajuda de um menuzinho? Bem, vamos
tentar escrever exatamente como estamos interpretando a funo?

> log(2187, base=3)


[1] 7

E no que funcionou??? Quer dizer, precisamos elevar 3 stima potncia para obter o
resultado de 2187.
Vamos aproveitar esse exemplo para explicar algumas caractersticas bsicas das funes
disponveis no R. Todas tm a forma:

> funo (argumento(s) obrigatrio(s), argumento(s) opcional(is))

Sendo que os argumentos opcionais podem ter um valor padro pr-estabelecido ou no. Os
argumentos estaro sempre entre parnteses sendo separados por vrgula. Se voc deixar o primeiro
argumento em branco, vai receber uma mensagem de erro:

> log(, base=3)


Error in log(, base = 3) : Argument "x" is missing, with no default

Repare que o programa j indica que o argumento (que ele chama de x) obrigatrio no
foi fornecido e que no existe nenhum padro (default). Agora, deixe o segundo argumento em
branco:

> log(2187,)
[1] 7.690286

Dessa vez no houve mensagem de erro, mas o resultado diferente do que a gente obteve
anteriormente... O que ter acontecido? Bem, se no houve queixa do programa quanto ao segundo
argumento, ele deve ter um default pr-estabelecido... Por que esse default seria 3?
Vamos descobrir, aproveitando para aprender a consultar a ajuda do R? Por que no
tentamos assim:

> ?log

Note que uma nova janela se abriu dentro do prprio R com a informao de ajuda sobre a
funo log. A essa altura voc est se perguntando onde estar a ajuda em HTML, no? que o
R possui vrios tipos de ajuda; se preferir, abra a ajuda em HTML e procure pela funo log. De
qualquer modo, se voc olhar a entrada Usage, na pgina de ajuda sobre o log, vai ver:

6
log(x, base = exp(1))

Isso quer dizer que a funo log() precisa de um argumento x que no tem default e
tambm de um argumento base que tem um valor pr-estabelecido, exp(1) que nada mais que o
nmero e (conhecido como algarismo Neperiano e aproximadamente igual ao valor 2.718282).
Vamos tentar? Volte para a janela do prompt e veja o valor:

> exp(1)
[1] 2.718282

Lembrou dele? Vamos conferir ento se foi isso mesmo que aconteceu. Vamos tentar assim:

> log(2187, base=2.718282)


[1] 7.690286

o mesmo resultado!!! Parece ser isso mesmo!!!

A prxima pergunta que voc pode estar fazendo se existe uma maneira de economizar
digitao omitindo o argumento base =. A resposta sim, neste caso. Vamos tentar:

> log(2187, 3)
[1] 7

Neste caso deu certo porque a funo s tem 2 argumentos possveis e eles entraram na
ordem certa. Se voc trocar a ordem, o resultado diferente:

> log(3,2187)
[1] 0.1428571

Se voc trocar a ordem, porm especificando quem quem, no haver confuso:

> log(base=3,2187)
[1] 7

Moral da histria: sempre melhor especificarmos o que estamos escrevendo (embora


muitas vezes ns tenhamos preguia de fazer isso tambm...).
;-)
Vamos aproveitar e ver rapidamente algumas funes bastante usadas no R. Veja a tabela
abaixo:

Funo Descrio
sqrt() raiz quadrada
abs() valor absoluto
exp() exponencial
log10() logaritmo na base 10
log() Logaritmo na base e
sin() cos() tan() funes trigonomtricas
asin() acos() atan() funes trigonomtricas inversas
sin() cos() tan() funes trigonomtricas

7
Curioso para saber como essas funes funcionam? Tente usar a ajuda do R para descobrir.
Por exemplo:

> help(sqrt)

Vai se abrir uma janela de ajuda que na verdade genrica para a funo abs() tambm.
Esperamos que voc tenha percebido que esta uma forma alternativa de chamar a ajuda (em vez
de ?sqrt)

Como o R armazena Objetos e Comandos


Muito bem, at agora ganhamos uma noo de como o R realiza operaes matemticas e de
como as funes pr-definidas (e tambm as que um dia voc mesmo vai criar!!!) funcionam.
Mas voc deve estar se perguntando: e os dados? Eu preciso mesmo analisar dados com
este programa... Como que funciona? Como que o R armazena dados, sejam eles digitados a
partir do teclado, sejam eles importados de um arquivo externo?
Bom, antes de entrar nessa parte mais interessante, vamos comear a falar sobre a maneira
diferente como o R guarda um objeto.
Objeto para o R significa tanto um banco de dados quanto a sada de uma funo ou at
mesmo uma frmula. Para criar um objeto no R, seja ele qual for, voc dever sempre usar o
operador de asignment (<-), apontando para o nome de um objeto. Por exemplo, para criar o objeto
x com o valor 3, faa assim no R:

> x <- 3

O que fizemos foi colocar o nmero 3 em um objeto chamado x usando o operador


assignment (<-). Este objeto pode ento ser chamado e seu contedo revelado, simplesmente
digitando o seu nome:

> x
[1] 3

No se preocupe: ao longo deste documento vamos criar diversos objetos e voc entender
melhor como faz-lo. Por ora, o importante entender que tudo o que voc cria no R um objeto.
Ao contrrio de outros programas que voc j deve conhecer (como Excel, Word, etc), o R
no armazena cada um dos seus objetos como um arquivo que fica em uma determinada localizao
no seu disco rgido. Ficou difcil de entender? Vamos tentar explicar de novo.
Quando voc usa um editor de texto como o Word, por exemplo, e voc salva o seu trabalho
pela primeira vez, o programa pede para voc dar um nome ao seu arquivo e o salva fisicamente em
um diretrio (que em geral em Meus Documentos My Documents se verso em ingls).
Uma vez salvo, aquele nico arquivo estar naquela localidade com o nome que voc deu e
portanto voc poder abri-lo no Word para futura edio ou para imprimir, etc.
O R trabalha um pouco diferente. Na verdade, quando voc cria uma srie de objetos, eles
podem ser salvos tambm, porm EM GRUPO, ou seja, o R salva TODOS OS OBJETOS num
mesmo arquivo. Mais tarde, voc poder abrir este arquivo e trabalhar com TODOS os objetos que
foram salvos.
Voc deve estar se perguntando se isso no vai atrapalhar muito a sua vida... Depende.
Apesar do R salvar o arquivo com o mesmo nome sempre (.RData o nome esquisito assim
mesmo), voc pode salv-lo com um nome diferente (mas mantendo a extenso) em diretrios (ou
pastas, o nome moderno...;-) diferentes. A vantagem que voc pode armazenar todos os objetos
relativos a um determinado projeto num diretrio prprio do projeto.

8
Uma questo que deve ficar clara que o R vai armazenar temporariamente todos os objetos
que foram criados em uma sesso de trabalho e posteriormente salv-los definitivamente no arquivo
.RData; mas repare que sero salvos os OBJETOS, ou seja, tudo o que voc guardou usando o
smbolo de assignment (<-). Isso quer dizer que sadas de frmulas, funes e dados externos sero
armazenados como objetos (desde que designados para algum objeto com o smbolo <-), mas no
as sadas na tela ou os grficos gerados por funes. Mais tarde voc vai aprender a salvar essas
sadas de um modo mais conveniente.
Vamos ver um exemplo. Iremos salvar o nosso arquivo no drive de disquete (geralmente o
drive A). claro que para isso voc deve ter um disquete...
Primeiro, vamos fazer com que o R mude o diretrio de trabalho (que em geral
configurado para ser "C:\\Program Files\R\rwXXXX" Faa assim:

Na barra de menus do R, clique em File e em seguida em Change dir


Uma pequena janela chamada Change directory se abrir. Clique em Browse
A janela Browse for folder se abrir. D um duplo clique em Meu Computador, depois
em A:
Clique em OK e em OK novamente na outra janela.

Agora o nosso diretrio de trabalho o drive A, e agora podemos salvar a nossa sesso
inteira no disquete:

V em File de novo, mas clique em Save Workspace


Note que o arquivo .RData est para ser salvo no nosso drive A
Clique Save

Vamos agora verificar se o nosso arquivo est mesmo l... Boa sorte!!!
Agora, experimente salv-lo com outro nome, mas no se esquecendo de manter a extenso
.Rdata (exemplo: aluno.Rdata). Quando voc encerra uma sesso do R ele sempre pergunta se
voc deseja salvar as alteraes, o que significa salvar todos os objetos novos que foram criados
naquela sesso.
Uma outra caracterstica do R a capacidade de armazenar um histrico de comandos
usados anteriormente. Como no caso dos objetos, o R armazena esses comandos num arquivo que
tem a extenso .Rhistory, tambm sem nome por default (e que tambm pode ser modificado,
mantendo-se a extenso). Esse arquivo na verdade um ASCII que contm todos os comandos que
voc salvou na sua ltima sesso. claro que voc pode editar esse arquivo, salvar com um nome
diferente, etc.
O funcionamento do histrico o seguinte: Na primeira vez que voc salvar o seu
workspace, o R vai automaticamente salvar no mesmo diretrio um arquivo com o histrico; se ma
prxima vez que voc executar o R ele encontrar um arquivo .Rhistory na mesma pasta onde est
o arquivo .RData, ele vai carregar automaticamente esse arquivo. Caso contrrio, voc ter qeu
carreg-lo manualmente, atravs do menu File e depois Load History. Um detalhe importante
que caso voc tenha carregado um arquivo de histrico (seja automaticamente ou manualmente),
quando voc salvar o histrico no final da sesso, o R vai acumular os comandos dessa sesso com
os comandos previamente salvos. Tente brincar um pouco com o arquivo...
Por fim, uma vez que voc tenha salvo o seu workspace, seja no disquete, seja em outro
diretrio qualquer, da prxima vez que for us-lo, basta dar um duplo-clique no arquivo mesmo (a
partir do Windows Explorer, por exemplo), que o R ser automaticamente executado o workspace
carregado.

Vetores

9
Certo. No fique ansioso ainda... Antes de vermos a questo de ler dados externos, seria
interessante ver como podemos entrar com algumas formas simples de dados a partir do teclado
diretamente.
A forma mais simples de armazenamento de dados (i.e. o mais simples objeto) no R um vetor. Um
vetor um seqncia em uma ordem especfica de valores de um mesmo tipo de dados. Como os
dados so mais freqentemente nmeros, os vetores numricos so os mais usuais. Vetores no
numricos formados por caracteres (como nomes) so tambm bastante utilizados e podem tambm
ser construdos no R.
Vamos criar um objeto chamado x, mas colocando diferentes coisas nesse objeto.
Um nmero:

> x <- 3

Voc j deve ter duas perguntas prontinhas. A primeira : que diabo esse <- que apareceu
entre o objeto que eu queria criar o x e o nmero 3? J esqueceu, n?
;-)
Esse o smbolo de atribuio (assignment) no R, lembra? Ele significa que o nmero 3 foi
colocado dentro do objeto x. Toda vez que a gente quiser colocar alguma coisa em um objeto,
esse smbolo vai ter que ser usado.
A segunda pergunta : muito bem, colocamos o nmero 3 no objeto x, mas como que eu
verifico se o objeto x realmente possui o nmero 3? simples, j fizemos isso tambm. Tente
assim:

> x
[1] 3

Hummm... Quer dizer que para visualizar um objeto basta digitar o seu nome? isso a!!!
Vamos aproveitar para mostrar um detalhe a mais do R. Para ele maisculas so DIFERENTES de
minsculas. Digite X em vez de x:

> X
Error: Object "X" not found

O programa informa que o objeto X no existe (existe o x).


Mas no era disso que estvamos falando. Vamos voltar para os diferentes contedos de um
vetor... Que tal entrarmos com um caracter, por exemplo, com a palavra banana?

> x <- "banana"


> x
[1] "banana"

Percebeu a diferena deste caso para o caso numrico? Sempre que estivermos trabalhando
com caracteres devemos usar aspas duplas. Voc deve estar se perguntando o que teria ocorrido se
no tivssemos utilizado aspas na palavra banana... O problema que se no fizermos isso, o R vai
pensar que banana o nome de um outro objeto...

> x <- banana


Error: Object "banana" not found

Viu s? O R reclama que o objeto banana no existe. Mas e se esse objeto existisse? O que
aconteceria? O R copiaria o contedo do objeto banana para o objeto x. Estranho? No. Essa a

10
maneira de se fazer uma cpia de um objeto no R. Vamos criar um objeto chamado banana,
contendo o nmero 7 e copiar o seu contedo para o objeto x:

> banana <- 7


> banana
[1] 7
> x <- banana
> x
[1] 7

Pegou? Legal. Agora, voc deve ter notado um probleminha... a gente tinha colocado no
objeto x primeiramente o nmero 3, depois a palavra banana e por fim o nmero 7, quando
copiamos o contedo do objeto banana para x. Repare que as substituies de contedo do objeto x
foram feitas sem nenhuma cerimnia pelo R. Pois , isso pode ser um problema no R: ele no
pergunta se voc quer ou no substituir o contedo de um objeto com um nome, por outro. Para
evitar esses acidentes, vamos aprender mais tarde uns macetes para economizar digitao...
Aguardem...
;-)
At agora s vimos exemplos que raramente usaremos, n? Quem que vai entrar UM valor
em um vetor??? Embora faamos isso muitas vezes no caso de programao avanada, vamos ver
algo mais interessante. No R, para entrar com vrios nmeros (ou nomes, ou qualquer outro grupo
de coisas), precisamos usar uma funo para dizer ao programa que os valores sero combinados
em um nico vetor. Vamos tentar:

> x <- c(1,2,3,4,5)


> x
[1] 1 2 3 4 5

A essa altura, voc j notou que a funo usada foi c() e serve evidentemente para
combinar elementos. Vamos ver com nomes:

> x <- c("banana", "laranja", "tangerina")


> x
[1] "banana" "laranja" "tangerina"

Por ltimo, vamos abordar uma outra funo que vai ser muito usada no R, e que a gente
queria apresentar para voc no contexto de vetores. a funo usada para gerar uma seqncia de
nmeros. Imagine como seria esta funo... Acertou:

>x <- seq(from=1, to=12)


> x
[1] 1 2 3 4 5 6 7 8 9 10 11 12

Usamos a funo seq para criar uma seqncia de (from) 1 a (to) 12. Bom, lembra quando
a gente disse que era preguioso? Pois : d para fazer a mesma coisa de duas maneiras mais
rpidas. Uma omitindo os argumentos from e to:

> x<- seq(1, 12)


> x
[1] 1 2 3 4 5 6 7 8 9 10 11 12

Agora, a campe da preguia mesmo seria:

> x<-1:12
> x

11
[1] 1 2 3 4 5 6 7 8 9 10 11 12

muita mesmo, no ???


Uma outra facilidade oferecida pelo R a capacidade de selecionar valores armazenados em
posies especficas dentro de um vetor (na verdade, como veremos adiante, essa capacidade se
estende para outros objetos do R como matrizes e data frames). Vamos, por exemplo, criar o vetor
bicho (s para treinar):

> bicho<-c("macaco","pato","galinha","porco")
> bicho
[1] "macaco" "pato" "galinha" "porco"

Que tal visualizarmos o contedo da posio 3? Vamos fazer assim:


> bicho[3]
[1] "galinha"

Repare que para selecionar uma posio especfica dentro de um vetor, usamos o nome do
vetor seguido de um nmero entre colchetes. Esse nmero corresponde posio do elemento nesse
vetor (confira acima, como "galinha" foi o terceiro elemento a ser entrado.) E se quisssemos
selecionar os contedos das posies 1, 3 e 4?
> bicho[c(1,3,4)]
[1] "macaco" "galinha" "porco"

A gente utilizou a funo c() para combinar os nmeros correspondentes s coordenadas


dos elementos (na verdade criamos um vetor com esses valores), ainda entre colchetes. E podemos
ainda selecionar os contedos atravs de uma seqncia de posies, sempre entre os colchetes:

> bicho[2:4]
[1] "pato" "galinha" "porco"

Bom, acho que deu para pegar a idia de seleo, n? s usar os colchetes. Porque voc
no tenta brincar um pouco agora, criando outros vetores e tentando selecionar elementos?

Operaes vetoriais
Bem, vamos mudar um pouco de assunto agora. J que estamos falando de vetores e j
vimos como o R funciona como uma calculadora, que tal agora vermos como o R combina essas
duas caractersticas para realizar operaes vetoriais? Ih! Que palavro esse!!!??? No se assuste,
s uma maneira que o R tem para facilitar a sua vida. Vamos pegar um exemplo qualquer bem
simples, como um vetor de pesos de pessoas em kg e alturas em metros. Vamos fazer assim:

peso <- c(62, 70, 52, 98, 90, 70)


altura <- c(1.70, 1.82, 1.75, 1.94, 1.84, 1.61)

Muito bem, agora que tal calcularmos o ndice de massa corporal (IMC) para essas pessoas?
No sabe como calcula? fcil: ele simplesmente o peso em kg dividido pela altura em metros ao
quadrado. Vamos tentar fazer tudo de uma vez? Tente:

imc <- peso/altura^2

Vamos ver agora o resultado:

12
> imc
[1] 21.45329 21.13271 16.97959 26.03890 26.58318 27.00513

Percebeu o que aconteceu? O R calculou o IMC para cada posio dos vetores de peso e
altura. Por exemplo, o primeiro resultado 21.45329 o resultado da aplicao da frmula proposta
sobre o primeiro elemento de peso e o primeiro elemento de altura. Confira:
2
62/1.70 =21.45329 . Confira os outros resultados.
Esse procedimento uma operao vetorial, ou seja ela foi aplicada a um vetor inteiro.
Esse um bom momento para falar sobre precedncia de operaes matemticas no R. Bem,
o R segue a precedncia que a gente aprendeu l no ensino fundamental em matemtica, lembra?
No acima, a potenciao tem precedncia em relao diviso e portanto a nossa conta foi feita
corretamente. Lembre-se que se a diviso fosse feita antes da potenciao, o resultado seria
diferente. Quer ver? Como se muda a precedncia de operaes? Isso mesmo: usando parnteses,
igualzinho como voc aprendeu:

> (peso/altura)^2
[1] 1330.1038 1479.2899 882.9388 2551.8121 2392.4858 1890.3592

Epa! No era bem isso que a gente queria... Bem, assim fica claro que se a gente no quiser
se confundir nunca com os resultados, o uso do parnteses sempre uma boa poltica quando no se
tem certeza de uma determinada operao...

Gerao de Distribuies e Grficos


Vamos ver agora algumas funes no R para a gerao de distribuies estatsticas. Esta
evidentemente uma das especialidades do R, j que ele voltado para funes estatsticas
principalmente.
Comecemos com as distribuies contnuas. A mais badalada de todas, naturalmente a
Normal, que voc j deve estar cansado de ouvir falar. Vamos gerar ento um vetor com 100
valores de uma distribuio Normal, digamos com mdia 10 e varincia 4 (estes so os parmetros
de uma distribuio Normal):

> x <- rnorm(100, mean=10, sd=2)

Repare que a funo se chama rnorm e que os argumentos usados foram o nmero de
valores a serem gerados, a mdia (mean) e o desvio-padro (sd de standard deviation em ingls).
Cabem dois comentrios: primeiro o nome da funo. Bom, o norm vem de Normal, claro e o r
vem de random, aleatrio em ingls, pois a gente est gerando aleatoriamente 100 valores de uma
distribuio Normal(10, 4). A segunda observao que a rigor (embora nem todos sejam
rigorosos) o segundo parmetro da Normal a sua varincia (e no o seu desvio-padro). De
qualquer maneira, o R recebe o argumento relativo ao desvio-padro e no varincia.
Voc pode estar pensando em duas coisas. Primeiro: e se eu s tivesse a mdia e a varincia
e no o desvio padro em um problema e quisesse gerar a Normal? Eu teria que fazer a conta e
colocar o valor? Voc pode fazer isso... Entretanto, o R aceita colocar uma funo dentro de outra
funo. Assim, o mesmo resultado pode ser obtido fazendo:

x <- rnorm(100, mean=10, sd=sqrt(4))

A segunda questo : ser que a funo rnorm() tem um default? A resposta sim, pelo
menos para os argumentos mean e sd. Ganha um doce quem adivinhar quais so os padres...
Acertou quem pensou na mais famosa das Normais: A Normal Padronizada ou Normal (0, 1), ou

13
seja, mdia zero e varincia (ou desvio-padro) 1. Para verificar esse fato, vamos usar duas funes
estatsticas, para calcular a mdia e o desvio-padro de vetores. Vamos comear pelo vetor que a
gente conhece:

> x <- rnorm(100)


> mean(x)
[1] -0.1358806
> sd(x)
[1] 1.053232

Epa!!! A mdia aqui no nosso exemplo no exatamente 0. E o desvio-padro tambm no


exatamente 1. Ser que o default da funo no gerar a partir da Normal (0,1)?
No nada disso! O problema que o vetor que ns criamos gerado de maneira aleatria,
de modo que, em mdia, esses valores convergem assintoticamente para os valores estabelecidos
para os parmetros. Ficou difcil? o seguinte: se a gente aumentar o nmero de valores gerados,
esses valores devem ir se aproximando cada vez mais dos valores dos parmetros. Querem ver?

> x100 <- rnorm(100)


> mean(x100)
[1] -0.1111455
> sd(x100)
[1] 1.121295

> x1000 <- rnorm(1000)


> mean(x1000)
[1] -0.01045328
> sd(x1000)
[1] 1.024044

> x10000 <- rnorm(10000)


> mean(x10000)
[1] 0.005090138
> sd(x10000)
[1] 0.9953523

Ah, e se for fazer isso no R voc mesmo, no digite tudo de novo: use a tecla de setinha para
cima () que voc chama o ltimo comando e pode edit-lo a partir do teclado... Mas ateno, para
mover o curso na linha de comando voc deve usar as setinhas para direita e esquerda ( ou ).
Lembrando que voc pode naturalmente sempre copiar e colar o texto mas no se esquea de no
copiar o >.
;-)
Muito bem, voc acabou aprendendo a simular uma distribuio Normal com diferentes
parmetros e tambm a conferir a mdia e o desvio padro do vetor que voc gerou. Alm disso,
ganhou uma noo que a mdia e o desvio padro de vetores maiores sero em princpio mais
aproximados da mdia e desvio padro das distribuies que os geraram.
Que tal uma visualizao grfica das nossas distribuies? Voc j deve ter ouvido falar de
tipos de grficos comumente usados em estatstica, como o scatter plot (ou grfico de disperso), o
histograma, o boxplot (ou grfico de caixas) e ainda um que gostamos muito, o stem and leaves (ou
ramo e folhas). Por que a gente no aproveita ento para dar uma olhada nesses grficos usando os
vetores que foram criados? Vamos l. Primeiro vamos criar um vetor y com 100 valores de uma
Normal Padronizada:

y <- rnorm(100)

Agora vamos plotar o nosso vetor:

14
plot(y)

2
1
y

0
-1
-2

0 20 40 60 80 100

Index

Se voc digitou essa funo no prompt do R, notou que aconteceu algo diferente. A sada
dessa funo no foi listada na mesma janela, mas uma outra janela diferente foi aberta e um
grfico foi mostrado. Os chamados grficos de alto nvel so sempre plotados nessa janela. O
grfico deve ser mais ou menos como esse a em cima.
Alguns detalhes devem ser notados nessa figura. Primeiro, apesar da funo ser plot(), o
grfico mostrado um scatter plot. Esse o default de uma funo plot() para um vetor, onde o
eixo x o ndice, ou seja a posio do elemento dentro do vetor, e o eixo do y o valor dos
elementos do vetor. O segundo detalhe so os valores do nosso vetor. Observe que, em se tratando
de uma Normal Padronizada, cuja mdia zero, a maior parte dos pontos se encontra concentrada
em torno desse valor . Alm disso, note que a esmagadora maioria dos pontos se concentra entre os
valores 2 e 2. Voc seria capaz de dizer qual a percentagem aproximada de pontos que deve estar
entre esses valores?

Outro grfico muito usado o histograma. Vamos ver o jeito dele:

hist(y)

15
Histogram of y

15
105
0

-2 -1 0 1 2

Repare como o histograma lembra bastante a densidade de uma distribuio Normal. Este
grfico tem os valores do vetor y no eixo horizontal e as freqncias (absolutas nesse caso) dos
valores contidos nos intervalos pr-estabelecidos pelo programa no eixo vertical. Curioso para saber
variaes da funo hist()? Consulte a ajuda. Lembra como?

> ?hist
OU
> help(hist)

O boxplot tambm um grfico interessante principalmente para analisar a disperso dos


dados e tambm para detectar a presena de outliers. Para quem no sabe ou no se lembra, outliers
so pontos que caem em uma regio muito afastada do centro da distribuio (i.e. muito afastados
da mdia e da mediana). Vamos explicar melhor com a visualizao de um boxplot propriamente
dito:

boxplot(y)

16
2
1
0
-1
-2

A linha central do retngulo (que seria a nossa caixa) representa a mediana da


distribuio (sabe o que significa mediana? No? As bordas superior e inferior do retngulo
representam o percentis 25 e 75, respectivamente (tambm conhecidos como primeiro e terceiro
quarts, respectivamente). Logo, a altura deste retngulo chamada de distribuio interquartilar
(DI). Os traos horizontais ao final das linhas verticais so traados sobre o ltimo ponto (de um
lado ou de outro) que no considerado um outlier.
A essas alturas voc deve estar estranhando a falta de definio de outlier no mesmo? A
nossa primeira definio foi algo subjetiva, certo? isso mesmo! No h um consenso sobre a
definio de um outlier. Porm, no caso do boxplot em geral, existe uma definio formal. A maior
parte das definies considera que pontos acima do valor do 3 quartil somado a 1,5 vezes a DI ou
os pontos abaixo do valor do 1 quartil diminudo de 1,5 vezes a DI so considerados outliers. Esses
pontos so assinalados (no nosso exemplo, tivemos 2 outliers, um para cada lado). Vamos ver de
novo o boxplot, para ficar mais claro:

17
Outlier

ltimo ponto
superior

3 quartil
Limites para
outliers Mediana

1 quartil

ltimo ponto
inferior

Outlier

Para o nosso prximo grfico, que tal a gente tentar gerar outra distribuio tambm
bastante comum em bioestatstica, a binomial. Ao contrrio da Normal, essa uma distribuio
discreta, ou seja, ela est definida para determinados valores (enumerveis) num intervalo e no
para todos os valores (no enumerveis) em um determinado intervalo.
Assim como a Normal, a Binomial tambm possui dois parmetros. O primeiro, n
corresponde ao nmero de experimentos que sero realizados (tambm chamados de experimentos
ou processos de Bernoulli); o segundo, p a probabilidade de se obter um sucesso em cada um dos
experimentos. A probabilidade de serem observados k sucessos dada por:


P X = k= n p 1 p
k
k n k

No R, a funo para gerar nmeros binomiais chama-se rbinom(), por motivos j bvios.
Evidentemente, ns precisamos especificar os dois parmetros que mencionamos anteriormente:

y <- rbinom(100, size=200, p=0.05)

Geramos ento tambm 100 pontos de uma Binomial cuja probabilidade de sucesso de 5%
e o nmero de experimentos (observaes) de 200. Esses parmetros foram escolhidos
propositadamente para fazer um paralelo com uma situao que comum em epidemiologia: termos
cerca de 200 participantes em um estudo (correspondendo ao nosso size = 200) e com uma
prevalncia de uma determinada doena de 5% (correspondente a uma probabilidade de sucesso de
0.05 por indivduo). Dado este raciocnio, quantos participantes devem estar doentes, em mdia? A
resposta vem mais tarde...
Para construir o ramo e folhas utilizamos a funo stem():

18
> stem(y)

The decimal point is at the |

2 | 0
4 | 000000
6 | 0000000000
8 | 0000000000000000000
10 | 00000000000000000000000000
12 | 0000000000000000000000000
14 | 000000000
16 | 00
18 | 00

A idia do ramo e folhas separar um nmero (como 7,0) em duas partes. Neste caso, a
primeiro parte inteira (7) chamada de ramo e a segunda, a parte decimal (0) chamada de folha.
Alm de separar os nmeros em duas partes (inteira e decimal), o R agrupa os nmeros em classes
de tamanho 2. Por exemplo, o ramo 4 leva em conta os nmeros 4 e 5. No gostou dessa
disposio? No tem problema. Que tal dobrarmos a escala do grfico para o R considerar cada
nmero separadamente na sua prpria classe?

> stem(y, scale=2)


The decimal point is at the |
3 | 0
4 | 0000
5 | 00
6 | 00000
7 | 00000000
8 | 0000000000000000
9 | 000000000000
10 | 000000000000000000
11 | 0000000000
12 | 00000000
13 | 000000
14 | 0000
15 | 000
16 | 00
17 |
18 |
19 |
20 |
21 | 0

J percebeu que o argumento extra para dobrar a escala scale=2, n?


E por que a distribuio dos dados parece concentrada em torno de 10 (hum... nem tanto...)?
Bem, o que fizemos aqui foi gerar 100 amostras de 200 pessoas, contando o nmero de
pessoas com a doena em cada amostra. Se a prevalncia da doena 0.05 a gente espera que em
uma amostra de 200 pessoas, o nmero de pessoas com a doena seja igual a 10 = 200x0.05!! Mas
como o processo aleatrio, existe a situao onde apenas 3 pessoas so afetadas pela doena e
ainda situaes extremas de 21 pessoas (mais que o dobro do esperado).
Vamos fazer um exerccio interessante? O exerccio consiste em observar o comportamento
do nmero de pessoas afetadas por uma doena na medida em que aumentamos o valor da
prevalncia. Antes disso, vamos dividir o espao grfico em 6 partes atravs do comando:

par(mfrow=c(2,3))

19
Ih... O Que essa funo par()??? Como voc deve ter observado, uma janela de grficos
foi aberta. Pois , essa a funo para atribuir parmetros grficos. O argumento mfrow= estabelece
o nmero de grficos que sero visualizados em uma mesma janela grfica e em que disposio.
Quando escrevemos no comando c(2,3), ele implicitamente divide essa janela em 6 partes: 2
linhas e 3 colunas (de grficos, n?) e que voc vai visualizar quando plotarmos 6 grficos em
seqncia.
Escolhendo valores de prevalncia 0.02, 0.04, 0.06, 0.08, 0.1 e 0.5 podemos fazer:

hist(rbinom(100, size=200, p=0.02))


hist(rbinom(100, size=200, p=0.04))
hist(rbinom(100, size=200, p=0.06))
hist(rbinom(100, size=200, p=0.08))
hist(rbinom(100, size=200, p=0.1))
hist(rbinom(100, size=200, p=0.5))
par(mfrow=c(1,1))

Beleza? Podemos visualizar como se altera a distribuio do nmero de pessoas atingidas


pela doena na medida em que aumentamos o valor da prevalncia.

Matrizes
Bem, vamos passar para o prximo tipo de objeto que vamos aprender no R. So as
matrizes. Como voc deve saber, matrizes so objetos numricos, que possuem elementos com
coordenadas (que so simplesmente a linha e a coluna s quais o elemento pertence). Para construir
um objeto que seja uma matriz no R, precisamos usar uma funo... Adivinha o nome:

> x <- matrix(c(1,2,3,4,5,6,7,8,9,10,11,12), ncol=3)


> x
[,1] [,2] [,3]
[1,] 1 5 9
[2,] 2 6 10
[3,] 3 7 11
[4,] 4 8 12

Muito bem. Neste momento voc deve estar desesperado. Por que usamos uma funo que
tinha sido usada para criar um vetor dentro de uma outra funo do R?
isso mesmo. Na verdade criamos um vetor temporrio com o a funo c() como
tnhamos visto anteriormente e depois esse vetor foi transformado numa matriz com a funo
matrix(). Quer ver? Vamos fazer por partes. Primeiro, crie o vetor y:

> y <- c(1,2,3,4,5,6,7,8,9,10,11,12)


> y
[1] 1 2 3 4 5 6 7 8 9 10 11 12

Lembre-se que esse vetor poderia ter sido gerado com a nossa seqncia:

> y <- 1:12


> y
[1] 1 2 3 4 5 6 7 8 9 10 11 12

Agora, aplique a funo matrix() ao vetor y:

> x <- matrix(y, ncol=3)


> x
[,1] [,2] [,3]

20
[1,] 1 5 9
[2,] 2 6 10
[3,] 3 7 11
[4,] 4 8 12

A prxima dvida quanto ao argumento ncol. Ele representa o nmero de colunas da


nossa gloriosa matriz. Como se trata de um vetor, o R no pode adivinhar qual a dimenso (nmero
de linhas e nmero de colunas desejada da matriz. Quer ver?

> x <- matrix(y)


> x
[,1]
[1,] 1
[2,] 2
[3,] 3
[4,] 4
[5,] 5
[6,] 6
[7,] 7
[8,] 8
[9,] 9
[10,] 10
[11,] 11
[12,] 12

A essa altura voc j deve ter notado que o default do R transformar o vetor em uma
matriz com apenas uma coluna. Um outro detalhe importante a ser comentado a ordem na qual ele
entra com os elementos na matriz. Observe que o preenchimento da mesma feito pelas colunas.
Vamos ver de novo a nossa matriz:

> x <- matrix(y, ncol=3)


> x
[,1] [,2] [,3]
[1,] 1 5 9
[2,] 2 6 10
[3,] 3 7 11
[4,] 4 8 12

Viu? O programa preencheu a coluna 1 com os nmeros 1 a 4, a segunda com os nmeros


de 5 a 8 e a terceira com os demais. Mais tarde vamos aprender a mudar este comportamento. Mas
se voc for curioso, use a ajuda.... e boa sorte!
Agora voc deve estar se perguntando como possvel visualizar um elemento (ou um
grupo de elementos) contido numa matriz. A lgica a mesma que com vetores, sendo que no caso
das matrizes, os elementos possuem 2 coordenadas: uma para a linha e outra para a coluna, usando
ainda os nossos colchetes lembra?. Quer ver um exemplo? Vamos visualizar o elemento da
segunda linha, terceira coluna de x:

> x[2,3]
[1] 10

Como voc j deve estar pensando, possvel selecionar, como nos vetores, um intervalo de
valores. Digamos que voc queira visualizar os 3 primeiros elementos da primeira coluna. Para isso
faamos:

> x[1:3,1]
[1] 1 2 3

21
No caso das matrizes possvel selecionar uma linha (ou coluna) inteira, sem se preocupar
em saber o nmero de colunas (ou linhas) da matriz. No entendeu nada, n? Nem eu! Vamos tentar
um exemplo: vamos selecionar as duas primeiras linhas da matriz, selecionando todas as colunas
dessas linhas:

x[1:2,]
[,1] [,2] [,3]
[1,] 1 5 9
[2,] 2 6 10

Repare que o espao depois da vrgula, que seria destinado s coordenadas das colunas,
ficou em branco, indicando que TODAS as colunas deveriam ser selecionadas. Pode-se fazer um
raciocnio semelhante para o caso de selecionar colunas inteiras, ou seja, com todas as linhas. Tente
voc mesmo!

Data Frames
O ltimo tipo de objeto do R que vamos abordar neste material ( isso mesmo, tem mais...)
so os chamados data frames. Esses objetos so equivalentes a um banco de dados que voc
provavelmente j viu em outros formatos (e.g. dbf), ou seja, trata-se de uma tabela de dados onde
as colunas so as variveis e as linhas so os registros.
Vamos ver um exemplo agora com um banco de dados que vem acompanhando o R (vrios
bancos de dados esto disponveis para trabalhar exemplos no R). Para tal, teremos primeiro que
invocar esse banco e depois salv-lo num outro objeto para evitar acidentes
;-)

data(iris)
dados <- iris

Acho que no tem muito mistrio. Ns usamos a funo data () para chamar um banco de
dados chamado iris e depois colocamos o contedo desse banco em um objeto chamado dados.
Alis, essa mesma funo serve para visualizar todos os bancos disponveis como exemplo
no R. Tente:

data()

E veja o que acontece!

Vamos agora dar uma olhadinha em alguns registros do nosso novo objeto; na verdade,
vamos olhar apenas os primeiros 10 registros:

> dados[1:10, 1:5]


Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
7 4.6 3.4 1.4 0.3 setosa
8 5.0 3.4 1.5 0.2 setosa
9 4.4 2.9 1.4 0.2 setosa
10 4.9 3.1 1.5 0.1 setosa

22
Repare que no h nada de novo: continuamos usando os colchetes para selecionar os
registros. Mas voc deve estar se perguntando por que usamos esse [1:10, 1:5]. Se com as
matrizes d para selecionar uma linha inteira, porque no poderia com o data frame que nada mais
do que uma matriz com caractersticas especiais. Acertou: A mesma lgica funciona aqui. Vamos
tentar:

> dados[1:10,]
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
7 4.6 3.4 1.4 0.3 setosa
8 5.0 3.4 1.5 0.2 setosa
9 4.4 2.9 1.4 0.2 setosa
10 4.9 3.1 1.5 0.1 setosa

Que tal iniciarmos uma pequena explorao desse banco de dados? Vamos comear uma
descrio dos dados, conhecendo o nome das variveis que esto contidas neste banco ( claro que
voc j sabe esses nomes, n?)

> names(iris)
[1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" "Species"

A descrio dessas variveis so:

Sepal.Length Tamanho da spala


Sepal.Width Largura da spala
Petal.Length Tamanho da ptala
Petal.Width Largura da ptala
Species Espcie observada

E se quisermos listar uma das variveis apenas?


Voc naturalmente respondeu que podemos selecionar uma das colunas inteiras do banco
usando aquele nosso velho conhecido. Vamos selecionar a varivel Species, que corresponde
terceira coluna:

dados[,5]

Vamos omitir a sada aqui para poupar espao... Mas ser que existe uma outra maneira de
selecionar uma varivel em um banco de dados no R? Uma maneira mais convencional, por
exemplo, seria chamar o nome da varivel e no tendo que saber especificamente a coluna
correspondente.
Tente:

dados$Species

Viu? O smbolo $ serve para indicar o nome de uma varivel em um data frame.
Digamos agora que voc queira listar todos os registros de flores que tm um tamanho de
ptala acima de 6 cm. Nesse caso, estaremos selecionando todas as colunas do banco e somente as
linhas que satisfizerem essa condio. Vamos ver como seria, usando os nossos colchetes:

23
> dados[dados$Petal.Length>6,]
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
106 7.6 3.0 6.6 2.1 virginica
108 7.3 2.9 6.3 1.8 virginica
110 7.2 3.6 6.1 2.5 virginica
118 7.7 3.8 6.7 2.2 virginica
119 7.7 2.6 6.9 2.3 virginica
123 7.7 2.8 6.7 2.0 virginica
131 7.4 2.8 6.1 1.9 virginica
132 7.9 3.8 6.4 2.0 virginica
136 7.7 3.0 6.1 2.3 virginica

Entendeu o que foi feito? Selecionamos (com os colchetes), do banco dados as linhas
(primeiro ndice dentro dos colchetes, antes da vrgula) onde a varivel Petal.Length > 6, e
todas as colunas (o espao em branco aps a vrgula dentro dos colchetes segundo ndice).
Para terminar, vamos fazer uma brincadeira com o nosso banco de dados. Ele no possui
nenhum valor faltante (missing value). No R, o smbolo para missing NA de not available em
ingls. Bem, vamos aproveitar o nosso exerccio de seleo para ver como podemos tambm
substituir valores selecionados por outro. Digamos que houve um engano e que todos os valores
maiores que 6 cm para o tamanho da ptala no so confiveis e devem ser considerados como
faltantes (esse um exemplo pssimo na verdade normalmente ns substitumos valores que
outros sistemas consideram missing por NA, como -99 ou espao em branco.) Neste caso a
sintaxe ser um pouco diferente:

dados$Petal.Length[dados$Petal.Length>6] <- NA

Explicando devagar: estamos substituindo (com o smbolo <-) os valores da varivel


Petal.Length (o primeiro dados$Petal.Length), que so maiores que 6
(dados$Petal.Length>6) por NA. Quer ver se funciona? Tente:

dados$Petal.Length

Repare que a sada mesmo um vetor com os valores da varivel Petal.Length.

Explorando um Data Frame


Vamos agora comparar os tamanhos de ptalas de acordo com 3 grupos: os das espcies
setosa, versicolor e virgnica. Para isso, lanaremos mo de uma funo especial:

by(data=dados$Petal.Length, INDICES=dados$Species, FUN=summary)

Essa funo especial porque ela aplica uma outra funo (no caso a funo summary()
argumento FUN) a uma varivel (argumento data=) estratificado por uma outra varivel (argumento
INDICES). Pegou? Repare qual a sada da funo summary(): ela calcula a mdia, mediana
mnimo, mximo, primeiro e terceiro quarts, alm de reportar o nmero de missings.
Voc deve ter notado que muito trabalhoso digitar o nome do data frame toda vez que a
gente quiser trabalhar com uma de suas variveis. Para contornar esse problema existe uma funo
no R que permite acessar as variveis diretamente. Vejamos

attach(dados)

Para testar vamos repetir a funo by() omitindo o nome do data frame e tambm o $.

by(Petal.Length, Species, summary)

24
Viu como somos preguiosos? Nem o nome dos argumentos foram usados neste caso.
Lembre-se que a omisso dos nomes dos argumentos pode causar uma enorme confuso caso voc
esquea a ordem correta (lembra do caso do log?).
Vamos visualizar os dados com um grfico que a gente j tinha visto anteriormente, que o
boxplot() com alguns argumentos avanados. Para isso escrevamos:

> boxplot(Petal.Length ~ Species)

Entendeu o que foi feito? O smbolo ~ (til) na funo boxplot() funciona como a funo
by() que vimos anteriormente, ou seja, visualizamos o peso estratificado pela varivel Species
Voc pode adicionar alguns nomes aos grficos para que ele fique mais apresentvel

> boxplot(Petal.Length ~ Species, xlab="Espcie", ylab="Tamanho da


Ptala", main="Tamanho da ptala por especie")

Tamanho da ptala por especie


7
6
5
4
3
2
1

setosa versicolor virginica

Espcie

As espcies parecem ter tamanhos de ptalas bastante diferentes. Suas medianas e


distribuies interquartilares so bem diferentes. Para ter uma idia se essas distribuies so
aproximadamente normais podemos usar histogramas. Vamos tentar

25
par(mfrow=c(1,3))
hist(Petal.Length[Species=="setosa"])
hist(Petal.Length[Species=="versicolor"])
hist(Petal.Length[Species=="virginica"])
par(mfrow=c(1,1))

Epa! Parece que o nosso tratamento para missing values esculhambou o grupo das
virgnicas (que so justamente as que tm um tamanho de ptala maior.)
;-)
Vamos reiniciar o nosso objeto dados e ver o que acontece. Faa assim:

detach(dados)
dados<-iris
attach(dados)
par(mfrow=c(1,3))
hist(Petal.Length[Species=="setosa"])
hist(Petal.Length[Species=="versicolor"])
hist(Petal.Length[Species=="virginica"])
par(mfrow=c(1,1))

Melhor assim, n? Repare que as distribuies no parecem ser l muito aproximadamente


normais para o tamanho da ptala, exceto para as setosas.
Um detalhe que no deve ter passado despercebido o uso do operador == em vez de um
sinal de igual somente para indicar igualdade. No se desespere ainda: no R sempre que quisermos
fazer uma comparao, seja numrica, seja com caracter, devemos usar os dois sinais de igual. Ah,
e note tambm que virginica est entre aspas isso mesmo, quando comparamos com um
caracter, o que est sendo comparado deve estar entre aspas.
Para finalizar esse mdulo bsico, vamos aplicar um teste estatstico para inferir se o
tamanho das ptalas so significativamente diferentes entre as espcies. Como no estou muito
convencido da normalidade das distribuies, vamos usar um teste no-paramtrico (tambm
chamado de livre de distribuio.) Esse tipo de teste no assume qualquer distribuio a priori e a
rigor um teste para saber se as medianas so diferentes. No caso de mais de dois grupos, devemos
lanar mo de um teste bastante popular, chamado teste de Kruska-Wallis:

> kruskal.test(Petal.Length, Species)

Kruskal-Wallis rank sum test

data: Petal.Length and Species


Kruskal-Wallis chi-squared = 130.411, df = 2, p-value = < 2.2e-16

Como esperado aps a inspeo do grfico boxplot, de fato existe uma diferena
significativa do nvel de variao dos tamanhos de ptalas estratificados pela espcie de flor.
Muito bem. Esse foi o nosso mdulo bsico para dar uma noo geral e bastante superficial
do R. Para quem estiver interessado em um estudo mais aprofundado do programa, futuramente
disponibilizaremos mdulos mais especficos para aprofundar os vrios aspectos do R

26
Mdulo Entrada e Sada de Dados
Autor: Geraldo Marcelo da Cunha e Antonio Guilherme Fonseca Pacheco

Pr-requisitos: Saber como funcionam e como usar funes e pacotes no R. Saber selecionar
elementos, linhas e colunas em dataframes.
ATENO: Este mdulo tambm exige a obteno de bancos de dados externos, que devem estar
disponveis junto com o meio de distribuio deste documento (ou seja, se foi em um CD-ROM,
ento deve estar em algum diretrio desta mdia; se foi via internet deve estar disponvel para
download em algum lugar especificado)

Pacotes e arquivos necessrios: Pacote foreign; arquivos oswego.rec, iris.sav.

Sada de Dados
Vamos iniciar a nossa discusso pela sada de dados. Apesar de parecer estranho estudarmos
como o R exporta dados, em vez de como ele os importa, ser mais fcil primeiro exportar para
depois ento reimportamos alguns formatos.
Como mencionado, o pacote foreign deve ser instalado na sua mquina. Se este pacote no
estiver instalado, instale-o a partir do prprio R. Para instrues sobre como fazer isso, consulte o
mdulo Baixando e Instalando o R. Esse pacote, como sugere o nome, contm vrias funes tanto
para importar como para exportar alguns formatos de bancos de dados entre o R e diversos
programas.
Uma vez instalado o pacote, voc precisa carreg-lo. Faa assim:

library(foreign)

Aproveite para dar uma olhada nas funes contidas nesse pacote. Use a ajuda em HTML
para facilitar a sua vida. Se voc for curioso bastante para explorar o pacote foreign, notar que
ele s possui na verdade uma funo para exportar diretamente dados para um formato especfico,
que o Stata, e que a maioria absoluta das funes so para importar dados.
Mas o R capaz de exportar tambm para o formato ASCII, que pode ser considerado como
um formato universal, ou seja, qualquer programa capaz de ler um arquivo nesse formato. Nessa
seo, vamos ver uma funo que faz essa tarefa, usando diferentes argumentos para a exportao,
convenientes para o programa que vai ler os dados. No estranhe, mas a funo utilizada para este
fim write.table() faz parte do pacote base, que instalada junto com a instalao bsica do
R.
O caso mais geral exportar dados num formato ASCII delimitado por espao ou tabulao.
Vamos comear com a separao por tabulao. Este formato pode ser lido por diversos programas,
como Excel, SPSS, SAS, dentre outros.
Se voc j fez o mdulo bsico, deve se lembrar do banco de dados iris com algumas
medidas de ptalas e spalas de algumas espcies de flores. Bem, vamos invocar esse mesmo banco
e trabalhar com ele:

data(iris)
dados <- iris

Vamos usar a funo write.table():

write.table(dados, file="iris.dat", sep="\t", row.names=F, quote = FALSE)

1
Os 3 primeiros argumentos da funo write.table() no devem suscitar dvidas: o
primeiro o nome do objeto a ser exportado, o segundo, o nome do arquivo onde o dado ser
armazenado e o terceiro o tipo de delimitador a ser usado, que neste caso esse "\t" que significa
tabulaes. O argumento row.names=F serve para indicar que as linhas desse objeto no tm nome
e ainda previne o R de colocar nmeros como nomes (por default o R vai fazer uma numerao
crescente, como se fosse o nmero do registro, se esse argumento for T). O argumento quote =
FALSE serve para indicar ao R que variveis tipo caracter devem ser exportadas sem estar entre
aspas (porque se estiverem o SPSS por exemplo no vai levar isso em conta e vai importar as aspas
junto).
O arquivo gerado iris.dat pode ser facilmente importado para diversos programas. A
tcnica de importao para outros programas no faz parte do escopo desse mdulo e dever ser
dominado por pessoas que trabalham com os respectivos programas de uma forma regular.
Uma dvida natural do leitor nesse momento seria: legal exportei os dados para um arquivo,
mas onde est este arquivo??? Boa pergunta! Por default, o R salva o arquivo no mesmo diretrio
de onde voc est trabalhando, ou seja no mesmo diretrio onde est o seu arquivo .Rdata. Se
voc quiser saber que diretrio esse, faa assim:

getwd()

Se voc utilizou esse cdigo, notou uma coisa estranha: o diretrio veio com duas barras
invertidas, em vez de uma s como usual, se voc tem alguma experincia com caminhos de
diretrios do DOS, algo assim:

"C:\\Documents and Settings\\Owner\\My Documents\\ENSP\\Curso R"

assim mesmo: no R ns temos que escrever os caminhos de diretrios com duas barras
invertidas. Opcionalmente, podemo usar uma barra para frente, como veremos num exemplo
adiante.
O outro formato que vamos ver nessa seo o separado por vrguas, ou .csv, um formato
que lido diretamente pelo Excel. A idia fundamentalmente a mesma, s diferindo o
delimitador:

> write.table(dados, file="iris.csv", row.names=F, sep=",", quote=F)

O arquivo "iris.csv" pode ser aberto diretamente no Excel, simplesmente dando um duplo
clique sobre o arquivo. Onde foi salvo este arquivo? No mesmo lugar que o anterior.
Mas e se voc quiser salvar em um diretrio especfico? Bom, nesse caso, o argumento
deve conter o caminho completo do diretrio, seguido do nome do arquivo. Por exemplo, digamos
que eu queira salvar esse arquivo no diretrio temp que est na raiz do drive C da minha
mquina. O cdigo seria:

write.table(dados, file="c:/temp/iris.csv", row.names=F, sep=",", quote=F)

Observe que aqui utilizamos a barra para frente em vez das duas barras invertidas. O cdigo
abaixo teria o mesmo efeito:

write.table(dados, file="c:\\temp\\iris.csv", row.names=F, sep=",",


quote=F)

Entrada de Dados
O R capaz de ler arquivos de dados salvos em diversos formatos diferentes, como ASCII
(arquivo texto, delimitado por espao, tabulao, vrgula, ponto-e-vrgula, entre outros), Excel,

2
SPSS, EpiInfo, etc. No caso do Excel, como veremos adiante, o processo de importao no
direto, tendo que se salvar inicialmente em um formato .csv.
A funo mais simples que l dados externos no R faz parte do pacote bsico e se chama
read.table() e tambm pertence ao pacote base. Essa funo vai importar dados em formato
ASCII para um objeto do tipo dataframe. Vamos ver um exemplo, usando a base de dados que ns
acabamos de exportar (note que o arquivo iris.dat deve estar presente no seu diretrio de
trabalho):

dados1 <- read.table(file="iris.dat", header=T, sep="\t")

Vamos ver por partes o que ns fizemos: criamos um objeto dados1, para no mexer no
objeto dados que ns criamos na seo anterior, atravs do assignment <- pela funo
read.table(), que tem um argumento obrigatrio (file) e dois argumentos opcionais (header=T
e sep=\t).
Bom, file simplesmente o nome do arquivo externo onde os dados esto armazenados,
com a extenso inclusive e entre aspas. O argumento header=T para indicar para o R que a
primeira linha contm o nome das variveis nesse banco. O ltimo argumento que usamos,
sep=\t usado para indicar que a delimitao dos dados nesse caso feita por tabulao. Uma
importante observao que se o separador fosse espao e no tabulao, a funo leria os dados da
mesma forma, apenas mudando-se para sep="\t". Que tal dar uma olhadinha na ajuda dessa
funo? Boa sorte...
Bom, a primeira providncia aps importar os dados dar uma olhadinha neles para ver se
tudo funcionou a contento. Se a gente quisesse ver esse banco inteiro, bastaria digitar o nome do
objeto dados (como voc deve se lembrar que acontece com qualquer objeto). Como esse banco
tem 150 registros e 5 variveis, que tal a gente ver somente os 10 primeiros registros? Vamos
tentar:

> dados1[1:10,]
slength swidth plength pwidth species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
7 4.6 3.4 1.4 0.3 setosa
8 5.0 3.4 1.5 0.2 setosa
9 4.4 2.9 1.4 0.2 setosa
10 4.9 3.1 1.5 0.1 setosa

Antes de passarmos para o prximo assunto, um detalhe que incomoda um pouco no R a


impossibilidade de (por enquanto, pelo menos) nomear variveis usando o caracter underscore (_).
Isso acontece, porque esse caracter, para o R, corresponde ao caracter de assignment. Embora isso
esteja mudando no R (e ao que parece isso ser abolido no futuro), ele ainda entende _ como um
assignment (muito embora na atual verso voc receba uma advertncia quando usa). Vamos ver
como funciona:

> x _ c(1,2,3)
Warning message:
The use of _ is deprecated: you will be warned only once per session
> x
[1] 1 2 3

Muito embora o meu objeto x tenha recebido o vetor (1,2,3), o programa adverte que o uso
do _ no recomendado...

3
Agora vamos passar para o caso de um arquivo em Excel, que voc gostaria que fosse lido
pelo R. Como foi mencionado anteriormente, o R no capaz de ler um arquivo em formato .xls
diretamente; preciso salvar o arquivo antes em um formato ASCII. Vamos ver como funciona?
No faz parte do escopo deste material ensinar como salvar um arquivo do Excel no formato
separado por vrgulas (ou CSV, comma-separated values em ingls), que ser facilmente lido pelo
R.
Bem, mas como somos muito bonzinhos, vamos descrever rapidamente como funciona: uma
vez que voc tenha aberto o arquivo que deseja salvar no Excel, pressione a tecla F12 no teclado,
o que abrir o menu Salvar Como. Na parte inferior do menu na opo salvar arquivo do tipo,
selecione CSV: simples assim mesmo.
Porm, meus amigos, nem tudo so flores... Existe um detalhe muito importante que os
usurios do Excel devem saber: se o seu Excel for em portugus, provavelmente o delimitador ser
um ponto-e-vrgula e no uma vrgula, como deveria ser; se for em ingls, o delimitador ser o
certo, ou seja, com vrgula mesmo. Isso vai fazer diferena porque preciso especificar o tipo de
separador se voc usar a funo read.table().
Bem, mas ns j temos um arquivo salvo no formato CSV que o iris.csv, que um
arquivo ASCII delimitado por vrgulas, lembra?

dados2 <- read.table(file="iris.csv", header=T, sep=",")

Acontece que o formato CSV to comum, que existem duas funes para ler esses
arquivos diretamente; uma para aqueles separados por vrgulas e outro para aqueles separados por
ponto-e-vrgula. Confira o usado para vrgula:

dados3 <- read.csv("iris.csv")

A funo basicamente a mesma, apenas com o default j trocado para o formato CSV. A
outra funo read.csv2(). Consulte a ajuda sobre esta funo para outras surpresas...
Vamos agora passar para os casos onde a leitura pode ser feita diretamente de um formato
que no seja ASCII. Nesta situao necessrio carregar um pacote especfico para importao e
exportao de dados chamado foreign. Se voc ainda no o fez, agora a hora. Para isto digite:

library(foreign)

Vamos comear importando dados armazenados em formato .sav, que a extenso de


banco de dados do SPSS. Aqui tambm a primeira vez que voc vai precisar de um arquivo
externo. Nesse caso o iris.sav. Ns fizemos o seguinte: pegamos aquele arquivo que voc
exportou iris.dat, importamos para o SPSS e fizemos algumas modificaes nele para mostrarmos
algumas outras caractersticas da funo que vamos usar. Vamos ler ento esse arquivo no R e
vamos admitir nesse caso que o arquivo iris.sav foi salvo por voc no seu diretrio de trabalho:

dados4 <- read.spss(file= "iris.sav", use.value.label=F, to.data.frame=T)

Vamos dar uma olhadinha nos primeiros 10 registros do nosso objeto:

> dados4[1:10,]
SEPAL.LE SEPAL.WI PETAL.LE PETAL.WI SPECIES
1 5.1 3.5 1.4 0.2 1
2 4.9 3.0 1.4 0.2 1
3 4.7 3.2 1.3 0.2 1
4 4.6 3.1 1.5 0.2 1
5 5.0 3.6 1.4 0.2 1
6 5.4 3.9 1.7 0.4 1
7 4.6 3.4 1.4 0.3 1
8 5.0 3.4 1.5 0.2 1

4
9 4.4 2.9 1.4 0.2 1
10 4.9 3.1 1.5 0.1 1

Vamos fazer algumas observaes. Primeiro, o nome das variveis est diferente do que
eram anteriormente: no s esto todos em maisculas, como parecem ter sido truncados para 8
espaos apenas. Bem, o SPSS no aceita nomes longos (com mais de 8 espaos) e trunca o nome
mesmo. Alm disso ele tambm converteu tudo para maisculo.
A outra diferena que a varivel SPECIES agora numrica e no mais contm o nome das
espcies. Essa foi a modificao que fizemos de propsito: convertemos os nomes para nmeros:
setosa para 1, versicolor para 2 e virgnica para 3. Depois colocamos os nomes como labels no
SPSS (usurios deste programa sabem o que isso significa espero...)
Vamos agora estudar os argumentos usados na funo read.spss(): o primeiro no h
dvida e o nome do arquivo; o segundo diz para o R no usar os labels das variveis que
eventualmente existam no SPSS ao importar as variveis por isso que neste caso os nmeros
foram importados para a varivel SPECIES e no os nomes das espcies. Por ltimo, o argumento
to.data.frame=T, indica para o R que o formato a ser lido um data frame, visto que o default
importar para uma lista. Para importar os nomes das espcies, faa:

> dados4 <- read.spss(file= "iris.sav", use.value.label=T,


to.data.frame=T)
> dados4[1:10,]
SEPAL.LE SEPAL.WI PETAL.LE PETAL.WI SPECIES
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
7 4.6 3.4 1.4 0.3 setosa
8 5.0 3.4 1.5 0.2 setosa
9 4.4 2.9 1.4 0.2 setosa
10 4.9 3.1 1.5 0.1 setosa

Quer saber mais detalhes sobre esta funo? Consulte a ajuda...

Vamos agora ver um outro formato que bastante usado em sade pblica, que o .rec,
extenso usada por bancos armazenados pelo EpiInfo. Se voc j usou o EpiInfo, deve conhecer o
famosssimo arquivo oswego.rec, usado em muitos exerccios em epidemiologia. Para maiores
informaes sobre o arquivo, consulte o manual do EpiInfo, mas consiste de dados sobre uma
intoxicao alimentar ocorrida em Oswego, NY em 1972 aps um almoo beneficente em uma
igreja. Nesse caso, podemos acessar o arquivo diretamente do diretrio do prprio EpiInfo:

oswego <- read.epiinfo("c:\\epi6\\oswego.rec")

Se voc no tiver o EpiInfo instalado, copie o arquivo oswego.rec para o diretrio de


trabalho e faa:

oswego <- read.epiinfo("oswego.rec")

Se voc tem familiaridade com o EpiInfo, deve se lembrar que antigamente as datas eram
armazenadas com os anos em 2 dgitos. No caso desse arquivo, na verdade, o ano foi omitido, j
que tudo se passou em apenas dois dias. O problema que nesses formatos, o R no vai entender
esse campo como data, mas como texto. Vamos tentar o seguinte:

oswego$ONSETDATE

5
Note que a sada so as datas entre aspas, caracterizando uma varivel tipo caracter.
Duvida? Ento faa:

is.character(oswego$ONSETDATE)

A resposta foi TRUE, como esperado. Para contornar esse problema, temos que lanar mo
de alguns argumentos extras. Vamos tentar o seguinte:

oswego1 <- read.epiinfo("c:\\epi6\\oswego.rec", guess.broken.dates=TRUE,


thisyear="1972")

Bem, voc deve ter entendido os dois argumetos extras: o primeiro pede para o R tentar
acertar o ano da data que tenha um ano com 2 dgitos ou que no tenha ano algum (o nosso caso
aqui). O segundo para o R colocar um ano quando ele no estiver especificado. Como ns
sabemos que esse surto ocorreu em 1972, esse foi o nosso argumento. Veja que agora temos datas
de fato:

oswego1[1:10,1:5]

Alm desses formatos, o pacote foreign tambm possui funes para ler arquivos em
outros formatos como S-Plus, SAS, Minitab e Stata. Fique vontade para explorar essas funes se
for do seu interesse...

Sada de Resultados
Uma outra necessidade a sada de resultados de funes usadas no R. Essas sadas so
basicamente de dois tipos: Ou um grfico ou uma sada de texto, que pode conter uma tabela ou
resultados na forma de texto livre mesmo. Se voc j tem alguma familiaridade com o R, deve saber
que sua parte grfica bastante superior sua parte de sada tipo tabela. Na verdade essas sadas s
podem ser coladas como texto e no tm a mesma facilidade de manuseio como as tabelas
avanadas do SPSS por exemplo (usurios do SPSS devem se lembrar que as sadas de uma
regresso logstica no tm essas facilidades tambm.)
Vamos ento usar o mesmo exemplo visto no final do mdulo bsico com o nosso banco
iris para mostrar como copiar e colar a sada de uma funo e tambm um grfico do R em um
outro programa, como um editor de texto avanado (tipo Word ou Write) ou at mesmo para uma
planilha eletrnica qualquer (como Excel, Lotus ou Calc.)
Primeiramente vamos reiniciar o objeto dados dados, evitando acidentes:

detach(dados)
data(iris)
dados <- iris
attach(dados)

Recordando os nomes das variveis desse banco:

> names(dados)
[1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" "Species"

Voc deve estar se lembrando da funo utilizada no mdulo bsico chamada by(). Bem, se
voc no fez o mdulo bsico porque j sabe um pouco de R, ento consulte a ajuda... Vamos
comparar os tamanhos de ptalas das flores por espcie:

by(data=Petal.Length, INDICES=Species, FUN=summary)

6
Temos aqui uma sada do tipo texto.
O primeiro passo para copiar e colar a sada dessa funo selecionar no R a sada ou parte
da sada que seja de interesse. Para isso apertamos o boto esquerdo do mouse e o arrastamos sobre
o texto. O tom azul sobre a tela indica a parte que est sendo selecionada.
O prximo passo copiar a parte do texto selecionada no R. Isso pode ser feito selecionando
no menu Edit a opo Copy, ou simplesmente apertando sucessivamente a tecla Ctrl e a tecla
c. Outra possibilidade ainda aps selecionar o texto no R clicar com o boto direito do mouse e
escolher Copy:

Agora, s colar o contedo no Word ou programa equivalente. Em qualquer editor de texto


no Windows, a forma de se fazer isso a mesma utilizada acima no processo de copiar os dados do
R bastando trocar a opo Copy pela opo Colar (ou Paste). Para obter uma formatao no
Word igual ao que aparece no R troque a fonte do texto colado para courier new.
Uma outra necessidade de exportao de dados pode ser quando se deseja exportar uma
tabulao qualquer (for exemplo uma tabela de freqncias, com uma ou mais variveis) para um
programa de planilha eletrnica. Bem, ns podemo usar neste caso a nossa j conhecida funo
write.table(), pois ela funciona tambm com outros tipos de objetos fora bancos de dados.
Para dar um exemplo, vamos dizer que desejamos fazer uma tabulao das espcies segundo
o critrio delas terem ptalas maiores ou menores do que a mediana do grupo inteiro. Inicialmente,
vamos descobrir essa mediana:

> median(Petal.Length)
[1] 4.35

7
Muito bem, vamos ento criar um vetor para agrupar as espcies segundo essa mediana (no
se preocupe em entender a sintaxe por enquanto):

> g.petala <- ifelse(Petal.Length<4.35,"<4.35",">=4.35")


> table(Species, g.petala)
g.petala
Species <4.35 >=4.35
setosa 50 0
versicolor 25 25
virginica 0 50

No primeiro comando, criamos o objeto g.petala que contm os agrupamentos, depois


fizemos uma tabela para comparar as espcies com os grupos. Podemos guardar essa tabela em um
objeto se quisermos. Faa assim:

g.petala <- ifelse(Petal.Length<4.35,"<4.35",">=4.35")


output <- table(Species, g.petala)

Confira o contedo do objeto output. Dever ser a mesma tabela acima. Agora podemos
usar a nossa velha amiga;

write.table(output, file="petalas.csv", row.names=F, sep=",", quote=F)

A nica diferena que o formato da tabela exportada um pouco diferente (ser uma
tabela de freqncias por grupos em vez de uma tabela 3x2). Veja um exemplo aps a importao
para o Calc:

No caso da sada de uma funo ser um grfico, o procedimento de copiar e colar outro.
Vamos fazer boxplots para comparar os tamanhos das ptalas por espcie.

8
> boxplot(Sepal.Length ~ Species, xlab="Espcie", ylab="Tamanho da
Ptala", main="Boxplots do Tamanho da Ptala por Espcie")

Um arquivo grfico pode ser copiado pelo R atravs de de dois formatos: Bitmap ou
metafile. Esses formatos se diferem entre si por vantagens e desvantagens que cada um possui.
Uma dentre outras vantagens do formato metafile o fato dele gerar arquivos de tamanho menor.
Para copiar um arquivo no formato metafile, primeiro se certifique que a janela grfica
est selecionada (para tanto, apenas clique em qualquer rea dentro da janela), e ento escolha no
menu File dentro de Copy to the Clipboard a opo as Metafile:

Depois s colar no seu editor de texto preferido, ou at mesmo na sua planilha. Colando
no formato metafile podemos editar a figura atravs de um duplo clique sobre a figura permitindo
alterar o ttulo do grfico, valores que aparecem nos eixos, etc, se voc tiver um programa que
permita editar metafiles

9
Mdulo Estatstica I no R
Autor: Antonio Guilherme Fonseca Pacheco

Pr-requisitos: Conhecimento prvio do ambiente R. Especificamente, o leitor deve estar


familiarizado com os mdulos Bsico, Entrada e Sada de Dados e tambm Manuseando
dados no R.

Bibliotecas necessrias: ISwR

Este um mdulo especial da srie de mdulos destinados ao aprendizado do ambiente R. A


abrangncia deste mdulo o contedo a ser dado em um curso bsico de Bioestatstica para alunos
de ps-graduao, ministrado em qualquer instituio de ensino superior.
O objetivo desse mdulo no tornar o leitor um especialista em R, nem sequer um
utilizador freqente do programa, mas sim usar o R como uma ferramenta de ensino da
Bioestatstica. Alunos que j conhecem o R podem usar esse mdulo sem recorrer a nenhum outro
mdulo bsico sobre o R, mas para aqueles que nunca trabalharam com ele, fundamental a leitura
dos 3 mdulos bsicos contidos no material Aprendendo R e tambm a leitura prvia do mdulo
Manuseando um Banco de Dados no R
Este mdulo baseado no livro Introductory Statistics with R, escrito pelo professor Peter
Dalgaard, que um dos membros do core de desenvolvimento do R. A adoo deste livro como
referncia leva em conta o fato dele ter quase todos os seus exemplos em bioestatstica (que a rea
pela qual eu me interesso) e de ter disponvel no prprio CRAN uma biblioteca com todos os
bancos de dados necessrios, chamada ISwR.

Os tpicos abordados nesse instrutivo acompanham aqueles que sero abordados nas aulas
tericas do curso de Estatstica I, a saber:

Probabilidade e distribuies
Estatstica descritiva
Distribuies amostrais
Teste de Hipteses, poder e tamanho da amostra
Testes para uma e duas amostras (contnuos)
Propores
ANOVA
Regresso e correlao

A programao de um curso como este para ser dado em 8 aulas, cada uma abordando um
destes temas citados, fora as aulas para o aprendizado do R. Sendo assim, vamos dividir esses
tpicos em aulas no necessariamente do mesmo tamanho,como vocs podero perceber no
calendrio do curso. Cada aula ter o tempo de 3 a 4 horas e meia, dependendo dos contedos a
serem estudados. Esse o tempo mdio para que o aluno possa ler e treinar cada uma dessas aulas.
Claro que isso uma mdia mesmo, e algumas pessoas necessitaro de mais dedicao para
acompanhar o ritmo das aulas.
Nem todas as aulas necessitaro da biblioteca , mas sempre que isso acontecer, ser
indicado no incio da aula. Nem todas as aulas tambm esto contempladas no nosso livro de
referncia, ma sempre que estiverem, as pginas correspondentes estaro tambm indicadas.
Convenes e dicas

Se voc j leu os outros tutoriais deste material, j deve estar acostumado com as
convenes (que no so muitas) usadas neste material. Sempre que estivermos nos referindo a um
cdigo ou sada de texto do R, usaremos a fonte Courier New tamanho 10 como em:

choose(1000, 30)

Existem dois tipos bsicos de apresentao dos comandos. Esse acima, que no tem
nenhuma sada de texto abaixo e tambm no precedido do smbolo do prompt do R >, ser
geralmente para ser copiado e colado no prompt do R para se obter a sada. J os do tipo:

> mean(notas)
[1] 7.01

So em geral apenas para a observao dos resultados (claro que isso no impede que o
comando seja usado, mas s tome cuidado para no colar o smbolo > junto, porque neste caso vai
dar erro no R).

Existe ainda mais um tipo, que igual ao primeiro, no sentido que para ser copiado e
colado tambm, mas de uma maneira mais complexa. So as funes. Elas tm esse jeito:

var.pop <- function (x)


{
sum((x-mean(x))^2)/length(x)
}
Mdulo Estatstica I no R
Autor: Antonio Guilherme Fonseca Pacheco

Pr-requisitos: Conhecimento prvio do ambiente R. Especificamente, o leitor deve estar


familiarizado com os mdulos Bsico, Entrada e Sada de Dados e tambm Manuseando
dados no R.

Bibliotecas necessrias: Nenhuma

Aula 1 Probabilidade e distribuies


Livro: pginas 45 a 55

Essa aula na verdade conter muita recordao do mdulo bsico onde falamos sobre
distribuies e grficos. Ficarei vontade inclusive para copiar algumas partes do texto j escrito. O
motivo dessa repetio no s aprofundar um pouco essas noes que foram passadas, mas
tambm permitir a introduo ao assunto para aqueles que se sentiram capazes de no estudar o
mdulo bsico.

Probabilidade
A funo sample()
Distribuies Discretas
Distribuies Contnuas
Distribuies no R
Densidade
Acumulativa
Quantis
Nmeros pseudo-aleatrios
Exerccios

Probabilidade

Inicialmente, vamos falar de probabilidades e amostras aleatrias. Como voc j deve ter
notado, a inferncia estatstica baseada sempre em uma amostra aleatria que tirada de uma
determinada populao sobre a qual gostaramos de inferir certas caractersticas, como a sua
mdia ou a sua varincia, por exemplo.
A idia sempre a mesma das bolinhas numeradas em uma urna. Se ns tivermos por
exemplo 10 bolinhas numeradas de 1 a 10 em uma urna, qual a chance de ns escolhermos
exatamente, por exemplo a bolinha com o nmero 5? Intuitivamente voc vai responder que essa
chance de 1 em 10, 1/10 ou 10%. Nesse caso o que acontece que as bolinhas tm uma chance
igual de serem escolhidas, certo? Pois se eu perguntasse sobre a chance da bolinha com o nmero 3,
a resposta seria a mesma.
Agora, e se eu perguntasse qual seria a probabilidade de se retirar a bolinha com o nmero 5
e a bolinha com o nmero 3? Nesse caso, voc tem que me fazer duas perguntas pelo menos. A
primeira se a ordem de retirada deve ser levada em conta ou no (ou seja, se sortear a bolinha 5 e
em seguida a 3 deve ser diferente de sortear a bolinha 3 e em seguida a 5, ou no). A segunda
pergunta se uma vez sorteada uma bolinha ela deve ser devolvida urna ou no para ser sorteada
a segunda bolinha. Essas perguntas so fundamentais porque elas vo alterar significativamente a
resposta. Muito bem, vamos assumir a situao mais comum, que quando a ordem no importa e
calcular as probabilidades com e sem reposio.
Para o caso com reposio, ns teremos a probabilidade de sortear a bolinha 3 (0.1) e a
bolinha 5 (0.1) ou a bolinha 5 (0.1) e a bolinha 3 (0.1). Em probabilidade existe um macete
interessante: quando falamos da probabilidade de acontecer um evento e outro evento, estamos
falando de uma multiplicao. Se estamos falando da probabilidade de acontecer um evento ou
outro evento, estamos falando de uma soma. Pescou? Pois , essa probabilidade vai ser (0.1x0.1) +
(0.1x0.1) = 0.02.
J para o caso sem reposio, a cosa muda um pouco de figura. Agora, a probabilidade do
segundo elemento a ser sorteado vai ser diferente da do primeiro, pois vai ter uma bolinha a menos
na minha urna. Ento, nesse caso, apesar do raciocnio ser o mesmo, os nmeros mudam. Olha s,
eu vou copiar a mesma frase l de cima, s mudando as probabilidades: Para o caso sem reposio,
ns teremos a probabilidade de sortear a bolinha 3 (1/10) e a bolinha 5 (1/9) ou a bolinha 5 (1/10) e
a bolinha 3 (1/9). Ento, essa probabilidade vai ser (1/10x1/9) + (1/10x1/9) = 0.0222.
Como voc percebeu, a probabilidade no segundo caso maior que no primeiro, j que a
probabilidade de se sortear uma determinada bolinha na segunda tentativa maior (o denominador
menor) que na primeira.
Agora um ltimo problema antes de ns partirmos para a nossa parte prtica de fato. Todos
esses exemplos so compostos de bolinhas que tm uma probabilidade igual de ser sorteada. Mas
isso no necessariamente acontece assim. Vamos supor que por exemplo ns s tivssemos
bolinhas com o nmero 1 e com o nmero 2, mas que temos 4 com o nmero 1 e 6 com o nmero 2.
Bem, agora qual seria a probabilidade de se escolher uma bolinha com o nmero 1? A resposta
tambm intuitiva, e ser 4/10 = 40% o nmero de bolinhas com o nmero 1 dividido pelo total
de bolinhas na urna... E da bolinha com o nmero 2? Nesse caso, seria 6/10 = 60%. Neste caso, as
bolinhas tm uma probabilidade diferente de serem sorteadas. O caso de uma segunda bolinha,
vamos deixar para um desafio para vocs que um problema um pouco mais complicado.
Muito bem, esse papo todo s para refrescar a sua memria sobre probabilidade, porque a
nossa inteno aqui ver coisas acontecendo na prtica.

A funo sample()

Tudo muito bonito esse papo de amostra aleatria e probabilidade, mas como o R pode nos
ajudar com isso? Bem, o R possui uma funo bastante interessante, que a funo sample() que
para quem conhece essa palavra em ingls j deduziu que serve para amostrar alguma coisa. E
isso mesmo: ela serve para criar uma amostra aleatria de um vetor qualquer, com ou sem reposio
e com probabilidades iguais ou no. Vamos ver ento como essa funo funciona e como ela vai
nos ajudar a entender melhor esses problemas de probabilidade.
Primeiro, vamos simular a situao onde temos a urna com as bolinhas numeradas de 1 a 10.
A maneira mais simples criar um vetor chamado urna, com valores de 1 a 10:

urna <- 1:10

Agora, ns poderamos pedir para a funo sortear uma bolinha pra a gente, assim:

sample(urna, 1)

Experimente tambm tirar 2 amostras (ou seja, duas bolinhas) da nossa urna:

sample(urna, 1)

Faa vrias vezes e veja o que acontece...


Bem, na verdade fica meio difcil ver o que realmente acontece quando essa funo trabalha,
no mesmo? O programa est simplesmente atribuindo uma probabilidade igual a cada um dos
elementos e retornando um ou dois deles. Bem, mas quando dizemos que a probabilidade de se
sortear a bolinha x, o que realmente queremos dizer com isso?
Queremos dizer que se ns repetirmos este experimento (retirar uma bolinha) n vezes, onde
n um nmero grande (diz-se inclusive que tende para o infinito grande para chuchu), ento em
mdia, a bolinha de nmero x ser sorteada em uma frao p das vezes. Por que no tentamos ento
fazer isso? Vamos criar uma funo para tirar vrias amostras de tamanho 1 e guard-las em um
vetor. Em seguida, vamos ver quantas vezes uma determinada bolinha (nmero) aparece no nosso
vetor, dividindo este nmero pelo tamanho do vetor. Complicou? Vamos tentar na prtica, ento:

probab <- function (x, size=length(bolinha), repos = FALSE, prob = NULL,


times=10000, bolinha=1, order=F)
{
el <- bolinha
pr <- 0
z<-0

if(order){
for (i in 1:times)
{
z <- sample(x, size=size, replace = repos, prob=prob)
if (sum(el==z)/length(el)==1)
{
pr[i] <- 1
}else{
pr[i] <- 0
}
}

}else{

for (i in 1:times)
{
z <- sample(x, size=size, replace = repos, prob=prob)
if (sum(el%in%z)/length(el)==1)
{
pr[i] <- 1
}else{
pr[i] <- 0
}
}
}
sum(pr)/times
}

O que estamos fazendo apenas tirar uma amostra 10000 vezes e comparando com
elementos que ns determinamos para ver qual a porcentagem (ou probabilidade) de se obter
aquela(s) bolinha(s) indicada(s), quando a ordem no importa (por default). Vamos ver como isso
funciona.
Vamos primeiro ver qual a probabilidade de se escolher a bolinha nmero 3 (a essa altura
voc j notou que para uma bolinha s no faz diferena se com ou sem reposio, n? Para a
bolinha nmero 3, teramos:

> probab(urna, bolinha=3)


[1] 0.1017

Bastante prximo do que tnhamos calculado anteriormente, no? Bem, e agora para as
bolinhas 3 e 5, como ficaria? Nesse caso depende se com ou sem reposio. No caso sem
reposio, a probabilidade deve ser em torno de 0.022. Vamos conferir:

> probab(urna, repos=F, bolinha=c(3,5))


[1] 0.0229

Repare que tivemos que usar a funo c() para escolhermos as bolinhas 3 e 5. E agora no
caso da com reposio? Esperamos uma probabilidade menor, em torno de 0.2. Vamos ver como
funciona:

> probab(urna, repos=T, bolinha=c(3,5))


[1] 0.0206
Muito bem. Mas lembre-se que quando voc for fazer isso no R, os resultados de cada uma
das suas tentativas vai ser diferente do que eu obtive quando fiz, pois a funo sample() escolhe as
bolinhas aleatoriamente...
Repare tambm que esta funo serve para calcular as probabilidades aproximadas quando a
ordem de retirada importa, com o argumento order=T, se for necessrio. Vamos ver s um exemplo
rpido:

> probab(urna, repos=T, order=T, bolinha=c(3,5))


[1] 0.0099

Um resultado esperado, j que se a ordem importa, no nos interessa a amostra (5,3), mas
apenas a amostra (3,5), e claro, a probabilidade deve ser aproximadamente a metade da anterior.

Distribuies Discretas

Como voc j deve ter aprendido, as distribuies de fenmenos naturais dos quais
queremos fazer inferncias a respeito se dividem em dois grandes grupos: variveis discretas e
variveis contnuas. Vamos comear pelas discretas. Elas so empregadas para descrever
fenmenos que s podem assumir nmeros inteiros. Um exemplo muito freqente em
epidemiologia o nmero de pacientes com uma determinada doena em uma populao. claro
que no pode existir um meio paciente, e portanto a distribuio deste evento uma distribuio
discreta.
Note que esta classificao muito geral e nada dito ou suposto sobre o range da
distribuio, e nem ao seu formato. Essas caractersticas sero particulares de cada distribuio. A
nica caracterstica que as une o fato de assumirem nmeros inteiros. Sendo discreta, podemos
definir a probabilidade de ocorrncia de um determinado evento ocorrer sem muita dificuldade:
P X = x= f x
Claro que isso uma definio muito geral. Para o nosso exemplo das bolinhas com nmero
1 e 2, com probabilidades diferentes, teramos:

{ 6
0.4, se x=1
P X = x= f x= 0.6, se x=2
0, caso contrrio
Como seria o grfico desta funo? ( isso mesmo, ela tem um grfico... meio esquisito,
verdade...)

x<-0:4
y<-c(0,0.4,0.6,0,0)
plot(x,y, type="h")
points(1,0.4)
points(2,0.6)

Esta funo chamada funo de densidade de probabilidade, ou fdp (no bom sentido,
claro.) conhecida tambm, por causa do ingls, como pdf.
Existe um outro tipo de funo que mede a probabilidade acumulada de eventos, ou seja, ela
mede a probabilidade da ocorrncia de eventos em sucesso, e estaramos falando no da
probabilidade de ocorrer um evento, mas da probabilidade de ocorrerem x ou menos eventos:
P X x= F x
Nessa funo anterior por exemplo, teramos:

{ 6
0 se x1
P X x= F x= 0.4, se 1 x2
1, se x2
Vamos ver o grfico?
x<-0:4
y<-c(0,0.4,1,1,1)
plot(x,y, type="s")

Esta funo chamada de funo de densidade acumulada, e s vezes tambm chamada


apenas funo de probabilidade.
claro que existem vrias funes discretas famosas, e uma das que iremos usar com
bastante freqncia a distribuio Binomial. Ela descreve o nmero de sucessos que ocorrem
em um determinado nmero de experimentos. Os sucessos tm uma certa probabilidade p de
acontecer e, junto com o numero de experimentos n compem os parmetros desta distribuio. A
fdp de uma Binomial (n,p) dada por:


P X = k= n p 1 p
k
k n k

Nesse caso o k usado apenas para no haver confuso com o x, e ele representa um valor
qualquer de x. O grfico desta funo pode ser facilmente obtido no R. Vamos ver um exemplo para
uma Binomial(100, 0.05):

hist(rbinom(1000, prob=.05, size=100), freq=F)

Tambm possvel obter-se a funo acumulada de distribuio da Binomial:


k

P X k=
x=0
nx p 1 p
x n x

E o seu grfico, como o do nosso exemplo, pode tambm ser facilmente obtido:

x<-seq(0,20,1)
plot(x, pbinom(x, prob=.05, size=100), type="s")

Voc deve ter notado que a F(x) da Binomial nada mais do que um somatrio das
probabilidades individuais de cada ponto da f(x) at que um determinado valor k seja obtido. Ns s
somamos todos os pontos dentro do range da distribuio para conferir se ela pode mesmo ser uma
distribuio. Como voc deve estar cansado de saber, essa soma tem que ser sempre 1.
Alis, se voc no se lembra, o range de uma funo de distribuio corresponde ao que
voc deve ter aprendido como domnio da funo, ou seja, os valores de x para os quais a funo
est definida. No caso da Binomial, o seu domnio x=0,1,... n e 0 p1 . Ambos os
valores so intuitivos, j que o nmero de sucessos x de uma Binomial em n experimentos, s pode
ir de zero a n. J a probabilidade p como toda probabilidade, s pode variar entre zero e um.

Distribuies Contnuas

Existem tambm variveis aleatrias que seguem uma natureza contnua, ou seja ela pode
assumir qualquer valor real. Por exemplo, a natureza da distribuio das presses arteriais de uma
populao qualquer uma varivel que pode assumir qualquer valor real positivo, muito embora
para uma pessoa viva alguns limites devam ser respeitados. Nesse caso, esta varivel dita
contnua.
Como as variveis discretas, as contnuas tambm possuem fdp's e distribuies
acumuladas. A grande diferena que como estamos falando de um espao contnuo, no possvel
calcular a probabilidade de um determinado valor que x assuma, mas sim de um pequeno intervalo
entre dois x consecutivos. Ento, a nossa f(x) vai ser apenas uma funo contnua. Um exemplo
muito conhecido nosso a distribuio Normal:


2
1 x
f x= exp 2
2 2
Como sabemos, a Normal possui tambm dois parmetros: a sua mdia e a sua
varincia 2 (muito embora seja comum usar o desvio-padro como o segundo parmetro
incluindo o R, como veremos mais adiante.) Como no caso da Binomial, esta funo pode
tambm ser facilmente colocada em um grfico no R. Vamos usar a Normal default no R que a
Normal (0,1):

curve(dnorm(x), from=-3, to=3)

Claro que como no caso das distribuies discretas, as distribuies contnuas tambm
possuem funes de densidade acumuladas e a idia do somatrio das probabilidades individuais de
cada valor que x pode assumir para a sua obteno tambm permanece. S que como estamos
falando de uma soma de uma funo contnua, em vez de somatrio, teremos que usar uma integral
para calcular a sua F(x). De modo geral:
x

F x = f x dx

claro que esse limite inferior de menos infinito vai depender do domnio da distribuio
algumas so definidas para certos intervalos, como a Uniforme (0,1) por exemplo, mas para a
Normal, exatamente assim.
Podemos tambm obter um grfico da funo de distribuio acumulada no R. Para a
Normal (0,1), seria assim:

x<-seq(-3,3,0.01)
plot(x, pnorm(x), type="l")

Repare que agora o grfico no assume mais o formato de degraus, mas sim de uma
distribuio contnua.
Vamos falar agora rapidamente de um fantasma que acabou de aparecer a em cima que a
integrao de uma funo. Muitas pessoas se assustam com a notao e tm dificuldade de entender
o que isso significa. Para o nosso nvel de aprendizado, cremos que pelo menos uma compreenso
bastante simples e bsica necessria. A primeira noo j foi passada, de que ela uma soma
contnua (se contrapondo ao somatrio quando estamos trabalhando com nmeros inteiros.)
A segunda noo simples uma interpretao geomtrica que a integral pode ter. Ela
representa na verdade apenas a rea sobre a curva da funo que est sendo integrada, dentro dos
limites estabelecidos. Quando ns falarmos adiante das funes do R para calcular funes
acumuladas, vamos ver uns exemplos sobre isto, mas legal j ter esta noo em mente.

Distribuies no R

O R possui uma srie de funes para calcular valores para essas distribuies que ns
acabamos de apresentar. Muitas delas j foram at usadas sem explicao alguma (o que pode ter
deixado voc um pouco boiando) quando fizemos os grficos da Binomial e da Normal. So quatro
os tipos bsicos dessas funes: funes para o clculo de densidade, funes para o clculo de
densidade acumulada, funes para o clculo de quantis e funes que geram distribuies. Cada
uma delas esto disponveis para diferentes tipos de distribuies, sejam discretas (e.g. Binomial,
Geomtrica) ou contnuas (e.g. Uniforme, Normal, Exponencial.) Vamos ver em mais detalhe como
cada uma destas funes funcionam.

Densidade

Como j foi mencionado anteriormente, a densidade de uma distribuio (o a sua fdp) tem
conotaes diferentes, dependendo se a distribuio discreta ou contnua. No primeiro caso, a
densidade representa de fato uma probabilidade pontual, a probabilidade do evento x ocorrer. J no
caso de uma distribuio contnua, a probabilidade para uma valor especfico de x zero e a
densidade representa a probabilidade de se obter um valor na vizinhana do valor x, definido por
um intervalo qualquer na sua vizinhana (de x). Este conceito pode ser um pouco confuso, pois
como veremos existe um valor definido para a densidade de uma funo como a Normal por
exemplo, s que esse valor NO CORRESPONDE PROBABILIDADE DESSE EVENTO
OCORRER!!!
Dos quatro tipos de funes que estudaremos, essa certamente a que menos se usa no dia a
dia, mas muito til para a construo de exemplos (alis, ns j usamos esta funo algumas
vezes.) Essa famlia de funes (chamo de famlia porque existem vrias delas para diversas
distribuies no R) sempre comeam com a letra d, seguida de uma abreviao do nome da
distribuio. Por exemplo, quando construmos o grfico da fdp da Normal, ns usamos o comando:

curve(dnorm(x), from=-3, to=3)

Como se tratava da Normal, a abreviao norm, e a funo se chama ento dnorm().


Veja um resumo das abreviaes usadas para algumas distribuies na tabela abaixo:

Tabela 1.1 Abreviaes e argumentos usados pelo R para gerar distribuies. Antes
da abreviao, deve-se acrescentar a letra d para a fdp, p para a funo de densidade
acumulada, q para a funo de quantis e r para gerao aleatria de uma amostra. Os
argumentos so descritos juntamente com os valores default, quando houver. Veja texto para
detalhes.
Distribuio Abreviao Argumentos com default
Binomial binom n= p=

Geomtrica geom prob=

Hipergeomtrica hyper m= n= k=

Binomial negativa nbinom size= prob=

Poisson pois lambda=

Uniforme unif min=0 max=1

Normal norm mean=0 sd=1

Exponencial exp rate=1

Qui-Quadrada chisq df=

t de Student t df=

F de Snedcor f df1= df2=

Weibull weibull shape= scale=1

Gama gamma shape= rate=1

Beta beta shape1= shape2=

Repare que apesar de na tabela estar assinalado que as funes para a Normal possuem 2
argumentos, eles foram omitidos no cdigo acima. Isso ocorreu porque algumas destas funes tm
valores default, e no caso da Normal, como voc j deve ter observado so mean=0 e sd=1.
A funo curve() vai desenhar um grfico de uma funo qualquer de x. Nesse caso a
funo justamente a funo dnorm(), que gera a densidade de uma normal. Alm disso, a funo
curve() tambm toma os argumentos from e to, para estabelecer os limites do grfico.
Mas afinal de contas, que valor retornado por esta funo? simplesmente o resultado da
fdp no ponto x. Quer ver um exemplo? Vamos ver a fdp da Normal (0,1):
2
x
1 2
f x = e
2
Vamos agora no R calcular o valor dessa funo quando x = 0:

> dnorm(0)
[1] 0.3989423

Lembre-se que esse valor, por se tratar de uma distribuio contnua, NO corresponde
probabilidade de se obter o valor x = 0 em uma Normal (0,1)!!!
Bem, vamos fazer este clculo na mo agora e conferir. Basta substituir por 0 onde existe x
na equao acima:
2

1 2 =
0 1 0 1
f 0= e e = 0.3989
2 2 2

Funo de distribuio acumulada

J a funo de distribuio acumulada bastante usada, no em exemplos, como ns


tambm vimos anteriormente, mas tambm para clculos corriqueiramente utilizados em estatstica.
Para a construo de um grfico da funo de distribuio acumulada da Normal, ns
usamos o comando:

x<-seq(-3,3,0.01)
plot(x, pnorm(x), type="l")

Onde ns criamos um vetor x como uma seqncia de -3 a 3, de 0.01 a 0.01 e depois


plotamos esse vetor contra os valores retornados pela funo pnorm(). Como voc deve ter
percebido, para gerarmos densidades acumuladas, acrescentamos a letra p antes de uma das
abreviaes descritas na Tabela 1.1.
Alis, aqui que entra a nossa compreenso superficial sobre a integral de uma funo. O
que a pnorm() faz calcular o resultado desta conta:
x

P X x = F x = f x dx

Onde a f(x) vai ser a fdp de alguma distribuio, neste caso, a Normal (0,1) e que ns j
vimos que o resultado :
2
x x
1 2
P X x = F x = e dx

2
Agora voc deve estar se perguntando: mas porque existem aquelas imensas tabelas para a
distribuio Normal (0,1) que vm nas costas de todo livro de estatstica, se o valor da funo de
distribuio acumulada apenas uma conta, uma funo de x aplicada a um determinado valor?
Nesse caso, a gente poderia calcular na mo, com fizemos com a fdp, no?
x x2
1 2
Bem... no. O problema que a conta e dx no tem resultado algbrico

2
definido (ou seja, no possvel obter uma outra funo a partir deste clculo) e ento os resultados
tm que ser obtidos por clculo numrico. Da a grande importncia da implementao de funes
do tipo da pnorm().
Alm ento dos grficos que ns vimos, com estas funes possvel calcular uma srie de
coisas teis para estatstica, que substituem a consulta das tabelas. Digamos, por exemplo, que uma
certa caracterstica de uma populao siga uma distribuio Normal, com mdia 100 e DP de 20.
Uma pergunta pertinente sobre esta populao seria: qual a percerntagem de pessoas nesta
populao que possuem um valor igual ou menor a 75? Para responder, podemos fazer:

> pnorm(75, mean=100, sd=20)


[1] 0.1056498
Ou seja, cerca de 10.56% das pessoas possuem um valor igual ou menor que 75. Mas afinal
de contas, como podemos visualizar esses resultados? Como foi mencionado, esse valor que foi
encontrado nada mais do que a rea abaixo da curva da fdp desta Normal (100, 400). Vamos ver
como isso funciona, mas desta vez s mostrarei o resultado final (seria um pouco complicado pedir
para voc fazer esse grfico, mas se estiver interessado, no se acanhe em entrar em contato.)

Density function
0.020
0.015
0.010
Y
0.005
0.000

0 50 100 150 200

O que observamos na figura acima a fdp desta normal, com a rea hachurada de menos
infinito (embora no d pra visualizar muito bem) at o valor que queramos de 75. Esta rea vale
exatamente o valor que ns achamos acima, ou seja, 0.1056. Para reforar, essa conta para esta
normal dada por:


75 2
1 x 100
F 75= exp 2
dx

2 20 2 20
Significa que estou calculando a integral (que a rea sob a curva) de menos infinito at 75
da fdp da Normal (100, 400.) Note que eu apenas substitu os valores de e de 2 na
equao acima.
Testes estatsticos tambm so uma aplicao direta dessas funes. Por exemplo, mais
tarde voc vai aprender a usar e interpretar o famoso teste t de Student. Sem entrar em detalhes,
basicamente ser calculada uma estatstica T, a qual ter uma distribuio t com n-1 graus de
liberdade (onde n o tamanho da amostra.) Para se calcular o famoso p-valor associado a esta
estatstica, usamos a funo pt(). Digamos que para uma amostra de 100 pacientes, a estatstica
que voc calculou foi -2.55. Para calcular o p-valor:

> pt(-2.55, df=99)


[1] 0.006152768

Como voc aprender mais tarde, a distribuio t tem um nico parmetro, que so os graus
de liberdade (degrees of freedom em ingls da o argumento df). Mas no se preocupe com nada
disso agora, apenas para j ter em mente a utilidade da funo.
Novamente, esse valor tambm uma rea, mas sob a curva da fdp de uma distribuio t
com 99 graus de liberdade, indo de menos infinito at -2.55, como mostrado na curva abaixo.
S para fixar, sem querer complicar muito, vamos admitir que a distribuio t99 tenha uma
fdp genrica, do tipo f t , usando t s para indicar que se trata de uma distribuio t. Ento, a
rea assinalada abaixo corresponde conta:
2.55

F 2.55= f t dt

Cuja soluo, como voc j deve ter adivinhado, tambm no tem um resultado definido
algebricamente.

Density function
0.4
0.3
0.2
Y
0.1
0.0

-4 -2 0 2 4

X
Quantis

A prxima famlia de funes so as que geram quantis. Se voc est achando isso um
palavro, no posso culp-lo. Essa funo na verdade apenas a funo inversa da funo de
densidade acumulada. Assim, ela responde seguinte pergunta: a que valor de x corresponde uma
probabilidade acumulada de 0.975, por exemplo. Alis, numa Normal (0,1), qual seria mesmo esse
valor?

> qnorm(0.975, mean=0, sd=1)


[1] 1.959964

Isso mesmo, o nosso bom e velho 1.96...


A utilizao dos quantis ser bastante importante quando estudarmos tambm intervalos de
confiana, pois como veremos, precisaremos do valor desta funo para calcular quanto deve ser
somado mdia amostral por exemplo para obter-se o limite superior do seu intervalo de confiana
(e subtrair-se tambm para obter-se o limite inferior.) Vamos ver um rpido exemplo: Por exemplo,
um IC 95% para uma mdia amostral com varincia da populao desconhecida dada por (no se
assuste se voc no entendeu o que isso quer dizer, voc vai aprender mais tarde):

x t n 1,1 / 2 s 2 /n

Onde x a mdia da amostra, s 2 a varincia da amostra, n o tamanho da amostra e
t n 1,1 / 2 exatamente o valor de t com n-1 graus de liberdade no ponto 1 /2 , que para
um nvel de confiana de 5% = 0.05 corresponde a 0.975. Vamos chutar alguns valores e ver
como isso funcionaria no R. Digamos que a mdia das diferenas de presso arterial de uma
amostra de 100 pacientes, antes e aps um determinado tratamento, seja -10mmHg e que a varincia
da diferena tenha sido de, digamos 9mmHg2.. Nesse caso teramos:

> -10-(qt(0.975, df=99)*sqrt(9/100))


[1] -10.59527
> -10+(qt(0.975, df=99)*sqrt(9/100))
[1] -9.404735

Nesse caso tivemos que usar a funo qt() para calcular este IC 95%. Assim, nesse
experimento a presso arterial dos pacientes foi reduzida em mdia 10mmHg, com um IC95% de (-
10.595,-9.405).

Nmeros pseudo-aleatrios

Geralmente nos referimos gerao de nmeros pelo computador como nmeros aleatrios
apenas. Essa noo pouco intuitiva, porm, pois de se esperar que um computador realize
apenas clculos e operaes exatas, sem nenhum tipo de aleatoriedade envolvida. Essa dvida
procede, j que na verdade, algoritmos foram desenvolvidos para que o computador possa gerar
nmeros como se fossem aleatrios, mas na verdade eles no so genuinamente aleatrios, e por
isso devem receber a denominao mais precisa de pseudo-aleatrios. A explicao de como isso
obtido foge do escopo deste material e no ser abordada.
O que importa que o R capaz de gerar amostras aleatrias de vrias distribuies
diferentes, que podem ser usadas em simulaes e tambm em exemplos, como ns fizemos
anteriormente. Por exemplo, a fdp de uma binomial foi feita com essa funo, gerando uma amostra
de tamanho 1000:

hist(rbinom(1000, prob=.05, size=100), freq=F)

Vamos ver alguns dos nmeros gerados, digamos, 10:


> rbinom(10, prob=.05, size=100)
[1] 8 4 4 4 2 3 6 8 6 5

Esses nmeros deveriam estar (e esto) distribudos mais ou menos em torno de 5, que a
mdia desta Binomial temos nesse caso a probabilidade de 5% (prob=.05) de sucessos, como o
nmero de experimentos 100 (size=100), esperamos que ocorram 5 sucessos em cada 100
experimentos.

Exerccios

1. Tomando o mesmo exemplo da urna com 10 bolinhas numeradas, qual seria a


probabilidade para o caso com e sem reposio, com ordem indiferente para se retirar a
bolinha com o nmero 5 duas vezes?

2. Suponha que uma urna contenha 7 bolinhas azuis e 3 bolinhas verdes. Digamos que
estamos interessados na probabilidade de tirarmos uma segunda bolinha verde da urna,
sem reposio. Calcule as seguintes probabilidades
a. A segunda bolinha ser verde, sendo que eu desconheo a cor da primeira bolinha
b. A segunda bolinha ser verde, dado que a primeira bolinha verde
c. A segunda bolinha ser verde, dado que a primeira bolinha azul
Que concluses voc pode tirar sobre essas probabilidades condicionais?

3. Calcule a probabilidade desses eventos:


a. Uma varivel distribuda como uma Normal (0,1) ser menor que 3
b. Uma varivel distribuda como uma Normal com mdia 35 e DP de 6 ser maior que 42
c. Obter-se 10 sucessos em 10 experimentos em uma Binomial com probabilidade de
sucesso de 0.8
d. X < 0.9, sendo que X uma Normal-padro
e. X > 6.5 numa distribuio 2 com 2 graus de liberdade

4. Como vimos na aula, o intervalo de confiana 95% de uma normal gira em torno da mdia
amostral com um certo afastamento. Quando a varincia da populao conhecida (coisa
que nunca acontecer), podemos usar a distribuio Normal (0,1) em vez da distribuio t.

Nesse caso, o IC 1001 % ser dado por x z 2 /n . Para um IC
1 / 2

95%, ns chegamos a calcular o valor de z 1 / 2 - lembra? Era aproximadamente 1.96.


Calcule z 1 / 2 para os seguintes nveis de confiana: 10%, 1%, 0.05%, 0.01%

5. Um cirurgio prope uma nova tcnica operatria para uma doena cujo mtodo clssico
sabidamente cursa com complicaes ps-operatrias em 20% dos pacientes. Ele aplica a
nova tcnica em 10 pacientes e nenhum apresenta complicaes ps-operatrias. Qual a
probabilidade de se usar o mtodo tradicional em 10 pacientes e obter-se o mesmo
resultado (i.e. no haver complicao em nenhum paciente)?
Exerccios

Aula 1 Probabilidade e distribuies


Livro: pginas 45 a 55

1. Tomando o mesmo exemplo da urna com 10 bolinhas numeradas, qual seria a


probabilidade para o caso com e sem reposio, com ordem indiferente para se retirar a
bolinha com o nmero 5 duas vezes?

Sem reposio, a probabilidade zero, pois no possvel tirar a bolinha 5 uma segunda vez
se ela no for recolocada na urna.
Com reposio, ns teremos (1/10)x(1/10) = 0.01, ou 1%, j que s existe uma possibilidade
de se sortear duas vezes a bolinha 5.
Uma outra forma de se chegar ao mesmo resultado calcular todas as possveis amostras de
tamanho 2 com reposio que podem ser retiradas de uma populao de 10 bolinhas. Esse nmero
calculado assim: Quantas bolinhas diferentes podem ser sorteadas na primeira escolha? A resposta
bvia: qualquer uma das 10. Mas se com reposio, quantas bolinhas diferentes podem ser
sorteadas na segunda escolha? 10 novamente. Logo o total de amostras possveis ser 10x10 = 100.
Esse resultado pode ser generalizado para o caso de uma populao de N elementos e uma amostra
de tamanho n. Nesse caso, pode-se mostrar que o nmero total de amostras possveis com reposio
ser N n . Esse conceito muito importante e toda a teoria de distribuies amostrais baseada
nesse tipo de amostragem, como voc ver em breve.
Muito bem, mas ento dentre as 100 possveis amostras, sem se levar em conta a ordem do
sorteio, quantas amostras tero duas vezes o nmero 5? Apenas uma! Ento a probabilidade 1/100
= 0.01.
Mas voc deve estar perguntando agora e se fosse a bolinha 3 e a 5, sem importar a ordem.
Bem, nesse caso, ns teramos duas possibilidades, 3 primeiro e 5 depois ou vice-versa. Ento a
probabilidade seria 0.02.

2. Suponha que uma urna contenha 7 bolinhas azuis e 3 bolinhas verdes. Digamos que
estamos interessados na probabilidade de tirarmos uma segunda bolinha verde da urna,
sem reposio. Calcule as seguintes probabilidades

Vamos inicialmente definir as probabilidades de alguns eventos:


Seja:
P(1A) = Probabilidade da primeira bolinha ser azul
P(1V) = Probabilidade da primeira bolinha ser verde
P(2V) = Probabilidade da segunda bolinha ser verde

a. A segunda bolinha ser verde, sendo que eu desconheo a cor da primeira bolinha
Para comear, se ns no sabemos a cor da primeira bolinha, de cara ns teremos duas
possibilidades: OU a primeira bolinha era verde OU a primeira bolinha era azul. J deu para sentir
que teremos que SOMAR probabilidades, n? Alm disso, cada parcela desta soma envolver uma
multiplicao, pois estaremos lidando com 2 eventos que aconteceram, ou seja, se a primeira
bolinha foi verde e a segunda tambm, temos que fazer a multiplicao das probabilidades destes
eventos. Vamos ver como fica:
P(2V) = [P(1V) x P(2V)] + [P(1A) x P(2V)] = (3/10 x 2/9) + (7/10 x 3/9) = 0,3
Note que esse valor igual probabilidade de tirarmos uma bolinha verde da primeira vez!
Isso significa que o fato de apenas sabermos que uma bolinha j foi tirada da urna, sem saber nada
sobre ela, no ajuda em nada no clculo desta probabilidade.

1
b. A segunda bolinha ser verde, dado que a primeira bolinha verde
Agora a histria diferente. Ns sabemos que a primeira bolinha verde:
P(2V | 1V) = 2/9

c. A segunda bolinha ser verde, dado que a primeira bolinha azul


Bem, ficou fcil, n?
P(2V | 1A) = 3/9

Que concluses voc pode tirar sobre essas probabilidades condicionais?


A concluso que nesses casos, como os eventos so dependentes, a informao sobre um
deles modifica a probabilidade de ocorrncia do outro. J percebeu como os mesmos eventos seriam
independentes? Uma questo de bnus para quem me procurar at a prxima aula e me explicar
como...

3. Calcule a probabilidade desses eventos:


a. Uma varivel distribuda como uma Normal (0,1) ser menor que 3
Para resolver esta questo, precisamos apenas aplicar diretamente a funo de densidade
acumulada:

> pnorm(3)
[1] 0.9986501

b. Uma varivel distribuda como uma Normal com mdia 35 e DP de 6 ser maior que 42
Repare que nesse caso, a aplicao direta da funo de densidade acumulada no vai
funcionar. Voc deve usar uma propriedade simples das funes de densidade acumuladas para
resolver facilmente esse problema. A rea total abaixo da fdp sempre 1, pois esse valor mximo
de uma probabilidade. Isso significa que a rea total abaixo da curva da Normal vale 1. Ora, a
funo de densidade acumulada nos d P X z , ento P X z + P X z = 1, logo:
P X z = 1- P X z
No R:

> 1-pnorm(42, mean=35, sd=6)


[1] 0.1216725

A outra maneira de se obter o mesmo resultado era se voc se lembrar da caracterstica da


Normal ser simtrica em torno da sua mdia. O valor sobre o qual eu quero a probabilidade est a 7
unidades direita da mdia (42-35). Ora, ento a rea abaixo da curva para valores acima de 42,
ter de ser a mesma que a rea abaixo da curva para valores abaixo de 35-7 = 28 unidades. Vamos
ver no R:

> pnorm(28, mean=35, sd=6)


[1] 0.1216725

De maneira geral, para uma Normal (0,1), cuja mdia zero, essa propriedade pode ser
descrita:
1 z p = z p
Onde representa a funo de densidade acumulada da Normal (0,1), z p representa
um quantil da Normal (0,1)

c. Obter-se 10 sucessos em 10 experimentos em uma Binomial com probabilidade de


sucesso de 0.8

2
Neste caso a pergunta se refere a exatamente 10 sucessos (repare que isso diferente de no
mximo 10 sucessos. Estamos procurando P X =0 em uma Binomial (p = 0.8, n = 10). No R:

> dbinom(10, prob=.8, size=10)


[1] 0.1073742

Note que a probabilidade relativamente alta (~10%), o que esperado, j que a mdia
dessa Binomial 0.8x10 = 8.
Se a pergunta fosse sobre no mximo 10 sucessos, a resposta seria bvia e de cabea: 1, pois
10 o nmero mximo de sucessos, logo, tudo o que pode acontecer est entre 0 e 10 sucessos. Mas
quem quiser conferir no R ser bem-vindo:

> pbinom(10, prob=.8, size=10)


[1] 1

d. X < 0.9, sendo que X uma Normal-padro


Alguma dvida? No R:

> pnorm(0.9)
[1] 0.8159399

e. X > 6.5 numa distribuio 2 com 2 graus de liberdade


Aqui teremos que usar a propriedade da funo de densidade acumulada (cuidado: A
distribuio qui-quadrada NO SIMTRICA!!!) Novamente:
P X x = 1- P X x

> 1-pchisq(6.5, df=2)


[1] 0.03877421

2
Confira no R como a 2 no simtrica:

curve(dchisq(x, df=2), from=0, to=10)

4. Como vimos na aula, o intervalo de confiana 95% de uma normal gira em torno da
mdia amostral com um certo afastamento. Quando a varincia da populao conhecida
(coisa que nunca acontecer), podemos usar a distribuio Normal (0,1) em vez da

distribuio t. Nesse caso, o IC 1001 % ser dado por x z 2 .
1 / 2 / n
Para um IC 95%, ns chegamos a calcular o valor de z 1 / 2 - lembra? Era
aproximadamente 1.96. Calcule z 1 / 2 para os seguintes nveis de confiana: 10%, 1%,
0.05%, 0.01%

Esse exerccio uma aplicao direta da frmula de quantis. A nica ateno tem que ser
dada ao fato de os nmeros estarem em porcentagem:
Para 10%, 1 /2 = 0.95
Para 1%, 1 /2 = 0.995
Para 0.05%, 1 /2 = 0.99975
Para 0.01%, 1 /2 = 0.99995
Ento no R:

> qnorm(0.95)

3
[1] 1.644854
> qnorm(0.995)
[1] 2.575829
> qnorm(0.99975)
[1] 3.480756
> qnorm(0.99995)
[1] 3.890592

5. Um cirurgio prope uma nova tcnica operatria para uma doena cujo mtodo
clssico sabidamente cursa com complicaes ps-operatrias em 20% dos pacientes. Ele
aplica a nova tcnica em 10 pacientes e nenhum apresenta complicaes ps-operatrias.
Qual a probabilidade de se usar o mtodo tradicional em 10 pacientes e obter-se o mesmo
resultado (i.e. no haver complicao em nenhum paciente)?

Neste caso, temos duas possibilidades de calcular esta probabilidade. Repare que o que
estamos tentando descobrir P X =0 , ou seja, a densidade de uma Binomial no ponto 0, mas
para uma distribuio Binomial, cujo range de k = 0,1,2,...,n, isso equivale a calcular a funo de
densidade acumulada tambm, P X 0 . Pelas caractersticas do problema, essa uma
Binomial(p = 0.2,n = 10). Para obter o valor no R com a fdp:

> dbinom(0, prob=0.2, size=10)


[1] 0.1073742

Usando a funo de densidade acumulada:

> pbinom(0, prob=0.2, size=10)


[1] 0.1073742

claro que nesse caso, poderamos facilmente calcular esse valor na mo. Lembre-se da fdp
da Binomial:

P X = k = kn p 1 p
k n k

Substituindo os valores de k, p e n nessa equao:

0
P X = 0= 10 0.2 1 0.2
0 10 0
= 0.810 = 0.1073742

4
Mdulo Estatstica I no R
Autor: Antonio Guilherme Fonseca Pacheco

Pr-requisitos: Conhecimento prvio do ambiente R. Especificamente, o leitor deve estar


familiarizado com os mdulos Bsico, Entrada e Sada de Dados e tambm Manuseando
dados no R.

Bibliotecas necessrias: ISwR

Aula 2 Estatstica descritiva


Livro: pginas 57 a 80

Nesta e na prxima aula tambm usaremos alguns elementos j descritos no mdulo bsico,
e a repetio mais uma vez se justifica pelos motivos j mencionados. Novamente, parte do material
ser tomada emprestada do mdulo bsico.
Uma diferena importante deve ser mencionada que a partir desta aula, ns iremos
efetivamente usar a biblioteca ISwR. Essa biblioteca composta basicamente de bancos de dados
que usaremos para exemplificar alguns procedimentos. Isso significa que teremos que inicializar a
biblioteca, chamar alguma base de dados dessa biblioteca e eventualmente anexar essa base de
dados para poupar digitao. Digamos que iremos usar a base de dados juul anexada. Nesse caso,
precisaremos invocar a seguinte seqncia de dados:

library(ISwR)
data(juul)
attach(juul)

Nenhuma dessas funes nova para voc se voc j fez os mdulos iniciais do R, mas s
para relembrar, a primeira carrega a biblioteca, a segunda inicializa a base de dados e a terceira
anexa o banco.
O importante lembrar que esses comando somente ficaro ativos durante uma sesso do R,
ou seja, se voc fechar o programa, esses comandos sero perdidos e numa prxima sesso, tero
que ser invocados novamente. Isso importante porque as aulas so feitas como se o aluno
estivesse em uma nica sesso do R. Isso significa que dentro de uma mesma aula, esses comandos
no sero repetidos, e se o aluno resolver seguir a aula em vrias sesses, essa inicializao dever
ser feita toda vez que a sesso for iniciada (obviamente substituindo o nome do banco de dados, que
no ser apenas o juul , naturalmente.)

Descrio univariada
Estatsticas-resumo
Grficos
Histogramas
Distribuio acumulativa emprica
Q-Q plots
Boxplots
Descrio univariada por grupos
Estatsticas-resumo
Grficos
Histogramas
Boxplots paralelos
Descrio de dados categricos

1
Tabelas
Grficos

Descrio univariada

Apesar do palavro a do ttulo, ele apenas quer dizer que vamos ver a descrio de
variveis uma a uma, sem estratificar ou cruzar esta varivel com outras variveis.

Estatsticas-resumo

No R fcil obter-se estatsticas-resumo bsicas. Na verdade ns j fizemos isso no Mdulo


Bsico, quando estudamos distribuies e grficos. Vamos alis pegar emprestado o que j fizemos:
vamos gerar uma amostra de 100 observaes de uma Normal (0,1):

x <- rnorm(100)

Agora, vamos calcular algumas estatsticas:

> mean(x)
[1] -0.05940595
> sd(x)
[1] 0.9533712
> var(x)
[1] 0.9089166
> median(x)
[1] -0.08017842
> sqrt(var(x))
[1] 0.9533712

A primeira observao, claro, que a mdia e a mediana no so iguais a zero e a varincia


e desvio-padro tambm no so exatamente iguais a 1. Bom, como j comentamos no Mdulo
Bsico, isso acontece porque ns geramos esses nmeros, ento eles devem ter uma distribuio
aproximadamente igual a uma Normal (0,1). A segunda observao que apesar de ser intuitivo,
parece ser absolutamente no prtico obter esses valores... Ser que no existe um modo mais
fcil??? Relaxe: existe e veremos j-j...
Antes, vamos ver algumas outras estatsticas, como por exemplo quantis:

> quantile(x)
0% 25% 50% 75% 100%
-2.34662031 -0.65581393 -0.08017842 0.57501559 2.61270000

Repare que essa funo retorna o valor mnimo, o mximo e ainda a mediana (por definio
o quantil 0.5, ou centil 50), o primeiro e o terceiro quartis (que so os centis 25 e 75,
respectivamente). Essa funo aceita tambm um argumento para fornecer o centil que se desejar.
Por exemplo, para obter-se o 10 e o 90. centis, pode-se fazer:

> quantile(x, c(0.1, 0.9))


10% 90%
-1.185000 1.160362

Muito bem, vamos agora pela primeira vez usar dados contidos na biblioteca IswR, para
podermos estudar descries em bancos de dados reais:

library(ISwR)

2
Vamos seguir o nosso livro de referncia e usar o banco juul, que contm valores repetidos
de IGF-I para um grupo de crianas em idade escolar, alm de outras variveis. Para uma descrio
mais detalhada desse banco, digite:

?juul

Muito bem. Vamos agora usar o nosso banco. Mas antes, vamos salv-lo com outro nome,
para facilitar a nossa vida:

data(juul)
aula2.juul <- juul
attach(aula2.juul)

O primeiro comando usado para carregar o banco juul para a memria do R e o segundo
voc deve se lembrar, para no termos que digitar o nome do banco toda vez que quisermos
chamar uma varivel deste banco. Alis, vamos conferir o nome destas variveis:

> names(aula2.juul)
[1] "age" "menarche" "sex" "igf1" "tanner" "testvol"

Bom, vamos calcular uma mdia ento da varivel IGF-I:

> mean(igf1)
[1] NA

Epa!!! Como isso? A mdia da IGF-I no disponvel??? (Lembra? NA no R significa


missing.) Calma: isso acontece pelo modo como o R lida com valores faltantes. Depende da funo,
mas em geral, o R no remove automaticamente os valores faltantes para calcular estatsticas isso
funciona na verdade como um alarme para informar que existem registros sem informao.
Ento, ns precisamos indicar para o R que ele deve remover os NAs. Assim:

mean(igf1, na.rm=T)
[1] 340.168

Entendeu? Usamos a opo na.rm=T para remover os Nas. Isso funciona para outras funes
tambm:

> median(igf1)
[1] NA
> median(igf1, na.rm=T)
[1] 313.5

Certo, mas e a nossa funo que nos d uma sada mais resumida, mais jeitosa? Vamos l;
que tal um resumo da nossa varivel?

> summary(igf1)
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
25.0 202.3 313.5 340.2 462.8 915.0 321.0

Com essa funo temos ento algumas estatsticas bsicas (porm no todas as que voc
gostaria de calcular, talvez) e ainda o nmero de registros com missing para aquela varivel. Mais
tarde veremos como personalizar algumas sadas.
Na verdade, essa mesma funo pode ser usada para obter um resumo de um banco inteiro:

> summary(aula2.juul)

3
age menarche sex igf1
Min. : 0.170 Min. : 1.000 Min. :1.000 Min. : 25.0
1st Qu.: 9.053 1st Qu.: 1.000 1st Qu.:1.000 1st Qu.:202.3
Median :12.560 Median : 1.000 Median :2.000 Median :313.5
Mean :15.095 Mean : 1.476 Mean :1.534 Mean :340.2
3rd Qu.:16.855 3rd Qu.: 2.000 3rd Qu.:2.000 3rd Qu.:462.8
Max. :83.000 Max. : 2.000 Max. :2.000 Max. :915.0
NA's : 5.000 NA's :635.000 NA's :5.000 NA's :321.0
tanner testvol
Min. : 1.000 Min. : 1.000
1st Qu.: 1.000 1st Qu.: 1.000
Median : 2.000 Median : 3.000
Mean : 2.640 Mean : 7.896
3rd Qu.: 5.000 3rd Qu.: 15.000
Max. : 5.000 Max. : 30.000
NA's :240.000 NA's :859.000

Observando essas estatsticas-resumo, observamos um outro problema: o R est


considerando variveis de classificao, como menarca (menarche), sexo (sex), e classificao de
Tanner (tanner) como sendo contnuas. Alm disso, a falta de um significado para os cdigos
tambm atrapalha um pouco. Vamos usar ento uma funo para transformar estas variveis em
fatores (lembra?) e atribuir alguns labels para os seus valores. Faa assim:

detach(aula2.juul)
aula2.juul$sex <- factor(juul$sex, labels=c("M","F"))
aula2.juul$menarche <- factor(juul$menarche, labels=c("No","Sim"))
aula2.juul$tanner <- factor(juul$tanner, labels=c("I","II", "III", "IV",
"V"))
attach(aula2.juul)
summary(aula2.juul)

E veja como a sada agora bem mais agradvel. Note que tivemos que remover o banco da
memria com a funo antes de fazermos as modificaes. Isso necessrio porque a verso que
voc carrega para a memria fica preservada e no alterada quando voc faz alteraes no banco
original.

Grficos

J sei: est preocupado com a funo que eu prometi mostrar que tem uma sada mais
palatvel, no ? Mas vamos esperar mais um pouquinho, pois ela tambm fornece uns grficos
interessantes...

Histogramas

Primeiramente vamos falar dos nossos conhecidos histogramas. Como j vimos


anteriormente, o histograma apresenta a distribuio de freqncias de uma varivel qualquer, seja
ela gerada pelo R, como uma Normal (0,1), seja de uma varivel contnua qualquer.

hist(igf1, freq=F)

Hum... No parece muito normal, no ? Vamos comparar com uma Normal terica?

hist(igf1, freq=F)
curve(dnorm(x, mean=mean(igf1, na.rm=T), sd=sd(igf1, na.rm=T)), from=0,
to=1000, add=T)

4
At que no to ruim assim... O que voc acha? Repare que eu usei a funo curve() que
ns j tnhamos usado anteriormente, usando como parmetros da Normal a mdia e o desvio-
padro da varivel igf1 calculados pelo R observe que eu tive que retirar os missings tambm!
Alm disso, a opo add=T tem que ser usada para a cure aparecer na mesma janela do histograma.
Ah, e para esse caso, temos que usar o histograma com a densidade e no com a freqncia.
Os histogramas so muito teis para observar o jeito da nossa varivel. Existe um outro
recurso, que muita gente no gosta, mas que eu considero mais informativo do que o histograma
para este tipo de descrio, que o grfico de ramo-e-folhas (que j foi visto tambm no Mdulo
Bsico.) Vamos ver como ficaria:

> stem(igf1, scale=2)

The decimal point is 1 digit(s) to the right of the |

2 | 5968
4 | 233346123
6 | 478811699
8 | 0678899000234556789
10 | 0011134445566667801123557779
12 | 12234666701234455567888999
14 | 001112234445668899990011122233344666777888899
16 | 0000133334445666777888899900111111234444444667788999999
18 | 00011234455666677777777888000001133334556667789999
20 | 001111222233344556667899900122224445555778889
22 | 000111122223333333444555678899912222223334444555667888999
24 | 0001222222334455666677788990011222445556667777888999999
26 | 1111122222334667788999011111122223445788889999
28 | 000111133444456667888890000001222344555666899
30 | 0144457789912233456889
32 | 112222234456678888990012668889
34 | 01455567777788899912222244556668899
36 | 0001223333344444667788011244444566789
38 | 03335677777889990011123344556778889999
40 | 0012224445566677899011222445666778899999
42 | 001112556888900001123444556668999
44 | 0012222333445567778890223333779
46 | 1122344445567899012333444556667788899
48 | 012333455678888889000011112233334455566777889
50 | 012233344444556889044777888
52 | 02234456666778890355555
54 | 135788990122333668889
56 | 004455800344689
58 | 112780125569
60 | 034889991556889
62 | 124500125799
64 | 81235
66 | 7890
68 | 02679069
70 | 1146
72 | 0222383778
74 | 137
76 | 2897
78 | 158
80 | 1
82 | 1028
84 | 23
86 | 8
88 | 4
90 | 45

5
Observe que com essa sada visualizamos o jeito quase normal, que observamos no
histograma e temos uma idia da distribuio dos valores no banco tambm. Por exemplo, o valor
mnimo pode ser estimado, que 25 (observe a mensagem dizendo que o ponto decimal est uma
casa direita da barra, ento o primeiro valor ser 25 ou 35 isso por causa do intervalo
estabelecido pelo grfico cada ramo engloba 2 dezenas, ou seja, o ramo 2 engloba todos os
valores de 20 a 39; mas como a seqncia 5968 esses valores so 25, 29, 36, 38.) O mesmo
acontece para o valor mximo, que 905 ou 915, pelo mesmo motivo j comentado, mas aqui no
podemos dizer exatamente qual. Alm disso, podemos ver que os valores mais freqentes esto em
torno de 220, 260, mais ou menos.

Distribuio acumulativa emprica

Esse grfico ns j vimos na aula passada, quando construmos os grficos das funes de
densidade acumulada para distribuies, usando, por exemplo a funo pnorm() para a Normal
(0,1). Isso possvel de ser feito para uma varivel tambm.
Na prtica mesmo, isso no muito usado, j que um dos seus objetivos, que testar
normalidade, contra uma distribuio simulada, por exemplo pode ser feita de uma maneira mais
eficiente como veremos a seguir, mas vamos ver como funciona:

n<-sum(!is.na(igf1))
x<-seq(1,n,1)
plot(sort(igf1), (1:n)/n, type="s")
lines(x, pnorm(x, mean=mean(igf1, na.rm=T), sd=sd(igf1, na.rm=T)),
col="blue", lwd=3)

Bem, no vou entrar em muitos detalhes sobre o que foi feito e colocamos o resultado final
no grfico abaixo. Apenas a primeira linha ser comentada. Muitas vezes, queremos saber o nmero
de observaes de uma varivel que no so missing e usar este nmero para alguma coisa, como
foi o caso aqui, para construir a distribuio emprica. Bem, voc se lembra que a IGF-I tem 321
valores faltantes, e que o total de registros de 1339. Ora, ento efetivamente usaremos 1339-321 =
1018 valores para serem usados. Mas olhe o que acontece quando chamamos a funo para medir o
tamanho de um objeto:

> length(igf1)
[1] 1339

6
1.0
0.8
0.6
0.4
0.2
0.0

0 200 400 600 800

sort(igf1)

E o pior que a opo para remover os missing no aceita pela funo length(). Ento,
tivemos que usar esse macete:

> sum(!is.na(igf1))
[1] 1018

No difcil entender esse cdigo: eu fiz uma pergunta lgica que elementos em igf1 so
diferentes de NA com o cdigo !is.na(igf1). Esse teste vai retornar um vetor cheio de valores
TRUE e FALSE que como voc j aprendeu, correspondem aos valores 1 e zero, respectivamente.
Ora, quantos desses valores sero TRUE? Todos os que no forem faltantes, certo? Ento a soma
total desses valores ser igual ao nmero de valores no faltantes.
Muito bem, mas veja s a comparao da distribuio emprica (em preto) com a terica
(em azul). O que acha? Normalzinha?

Q-Q plots

Bem, vamos dar uma rpida olhada no q-q plot. Literalmente significa grfico quantil-
quantil. Ficou difcil? No se preocupe. Na verdade a mesma coisa que ns j fizemos na nossa
distribuio emprica, s que desenhados em uma nica curva (em vez de 2, como fizemos na seo
anterior.) Vamos tentar:

7
qqnorm(igf1)

Repare nos nomes dos eixos do grfico: estamos comparando os quantis observados com os
quantis tericos. Foi exatamente o que fizemos antes. Vamos tentar? Vamos usar ento aquela
funo que ns vimos anteriormente, mas vamos calcular vrios quantis e depois vamos plotar
quantis de uma Normal (0,1) contra os quantis reais de :

quantis <- seq(0,1,0.001)


plot(quantile(rnorm(1018),quantis), quantile(igf1,quantis,na.rm=T))

Achou parecido com o grfico anterior? No lembra? Vamos ver lado a lado:

par(mfrow=c(1,2))
qqnorm(igf1)
plot(quantile(rnorm(1018),quantis), quantile(igf1,quantis,na.rm=T))
par(mfrow=c(1,1))

8
Elas no so exatamente iguais porque ns geramos a normal ao fazer o grfico, mas a idia
a mesma. Para ser normal, a curva deveria ser uma reta diagonal.

Boxplots

Bem, o boxplot foi bem explicado no mdulo bsico, mas para aqueles que no pegaram a
explicao, vamos repetir aqui. Vamos fazer um primeiro:

boxplot(igf1)

A linha central do retngulo (que seria a nossa caixa) representa a mediana da


distribuio. As bordas superior e inferior do retngulo representam os percentis 25 e 75,
respectivamente (tambm conhecidos como primeiro e terceiro quarts, respectivamente). Logo, a
altura deste retngulo chamada de distribuio interquartilar (DI). Os traos horizontais ao final
das linhas verticais so traados sobre o ltimo ponto (de um lado ou de outro) que no
considerado um outlier.
No caso do boxplot em geral, existe uma definio formal de outlier, que adotada pelo R.
A maior parte das definies considera que pontos acima do valor do 3 quartil somado a 1,5 vezes
a DI ou os pontos abaixo do valor do 1 quartil diminudo de 1,5 vezes a DI so considerados
outliers. Esses pontos so assinalados (no nosso exemplo, tivemos 2 outliers, um para cada lado). A
figura acima mostra como isso funciona esquematicamente.

Outlier

ltimo ponto
superior

3 quartil
Limites para
outliers Mediana

1 quartil

ltimo ponto
inferior

Outlier

Agora voc deve estar se perguntando se esse boxplot que voc fez no R poderia conter
mais informao e ser esteticamente mais apresentvel, por exemplo se voc quiser utiliz-lo num

9
documento ou numa apresentao em uma aula, etc. Claro que podemos. Vamos ver algumas
opes para o nosso grfico:

boxplot(igf1, main="Boxplot da IGF-I", ylab="microgramas/litro",


sub=paste("Observaes:", "\n", "Total =",length(igf1), "\n", "Missing =",
sum(is.na(igf1)), sep=" " ), col="blue")

Veja o resultado:

Boxplot da IGF-I
800
600
400
200
0

Observaes:
Total = 1339
Missing = 321

Para finalizar, vamos dar uma olhada em uma funo muito interessante que foi escrita
inicialmetne para o S-Plus, mas que foi passada para o R e disponibilizada pelo nosso guru, o
Professor Oswaldo Cruz:

eda <- function(x, na.rm=FALSE)


{
require(ctest)
if (!is.numeric(x) || !is.vector(x)) {
stop("argumento no vetor ou no numerico ")
}
old.par <- par(mfrow = c(2, 2), oma = c(1, 1, 2, 1))

10
densi <- density(x, na.rm=na.rm)
xli <- range(densi$x)
yli <- range(densi$y)
hist(x,col="red",probability = T,xlim = xli, ylim =
yli,main=paste("Histograma de ",deparse(substitute(x))), ylab="Densidade",
xlab="")
lines(densi,lwd=2)
boxplot(x,col="limegreen", main=paste("Boxplot de
",deparse(substitute(x))))
points(1, mean(x), pch = 16,cex=1,col="blue")
qqnorm(x, xlab="Quantis Tericos", ylab="Quantis da Amostra",
sub="",main="qq-plot Normal")
qqline(x,col="orange",lwd=2)
plot(seq(1:50),seq(1:50),axes=F,type="n",ylab="",xlab="")
lugarnomes <- list(x=c(24,24,24,24,24,24),y=c(50,42,34,26,18,10))
text(lugarnomes,c("Minimo =","1Quartil =","Mediana =","Mdia
=","3Quartil=","Maximo ="),adj=1)
lugx=c(25,25,25,25,25,25)
lugy=c(50,42,34,26,18,10)
text(lugx,lugy,summary(x),adj=0)
par(old.par)
title("Sumrio")
}

Veja s o resultado muito bom que se consegue pra um rpido resumo descritivo da nossa
varivel igf1:

eda(igf1, na.rm=T)

Bem legal, no?

Descrio univariada por grupos

Nesta seo, discutiremos a descrio de uma varivel por grupos. Esta abordagem usada
para mostrar variveis contnuas por determinados subgrupos. Por exemplo, digamos que voc quer
saber se os nveis de IGF-I varia de acordo com as categorias de sexo e classificao de Tanner. Na
verdade, queremos a descrio desses dados por grupos de sexo ou de classificao.

Estatsticas-resumo

Comecemos pelas estatsticas-resumo. A maneira mais fcil de se fazer isso no R usando a


funo tapply() . Ela vai aplicar uma outra funo a uma tabela qualquer. Esta tabela vai ser
definida como o cruzamento de duas variveis: a que voc quer aplicar a funo e a varivel de
agrupamento. Assim, se eu quiser saber a mdia de IGF-I por sexo:

> tapply(igf1,sex,mean)
M F
NA NA

Hum... parece que o nosso problema com dados faltantes est presente aqui tambm...
Vamos pedir ento para a funo retir-los:

> tapply(igf1,sex,mean,na.rm=T)
M F
310.8866 368.1006

Bem melhor... Repare que a funo mean() passada sem os parnteses. Vamos fazer o
mesmo com a classificao:

11
> tapply(igf1,tanner,mean,na.rm=T)
I II III IV V
207.4727 352.6714 483.2222 513.0172 465.3344

Ah, e podemos tambm usar a nossa funo summary():

> tapply(igf1,tanner,summary)
$I
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
29.0 151.0 201.0 207.5 259.0 624.0 204.0

$II
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
157.0 269.5 341.5 352.7 443.3 682.0 33.0

$III
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
167.0 383.0 474.0 483.2 553.0 868.0 27.0

$IV
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
321.0 447.5 500.0 513.0 574.0 915.0 23.0

$V
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
100.0 389.8 452.0 465.3 528.0 914.0 20.0

Nada mal... E com o R ns podemos criar funes personalizadas para apresentar vrias
estatsticas por grupos. Vamos a um exemplo:

resumo.grupo <- function (x, y, na.rm=F)


{
min <- tapply(x, y, min, na.rm=na.rm)
max <- tapply(x, y, max, na.rm=na.rm)
mediana <- tapply(x, y, median, na.rm=na.rm)
media <- tapply(x, y, mean, na.rm=na.rm)
sd <- tapply(x, y, sd, na.rm=na.rm)
cbind(Mnimo=min, Mximo=max, Mediana=mediana, Mdia=media, DP=sd)
}

Esta funo vai nos dar uma sada composta de estatsticas bsicas, num formato mais
confortvel. Vamos testar:

> resumo.grupo(igf1,sex,na.rm=T)

Mnimo Mximo Mediana Mdia DP


M 29 915 280 310.8866 169.7136
F 25 914 352 368.1006 167.3476

Que tal?

Grficos

Obviamente, podemos utilizar grficos tambm para descrever variveis por grupos. Na
verdade so os mesmos grficos que ns j vimos antes, porm separados, ou estratificados por
grupos.

Histogramas

12
Muitas vezes interessante observar a distribuio de uma varivel por grupos. Para este
fim, podemos utilizar histogramas estratificados por categoria tambm. Vamos ver uma maneira
suja e rpida de obter histogramas por grupos

par(mfrow=c(3,1))
hist(igf1)
by(igf1,sex,hist)
par(mfrow=c(1,1))

Veja o que aconteceu: Primeiro ns dividimos a tela grfica em 3 linhas e uma coluna,
depois fizemos o histograma para a IGF-I sem dividir por grupos e em seguida usamos a funo
by() para fazer os histogramas da IGF-I por categoria de sexo. Eu chamei de rpida e suja, porque
na sada no temos os ttulos apropriados para os grficos, e alm disso, o R cospe uma sada em
texto na tela... No se preocupe: esse texto contm todas as informaes sobre os histogramas que
voc acabou de plotar, alm de dizer que grupos foram usados: primeiro foram os homens e depois
as mulheres. Para apresentar no est muito bom, de jeito nenhum, mas d para ter uma idia. Para
uma sada mais elegante, poderamos usar:

par(mfrow=c(3,1))
hist(igf1, main="Histograma de IGF-I - Total", xlab="IGF-I",
ylab="Densidade", col="red", freq=F)
hist(igf1[sex=="M"], main="Histograma de IGF-I para Homens", xlab="IGF-I",
ylab="Densidade", col="red", freq=F)
hist(igf1[sex=="F"], main="Histograma de IGF-I para Mulheres", xlab="IGF-
I", ylab="Densidade", col="red", freq=F)
par(mfrow=c(1,1))

Veja o resultado:

13
Histograma de IGF-I - Total

0.0020
0.0010
0.0000

0 200 400 600 800 1000

IGF-I

Histograma de IGF-I para Homens


0.0020
0.0010
0.0000

0 200 400 600 800 1000

IGF-I

Histograma de IGF-I para Mulheres


0.0020
0.0010
0.0000

0 200 400 600 800 1000

IGF-I

Boxplots

Assim como histogramas, os boxplots tambm podem ser feitos por grupos. Vamos ver
como funciona a sintaxe do boxplot, com alguns detalhes para ficar mais apresentveis:

boxplot(igf1~sex, col="blue", main="Boxplot de IGF-I por Sexo")

Repare no til que ns usamos entre a varivel igf1 e o sexo, que a varivel de
agrupamento. Esse til significa por neste caso. Ns ainda vamos us-lo muito quando
aprendermos modelos lineares mais adiante.
s vezes tambm interessante dispor os boxplots em conformao horizontal. Veja um
exemplo:

boxplot(igf1~tanner, col="blue", main="Boxplot de IGF-I por Classificao


de Tanner", horizontal=T)

Por ltimo, vou mencionar uma caracterstica muito interessante disponvel no R. a


colocao de uma indentao no boxplot, chamada notch. A utilidade disso que os boxplots de

14
grupos cujas indentaes no se sobrepuserem tm suas medianas significativamente diferentes
para um nvel de 0.05. Veja como :

boxplot(igf1~sex, col="blue", main="Boxplot de IGF-I por Sexo", notch=T)

Boxplot de IGF-I por Sexo


800
600
400
200
0

M F

Como se observa, a mediana de IGF-I para os homens significativamente diferente da


mediana de IGF-I para as mulheres (as indentaes no se sobrepem.)

Descrio de dados categricos

At agora discutimos como descrever variveis contnuas, seja o seu total ou dividida por
categorias de uma outra varivel. Mas e quando queremos estudar tambm a prpria varivel
categrica? Nesse caso, vamos usar ferramentas diferentes daquelas usadas para as variveis
contnuas.

Tabelas

A forma mais usual e simples de se descrever dados categricos com o uso de tabelas de
contingncia. Com o R possvel construir essas tabelas, mas no h um instrumental adequado
para uma formatao de alto nvel para apresentao de dados em um documento ou para a
preparao de slides. Como j mostrado no mdulo Entrada e Sada de Dados no R, essas tabelas
podem ser exportadas facilmente para o formato CSV que pode ser lido por diversos programas
tanto estatsticos como planilhas eletrnicas.
Vamos usar o mesmo banco que vnhamos usando para exemplificar. Vamos estudar as
relaes entre as variveis categricas nesse banco. Comeando por uma tabulao para cada
varivel:

15
> table(sex)
sex
M F
621 713

> table(menarche)
menarche
No Sim
369 335

> table(tanner)
tanner
I II III IV V
515 103 72 81 328

Podemos tambm fazer tabelas de dupla entrada, claro:

> table(sex,tanner)
tanner
sex I II III IV V
M 291 55 34 41 124
F 224 48 38 40 204

> table(menarche,tanner)
tanner
menarche I II III IV V
No 221 43 32 14 2
Sim 1 1 5 26 202

E at mesmo de tripla entrada, embora neste caso isso no faa sentido...

table(menarche,tanner, sex)

A essas alturas, voc deve estar estranhando um pouco essas tabelas que o R est fazendo,
no? Pois : elas no tm as marginais, ou seja os totais das linhas e das colunas. Outra questo se
voc estivesse querendo uma tabela de propores e no de nmeros absolutos. Bem, para facilitar
a vida, vamos criar uma funo para que possamos escolher o tipo de tabela que queremos:

tabela.2x2 <- function(..., margens=F, prop=c("no", "colunas", "linhas",


"total"), arred=3)
{
if (margens && prop!="no") {stop("No ajuda muito fazer propores
com marginais... Tente de novo")}
z <- table(...)
nnm <- names(dimnames(x))
if (prop=="colunas")
{
z <- prop.table(z,2)
}
if (prop=="linhas")
{
z <- prop.table(z,1)
}
if (prop=="total")
{
z <- z/sum(z)
}
if (margens && prop=="no")
{
z <- cbind(z, Total=apply(z,1,sum))
z<-rbind(z, Total=apply(z,2,sum))
}

16
names(dimnames(z))<-nnm
round(z, arred)
}

No chega a ser um primor de funo, mas d para fazer algumas brincadeiras. Por exemplo,
vamos tentar fazer uma tabela com as margens:

> tabela.2x2(menarche,tanner, margens=T)


tanner
menarche I II III IV V Total
No 221 43 32 14 2 312
Sim 1 1 5 26 202 235
Total 222 44 37 40 204 547

Podemos tambm obter tabelas com propores, tanto em relao s colunas como linhas e
tambm com relao ao total geral da tabela. Vamo tentar para as colunas:

> tabela.2x2(menarche,tanner, prop="colunas")


tanner
menarche I II III IV V
No 0.995 0.977 0.865 0.35 0.01
Sim 0.005 0.023 0.135 0.65 0.99

Repare que as colunas que somam 1 e no as linhas. Voc capaz de sugerir como
poderamos obter percentagens em vez de propores para estas sadas?

Grficos

Ao contrrio dos grficos que vimos para variveis contnuas, que so realmente muito bons
tanto sob o ponto de vista de utilidade quanto sob o ponto de vista esttico, j no caso das
representaes grficas de tabelas, que seriam os grficos tipo barra e pizza, que em geral precisam
de legendas, o R fica um pouco mais complicado para obter-se um resultado satisfatrio. Muitas
vezes ser mais til exportar a tabela para uma planilha eletrnica. De qualquer forma, vamos ver
como isso pode ser feito no R.
Vamos iniciar pelo grfico de barras. Podemos usar a nossa funo para tabelas 2x2
personalizadas para nos ajudar, por exemplo a fazer um grfico de barras com as propores de
sexo e Classificao de Tanner em relao ao total. Vamos ver como fica, fazendo de duas maneiras
diferentes e com barras verticais e horizontais:

par(mfrow=c(2,2))
barplot(100*tabela.2x2(sex,tanner, prop="total"), legend.text=T,
main="Distribuio do Sexo pela Classificao de Tanner", ylim=c(0,50), ylab="%
do Total")
barplot(100*tabela.2x2(tanner,sex, prop="total"), legend.text=T,
main="Distribuio da Classificao de Tanner por Sexo", ylim=c(0,50), ylab="%
do Total", beside=T)
barplot(100*tabela.2x2(sex,tanner, prop="total"), legend.text=T,
main="Distribuio do Sexo pela Classificao de Tanner", xlim=c(0,50), xlab="%
do Total", horiz = T)
barplot(100*tabela.2x2(tanner,sex, prop="total"), legend.text=T,
main="Distribuio da Classificao de Tanner por Sexo", xlim=c(0,50), xlab="%
do Total", beside=T, horiz = T)
par(mfrow=c(1,1))

Se voc estiver curioso para saber o que realmente est sendo plotado, veja o resultado das
tabelas, por exemplo, a primeira:

17
100*tabela.2x2(sex,tanner, prop="total")

Observe que o argumento beside=T faz com que as barras no sejam aglomeradas para a
mesma categoria (o default aglomerar) e que o argumento horiz = T faz com que as barras sejam
horizontais (default vertical.)
A essas alturas, voc deve estar se perguntando porque eu fui to duro com esse tipo de
grfico no R... Bem, que o controle da posio da legenda no uma tarefa muito fcil e o R nem
sempre acerta o local ideal para coloc-la. Por exemplo, tente fazer um grfico de propores por
colunas:

barplot(100*tabela.2x2(sex,tanner, prop="colunas"), legend.text=T,


main="Distribuio do Sexo pela Classificao de Tanner", ylab="% sexo")

Entendeu o que eu quis dizer? A maneira de driblar o R seria aumentar os limites do eixo y:

barplot(100*tabela.2x2(sex,tanner, prop="colunas"), legend.text=T,


main="Distribuio do Sexo pela Classificao de Tanner", ylab="% sexo",
ylim=c(0,120))

Mas isso no l muito elegante, ?


Bem, o outro tipo de grfico o famoso grfico de pizza (ou torta, depende do fregus...)
Tambm um grfico meramente ilustrativo, e podemos por exemplo us-lo para mostrar a mesma
coisa que j mostramos com o grfico de barras. Vamos a um exemplo:

par(mfrow=c(1,2))
pie(tabela.2x2(sex,tanner)["M",], main="Homens")
pie(tabela.2x2(sex,tanner)["F",], main="Mulheres")
par(mfrow=c(1,1))

Essas lindas cores podem ser alteradas, com o argumento col. Tente brincar com esses
grficos para ver se eles lhe agradam...

18
Exerccios

1. Para uma distribuio Normal, calcule a massa de probabilidade contida no intervalo


interquartilar e tambm entre os limites superior e inferior de um boxplot (corresponderia
probabilidade de um ponto no ser um outlier.) Exemplifique com um grfico.

2. Escolha um banco de dados qualquer pode ser um banco com o qual voc trabalha, ou
um banco que voc baixou da internet ou at mesmo um banco de exemplo do R, qualquer
um. Apresente uma anlise descritiva das principais variveis encontradas nesse banco,
como se fosse o material que voc enviaria para uma publicao em uma revista. Note que
no h nenhuma obrigao em se fazer este trabalho no R. Note tambm que o material a
ser entregue o mesmo que voc mandaria para uma publicao, o que exclui
completamente respostas escritas a mo.

19
Exerccios

Aula 2 Estatstica descritiva


Livro: pginas 57 a 80

1. Para uma distribuio Normal, calcule a massa de probabilidade contida no intervalo


interquartilar e tambm entre os limites superior e inferior de um boxplot (corresponderia
probabilidade de um ponto no ser um outlier.) Exemplifique com um grfico.

Bem, a primeira parte da pergunta para ser feita de cabea. A resposta 0.5 e acho que
dispensa maiores explicaes. A segunda parte mais complicada e devemos usar algum cdigo
para resolv-la (claro que isso poderia ter sido feito mo tambm.) Inicialmente vamos calcular os
quantis de uma Normal (0,1) terica que delimitam a distncia interquartilar:

> qnorm(.25)
[1] -0.6744898
> qnorm(.75)
[1] 0.6744898

Como esperado, so valores simtricos. Para conferir, sabendo que teoricamente a densidade
dessa rea deve ser 0.5, vamos fazer:

> pnorm(qnorm(.75))-pnorm(qnorm(.25))
[1] 0.5

Confere. Agora vamos calcular a distncia entre os quartis. A forma mais fcil :

> 2*qnorm(.75)
[1] 1.348980

Em seguida, devemos multiplicar essa distncia por 1.5:

> 1.5*2*qnorm(.75)
[1] 2.023469

E em seguida temos que subtrair esse valor do primeiro quartil e som-lo ao terceiro quartil,
ambos calculados acima, para obter os limites que estamos procurando:

> qnorm(.25)-1.5*2*qnorm(.75)
[1] -2.697959
> qnorm(.75)+1.5*2*qnorm(.75)
[1] 2.697959

Novamente, como esperado, so valores simtricos. Agora basta calcular a rea sob a curva
entre esses limites

> pnorm(qnorm(.75)+1.5*2*qnorm(.75))-pnorm(qnorm(.25)-1.5*2*qnorm(.75))
[1] 0.9930234

O grfico deve ser obviamente um boxplot, que para ilustrar essas questes poderia ser feito
com uma simulao de muitos pontos de uma Normal (0,1) e poderamos traar linhas horizontais
demarcando os limites que calculamos sobre o boxplot. Algo assim:

boxplot(rnorm(10000))

1
abline(h=qnorm(.25))
abline(h=qnorm(.75))
abline(h=qnorm(.25)-1.5*2*qnorm(.75))
abline(h=qnorm(.75)+1.5*2*qnorm(.75))
4
2
0
-2
-4

Notou algo de anormal com esse boxplot? Alguma explicao para isso? Quem me
entregar essa resposta certa e por escrito na prxima aula, ganhar 0.1 de bnus.

2
2.
Escolha um banco de dados qualquer pode ser um banco com o qual voc trabalha, ou
um banco que voc baixou da internet ou at mesmo um banco de exemplo do R, qualquer
um. Apresente uma anlise descritiva das principais variveis encontradas nesse banco,
como se fosse o material que voc enviaria para uma publicao em uma revista. Note que
no h nenhuma obrigao em se fazer este trabalho no R. Note tambm que o material a
ser entregue o mesmo que voc mandaria para uma publicao, o que exclui
completamente respostas escritas a mo.

Evidentemente esse exerccio no tem uma resposta fixa. Ele consiste em escolher um banco
de dados qualquer e fazer uma descrio de variveis contidas nesse banco, como se fosse parte dos
resultados que voc entregaria para publicao, o que significa que a qualidade grfica importante
tambm. Basta usar as sadas de qualquer programa. Por exemplo, usando o R para descrever o
banco juul:

Por exemplo, para uma descrio univariada das variveis contnuas, poderamos usar a
funo eda():

Figura 1 Resumo Estatstico da Quantidade de IGF-I

3
Figura 2 Resumo Estatstico da Idade dos Participantes

Poderamos tambm usar comparaes por categorias. Como o nosso interesse neste banco
a IGF-I, podemos usar Box-plots para comparar:

4
Boxplot de IGF-I por T anner Boxplot de IGF-I por Sexo

800

800
600
600

400
400

200
200

0
0

I II III IV V M F

Classificao de Tanner Sexo

Claro que poderamos usar tabelas tambm:

Quadro 1 Resumo Estatstico da IGF-I por Categorias de Sexo e Classificao de Tannner

Varivel Categoria Mnimo Mximo Mediana Mdia DP


Masculino 29 915 280 310.9 169.71
Sexo
Feminino 25 914 352 368.1 167.35
I 29 624 201 207.47 90.27
II 157 682 341.5 352.67 122.59
Tanner III 167 868 474 483.22 152.29
IV 321 915 500 513.02 119.1
V 100 914 452 465.33 134.42

Enfim, so apenas exemplos. Voc pode inventar a apresentao que quiser!!!


Claro que isso deve ser acompanhado de uma descrio propriamente dita desses grficos e
tabelas. Deixo isso para um exerccio extra para voc... Quem me entregar essa resposta certa e por
escrito at Sexta-Feira que vem, ganhar 0.1 de bnus. Obs.: Nesse caso, por escrito no escrito
a mo!!!

5
Mdulo Estatstica I no R
Autor: Antonio Guilherme Fonseca Pacheco

Pr-requisitos: Conhecimento prvio do ambiente R. Especificamente, o leitor deve estar


familiarizado com os mdulos Bsico, Entrada e Sada de Dados e tambm Manuseando
dados no R.

Bibliotecas necessrias: ISwR

Aula 3 Distribuies amostrais


Livro: NA

Mistrios da Estatstica
O TLC
A distribuio amostral da mdia e o Intervalo de Confiana
As varincias da populao e da amostra
Exerccios

O contedo desta aula no est disponvel no nosso livro texto de referncia. Ns achamos,
porm, que ele vai nos ajudar a explicar melhor alguns conceitos, fundamentais para se entender
com mais clareza questes de inferncia e testes de hipteses que sero vistos mais adiante, usando
o que ns j vimos como base para esta aula.
Uma primeira questo que deve surgir muito cedo na cabea de qualquer pessoa que comea
a aprender estatstica como possvel acreditar no Teorema do Limite Central (TLC) sem nunca
ter visto como ele funciona na prtica. Bem, quando voc l em um livro de estatstica que a
distribuio da mdia amostral de uma populao normal normal, acredito que intuitivamente
voc concorde (sem talvez entender muito bem o que isso quer dizer), mas e quando voc l que a
distribuio da mdia amostral de qualquer distribuio converge assintoticamente (na verdade
converge em distribuio, mas isso outro assunto...) para uma normal, eu no creio que esse
conceito fique entendido e assimilado na cabea de quem l.
A primeira questo aqui entender que, apesar da mdia amostral ser bem intuitiva e, como
voc deve se lembrar, o seu clculo feito da mesma maneira que o clculo da mdia da populao,
ela na verdade uma varivel aleatria (e no um nmero!!!) e que portanto ela tem uma
determinada distribuio. A sua prxima pergunta : mas ento quando eu calculo a presso arterial
mdia dos meus pacientes, essa medida no um nmero???
Vamos por partes... um nmero, sem dvida, mas ele representa a mdia de uma nica
amostra da sua populao e a ele estar associado uma probabilidade de estar suficientemente
prximo da verdadeira mdia da populao (a qual eu nunca conhecerei com certeza, a menos que
realize um censo nesta populao). por causa desta noo que eu usei de forma livre aqui e
espero que nenhum estatstico esteja por perto, pois ele pode ter um troo que ns usamos sempre
um estimador intervalar (o nosso conhecido intervalo de confiana.)
Como vocs devem saber, o intervalo de confiana representa um intervalo numrico tal
que, se ns retirssemos k amostras de tamanho n de uma populao, para um k suficientemente
grande, aproximadamente 95% dos k intervalos, calculados a partir de cada uma das amostras,
conteriam o verdadeiro valor da mdia da populao (claro que voc j concluiu que isso para um
intervalo de confiana 95% da mdia, n?)
Ah, e tem ainda a misteriosa varincia da amostra, que por incrvel que parea no
estimada corretamente pela mesma frmula usada para a varincia da populao, mas que como a
mdia tambm uma varivel aleatria (algum lembra qual a sua distribuio???)

1
O TLC

Bom, chega de papo e vamos tentar entender alguns desses mistrios com a ajuda do R.
Vamos comear pelo TLC. Vamos verificar que, dada uma distribuio qualquer, a distribuio da
mdia amostral converge para uma distribuio normal, com mdia x , igual mdia da
populao e varincia 2 / n , ou seja, a varincia da populao sobre o tamanho da amostra.
Bem, vamos ver como isso funciona, ento?
A idia inicial gerar uma amostra de uma distribuio qualquer e depois usar uma funo
que voc j deve ter visto para retirar amostras dessa distribuio, que ser considerada a minha
populao sobre a qual queremos fazer inferncias. Para visualizarmos a distribuio da mdia
amostral, no precisamos retirar todas as possveis amostras (at porque seria muito trabalhoso, por
exemplo obter todas as possveis amostras de n = 30 de uma populao de N = 1000. Isso daria nada
menos que 1000
30
experimente fazer a conta no R com a funo:

choose(1000, 30)

Grandinho o nmero, n?
;-)
E olha que isso seria sem reposio!!! Na verdade a toda a teoria amostral desenvolvida
para casos com reposio. Algum se arrisca dizer qual seria o nmero total de amostras com
reposio neste caso? Pois : 100030 ou 10 32 , diria que bastante trabalhoso...
Em vez disso, vamos retirar umas 500 amostras mais ou menos e ver o que acontece com
esta distribuio. Para facilitar a nossa vida, vamos usar uma funo que eu inventei, e vamos ver se
conseguimos entender o que se passa:
histo.mean <- function(x, n=2, b=500)
#x um vetor com uma distribuio populacional; n o tamanho de cada amostra e b o nmero
de amostras
{
z <- mat.or.vec(0,1) #Inicializao do vetor z
for (i in 1:b) #Loop para obter as mdias das b amostras
{
z[i] <- mean(sample(x,n)) #O verdadeiro truque
}
w <- list("n" = n, "mean.pop"=mean(x), "var.pop" = (length(x)-1)*var(x)/length(x))
#Adicionando a mdia e a varincia da populao
w$mean.sampl <- mean(z) #Acrescentando a mdia amostral
w$var.mean.sampl <- var(z) #Acrescentando a varincia amostral
hist(z, main="Histograma da mdia amostral de x") #Fazendo o Histograma
w
}

Sinto que neste momento o desespero tomou conta de voc... Calma, nem tudo est
perdido... Eu coloquei alguns comentrios (tudo o que for seguido do smbolo #) que explica cada
um dos passos dessa funo. Tente entender o que est acontecendo. Em resumo, essa funo pega
um vetor x com uma distribuio qualquer, tira b amostras (500 por default) de tamanho n (2 por
default.) Com isso, a funo calcula a mdia dessas 500 amostras e as armazena num vetor z. Ento
uma lista criada com algumas informaes teis tanto com respeito populao quanto s
amostras (experimente a funo mais tarde para entender melhor.) Por ltimo, um histograma das
mdias amostrais desenhado.
Voc j deve saber que para utilizar esta funo, basta marc-la, copi-la e col-la no
prompt do R. Bem, ento vamos comear a brincar. Vamos fabricar uma distribuio, digamos
normal para comear... Vamos assumir que temos 1000 idosos, dos quais ns queremos estudar a
presso arterial mdia (PAM), onde a mdia em torno de 100 mmHg e a varincia de 16
mmHg2:

2
x <- rnorm(1000, mean=100, sd=4)

Agora vamos usar a nossa funo para construir uma distribuio de 500 amostras dessas
1000 PAMs d n = 2 ( isso mesmo, a nossa amostrinha s de 2):

> histo.mean(x)
$n
[1] 2

$mean.pop
[1] 100.078

$var.pop
[1] 16.74125

$mean.sampl
[1] 100.1585

$var.mean.sampl
[1] 8.1367

Histograma da mdia amostral de x


120
100
80
60
40
20
0

90 95 100 105 110

3
Voc deve ter notado que alm dessa sada acima (que deve ser diferente para voc, claro,
j que a nossa populao foi gerada aleatoriamente!!!), um histograma tambm foi gerado, como
voc deve ter visto na sua sesso do R. Surpreso com os resultados? isso mesmo: ainda que a
nossa amostrinha tenha sido de apenas 2 observaes, a sua distribuio bastante normal, sua
mdia bastante prxima da mdia da populao (compare a sada mean.pop e mean.sampl
acima.) Alm disso, a sua varincia (da mdia) bastante prxima da metade da varincia da
populao (ou seja, a varincia da populao dividida pelo tamanho da amostra.)
Bem, mas por enquanto no teve graa, n? A populao j tinha uma distribuio normal,
ento no surpreende muito que a distribuio da mdia amostral seja normal tambm...
Vamos brincar um pouco agora com distribuies populacionais bem diferentes da normal.
Que tal comearmos pela uniforme?

x <- runif(1000)
Como voc deve se lembrar, esta distribuio muito diferente da normal. Confira:

> hist(x)

Histogram of x
100
80
60
40
20
0

0.0 0.2 0.4 0.6 0.8 1.0

Veja agora o que acontece com a distribuio amostral da mdia com o n = 2:

4
histo.mean(x)

Bom, agora eu acho que voc ficou surpreso: aposto como o resultado foi muito parecido
com o da populao com distribuio normal... Na verdade, existe um motivo para isso, mas a
explicao foge ao escopo deste material.
Vamos radicalizar ento e simular uma distribuio bastante assimtrica, e vamos aproveitar
para usar uma distribuio discreta. Sugestes? Que tal uma Binomial com p = 0.2 e n = 1? No
confunda este n com o tamanho da amostra: aqui trata-se do parmetro da Binomial, significando
que estamos realizando 1 experimento apenas e medindo o nmero de sucessos ou seja, o vetor
gerado ser composto de nmeros 0 e 1.) Lembra o nome dessa Binomial especial?

x <- rbinom(1000, p=0.2, size=1)

Confira o histograma desta distribuio. Observe como ela assimtrica, e que ela s
assume 2 valores inteiros. Faa:

table(x)

Essa poderia ser a distribuio de um desfecho binrio qualquer do tipo doente/sadio, por
exemplo. Vamos fazer ento a seguinte brincadeira: vamos usar a nossa funo mgica par para
plotarmos 9 grficos em uma mesma janela. O primeiro vai ser o histograma da distribuio de x e
os outros, histogramas amostrais da mdia com tamanhos da amostra crescentes:

par(mfrow=c(3,3))
hist(x)
histo.mean(x)
histo.mean(x,5)
histo.mean(x,10)
histo.mean(x,15)
histo.mean(x,20)
histo.mean(x,25)
histo.mean(x,30)
histo.mean(x,100)
par(mfrow=c(1,1))

Alm da sada que ns j discutimos, o grfico final que eu obtive mostrado abaixo
apesar da falta de legenda para saber qual o n para cada um deles, voc deve ter decifrado isso
pelo cdigo acima. Veja o que aconteceu: Ao aumentarmos o tamanho da amostra, a distribuio da
mdia amostral foi se aproximando de uma distribuio normal. Aproveite para conferir tambm as
mdias e varincias dessas distribuies. Veja se tambm no seguem a nossa regrinha do TLC.

5
Histogram of x Histograma da mdia amostral de x Histograma da mdia amostral de x

200
100 150 200 250
600

150
400

100
200

50
50
0

0
0.0 0.2 0.4 0.6 0.8 1.0 0.0 0.2 0.4 0.6 0.8 1.0 0.0 0.2 0.4 0.6 0.8

x z z

Histograma da mdia amostral de x Histograma da mdia amostral de x Histograma da mdia amostral de x


150

100

80
100

80

60
60

40
40
50

20
20
0

0
0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.0 0.1 0.2 0.3 0.4 0.5 0.0 0.1 0.2 0.3 0.4 0.5

z z z

Histograma da mdia amostral de x Histograma da mdia amostral de x Histograma da mdia amostral de x


150

100
150

80
100
100

60
40
50
50

20
0

0.0 0.1 0.2 0.3 0.4 0.5 0.0 0.1 0.2 0.3 0.4 0.5 0.15 0.20 0.25 0.30 0.35

z z z

Achou pouco os exemplos? No se preocupe, tem um exerccio bem legal sobre isso para
voc treinar e se divertir...
Muito bem. At agora mostramos como o TLC funciona na prtica, mas ainda falta mostrar,
para a mdia, como funciona essa histria do intervalo de confiana para a mdia, que justamente
baseado nesse teorema.

A distribuio amostral da mdia e o Intervalo de Confiana

Vamos agora trabalhar com uma situao menos real, mas que nos permitir tirar algumas
concluses importantes a respeito ainda da mdia amostral, e tambm do seu intervalo de confiana,
fazendo as distribuies completas da mdia amostral claro que agora precisamos de uma
populao e amostras menores para no termos que lidar com nmeros gigantescos.
Digamos que ns queiramos a partir de uma populao de 10 notas de alunos, estimar a
mdia da turma com amostras de 2 ou de 3 alunos apenas. Vamos assumir que essas notas tm
distribuio normal, com mdia aproximadamente 7 e desvio-padro de 1. Como somos
preguiosos, vamos usar o R para nos fazer uma distribuio assim:

notas <- round(rnorm(10,7,1),1)


notas
[1] 6.8 5.0 7.4 6.3 7.2 7.1 7.0 6.4 9.4 7.5

6
Note que como eu gerei essas notas, no necessariamente elas tero mdia 7 e DP de 1.
Vamos ver o que temos nesse caso:

> mean(notas)
[1] 7.01
> sqrt((length(notas)-1)*var(notas)/length(notas))
[1] 1.053992

Para minha sorte, at que ficou bem perto... mas isso no importa, pois agora a mdia da
minha POPULAO 7.01 e o DP 1.05.
Voc reparou que eu no usei a funo sd() disponvel no R, no mesmo? Isso porque por
default o R calcula tanto a varincia quanto o desvio padro de uma amostra e no de uma
populao voc lembra a diferena? No? No faz mal, vamos falar bastante sobre isso mais
tarde, mas por ora, vamos logo usar uma funo para calcular a varincia da populao que eu
gerei, e que vai facilitar a nossa vida bastante:

var.pop <- function (x)


{
sum((x-mean(x))^2)/length(x)
}

Confira se o resultado o mesmo:

> sqrt(var.pop(notas))
[1] 1.053992

Acho que no preciso lembrar que o desvio-padro a raiz quadrada da varincia (a raiz
positiva, por conveno.) No se preocupe em entender o cdigo ainda, que ele ser melhor
explicado mais adiante.
Se voc quiser gerar a sua prpria populao de notas, apenas copie o cdigo acima, mas se
voc quiser seguir os exemplos exatamente como eu vou escrever aqui, copie o vetor:

notas <- c(6.8, 5.0, 7.4, 6.3, 7.2, 7.1, 7.0, 6.4, 9.4, 7.5)

Vamos comear a nossa brincadeira tomando todas as possveis amostras de tamanho 2 e 3


com reposio nesta populao. Quantas amostras so possveis?
Bem, de tamanho 2, so possveis 100 amostras, o que corresponde a todas as permutaes
possveis 2 a 2 de 10 observaes.
No caso do tamanho 3, teremos 1000 amostras, tambm correspondendo a todas as possveis
permutaes 3 a 3 de 10 observaes.
Repare que estamos fazendo a nossa brincadeira a partir de uma amostragem com reposio,
pois assim que desenvolvida toda a teoria amostral, e no como se faz geralmente na prtica,
onde no iremos entrevistar um mesmo paciente duas vezes, por exemplo... Mais tarde, veremos
qual a conseqncia dessa mudana.
Bem, vamos usar a ajuda do R para gerar as amostras e voc poder verificar os valores
mais tarde. Para isso vamos usar uma funo que calcula essas permutaes automaticamente:

7
permuta2.ou.3 <- function (x, N, n)
{
if (n!=2 && n!=3) stop("Esta funo para obter permutaes 2 a 2 ou 3 a 3 apenas")
z <- matrix(0, nrow=N^n,ncol=n)
z[,1] <- rep(x,each=N^(n-1))
z[,2] <- rep(x, times=N^(n-2), each=N^(n-2))
if (n==3)
{
z[,3] <- rep(x, times=N^(n-1))
}
z
}

Bem, agora basta voc fazer:

amostras.2 <- permuta2.ou.3(notas, 10,2)


amostras.3 <- permuta2.ou.3(notas, 10,3)

Com isso, criamos uma matriz 100x2 e outra 1000x3, sendo que cada linha dessas matrizes
uma das combinaes de amostras de tamanho 2 e 3, respectivamente. No entendeu? Ento
verifique o contedo do objeto amostras.2 e amostras.3!
Bem, agora que temos todas as possveis amostras, vamos calcular a mdia de cada uma
dessas amostras... Se voc est pensando que vai ter que calcular cada mdia na mo, enganou-se.
Vamos usar uma funo especial, bem parecida com uma outra funo que ns j utilizamos
(lembra?), para calcular a mdia de cada uma das linhas da nossa matriz (que so as amostras):

medias.2 <- apply(amostras.2,1,mean)


medias.3 <- apply(amostras.3,1,mean)

Aproveite para conferir se esses objetos contm o esperado...


Vamos ver qual a mdia e a varincia dessas mdias amostrais:

> mean(medias.2)
[1] 7.01
> mean(medias.3)
[1] 7.01
> > var.pop(medias.2)
[1] 0.55545
> var.pop(medias.3)
[1] 0.3703

Alguma surpresa? Confira... Veja que agora os nmeros so exatos e no mais aproximados.
Bem, agora vamos comparar a distribuio desta populao de notas com as suas
distribuies amostrais da mdia. Vamos fazer isso de uma maneira um pouco elaborada, com o
cdigo abaixo, cuja explicao ser deixada como exerccio:

par(mfrow=c(1,3))
hist(notas, freq=F, breaks=seq(4,10), ylim=c(0,0.8))
curve(dnorm(x,7.01,1.111006), from=4, to=10, add=T)
hist(medias.2, freq=F, breaks=seq(4,10), ylim=c(0,0.8))
curve(dnorm(x,7.01,sqrt(1.111006/2)), from=4, to=10, add=T)
hist(medias.3, freq=F, breaks=seq(4,10), ylim=c(0,0.8))
curve(dnorm(x,7.01,sqrt(1.111006/3)), from=4, to=10, add=T)
par(mfrow=c(1,1))

Vamos ver o resultado:

8
Ainda nenhuma surpresa: nada diferente do que j havamos feito com as amostras
anteriormente, ou seja as distribuies amostrais da mdia so normais, assim como a populao e
sua varincia diminui quando aumentamos o tamanho da amostra.
Tudo muito bonito, mas agora voc deve estar se perguntando: mas acontece que eu no tiro
todas as amostras possveis de uma populao (seria mais fcil fazer um censo, bolas!) O que ns
fazemos tirar UMA NICA amostra de tamanho 2 (e no 100 amostras) ou de tamanho 3 (e no
1000 amostras.)

E tem mais: voc deve estar pensando tambm no seguinte: como eu s tiro UMA amostra,
eu obterei UMA dessas mdias... Bem ns vimos que a mdia das mdias amostrais exatamente
igual mdia da populao, mas e a mdia que eu obterei da minha nica amostra? Qual ser a
chance dela ser igual mdia da populao? Isso fcil de calcular. Basta ns inspecionarmos o
vetor de mdias e ver quantas delas so iguais mdia da populao de notas. Depois, basta dividir
pelo total de mdias (100 para amostra de 2 e 1000 para amostra de 3.) Vamos usar um cdigo que
nos diz em que posio em um vetor se encontra um valor que queremos procurar:

> which(medias.2==mean(notas))
numeric(0)
> which(medias.3==mean(notas))
numeric(0)

EPA!!! Esse resultado est indicando que NENHUMA das mdias das amostras de
tamanhos 2 e 3 so iguais mdia da populao???!!!

9
Nem precisa tanta surpresa: ningum disse que a mdia de uma amostra ser igual mdia
da populao. Alis, para os nosso exemplos, no possvel obter-se a verdadeira mdia de jeito
nenhum... O que ns garantimos que em mdia esses valores so iguais mdia da populao.
Pode at parecer brincadeira, mas no ...
Mas ento, como podemos saber se a mdia que estamos obtendo de uma amostra est pelo
menos prxima da verdadeira mdia? De que me adianta todo esse trabalho, se eu no puder inferir
algo a esse respeito?
Bem, a que temos que lanar mo dos intervalos de confiana (IC), que representam um
intervalo numrico, construdo a partir da amostra, atravs do qual poderemos ter uma idia de o
quanto prximo da verdadeira mdia a nossa mdia amostral pode estar.
Ns vamos tentar demonstrar como isso funciona, atravs da prpria definio de um
intervalo de confiana. Por exemplo, a definio de um IC 95% para a mdia a seguinte: se ns
retirssemos k amostras de tamanho n de uma populao, para um k suficientemente grande,
aproximadamente 95% dos k ICs, calculados a partir de cada uma das amostras, conteriam o
verdadeiro valor da mdia da populao.
Duas observaes podem ser feitas. A primeira que nada dito sobre n nesse caso, isto ,
essa definio no depende do tamanho da amostra, ela ser vlida para qualquer tamanho (embora
para o caso de varincia da populao desconhecida, n deve ser no mnimo 2 voc sabe explicar
porque?)
A segunda observao sobre a afirmao para um k suficientemente grande. Essa forma
mais abrangente serve para incluir populaes consideradas infinitas, onde evidentemente o nmero
de amostras possveis ser igualmente infinito. Voc j notou que para o nosso exemplo aqui das
notas, essa populao finita, e fomos inclusive capazes de tirar TODAS as amostras possveis de
tamanhos 2 e 3.
Vamos comear ento a nossa brincadeira, e para facilitar a nossa vida, vamos trabalhar com
o nosso velho conhecido de IC 95% para a mdia.
Voc se lembra como se calcula um IC 95% para a mdia, usando a distribuio Normal?
Alis, por que mesmo posso usar a Normal aqui e posso dispensar a distribuio t de Student?
Bom, vamos refrescar o clculo:

x z 1 / 2 2 /n
Bem, para demonstrarmos como o IC funciona, segundo a definio que conhecemos,
poderamos construir todos os 100 IC 95% possveis para todas as amostras de tamanho 2 e
comparar isso com a verdadeira mdia da populao (lembrando que isso nunca mais vai acontecer
na sua vida profissional!!!)
Vamos usar o seguinte cdigo:

plot(medias.2,rep(mean(medias.2),100), type="b", ylim=c(0,15))


arrows(medias.2, medias.2+(qnorm(0.975)*sqrt(var.pop(notas)/2)), medias.2,
medias.2-(qnorm(0.975)*sqrt(var.pop(notas)/2)), angle=90, code=3, length=0.1)
points(medias.2, medias.2, pch=19)

O primeiro comando, como voc deve ter facilmente decifrado apenas vai desenhar o
grfico das mdias de cada uma das amostras contra um valor fixo, que a mdia total de todas as
mdias amostrais, feito pela funo rep(), que repete esse nmero 100 vezes. A opo type="b"
vai forar o aparecimento de pontos ligados por uma linha.
O segundo comando acrescenta a esse grfico pontos do tipo alto e baixo, que na
verdade os limites superiores e inferiores de cada um dos ICs para cada uma das amostras.
Finalmente o ltimo comando insere no grfico as mdias de cada uma das amostras.
Sem entrar em detalhes como funciona essa funo arrows(), vamos nos deter um pouco
mais no cdigo que foi usado para criar o intervalo o grfico:

medias.2+(qnorm(0.975)*sqrt(var.pop(notas)/2))

10
medias.2-(qnorm(0.975)*sqrt(var.pop(notas)/2))

e comparar com a a equao que ns conhecemos


2
x z 1 / 2 /n
Acho que no h dvida quanto a se escrever esta equao em suas linhas, separando o +
do -. O que pode ser um pouco confuso se voc se esqueceu da capacidade do R de fazer
operaes vetoriais o que ns estamos fazendo com o vetor medias.2. Como ns precisamos de
todos os 100 ICs nesse caso, ns vamos aplicar a soma e a subtrao da parcela da direita (que
nesse caso so nmeros fixos e simtricos) ao vetor inteiro, o que vai nos dar os 100 intervalos de
confiana (lembre-se que a operao nesse caso feita elemento-a-elemento).
A parcela da direita comea com o valor de z para o qual a rea da normal 1- . No R a
funo que calcula esse quantil a qnorm(), como voc deve se lembrar. Como nosso nvel de
confiana 0,05, usamos o valor 0,975. Por fim, esse valor multiplicado pela raiz quadrada do
quociente da varincia pelo tamanho da amostra.
O grfico mostrado abaixo. Que concluses voc tiraria dele, em respeito ao nosso IC
95%?

11
Voc deve ter notado que na verdade no aparecem neste grfico os 100 ICs que ns
espervamos... O que ser que aconteceu? Uma possibilidade que tenhamos na verdade vrios
intervalos sobrepostos uns aos outros. Vamos criar uma matriz com os valores, para podermos
inspecionar o que est acontecendo. Faa assim:

ic.2<-cbind(medias.2-(qnorm(0.975)*sqrt(var.pop(notas)/2)), medias.2,
medias.2+(qnorm(0.975)*sqrt(var.pop(notas)/2)))
ic.2[order(ic.2[,2]),]

O resultado simplesmente uma matriz onde a primeira coluna o limite inferior, a segunda
a mdia e a terceira o limite superior do IC. Alm disso, a matriz foi ordenada ascendentemente
pela coluna do meio (pela mdia.) Verifique se de fato no existem linhas rigorosamente iguais...
Mas agora voc deve estar se perguntando se no h mais ICs que no contenham a mdia...
Quem sabe esses dois que estamos visualizando no esto tambm sobrepostos? Para tirar essa
dvida, vamos usar um cdigo para saber quantos ICs no contm a mdia:

length(c(which(mean(notas)<ic.2[,1]), which(mean(notas)>ic.2[,3])))

Se tudo funcionou, o resultado foi 2, ou seja apenas aqueles dois intervalos mesmo no
continham a mdia da populao. Repare que nesse exemplo, 98% dos ICs contm a mdia (e no
95%) Isso no chega a causar surpresa j que a garantia de aproximadamente 95% e no
exatamente 95%
Bem, claro que essa situao de conhecer a varincia da populao nunca vai acontecer na
vida real, e ns teremos que usar um estimador para esta varincia. Como voc deve se lembrar o
estimador indicado neste caso s2. Lembra como se calcula?


n
2
xi x
i=0
s2=
n 1
Olha a um dos nossos mistrios que ns vamos falar mais tarde: por que esse n-1 no
denominador?
De qualquer maneira, neste caso o desvio-padro usado no ser constante como no caso de
usarmos a normal, para varincia conhecida e cada amostra ter a seu prprio s2 para ser calculado
Vamos usar este cdigo para gerar os desvios-padro de todas as amostras:

sem.2<-apply(amostras.2,1,var)
sem.2<-sqrt(sem.2/2)
sem.3<-apply(amostras.3,1,var)
sem.3<-sqrt(sem.3/3)

Agora vamos fazer algo bem semelhante ao que fizemos anteriormente, mas usando agora s2
para calcular o IC 95%, usando para isso a distribuio t. A equao, bastante semelhante ser:

x t n 1,1 / 2 s 2 /n
Vamos ver como fica, com o cdigo abaixo:

plot(medias.2,rep(mean(medias.2),100), type="b", ylim=c(-25,40))


arrows(medias.2, medias.2+(qt(0.975,1)*sem.2), medias.2, medias.2-
(qt(0.975, 1)*sem.2), angle=90, code=3, length=0.1)
points(medias.2, medias.2, pch=19)
abline(h=0, col="red")
abline(h=10, col="red")

12
A diferena que agora temos que usar a distribuio t de Student com n-1 graus de
liberdade em vez da normal. Outras diferenas so os limites do eixo y e duas linhas horizontais
acrescentadas nos pontos y = 0 e y = 10. Olha o bicho a embaixo...
Notou algo de diferente? Voc tem alguma explicao para isso?

Voc deve estar se perguntando agora por que que fizemos isso tudo para uma amostra de
tamanho 3 e no usamos ainda... Isso mesmo: ser um exerccio para voc...

As varincias da populao e da amostra

Finalmente vamos entrar no nosso ltimo mistrio: o n-1. Mas afinal de contas, por que
cargas d'gua o denominador n-1 e no n? Bom, primeiro vamos definir algumas coisas para a
gente entender melhor o que est acontecendo.
Em primeiro lugar, vamos definir melhor o que vem a ser a varincia da populao, tambm
conhecida como S 2 (maisculo, para indicar que da populao.) Ele a mdia do quadrado
dos afastamentos das observaes em relao mdia geral. Complicou? Vamos ver ento a
definio matemtica:

13

2
n
X i X
S2 =
i=0

n
Piorou? Ih... Vamos indo adiante para ver se d para entender, ento.
Bem, mas e a varincia amostral? Essa chamada de s 2 e ela quase igual ao nosso
amigo S 2 , s que o seu denominador um pouco diferente:
2

n

s =
2 X i X
i=0

n 1
Percebeu a diferena? Sutil, n? To sutil que a gente pode at aplicar uma correo ao
s
2
para ele ficar igual ao S 2 .
n 1 s 2
S
2
=
n
Ns j at fizemos isso, lembra?

> sqrt((length(notas)-1)*var(notas)/length(notas))

S que aqui foi para o DP, ento eu acrescentei a raiz quadrada.


Legal, mas ento qual o problema? Por que a gente usa S 2 para calcular a varincia da
populao e s 2 para a da amostra, se para a mdia se usa a mesma conta?
Bom, para aqueles que gostam de uma resposta mais formal, porque s 2 um estimador
no-enviesado de 2 , o que no o caso de S 2 . Por falar nisso, voc se lembra a definio de
um estimador no-enviesado? Vou dar uma pista... Pode-se provar que:



n 2

xi x
i=0
E s 2 = E = 2
n1
Isto a em cima quer dizer que a esperana (que corresponde mdia) de s
2
igual a
2
.
Mas como a nossa aula prtica, no nos interessa provar isso, e sim mostrar como isso
funciona na prtica.
Olhando as definies acima, podemos agora entender melhor a nossa funo var.pop(),
lembra?

var.pop <- function (x)


{
sum((x-mean(x))^2)/length(x)
}


2
n
X i X
Compare com e veja se no a mesma coisa...
i=0

n
Vamos fazer o seguinte: vamos calcular agora todas as varincias de todas as nossas 100 e
1000 amostras, tanto as da populao quanto as da amostra:

> var.2.pop <- apply(amostras.2,1,var.pop)


> var.3.pop <- apply(amostras.3,1,var.pop)
> var.2.smpl <- apply(amostras.2,1,var)

14
> var.3.smpl <- apply(amostras.3,1,var)

Agora vamos calcular as mdias dessas varincias (que so na verdade as esperanas,


lembra?):

> mean(var.2.pop)
[1] 0.55545
> mean(var.3.pop)
[1] 0.7406
> mean(var.2.smpl)
[1] 1.1109
> mean(var.3.smpl)
[1] 1.1109

E vamos agora comparar com a varincia da nossa populao:

> var.pop(notas)
[1] 1.1109

Alguma concluso interessante?


;-)
Para finalizar, voc deve estar familiarizado com a distribuio que uma pequena
modificao da varincia amostral segue uma distribuio qui-quadrada, com n-1 graus de
2
liberdade ( n 1 ), se a populao for Normal. Observe que neste caso, em se tratando da
varincia, no temos o TLC para nos ajudar. Vamos recordar esse resultado:

n 1 s 2
2
~ 2n 1

Ou seja, se multiplicarmos s2 por n-1 e dividirmos pela varincia da populao, obteremos


uma distribuio chi-quadrada com n-1 graus de liberdade. Vamos usar o R para nos ajudar a
verificar esse fato. Primeiro vamos transformar os nossos vetores em distribuies qui-quadradas:

var.2.smpl.chi <- 1*var.2.smpl/var.pop(notas)


var.3.smpl.chi <- 2*var.3.smpl/var.pop(notas)

15
Histogram of var.2.smpl.chi Histogram of var.3.smpl.chi

0.8

0.8
0.6

0.6
0.4

0.4
0.2

0.2
0.0

0.0

0 2 4 6 8 10 12 0 2 4 6 8 10 12

var.2.smpl.chi var.3.smpl.chi

E agora vamos fazer os histogramas comparando com as distribuies tericas:

par(mfrow=c(1,2))
hist(var.2.smpl.chi, freq=F, breaks=seq(0,12), ylim=c(0,0.8))
curve(dchisq(x,1), from=0.2, to=10, add=T)
hist(var.3.smpl.chi, freq=F, breaks=seq(0,12), ylim=c(0,0.8))
curve(dchisq(x,2), from=0.2, to=10, add=T)
par(mfrow=c(1,1))

O resultado essa figura a em cima. Que tal? Convenceu?

Exerccios

1. Reveja a funo que ns usamos para mostrar o TLC, histo.mean. Todas as linhas dessa
funo esto comentadas. Voc seria capaz de explicar a seguinte linha com o seu
respectivo comentrio?
z[i] <- mean(sample(x,n)) #O verdadeiro truque

O que significa esse verdadeiro truque?

2. Escolha duas distribuies, uma discreta e uma contnua, gere 1000 valores destas
distribuies e use o mesmo cdigo que ns usamos para a Bernoulli na Aula para gerar
uma seqncia de histogramas, o primeiro com a distribuio gerada e os demais com as
distribuies das mdias amostrais para um nmero crescente de tamanho da amostra.

16
Mostre os grficos e descreva o que est acontecendo. Dicas: 1) Consulte a Tabela 1.1 da
Aula 1 para recordar algumas distribuies disponveis no R (ou, claro, use um outro
programa qualquer para ger-las); 2) O cdigo ao qual estamos nos referindo :

par(mfrow=c(3,3))
hist(x)
histo.mean(x)
histo.mean(x,5)
histo.mean(x,10)
histo.mean(x,15)
histo.mean(x,20)
histo.mean(x,25)
histo.mean(x,30)
histo.mean(x,100)
par(mfrow=c(1,1))

3. Explique com as suas palavras o que o cdigo abaixo faz:

par(mfrow=c(1,3))
hist(notas, freq=F, breaks=seq(4,10), ylim=c(0,0.8))
curve(dnorm(x,7.01,1.111006), from=4, to=10, add=T)
hist(medias.2, freq=F, breaks=seq(4,10), ylim=c(0,0.8))
curve(dnorm(x,7.01,sqrt(1.111006/2)), from=4, to=10, add=T)
hist(medias.3, freq=F, breaks=seq(4,10), ylim=c(0,0.8))
curve(dnorm(x,7.01,sqrt(1.111006/3)), from=4, to=10, add=T)
par(mfrow=c(1,1))

Nota: No para explicar o cdigo, mas apenas o que ele faz, interpretar a sua sada. Dica:
ns conhecemos a varincia da populao nesse caso?

4. Afirmamos na seo sobre Intervalos de Confiana que duas observaes podem ser
feitas. A primeira que nada dito sobre n nesse caso, isto , essa definio no depende
do tamanho da amostra, ela ser vlida para qualquer tamanho (embora para o caso de
varincia da populao desconhecida, n deve ser no mnimo 2...).
Explique porque o tamanho de n deve ser no mnimo 2 nesta situao. Dica: lembre-se que o
IC depende basicamente de 3 valores: o nvel de significncia, o tamanho da amostra e a
variabilidade da amostra, como mostrado na equao abaixo, que o IC para a mdia amostral com
varincia da populao desconhecida:

x t n 1,1 / 2 s 2 /n

5. Quantos ICs 95% calculados para as amostras de tamanho 3 das notas dos alunos de fato
continham a verdadeira mdia, no caso da varincia conhecida? Mostre um grfico para
ilustrar.
Dica: Basta modificar o cdigo j dado para as amostras de tamanho 2, mas em todo caso
aqui est a cola:

plot(medias.3,rep(mean(medias.3),1000), type="b", ylim=c(0,15))


arrows(medias.3, medias.3+(qnorm(0.975)*sqrt(var.pop(notas)/3)), medias.3,
medias.3-(qnorm(0.975)*sqrt(var.pop(notas)/3)), angle=90, code=3, length=0.1)
points(medias.3, medias.3, pch=19)
ic.3<-cbind(medias.3-(qnorm(0.975)*sqrt(var.pop(notas)/3)), medias.3,
medias.3+(qnorm(0.975)*sqrt(var.pop(notas)/3)))
length(c(which(mean(notas)<ic.3[,1]), which(mean(notas)>ic.3[,3])))

17
6. Ns vimos que com a mdia das varincias das amostras usando S 2 obtemos um
resultado enviesado, isto , diferente da verdadeira varincia da populao de notas:

> mean(var.2.pop)
[1] 0.55545
> mean(var.3.pop)
[1] 0.7406

Baseado no que ns discutimos existe alguma maneira de se obter a varincia da populao


a partir desses valores?

7. Ns vimos na aula terica que a mdia amostral um estimador consistente, ou seja, ela:
assintoticamente no-enviesada (alis ela no-enviesada mesmo, no s assintoticamente)
Sua varincia tende para zero quando o tamanho da amostra tende para o infinito
Mostre graficamente essa segunda condio para um caso onde a varincia da populao
seja conhecida

8. A fdp de uma distribuio t de Student dada por:


12

1
1 t2
f t= 1 2
, onde so os graus de liberdade e a



2
funo gama. Pode ser mostrado que para uma distribuio t com > 2, sua mdia fixa e igual

a zero e sua varincia dada por: . Mostre porque a distribuio t torna-se bastante
2
semelhante a uma Normal quando . Dica: uma maneira de mostrar isso usando a funo
curve() para comparar grficos de Normais e t's.

18
Exerccios - Respostas

Aula 3 Distribuies amostrais


Livro: NA

1. Reveja a funo que ns usamos para mostrar o TLC, histo.mean. Todas as linhas dessa
funo esto comentadas. Voc seria capaz de explicar a seguinte linha com o seu
respectivo comentrio?
z[i] <- mean(sample(x,n)) #O verdadeiro truque

O que significa esse verdadeiro truque?

Esse truque apenas a escolha aleatria de uma amostra de tamanho n do vetor x ,


aproveitando para se calcular a mdia de cada uma dessas amostras, que so guardadas em um vetor
z. Com isso, no necessrio armazenar cada uma das amostras, mas apenas os valores das suas
mdias. Essa uma boa aplicao da funo sample().

2. Escolha duas distribuies, uma discreta e uma contnua, gere 1000 valores destas
distribuies e use o mesmo cdigo que ns usamos para a Bernoulli na Aula para gerar
uma seqncia de histogramas, o primeiro com a distribuio gerada e os demais com as
distribuies das mdias amostrais para um nmero crescente de tamanho da amostra.
Mostre os grficos e descreva o que est acontecendo. Dicas: 1) Consulte a Tabela 1.1 da
Aula 1 para recordar algumas distribuies disponveis no R (ou, claro, use um outro
programa qualquer para ger-las); 2) O cdigo ao qual estamos nos referindo :

par(mfrow=c(3,3))
hist(x)
histo.mean(x)
histo.mean(x,5)
histo.mean(x,10)
histo.mean(x,15)
histo.mean(x,20)
histo.mean(x,25)
histo.mean(x,30)
histo.mean(x,100)
par(mfrow=c(1,1))x<-rpois(1000, 3)

Esse exerccio apenas uma aplicao direta de conhecimentos e o resultado ser o mesmo
que o discutido em aula. Por exemplo, vamos fazer para uma Qui-quadrada com 2 graus de
liberdade e para uma Poisson com mdia 3:

x <- rchisq(1000, df=2)


x <- rpois(1000, lambda=3)

Aplicando o cdigo acima, voc visualizaria o mesmo conjunto de grficos que vimos na
aula e com a mesma tendncia de aproximao da mdia amostral da mdia verdadeira e
diminuio da disperso da distribuio da mdia amostral, por alcunha o erro-padro.
Os grficos:
Para a Qui-quadrada:

1
Histogra m of x Histogra m a da m dia a m ostra l de x Histogra m a da m dia a m ostra l de x

100 120
100 200 300 400 500 600

150
100

80
60
40
50

20
0

0
0 5 10 15 0 2 4 6 8 10 0 1 2 3 4 5

x z z

Histogra m a da m dia a m ostra l de x Histogra m a da m dia a m ostra l de x Histogra m a da m dia a m ostra l de x

200
150

80
150

60
100

100

40
50

50

20
0

0
1 2 3 4 1 2 3 4 1.0 1.5 2.0 2.5 3.0 3.5

z z z

Histogra m a da m dia a m ostra l de x Histogra m a da m dia a m ostra l de x Histogra m a da m dia a m ostra l de x


100

100

100
80

80

80
60

60

60
40

40

40
20

20

20
0

0
1.0 1.5 2.0 2.5 3.0 3.5 1.0 1.5 2.0 2.5 3.0 3.5 1.6 1.8 2.0 2.2 2.4 2.6

z z z

Para a Poisson:

Histogra m of x Histograma da mdia amostral de x Histogra ma da mdia amostra l de x


140
150
200

100
150

100

80
100

60
50

40
50

20
0

0 2 4 6 8 0 2 4 6 8 1 2 3 4 5 6

x z z

Histograma da m dia amostral de x Histograma da mdia amostral de x Histogra ma da mdia amostra l de x


100
80

80
60

60

60
40

40

40
20

20

20
0

2.0 2.5 3.0 3.5 4.0 4.5 2.0 2.5 3.0 3.5 4.0 4.5 2.0 2.5 3.0 3.5 4.0

z z z

Histograma da m dia amostral de x Histograma da mdia amostral de x Histogra ma da mdia amostra l de x


140

100 120
100

100
80

80
80
60

60
60
40

40
40
20

20
20
0

2.0 2.5 3.0 3.5 4.0 2.0 2.5 3.0 3.5 4.0 2.6 2.8 3.0 3.2 3.4 3.6

z z z

3. Explique com as suas palavras o que o cdigo abaixo faz:

par(mfrow=c(1,3))
hist(notas, freq=F, breaks=seq(4,10), ylim=c(0,0.8))
curve(dnorm(x,7.01,1.111006), from=4, to=10, add=T)

2
hist(medias.2, freq=F, breaks=seq(4,10), ylim=c(0,0.8))
curve(dnorm(x,7.01,sqrt(1.111006/2)), from=4, to=10, add=T)
hist(medias.3, freq=F, breaks=seq(4,10), ylim=c(0,0.8))
curve(dnorm(x,7.01,sqrt(1.111006/3)), from=4, to=10, add=T)
par(mfrow=c(1,1))

Nota: No para explicar o cdigo, mas apenas o que ele faz, interpretar a sua sada. Dica:
ns conhecemos a varincia da populao nesse caso?

Bem, essa fcil demais. Basta colocar o cdigo para rodar que veremos que estamos
simplesmente plotando histogramas da populao e das distribuies amostrais das mdias de
tamanhos 2 e 3, juntamente com a Normal terica, com a sua varincia conhecida, para
comparao.

4. Afirmamos na seo sobre Intervalos de Confiana que duas observaes podem ser
feitas. A primeira que nada dito sobre n nesse caso, isto , essa definio no depende
do tamanho da amostra, ela ser vlida para qualquer tamanho (embora para o caso de
varincia da populao desconhecida, n deve ser no mnimo 2...).
Explique porque o tamanho de n deve ser no mnimo 2 nesta situao. Dica: lembre-se que o
IC depende basicamente de 3 valores: o nvel de significncia, o tamanho da amostra e a
variabilidade da amostra, como mostrado na equao abaixo, que o IC para a mdia amostral com
varincia da populao desconhecida:

x t n 1,1 / 2 s 2 /n

Nesse caso, ns precisamos de alguma variabilidade nessa amostra para podermos calcular o
s2. Com uma amostra de tamanho 1, o nosso s2 ser igual a zero e no ser possvel calcular um IC
para essa mdia.

5. Quantos ICs 95% calculados para as amostras de tamanho 3 das notas dos alunos de fato
continham a verdadeira mdia, no caso da varincia conhecida? Mostre um grfico para
ilustrar.
Dica: Basta modificar o cdigo j dado para as amostras de tamanho 2, mas em todo caso
aqui est a cola:

plot(medias.3,rep(mean(medias.3),1000), type="b", ylim=c(0,15))


arrows(medias.3, medias.3+(qnorm(0.975)*sqrt(var.pop(notas)/3)), medias.3,
medias.3-(qnorm(0.975)*sqrt(var.pop(notas)/3)), angle=90, code=3, length=0.1)
points(medias.3, medias.3, pch=19)
ic.3<-cbind(medias.3-(qnorm(0.975)*sqrt(var.pop(notas)/3)), medias.3,
medias.3+(qnorm(0.975)*sqrt(var.pop(notas)/3)))
length(c(which(mean(notas)<ic.3[,1]), which(mean(notas)>ic.3[,3])))

Bem, aqui s aplicao direta do cdigo acima para quem j vinha fazendo a aula. O
resultado para mim foram 47 ICs, o que nos d 95,3% dos ICs contendo a verdadeira mdia.
Bastante aproximadinho, at... Vou omitir o grfico, por uma questo de espao, pois o cdigo
acima o far automaticamente.

6. Ns vimos que com a mdia das varincias das amostras usando S 2 obtemos um
resultado enviesado, isto , diferente da verdadeira varincia da populao de notas:

> mean(var.2.pop)
[1] 0.55545
> mean(var.3.pop)
[1] 0.7406

3
Baseado no que ns discutimos existe alguma maneira de se obter a varincia da populao
a partir desses valores?
2
n 1 s
Bem, essa ns fizemos na aula: s repetir. Vamos l. Se S 2 = , basta
n
tirarmos o valor de s2, certo? Ento:
2 n 2
s = S
n1
No R, poderamos fazer:

> 2*mean(var.2.pop)/1
[1] 1.1109
> 3*mean(var.3.pop)/2
[1] 1.1109

7. Ns vimos na aula terica que a mdia amostral um estimador consistente, ou seja, ela:
assintoticamente no-enviesada (alis ela no-enviesada mesmo, no s assintoticamente)
Sua varincia tende para zero quando o tamanho da amostra tende para o infinito
Mostre graficamente essa segunda condio para um caso onde a varincia da populao
seja conhecida.

Para essa questo basta mostrar um grfico com um nmero de amostras crescentes no eixo
x e com a varincia da mdia amostral no eixo y. Isso pode ser feito at mesmo mo. Vamos
admitir que a varincia conhecida de 600. No R seria algo assim:

x <- seq(0,100,2)
plot(x, 600/(x^2), type="l")
abline(h=0)

Veja o resultado:

4
8. A fdp de uma distribuio t de Student dada por:
12

1
1 t2
f t= 1 2
, onde so os graus de liberdade e a



2
funo gama. Pode ser mostrado que para uma distribuio t com > 2, sua mdia fixa e igual

a zero e sua varincia dada por: . Mostre porque a distribuio t torna-se bastante
2
semelhante a uma Normal quando . Dica: uma maneira de mostrar isso usando a funo
curve() para comparar grficos de Normais e t's.

Seguindo a dica, poderamos plotar diversas t's e sobrepor diversas Normais a essas curvas e
ver o que acontece. Vamos plotar ento a t pontilhada e a Normal com linha cheia, para graus de
liberdade crescentes de t. No R:

par(mfrow=c(3,3))
curve(dt(x,1), from=-4, to=4, lty=2, ylim=c(0,0.4))
curve(dnorm(x),from=-4, to=4, add=T)
curve(dt(x,5), from=-4, to=4, lty=2, ylim=c(0,0.4))
curve(dnorm(x),from=-4, to=4, add=T)
curve(dt(x,10), from=-4, to=4, lty=2)
curve(dnorm(x),from=-4, to=4, add=T)
curve(dt(x,15), from=-4, to=4, lty=2)
curve(dnorm(x),from=-4, to=4, add=T)
curve(dt(x,20), from=-4, to=4, lty=2)
curve(dnorm(x),from=-4, to=4, add=T)
curve(dt(x,30), from=-4, to=4, lty=2)
curve(dnorm(x),from=-4, to=4, add=T)
curve(dt(x,50), from=-4, to=4, lty=2)
curve(dnorm(x),from=-4, to=4, add=T)
curve(dt(x,100), from=-4, to=4, lty=2)
curve(dnorm(x),from=-4, to=4, add=T)
curve(dt(x,200), from=-4, to=4, lty=2)
curve(dnorm(x),from=-4, to=4, add=T)
par(mfrow=c(1,1))

Com o seguinte resultado abaixo. Repare que para um > 100, praticamente j no h
diferena em relao Normal.
Uma outra maneira de se mostrar isso era afirmar que como a t simtrica em torno de zero
para qualquer e sua varincia tende a 1 conforme , ela vai se aproximando da
Normal. Como mostrar que a varincia tende a 1? Muito semelhante com o exerccio anterior.

Como Var(t) = , s fazer:
2

x<-seq(3,200,2)
plot(x, x/(x-2), ylim=c(0,3))
abline(h=1)

Faa e veja o que acontece!!!


Mostre uma terceira forma de mostrar essa aproximao da t pela Normal, sem levar em
conta a sua varincia propriamente dita. Quem entregar por escrito at Tera-Feira, vale 0.1
ponto.

5
6
0.0 0.1 0.2 0.3 0.4 0.0 0.1 0.2 0.3 0.4 0.0 0.1 0.2 0.3 0.4

-4
-4
-4

-2
-2
-2

x
x
x

0
0
0

2
2
2

4
4
4

0.0 0.1 0.2 0.3 0.4 0.0 0.1 0.2 0.3 0.4 0.0 0.1 0.2 0.3 0.4

-4
-4
-4

-2
-2
-2

x
x
x

0
0
0

2
2
2

4
4
4

0.0 0.1 0.2 0.3 0.4 0.0 0.1 0.2 0.3 0.4 0.0 0.1 0.2 0.3 0.4

-4
-4
-4

-2
-2
-2

x
x
x

0
0
0

2
2
2

4
4
4
Mdulo Estatstica I no R
Autor: Antonio Guilherme Fonseca Pacheco

Pr-requisitos: Conhecimento prvio do ambiente R. Especificamente, o leitor deve estar


familiarizado com os mdulos Bsico, Entrada e Sada de Dados e tambm Manuseando
dados no R.

Bibliotecas necessrias: ISwR

Aula 4 - Teste de Hipteses, poder e tamanho da amostra


Livro: pginas 139 a 147

Muito embora o livro esteja referido nesta aula, a parte de teste de hipteses propriamente
dito no abordado no livro. A compreenso do significado do teste de hipteses central para uma
melhor compreenso dos testes estatsticos que so rotineiramente empregados em bioestatstica e
em estatstica em geral. Alm disso, permite compreender melhor os conceitos fundamentais de
poder de um teste e tamanho da amostra, que podem influenciar em muito o tipo de estudo e o gasto
que esse estudo vai exigir no mundo real, caso voc esteja planejando um estudo epidemiolgico
qualquer.
Embora o teste de hipteses seja bem abordado nesta aula, os outros dois assuntos que
trataremos sero apresentados de uma maneira bastante geral, j que os testes especficos ainda no
foram apresentados para voc neste ponto do curso. claro que exemplos sero usados, e nas aulas
especficas de cada tipo de teste, esses temas podero ser abordados de uma maneira mais
especfica. Eu digo podero, porque o essencial entender como a coisa funciona e no a
especificidade para cada caso particular.

Teste de Hipteses
O teste
O julgamento
Relao entre o teste de hipteses e o intervalo de confiana
Poder de um teste
Tamanho da Amostra
Simulaes
Exerccios

Teste de Hipteses

Voc j deve ter sido apresentado ao clssico exemplo do julgamento, comparado a um teste
de hipteses, para passar uma compreenso intuitiva da construo de um teste de hipteses. Muitas
vezes, porm, a passagem desse exemplo para a estatstica propriamente dita apresenta algumas
dificuldades, que ns vamos tentar amenizar nesta aula.

O teste

Voc se lembra como se monta um teste? De maneira geral:


H0: =0
H1: 0
Nesse caso, usamos um teta, que uma representao geral, poderia tanto ser uma mdia,
como uma varincia, como uma diferena de mdias. Tambm no definimos a direo do teste, e a
hiptese alternativa simplesmente ser diferente de zero, isto trata-se de um teste bilateral.

1
O primeiro conceito-chave que deve ser frisado nesse caso que teta um parmetro e no
uma estatstica, ou seja, uma caracterstica da populao (que ns no conhecemos e jamais
conheceremos, a no ser que realizemos um censo) e no da amostra.
O segundo conceito importante que este parmetro possui uma determinada distribuio
terica, e sobre esta distribuio que os testes so feitos. Epa! Tem algo errado aqui. Se tudo nesse
teste de hipteses se refere populao que eu no conheo, inclusive a distribuio de teta, onde
entra a minha amostra?
Pois : essa a parte difcil. Isso mais parece um beco sem sada... Nem tanto. Os
parmetros da populao sero na verdade inferidos a partir de estatsticas tiradas da amostra. Bem,
a pergunta que vem a seguir seria: mas se no temos informao alguma sobre a populao, como
posso ter a garantia que uma amostra desta populao vai ser capaz de me dar informaes
suficientes para inferir os valores dos parmetros? Bem, a que entram alguns resultados que ns
at j discutimos. claro que vamos nos basear no mais fcil. Que tal o Teorema do Limite Central
(TLC)? Lembra dele? Ser que ele poderia nos ajudar de alguma maneira nesse nosso problema?
Digamos que o nosso seja a mdia de uma populao qualquer... E agora, alguma pista
que nos ajude? isso mesmo, podemos usar o TLC para nos ajudar a conhecer alguma coisa sobre
este parmetro. Como j vimos anteriormente, a mdia amostral de qualquer distribuio, para um
tamanho de amostra suficientemente grande seguir uma distribuio Normal com mdia e
varincia 2 / n . Hum... parece mesmo que esse negcio pode me ajudar, j que nesse caso, ns
temos pistas sobre parmetros da populao ( e 2 ) a partir da nossa amostra... E lembre-
se: esse resultado independe da distribuio da populao para um n suficientemente grande.
Vamos ver um exemplo mais especfico, ento. Digamos que uma populao de indivduos
sadios tenha uma presso arterial mdia (PAM) de 100 mmHg, com varincia de 625mmHg2.
Vamos desenhar um estudo para selecionar uma amostra de 100 idosos internados em uma unidade
hospitalar e avaliar se a PAM desse grupo pode ser considerada normal. Como no temos nenhuma
informao sobre a PAM desses idosos, vamos usar um teste bilateral:
H0: 0 =0
H1: 0 0
Como o 0 uma constante e conhecido nesse caso, podemos reescrever esse teste:
H0: 100=0
H1: 1000
Antes de bater o desespero, voc entendeu que o 100 so os 100mmHg de mdia da
populao, n? Bom... Agora, o que diabos esse 100 est fazendo no lugar do teta l em
cima? No se preocupe com isso, pois apenas um algebrismo. Voc pode diminuir uma constante
de um parmetro para fazer um teste de hipteses. Alis, como voc deve se lembrar, podemos at
testar a diferena de dois parmetros, no caso de estarmos testando mdias de dois grupos diferentes
confundiu? Tudo bem, veremos isso mais tarde...
Bem, voltando ao nosso teste, por que agora ns temos esse menos uma constante no
lugar de teta? Isso bastante confuso na minha opinio. Repare bem o que estamos testando aqui:
eu tenho uma populao de idosos internados (que uma sub-populao de uma populao mais
geral, por exemplo a populao de uma cidade.) Ora, essa sub-populao tem uma PAM mdia
(olha a cacofonia...) que eu nunca conhecerei de fato, a no ser que faa um censo de todos os
idosos internados em todos os hospitais digamos dessa cidade. Ao invs disso, vamos selecionar
100 deles e inferir a sua PAM, a qual eu quero comparar com a PAM de uma populao geral para
ver se elas diferem significativamente... Ufa!!!
Alis, meus amigos, pensem bem e vejam que essa situao aqui na prtica mesmo vai ser
bem difcil de acontecer... mas enfim, deixa pr l...

2
Certo, ento esse sobre o qual queremos fazer inferncias a PAM mdia dessa sub-
populao. Quando selecionarmos a nossa amostra e calcularmos a sua mdia, estaremos
evidentemente diante de x e usaremos o TLC para nos ajudar nessa tarefa.
Uma observao importante antes de seguirmos adiante que nesse momento ns ainda no
conhecemos a mdia amostral, mas no entanto j estabelecemos o teste de hipteses que iremos
usar. Ns estamos na fase do desenho do experimento, antes dele se realizar. Voc deve estar
imaginando agora que na prtica do dia-a-dia muitas vezes os dados j foram colhidos e voc estar
analisando esses dados sem ter planejado experimento algum... Essa uma discusso muito
interessante, e voltaremos a falar sobre ela mais tarde nessa aula, embora seja impossvel esgotar
esse assunto, que de fato um tema de intenso debate.

O julgamento

Agora que o nosso teste est entendido, vamos passar ao nosso julgamento. Vamos repetir
as regras desse julgamento s para refrescar a memria:
Toda pessoa inocente at que se prove o contrrio aqui esse fato traduzido pela hiptese
nula, que trata da igualdade da diferena entre a verdadeira mdia da sub-populao, e a
constante que queremos testar com o valor zero;
Os jurados ainda no conhecem as evidncias que sero apresentadas (os dados), mas j sabem
as possveis hipteses, inocente ou culpado inocente a igualdade e culpado a diferena.
Note que as hipteses devem ser estabelecidas antes da apresentao das evidncias;
Existem dois enganos que podem acontecer neste julgamento: a absolvio de um culpado ou a
condenao de um inocente so os erros Tipo II e Tipo I, respectivamente;
O pior engano possvel sem dvida condenar um inocente (muito embora algumas pessoas
possam discordar...) Seria to grave, que gostaramos de ter total controle sobre esse tipo de
engano, estabelecendo um limite para ele, antes mesmo de conhecermos as evidncias o
estabelecimento do alfa que geralmente de 0.05 ou 5%. No estranhe: isso quer dizer
exatamente o que voc entendeu, ou seja, at 5% dos inocentes podem ir para a cadeia...
O engano de absolver um culpado considerado menos grave, e nos damos o direito de nos
preocuparmos com ele aps a apresentao das evidncias, alis, preferimos at fazer o
contrrio: estabelecer a nossa capacidade de, apresentadas as evidncias, sermos capazes de
provar que um culpado realmente culpado, o que depender da qualidade e da quantidade de
evidncias apresentadas o famoso poder do teste, tambm conhecido como 1 e que
como veremos vai depender da qualidade e quantidade dos dados coletados;
Passemos ento apresentao das evidncias coletadas:
n = 100
= 112.28
x
s2 = 22.72
Claro que essa mgica foi feita no R. Caso queira fazer tambm, com resultados algo
diferentes, crie um vetor assim:

pam.idosos<-rnorm(100, mean=110, sd=25)

E depois calcule a mdia e desvio-padro desse vetor.


Voltando ao nosso julgamento, os advogados de defesa pedem a incluso da varincia da
populao, que conhecida e igual a 625 mmHg2, pedido que imediatamente indeferido pelo juiz
(algum sabe explicar porque?).
Bem, na impossibilidade de usar a varincia da populao, teremos que lanar mo de um
teste t para uma amostra, que como voc deve se lembrar, usa a varincia da amostra no seu lugar, e

3
ento e passaremos a compar a mdia amostral com o valor da populao geral de 100 mmHg. A
maneira mais fcil de fazer isso usar a funo t.test() no R:

> t.test(pam.idosos, mu=100)

One Sample t-test

data: pam.idosos
t = 5.4056, df = 99, p-value = 4.474e-07
alternative hypothesis: true mean is not equal to 100
95 percent confidence interval:
107.7729 116.7887
sample estimates:
mean of x
112.2808

Observe que nesse caso tivemos que dizer para o R que o valor contra o qual queremos
comparar a mdia 100, com o argumento mu=100 .
U, mas j acabou o nosso julgamento, ento? No deu nem para perceber o que
aconteceu... Bem, melhor irmos devagar. Vamos esquecer a sada a em cima por enquanto e
tentar entender o que est acontecendo.
Primeiramente, as nossas evidncias precisam ser processadas para que o jri possa dar o
seu veredicto. Neste nosso caso, baseado no TLC e na utilizao da varincia da amostra para
inferir a varincia da populao, esse processamento consiste em construir a distribuio da mdia
amostral, sob a hiptese nula... Ihhhh! Complicou, hein? O que isso quer dizer? Vamos reescrever a
hiptese nula, s para melhorar a compreenso:
H0: =100
Hum, j melhorou! Quer dizer que sob a hiptese nula, a (verdadeira) mdia igual a 100.
Mas o que que ns realmente temos? Ah, ns temos a amostra. E o que podemos dizer sobre a
mdia dessa amostra? Que ela segue uma distribuio t com n-1 graus de liberdade e que a sua
mdia amostral igual a 110.64. Bem, com essas informaes, podemos j fazer algo que fizemos
anteriormente, que calcular e desenhar um IC 95% para essa mdia amostral... Voc seria capaz
de fazer isso com a ajuda do R?
Alm disso, o que poderamos fazer? Como entender melhor o processamento das nossas
evidncias? Pelo que estamos vendo, isso no a mesma coisa que calcular o IC 95%. Repare que
no teste de hipteses estamos afirmando que sob a hiptese nula a verdadeira mdia igual a 100.
Isso quer dizer que para construirmos a curva da mdia sob a hiptese nula, devemos faz-lo para
uma distribuio com mdia 100 e no 112.28, como voc poderia estar pensando (pois esse seria o
raciocnio do IC 95%. o qual seria construdo ao redor do valor 112.28, como voc deve se lembrar
no caso do IC, ns estamos trabalhando apenas com valores amostrais, e nada dito sobre a
populao, entendeu a diferena?)
Muito bem. Mas agora para construirmos uma curva, vamos ter que voltar nossa hiptese
escrita como uma diferena e igual a zero isso porque como estamos lidando com uma
distribuio t no faz muito sentido usarmos uma distribuio com mdia 100. Para a construo da
curva, no necessitamos ainda do valor da mdia calculada a partir da amostra, pois podemos
visualizar uma densidade da distribuio t com o auxlio apenas do seu nico parmetro, que o
nmero de graus de liberdade (voc deve se lembrar que nesse caso ser n-1, ou seja, 99 para o
nosso problema.) Essa curva seria ento a distribuio da amostra sob a hiptese nula.
Com o nosso erro do tipo I fixado em 5% e bilateral, para separar a rea de no rejeio da
rea de rejeio, basta calcular uma rea abaixo da curva de densidade (fdp) que tenha 95% de toda
a massa de probabilidade. O que sobrar ser a nossa rea de rejeio... Mas ser que isso
suficiente para o nosso veredicto, ou seja, para definir a nossa rea de rejeio?
No... Como voc deve estar pensando, existem infinitas reas com valor 0.95 sob a curva
de densidade de uma t99, no verdade?. Veja a figura abaixo:

4
Density function Density function
0.4

0.4
0.3

0.3
0.2

0.2
Y

Y
0.1

0.1
0.0

0.0
-4 -2 0 2 4 -4 -2 0 2 4

X X

Density function Density function


0.4

0.4
0.3

0.3
0.2

0.2
Y

Y
0.1

0.1
0.0

0.0

-4 -2 0 2 4 -4 -2 0 2 4

X X

A rea hachurada de todas essas curvas tm uma rea de 0.95. Porm, a rea da curva no
canto inferior direito tem uma outra caracterstica que a far ser a nica dentre as infinitas reas de
no rejeio que ser usada no nosso julgamento. Algum arrisca dizer que caracterstica essa?
Isso mesmo: a simetria das reas de rejeio. Esta a nica rea de no rejeio que
proporciona reas de rejeio simtricas, ou seja, com rea iguais (a 0.025 cada, no caso de um alfa
de 0.05). Como o nosso teste bilateral, e ns no sabamos a priori se a estatstica seria maior ou
menor que o valor sob a hiptese nula, justo que a massa de probabilidade destinada aos valores
menores que 100 fosse a mesma que a dos valores maiores que 100.
Aposto que agora surgiu uma nova dvida... Estvamos felizes, falando de mdia igual a
100, 112, etc, e me aparecem umas curvas com valores de -4 a 4???!!! No se desespere ainda...
Como j mencionei, se trata de uma distribuio t, e no faz sentido falarmos em mdias que no
sejam iguais a zero ao contrrio da Normal, que pode assumir vrias mdias diferentes (afinal ela
um dos seus parmetros), a distribuio t tem sempre mdia zero.
Tudo bem, mas ento como que eu posso comparar alguma coisa com essa curva? Os
valores so muito diferentes... a que entra o famoso clculo da estatstica T, que voc j deve ter
ouvido falar, e que vai ser na verdade parte do nosso processamento das evidncias apresentadas.
Vamos recordar o seu clculo:

x0
T= 2
s /n
Repare que a obteno do T envolve todas as evidncias colhidas: a mdia amostral, a
varincia da amostra e o tamanho da amostra. Essa conta pode ser feita facilmente no R:

(mean(pam.idosos)-100)/sqrt(var(pam.idosos)/100)
[1] 5.405571

5
Confira com o resultado obtido com o t.test() acima... Esse processo de obteno do T
equivalente padronizao que fazemos quando estamos trabalhando com a distribuio Normal
(lembra?) A nica diferena que em vez de usar a varincia da populao, estamos usando a da
amostra.
claro que neste caso, com o grfico (aquele inferior direito que calculamos acima) e com
esse valor, possvel de cara dar o veredicto de rejeitar a hiptese nula e condenar a mdia desta
sub-populao a ser diferente da mdia da populao geral, no mesmo? Afinal 5.4 est bastante
distante dos cerca de 2 (valor no olhmetro) para o limite da rea de rejeio direita do grfico,
concorda? Vamos ver, s para conferir:

Density function
0.4
0.3
0.2
Y
0.1
0.0

-6 -4 -2 0 2 4 6

A seta ali direita representa o 5.4. Ele est bastante na rea de rejeio, no mesmo? Mas
e se a nossa estatstica T estivesse muito prxima do valor 2, por exemplo? Ficaria difcil ver no
olho se deveramos condenar ou absolver a nossa mdia... Bem, existem duas maneiras de se
contornar este problema...
A primeira calculando-se exatamente os valores crticos, que nada mais so do que os
limites do intervalo para o qual ns construmos a rea de no rejeio. Ora, se a estatstica
calculada cair dentro deste intervalo, ela estar na rea de no rejeio e a nossa mdia ser

6
absolvida. Se cair fora do intervalo, estar na rea de rejeio e a mdia ser condenada
(rejeitaremos a hiptese nula.)
O clculo desse intervalo fcil, e s depende na verdade da distribuio em questo e seus
parmetros. Basta calcularmos dois quantis: o primeiro, que ser o limite inferior desse intervalo,
que no nosso caso aqui ser para uma t onde teremos uma rea de 0.025, contando desde menos
infinito at este quantil. Isso ns j aprendemos a fazer no R, no mesmo?

> qt(0.025, df=99)


[1] -1.984217

O limite superior deste intervalo calculado para a mesma t99 para se obter uma rea de
tambm 0.025 a partir desse valor at mais infinito. Claro que pela simetria da distribuio t
podemos tambm calcular o quantil que corresponde a uma rea de 1 0.025 = 0.975, indo de
menos infinito at esse valor. Bem para dizer a verdade no precisamos calcular nada, j que devido
simetria em torno de zero este valor obrigatoriamente igual ao valor acima, s que com sinal
positivo. Duvida? Ento faa:

qt(0.025, df=99, lower.tail=F)

ou

qt(0.975, df=99)

A outra maneira de se fazer isso calculando-se o famoso p-valor. Mas para facilitar as
nossas contas, vamos agora comparar a nossa populao de idosos com uma mdia de 106 mmHg e
no mais com 100 mmHg como estvamos fazendo anteriormente. Veja bem que a nossa curva no
muda, ela continua sendo a mesma e o intervalo de (-1.98,1.98) ainda o mesmo eles no
dependem do valor que queremos testar. O nosso teste porm mudou:
H0: 106= 0
H1: 106 0
Obviamente a nossa estatstica T mudou, pois ela depende de 0 , que mudou agora.
Vamos fazer um novo teste t:

> t.test(pam.idosos, mu=106)

One Sample t-test

data: pam.idosos
t = 2.7646, df = 99, p-value = 0.006799
alternative hypothesis: true mean is not equal to 106
95 percent confidence interval:
107.7729 116.7887
sample estimates:
mean of x
112.2808

Repare que obviamente o IC 95% para a mdia amostral tambm no mudou. Alis,
somente dois valores foram alterados: o valor da estatstica T e justamente o p-valor. Como
funciona ento o p-valor? simples: o p-valor a rea sob a curva (nesse caso a t99) a partir do
quantil do mesmo valor da estatstica T que foi calculada at mais infinito (para um T positivo), ou
a rea de menos infinito at a estatstica T, se ela for negativa. Como recamos no primeiro caso,
vamos ver como fica:

p valor = f t dt
T
Onde a f(t) a fdp de uma t99. Vamos conferir no R, usando funes j conhecidas nossas:

> pt(2.7646, df=99, lower.tail=F)


[1] 0.003399186

Epa! Esse p-valor no igual ao p-valor calculado no nosso teste t acima (0.006799)!!!! O
que est acontecendo aqui? Calma. O problema aqui que ns estamos fazendo um teste bilateral,
lembra? Ns no sabamos a priori se a mdia da amostra seria maior ou menor que o meu valor de
teste (voc pode dizer que para este segundo caso, ns j sabamos... bom, mas temos que fingir que
no sabamos, ou estaramos apresentando evidncias para o nosso jri com informaes
privilegiadas, o que no justo...)
Quando estvamos construindo a nossa rea de no rejeio, o fato de acharmos duas reas
de rejeio simtricas fez sentido, para este teste bilateral, mas no d para entender muito bem para
o caso do p-valor, No mesmo? mesmo! Tanto que para calcular o p-valor para um teste
bilateral, usamos uma conveno, que multiplicar o valor encontrado por 2 (o que na verdade
corresponde a calcular a integral para os intervalos simtricos e somar os dois valores.) Complicou?
Vamos ver devagar:
T

p valor =2 f t dt = f t dt f t dt
T T
Conferindo no R:

> 2*pt(2.7646, df=99, lower.tail=F)


[1] 0.006798372
> pt(2.7646, df=99, lower.tail=F)+pt(-2.7646, df=99)
[1] 0.006798372

Muito bem, conferindo com o valor obtido no teste t acima, o resultado bate. Mas afinal de
contas, qual a interpretao desse p-valor? No parece to intuitivo quanto a nossa rea de
rejeio... E de fato no ...
O que ele representa a probabilidade de se selecionar uma amostra, cuja mdia amostral
pelo menos x (pode ser esta diferena ou uma diferena maior, mais para o lado do
0
infinito), se a verdadeira mdia da populao fosse 0 . Entendeu? aquela rea que a gente
calculou...
Repare que este conceito bastante diferente daquele que ns estudamos para os intervalos
de confiana e bem menos intuitivo tambm. Ainda assim a medida mais usada em estatstica.
E assim o nosso julgamento entra em recesso, com a condenao incondicional do nosso
ru. Voltaremos a ele ainda mais tarde quando falarmos de poder e tamanho de amostra

Relao entre o teste de hipteses e o intervalo de confiana

Voc agora deve estar pensando: bom, o teste de hipteses com as suas reas de rejeio e
p-valores so conceitualmente diferentes dos intervalos de confiana. Mas muito comum,
especialmente em Epidemiologia vermos relatadas ambas as medidas, lado a lado, e tem uma coisa
que sempre acontece: sempre que o p-valor menor que 0.05, o IC 95% no contm o valor do
parmetro sendo testado na hiptese nula. Por exemplo, uma odds ratio (OR) que tenha um p-valor
relatado < 0.05 nunca contm a unidade, sim, porque o que estamos falando aqui vale para qualquer
teste de hipteses e qualquer IC, para qualquer parmetro.

8
Claro que isso no coincidncia. De fato existe uma relao entre essas duas medidas
apesar delas serem construdas de maneiras diferentes e terem interpretaes prprias.
No vamos perder tempo com provas algbricas formais aqui (que alis nem so to
complicadas assim), e vamos partir para uma demonstrao prtica. Vamos pegar a nossa amostra
de idosos novamente. Se o que acabei de afirmar verdade, ento todas as estatsticas T calculadas
para qualquer valor fora do IC 95% para o nosso vetor de PAMs (107.7729,116.7887) dever cair
na rea de rejeio do nosso teste de hipteses (e, por conseqncia, ter um p-valor menor que
0.05). Vamos fazer o seguinte: vamos criar um vetor seqencial cujos limites so o IC 95%, com
espao de 0.1:

x <- seq(107.7729,116.7887,0.1)
x[92] <- 116.7887

Tivemos que acrescentar o ltimo valor do vetor s para podermos ter um vetor exatamente
igual ao do intervalo. Se quiser, confira o vetor. Vamos agora calcular todas as estatsticas T
associadas a esses valores do vetor x:

T <- (mean(pam.idosos)-x)/sqrt(var(pam.idosos)/100)

No creio que seja necessria explicao. Esta a mesma equao que usamos
anteriormente, apenas colocando o vetor x no lugar do valor 100. Claro que aqui nos valemos de
um clculo vetorial no R. Vamos agora ver se esses valores de T caem mesmo na rea de rejeio.
Lembra do intervalo? mais fcil fazer o contrrio: tnhamos calculado o intervalo de no rejeio
- (-1.98,1.98) e podemos verificar se os valores caem fora deste intervalo. Para isso, vamos ver os
valores mximo e mnimo para o nosso recm-calculado vetor T:

> min(T)
[1] -1.984238
> max(T)
[1] 1.984207

Como o menor valor deste vetor menor que -1.98 e o maior valor maior que 1.98,
podemos concluir que de fato todos esses valores caem na rea de rejeio. Mas e o p-valor? Como
ser que ele se comportaria? Vamos calcular:

pvalor <- 2*pt(abs(T), df=99, lower.tail=F)

A explicao desse cdigo fica para um exerccio. Basta agora ver qual o menor p-valor
que foi calculado e ele deve ser maior que 0.05:

> min(pvalor)
[1] 0.04999757

Epa! Esse p-valor aqui ainda menor que 0.05. Como fica isso? Bem, meus amigos, isso a
estatstica... Certamente um problema de de arredondamento. Esse valor corresponde ao valor do
limite superior, usado com 4 dgitos (116.7887.) Daria muito trabalho calcular exatamente, sem
arredondamento esse valor. Vamos ento ver o menor valor possvel que arredondado daria
116.7887. Bem, 116.78865 seria o caso... Confira:

> round(116.78865,4)
[1] 116.7887

Agora vamos ver o que teramos nesse caso (no se assuste: eu apenas coloquei tudo ao
mesmo tempo agora):

9
> 2*pt(abs((mean(pam.idosos)-116.78865)/sqrt(var(pam.idosos)/100)), df=99,
lower.tail=F)
[1] 0.05000006

At que ficou aproximadinho...


;-)
Convenceu? No? Faa ento com outro valor qualquer e confira...

Poder de um teste

Vamos agora voltar para o nosso teste e tambm para o nosso julgamento para discutir o
famoso poder de um teste. Para facilitar a nossa vida porm, vamos agora usar uma Normal em vez
de uma distribuio t. Nesse caso, vamos trabalhar com uma varincia conhecida e igual a 625
mmHg2, uma situao bastante irreal, mas s para ficar mais palpvel. No nosso julgamento, a
nica garantia que queramos era estabelecer um erro mximo para no condenar um inocente, ou
seja para no rejeitar a hiptese nula com uma probabilidade qualquer. Para tal, em geral,
estabelece-se um limite de 5%.
Como ns j comentamos tambm, o poder nada mais do que a probabilidade de um acerto
e no de um erro: a probabilidade de rejeitar a hiptese nula, quando de fato ela falsa, ou seja,
a probabilidade de condenar um culpado. Isso evidentemente o complemento de se absolver um
culpado, ou seja o complemento do erro tipo II. A probabilidade do erro tipo II tambm
conhecida como . Logo, o poder ser a probabilidade de no cometermos o erro tipo II ou
1 . Ao contrrio da probabilidade de cometer o erro tipo I, ou o nosso famoso alfa, o beta no
fixo e ele depende de trs fatores: o prprio alfa, o valor testado na hiptese alternativa e o
tamanho da amostra.
O tamanho da amostra no deve causar estranheza a voc, j que voc deve estar se
lembrando da nossa discusso sobre intervalos de confiana, que quanto maior o tamanho da
amostra, menor a varincia da mdia amostral. Nesse caso, intuitivamente voc poderia pensar que
faz sentido um teste ter uma preciso maior quanto maior o tamanho da amostra e por conseqncia
um maior poder. O erro tipo I tambm no deve ser intuitivamente difcil de entender, j que se ns
aumentarmos o limite do erro tipo I, deveremos diminuir o limite do erro tipo II como se o jri
ficasse mais inclinado a condenar o nosso ru, e portanto menos inclinado a absolv-lo.
Mas e quanto ao valor testado? Como isso?
Para incio de conversa, qual seria o valor testado sob a hiptese alternativa no nosso
exemplo acima? Recordando:
H0: 0 = 0
H1: 0 0
No parece haver um valor definido no mesmo? isso a. No nosso caso, existem
infinitos nmeros sendo testados, alis, qualquer valor que no seja o nmero zero cabe na nossa
hiptese alternativa. Complicou, n? Bem, que na verdade o poder do teste uma funo e no
um nmero exato, e depender do valor contra o qual queremos testar a hiptese nula; para dizer a
verdade ele depende mesmo da diferena que queremos testar. Vamos ver como isso funciona na
prtica, ento.
Para comear, vamos recordar o que significa o poder, em termos intuitivos: como temos
que rejeitar a hiptese nula, quando ela de fato falsa, estamos procurando uma probabilidade a
partir de um ponto qualquer (um quantil qualquer) que est certamente mais extrema do que o nosso
alfa, sob a hiptese nula, para podermos rejeit-la, certo? Se temos que rejeitar a hiptese nula, esse
valor tem que estar na rea de rejeio (sob a hiptese nula.)
Acontece que ao mesmo tempo queremos obter uma probabilidade sob a hiptese
alternativa, na verdade, concorda? Ora, se estamos afirmando que a hiptese nula falsa, isso

10
significa que a hiptese alternativa que verdadeira e portanto sobre a distribuio da hiptese
alternativa que nos interessa calcular essa probabilidade. Complicou bem, no?
que voc no est levando em conta o fato de ser possvel que essas distribuies se
sobreponham. Alis, no caso da Normal e da t elas vo sempre se sobrepor, no mesmo? Vamos
ver um exemplo? Vamos usar a hiptese alternativa de 110 mmHg e ver o que acontece.
Repare na figura abaixo a rea que estamos procurando. A curva da esquerda a
distribuio da mdia sob a hiptese nula e a da direita, sob a hiptese alternativa. Ns marcamos
ento o limite do nosso erro do tipo I na curva da esquerda, mas a teremos que calcular a rea sob a
curva a partir deste valor, mas na curva da direita (a curva da hiptese alternativa).

A rea hachurada o poder do teste para uma hiptese alternativa de 110 mmHg.
Obviamente isso s um exemplo, pois como j mencionado, no temos uma hiptese alternativa
simples, com apenas um nmero, mas sim infinitos nmeros. Desse modo, comum representarmos
o poder de um teste atravs de uma curva, a curva de poder. como se tivssemos vrias curvas
diferentes para a hiptese alternativa, com vrias reas diferentes, que variam em funo da
hiptese alternativa.
Vamos usar o R para construir uma curva de poder para esse teste lembre-se que estamos
mantendo fixos o nosso tamanho de amostra de 100 e ainda o nosso alfa de 0.05!!!
Bem, uma maneira intuitiva (diferente da frmula do livro...) de se desenhar essa curva de
poder para vrios valores da hiptese alternativa poderia ser o seguinte: calculamos o valor crtico
para a hiptese nula, demarcando a nossa rea de rejeio. Toma-se esse quantil calculado para a
hiptese nula e calcula-se a rea mostrada no grfico acima para vrios valores diferentes. Vamos
comear criando esses valores, digamos de 100 a 120:

x <- seq(100,120,1)

Agora vamos calcular o poder para esses vrios valores, usando o raciocnio acima, com a
ajuda do R:

poder <- pnorm(qnorm(0.975, mean=100, sd=2.5), mean=x, sd=2.5,


lower.tail=F)

11
Ihhhh! Complicou... Vamos explicar devagar. Estamos calculando uma rea com a funo
pnorm() e esta rea de um ponto at o infinito (com o agumento lower.tail=F.) Muito bem, o
ponto a partir do qual queremos calcular esta rea o limite da regio crtica sob a hiptese nula,
certo? Este ponto corresponde ao quantil para uma rea de 0.975, para uma Normal de mdia 100
(hiptese nula) e um desvio-padro de 2.5 (de onde vem esse valor? Dica: lembre-se que a varincia
da populao conhecida e igual a 625 mmHg2). Mas essa rea para ser calculada sob a hiptese
alternativa, e portanto os demais argumentos so a mdia sob a hiptese alternativa (que o vetor
x) e o desvio-padro que o mesmo que sob a hiptese nula. Agora basta desenhar o grfico:

plot(x,poder, type="l")

Que tal? Que concluses voc pode tirar dessa curva?


Se voc quiser conferir essa curva com a que voc aprendeu na aula ou no livro, use este
cdigo:

poder1 <- pnorm(qnorm(0.025)+abs((100-x))/2.5)


points(x,poder1)

Confere? Entendeu o que est acontecendo? Aquela curva da hiptese alternativa est se
movendo no eixo x, produzindo diferentes reas, com nessas curvas abaixo, construdas para
hopteses alternativas variando de 101 a 117 com um incremento de 2:

12
Reparou como a rea aumenta medida que a hiptese alternativa se afasta da hiptese
nula?
Agora, uma coisa que pode estar estranha que apesar de estarmos lidando com um teste
bilateral, ns s tratamos de poder para um dos lados. Nesse caso ns escolhemos valores maiores
que o valor para a hiptese nula. Na verdade, uma vez que estabelecemos os valores, no faz
diferena se o valor foi menor ou maior. Com o uso da equao, que leva em conta valores
absolutos, no importa a direo, que o valor do poder ser o mesmo. Visualmente fica mais fcil
fazer para um dos lados s. Note que isso no funcionaria para o meu raciocnio intuitivo, e a
equao teria que ser modificada um pouco para o clculo do poder para valores menores que 100.
Agora que j vimos que quanto mais distante do valor da hiptese nula maior o poder,
vamos ver o que acontece quando alteramos os outros dois parmetros, o alfa e o tamanho da
amostra. Vamos fazer o seguinte: criaremos uma funo para desenhar uma matriz de curvas de
poder para uma hiptese nula fixa e vrias hipteses alternativas (as mesmas que ns j
construmos) em relao a uma mdia. Cada curva ter valores variveis para o seu alfa e tambm
para o seu tamanho de amostra. Veja esta funo:

curva.poder <- function(H1, H0, pop.var, alfa, n)


{
a <- length(alfa)
b <- length(n)
par(mfrow=c(a,b))
for (i in 1:a){
for (j in 1:b){
plot(H1,pnorm(qnorm(alfa[i]/2)+abs((H0-
H1))/sqrt(pop.var/n[j])), type="l", ylim=c(0,1), ylab="Poder", xlab="Hiptese
Alternativa", main=paste(c("H0:", H0, ", alfa=", alfa[i], " e n=", n[j]),
collapse=""))
abline(h=0.8)
}
}
par(mfrow=c(1,1))
}

Ela vai pegar um vetor de hipteses alternativas, e plotar a curva de poder em relao a uma
hiptese nula, dada uma varincia da populao e ainda vetores de alfas e tamanhos de amostra. Os
grficos tambm tm uma linha horizontal em 80% de poder para referncia. Note que o resultado
para alternativa bicaudal.
Veja um resultado abaixo, para a nossa mesma hiptese nula de uma mdia de 100 mmHg,
vrias alternativas e a varincia de 625 mmHg2:

curva.poder(H1=seq(100,115,0.5), H0=100, pop.var=625,


alfa=seq(0.025,0.10,0.025), n=seq(25,100,25))

As curvas obtidas podem ser vistas na figura abaixo. Que concluses voc poderia tirar?
Faam uma linha vertical onde a curva cruza com a linha traada em 80% de poder. O que acontece
com a diferena detectada? Voc consegue perceber que algumas vezes teremos que absolver o
nosso ru por falta de provas?

13
Mas eu tenho certeza que agora voc est se perguntado: bom, se isso uma rea sob uma
curva, deve ter uma daquelas cobrinhas (nome carinhoso da integral) que representa essa joa,
no mesmo? mesmo! Tanto que eu vou deixar essa como exerccio para vocs!!!

Tamanho da amostra

Por ltimo, vamos ver um pouco mais sobre o tamanho da amostra, que como voc j notou
influencia bastante o poder do teste. Isso tudo muito bonito, mas na prtica mesmo de um desenho
de estudo, a deciso final que ter que ser tomada quanto ao tamanho da amostra a ser coletada da
sua populao. Isso porque, como voc deve ter notado, os outros parmetros que influenciam nessa
nossa equao de poder so de uma maneira ou de outra chutados. Vamos ver a equao do poder
novamente. Eis uma de suas representaes, para um teste bilateral para a mdia. Encontrado em
qualquer livro de estatstica:

[
1 = z 1 / 2
0 1 n
]
Essa equao envolve todos os parmetros aos quais nos referimos anteriormente. Tente
identific-los (repare que ns usamos essa equao, com uma pequena modificao). Ah, lembre-se
que z a rea de uma normal desde menos infinito at o ponto z, ou seja, aquela
cobrinha... Alguma semelhana com uma funo do R?

14
Bem, a partir desta equao, podemos facilmente isolar o valor do tamanho da amostra, n.
Para no dizer que sou muito exigente, o primeiro passo aplicar a funo inversa z em
ambos os lados da equao, o que daria:
0 1 n
z1 = z1 / 2

Bem, daqui para frente ficou fcil obter uma equao para o n, no mesmo?
Mas afinal, por que eu digo que os parmetros sero chutados? simples: porque na prtica,
voc no sabe a verdadeira mdia nem a verdadeira varincia se soubesse no precisaria da
estatstica, no mesmo? Como o alfa fixo e voc tem que chutar os outros parmetros, o nico
clculo interessante na prtica o tamanho de sua amostra para obter-se um teste com um
determinado poder, chutados os demais parmetros.
Observe tambm nessa equao que o que importa de fato a diferena entre as mdias que
estamos testando e no os seus valores propriamente ditos. Assim, tanto faz estarmos comparando
100 mmHg com 110 mmHg ou 95 mmHg com 105 mmHg, que mantidos os outros parmetros
fixos, o tamanho da amostra ser o mesmo.
De fato, ao desenhar um estudo, o que se faz em geral apresentar diversos cenrios para
tamanhos de amostra diferentes, e ver como o poder desse teste vai variar. verdade que a
diferena que se quer detectar tambm pode entrar na questo, especialmente se voc no tem a
menor idia de qual seja essa diferena. claro tambm que no caso de um ensaio clnico por
exemplo, uma diferena que seja clinicamente significativa seria a de interesse para voc.
O principal motivo para isso que coletar informaes de pessoas custa tempo e dinheiro, e
o que queremos, em um mundo com recursos escassos (que papo de economista, hein?) o melhor
custo-benefcio em termos de poder e tamanho de amostra, isto , um tamanho de amostra que no
seja muito caro de se obter tanto em termos de tempo quanto de dinheiro, mas que ao mesmo tempo
seja capaz de responder pergunta proposta pelo estudo de forma adequada.
Bem, nesse caso seria interessante termos uma funo para calcular o tamanho de uma
amostra no mesmo? Ento vamos l...

tamanho.amostra <- function(alfa=0.05, poder=0.8, dif, var, bilateral=T)


{
if (bilateral){
zalfa<-qnorm(1-(alfa/2))
}else{
zalfa<-qnorm(1-alfa)
}
ceiling(((qnorm(poder)+zalfa)^2)*var/(dif^2))
}

Essa uma funo bem simples, apenas para o caso de uma amostra que ns vnhamos
discutindo, mas funciona. Experimente um tamanho de amostra para o nosso exemplo:

tamanho.amostra(alfa=0.05, poder=0.8, dif=10, var=625, bilateral=T)

Muito bem. Repare que ns mantivemos aqui a nossa varincia conhecida, para podermos
usar a Normal em vez da distribuio t. Apesar de existirem mtodos (inclusive implementados no
R) para um clculo mais preciso de tamanho de amostra (e conseqentemente do poder tambm),
em geral essas aproximaes pela Normal so usadas e funcionam bem, especialmente se
estivermos falando de tamanhos de amostra suficientemente grandes (por que ser?) Esses mtodos
mais especficos sero abordados na prxima aula... Aguardem!
Apesar de ns s termos abordado o caso de uma amostra para a diferena de mdias, toda
esta teoria sobre teste de hipteses, poder e tamanho de amostra pode e deve ser aplicada para
outros problemas, como testes pareados, testes para mais de uma amostra, testes para propores,

15
etc. Como o raciocnio o mesmo, se voc entendeu como funciona, a extrapolao para as demais
situaes bastante intuitiva tambm.

Simulaes

Mas nem tudo so flores... Nem sempre possvel obter-se funes algbricas para calcular
tamanhos de amostra para determinados problemas, como vocs podero se deparar no futuro... Em
situaes como essas, podemos lanar mo de resultados aproximados, ou ento usar um recurso
que vem sendo empregado mais e mais freqentemente em estatstica que o uso de simulaes
para o clculo de poder de um teste.
Neste caso, faz-se o caminho inverso: ns simulamos amostras sob a hiptese alternativa
para vrios tamanhos de amostra diferentes e calculamos o poder obtido para cada um desses
tamanhos de amostras. Assim, possvel, para um determinado poder, estabelecermos um tamanho
de amostra adequado.
Mas como isso funciona, afinal de contas? No d para entender muito bem como isso
funciona, no mesmo? Mas mais simples do que parece. Vamos l: queremos calcular o poder
do teste, certo? Isto significa que quero saber com que freqncia o meu teste capaz de rejeitar a
hiptese nula, quando a hiptese alternativa verdadeira (um acerto).
Muito bem, na simulao ns fazemos o caminho inverso: ns criamos uma base de dados
que ser uma amostra de uma populao que tenha os parmetros de uma hiptese alternativa.
Complicou? Vamos ver o nosso caso: quero testar se a PAM diferente de 100mmHg. Bom, para
uma determinada hiptese alternativa, por exemplo 106mmHg, ns vamos gerar amostras de
tamanhos diversos a partir de uma Normal (106, 625), que a distribuio sob a hiptese alternativa
e ento vamos usar o nosso teste para ver se ele capaz de detectar a diferena (que de fato existe.)
Com isso teremos uma freqncia que corresponde mesmo ao poder desse teste para esta diferena.
Vamos ento implementar uma simulao no R, para esse problema. Vamos pensar: o poder
do teste a capacidade desse teste detectar uma real diferena quando ela realmente existe. Bem,
baseado no que j vimos em termos de testes de hipteses, uma das maneiras de se fazer isso,
calcular o p-valor e rejeitar H0 para valores menores que 0.05, por exemplo. Ora, ento, isso quer
dizer que se eu testar um valor fixo (como fizemos aqui, de 100 mmHg, nossa H0) contra uma
distribuio que seja gerada de uma populao com uma mdia de, digamos 106 mmHg, para
diferentes tamanhos de amostra, teremos diferentes probabilidades de rejeitarmos H0 (pois nesse
caso, estamos assumindo que de fato a mdia mesmo 106 mmHg)
Como poderamos ento fazer isso? Bem, uma maneira simular vrias vezes uma amostra
de tamanho varivel (mas conhecido, estabelecido por ns), aplicar o teste estatstico que
empregaremos no nosso estudo e contar quantas vezes o p-valor desse teste ser menor que 0.05. Se
dividirmos esse nmero pelo nmero total de simulaes, estaremos calculando a freqncia com a
qual o teste rejeita a hiptese nula (p < 0.05), quando a hiptese alternativa verdadeira (a amostra
simulada sob a hiptese nula), ou seja, teremos o poder desse teste.
Vamos ento criar uma funo para simular as nossas presses a partir de uma Normal com
mdia igual mdia sob a hiptese alternativa e com a varincia da populao 625mmHg2 e ento
calcular quantas vezes o p-valor para um teste t vai ser menor que 0.05. O default para o nmero de
simulaes ser 1000. Veja o cdigo abaixo:

poder.sim <- function(x, k=1000, H0, H1, sd)


{
#Iniciando as variveis
p <- 0
poder.t<-0
#Loop para vrios tamanhos de amostra
for (m in 1: length(x))
{
#Loop para o nmero de simulaes

16
for (i in 1:k)
{
data <- rnorm(x[m], mean=H1, sd=sd) #Gerao da amostra
sob H1
p[i] <- t.test(data, mu=H0)$p.value #Clculo do p-valor
para o teste t
}
poder.t[m] <- sum(p<=0.05)/k #Clculo do Poder para cada tamanho de
amostra o nmero de vezes que o p-valor menor que 0.05, dividido pelo nmero
de simulaes
}
plot(x, poder.t, ylab="Poder", xlab="n", type="b") #Plotando a curva
de poder
cbind(x, poder.t) #Retornando os tamanhos e os poderes
}

Agora podemos calcular uma curva de poder para o nosso problema. Vamos tentar ento
calcular a nossa curva para amostras de tamanhos 25 at 350 com incremento de 25 em 25, para as
nossas hipteses H0=100mmHg e H1=106mmHg:

poder.sim(seq(25,350,25), k=1000, H0=100, H1=106, sd=25)

Possivelmente a sua curva no to redondinha quanto uma curva calculada a partir de uma
conta exata, como fizemos anteriormente. Acontece que para a distribuio t tambm no existe
uma equao exata muito tratvel, apesar de existir um modo de faz-lo, e que descrito no livro-
texto, para quem estiver interessado. O que a maioria dos livros descreve geralmente admitir que a
varincia da populao conhecida e aproximar os resultados usando a Normal mesmo para
calcular o poder. Vamos ento comparar com os poderes usando a Normal para o nosso caso, no
prprio grfico que acabamos de criar, assumindo a varincia da populao como 625mmHg2:

x<-seq(25,350,25)
lines(x, pnorm(qnorm(0.975, mean=100, sd=sqrt(625/x)), mean=106,
sd=sqrt(625/x), lower.tail=F), pch=20, type="b")

E ento, os resultados so bem parecidos?

Exerccios

1. Explique porque o juiz indeferiu o pedido de se utilizar a varincia da populao geral


como evidncia para o nosso julgamento.

2. Calcule o IC 95% para a mdia amostral calculada no nosso julgamento. Apresente o


cdigo do software que voc utilizou ou as contas feitas mo. Explique cada um dos
passos do clculo. Obs.: Repare que o vetor pam.idosos foi gerado aleatoriamente por
cada um de vocs. Portanto, espera-se que os resultados sejam diferentes para cada aluno.

3. Para o nosso exemplo da PAM, apresente uma proposta de tamanho de amostra para um
estudo como esse, discutindo diferentes poderes e diferentes possveis diferenas.

4. Escreva as equaes matemticas que correspondem ao cdigo


((qnorm(poder)+zalfa)^2)*var/(dif^2) na funo para calcular o tamanho de uma
amostra acima. Dica: o plural est bem empregado, pois uma equao para o caso
bilateral e outra para o unilateral. Observe o cdigo acima, para tirar (ou aumentar?) a
dvida:

17
if (bilateral){
zalfa<-qnorm(1-(alfa/2))
}else{
zalfa<-qnorm(1-alfa)

5. Vimos na aula uma das maneiras de escrevermos a equao para obter o poder de um teste:

[
1 = z 1 / 2
0 1 n
] . Identifique nessa equao cada um dos elementos

presentes, descrevendo o significado de cada um deles (i.e. descreva cada uma das
letrinhas dessa equao). Dica: essa equao tem uma integral disfarada. Aponte onde ela
est e o que ela representa tambm.

6. Utilize o banco de dados velho conhecido nosso, juul e teste se a mdia de IGF-I
diferente de 330 g/l. Indique qual o teste de hipteses e interprete a sada do programa
que voc utilizou das trs maneiras possveis: comparao com um valor crtico, p-valor e
intervalo de confiana.

Questo extra (bnus de 0.1 ponto):

Use simulaes para desenhar uma curva de poder para diversos tamanhos de amostra para
um teste de hipteses qualquer, envolvendo uma distribuio t e escolha um tamanho de
amostra adequado para este estudo. Isto significa que voc vai estabelecer o que testar e
que pressuposies so necessrias. Indique tambm explicitamente o teste de hipteses a
ser realizado. Dica: Use a funo para simulao de poder que ns criamos para ajudar
voc a escolher o tamanho da amostra. Obs.: No use o mesmo exemplo da questo 3.

18
Mdulo Estatstica I no R
Autor: Antonio Guilherme Fonseca Pacheco

Pr-requisitos: Conhecimento prvio do ambiente R. Especificamente, o leitor deve estar


familiarizado com os mdulos Bsico, Entrada e Sada de Dados e tambm Manuseando
dados no R.

Bibliotecas necessrias: ISwR

Aula 5 - Testes para uma e duas amostras (contnuos)


Livro: pginas 81 a 93

A partir dessa aula vamos abordar diferentes tipos de testes usados em situaes especficas
comumente encontrados no dia-a-dia da Epidemiologia e da Bioestatstica.
Na presente aula vamos conversar sobre testes para inferir basicamente diferenas entre
mdias de variveis contnuas, seja como ns j vimos, apenas com uma amostra ou com duas
amostras. Alm disso, alternativas no-paramtricas, isto , estatsticas que no assumem uma
distribuio conhecida dos parmetros tambm ser abordada. O caso de mais de duas amostras
para variveis contnuas ser abordado na aula sobre ANOVA

Teste t para uma amostra


Teste do sinal do posto de Wilcoxon
Teste t para duas amostras
Comparao de varincias
Testes para normalidade
Teste de Wilcoxon para duas amostras
Teste t pareado
Teste de Wilcoxon pareado
Poder e tamanho de amostra para testes t
Exerccios

Teste t para uma amostra

Bem, o teste t para uma amostra no deve apresentar problemas ou surpresas para voc, j
que vnhamos usando esse teste como exemplos nas duas ltimas aulas. Iremos apenas formalizar as
coisas aqui e tambm descrever um pouco melhor a sada da funo t.test(), que usada tambm
para esse fim, como j fizemos anteriormente.
Recordando um pouco, o teste t ser usado na esmagadora maioria dos casos, pois em geral
a varincia da populao no conhecida, e teremos que lanar mo da varincia amostral. O
conceito bsico de um teste t o clculo do erro padro da mdia (EPM), que nada mais do que o
desvio-padro da mdia amostral que ns j exploramos bastante. Recordando:
EPM = s / n
No creio que haja dvidas a respeito do EPM acima. O prximo conceito o clculo da
estatstica T, que baseado, como voc deve estar lembrado tambm no EPM. Ns j fizemos esse
clculo para o teste t para uma amostra, mas sem usar o termo EPM. Recorde:

x 0 x 0
T= =
EPM s / n

1
E claro que toda aquela teoria que ns j discutimos para testes de hipteses, p-valores e
ICs se aplicam aos nossos testes, e portanto no vamos discutir esse assunto novamente. Vamos
partir para um exemplo prtico, s para reforar tambm.
Vamos usar um banco de dados do pacote ISwR como exemplo. O banco chama-se intake
e contm informaes sobre ingesta calrica (em kilojoules) antes (primeira coluna) e aps
(segunda coluna) a menstruao de 11 mulheres, valores esses pareados para cada uma dessas
mulheres.
Vamos chamar e inspecionar esse banco:

library(ISwR)
data(intake)
intake

Bem, como por enquanto vamos trabalhar com uma amostra, vamos inicialmente usar
somente a primeira coluna desse banco. Selecione este vetor:

energia<-intake[,1]

Aproveite para fazer algumas estatsticas-resumo deste vetor...


Bem, um problema interessante que podemos testar se a ingesta dessas mulheres difere
significativamente ou no no perodo pr-menstrual do valor recomendado, de 7725 kJ. Vamos
assumir que essa amostra foi tirada de uma distribuio Normal e aplicar o nosso j conhecido teste
t:
> t.test(energia, mu=7725)

One Sample t-test

data: energia
t = -2.8208, df = 10, p-value = 0.01814
alternative hypothesis: true mean is not equal to 7725
95 percent confidence interval:
5986.348 7520.925
sample estimates:
mean of x
6753.636

Vamos ento explicar agora cada parte da sada desse teste:

One Sample t-test

Bem, essa s a descrio do tipo de teste empregado. Repare que o R entende, s por voc
ter colocado a opo mu=7725 que se trata de um teste t para uma amostra.

data: energia

Sem problemas aqui tambm. Trata-se apenas do nome do banco de dados que foi usado
pela funo. Pode ser til em algumas situaes.

t = -2.8208, df = 10, p-value = 0.01814

Aqui comea a brincadeira. Ns temos a estatstica T (t = -2.8208), os graus de liberdade


da distribuio ( df = 10) e o p-valor associado a essa estatstica (p-value = 0.01814). Na
verdade esta linha basta para voc interpretar o seu teste de hipteses, no mesmo? Lembra da
relao entre o p-valor e o teste de hipteses? Pois , mas claro que voc poderia calcular o valor
crtico e compar-lo com o valor de T como ns fizemos anteriormente.

2
alternative hypothesis: true mean is not equal to 7725

Aqui o R nos informa que o teste bilateral (bicaudal) isso por causa do not equal to
que significa diferente e no maior ou menor que. Temos tambm a informao sobre o valor contra
o qual estamos comparando essa amostra, 7725.

95 percent confidence interval:


5986.348 7520.925

E claro que podemos ainda usar o IC 95% para esse fim tambm. Ora, se o valor testado
(7725) no estiver contido no IC 95% para a mdia da amostra, por causa da mesma relao, o p-
valor ser < 0.05 e a hiptese nula ser rejeitada, como o caso. Lembra-se como se calcula esse
IC?

sample estimates:
mean of x
6753.636

E aqui est a estimativa da mdia, ou seja a mdia amostral do nosso vetor. Voc gostaria de
ver alguma outra estimativa aqui para o nosso problema?
Se voc foi curioso o bastante, j deve ter consultado a ajuda do R para saber mais sobre a
funo t.test(), que realmente muito usada em estatstica e conseqentemente por ns tambm.
Voc deve ento ter notado que ela apresenta diversos argumentos possveis para vrios tipos de
testes e tambm opes de testes.
Neste caso, para definir o teste como para uma amostra, o argumento usado foi o mu=7725,
mas outros argumentos, dos quais ns usamos os defaults, definem caractersticas do teste em
questo. O primeiro a direo desejada do teste, cujo valor-padro "alternative=two.sided,
o que ns exatamente usamos. Se quisssemos um teste unidirecional, poderamos lanar mo das
alternativas, que tenho certeza que voc j procurou na ajuda para esse teste (caso contrrio, faa-o
agora.)
O outro parmetro o nvel de confiana que desejamos usar para o teste. O valor padro,
como voc deve estar imaginando conf.level = 0.95. Mas se quisssemos poderamos usar
outros nveis. Por exemplo, tente fazer um teste bilateral para um alfa de 0.01 e veja o que
acontece...

Teste do sinal do posto de Wilcoxon

Para incio de conversa, que nomezinho mais infeliz, esse no mesmo? Pois , mas o nome
original dele Wilcoxon signed-rank test e se algum vier com uma traduo melhorzinha, ser
bem-vinda.
Bem, esse teste pertence a uma famlia de testes chamados testes no-paramtricos, tambm
conhecidos como livres de distribuio. Significa que ns no precisamos assumir uma distribuio
qualquer para os parmetros que estamos querendo estimar.
U, mas ento como que isso funciona? Calma. Ele baseado no que chamamos de
estatsticas de ordem. o seguinte: lembra da mediana e dos quartis, quantis, etc? Pois , eles so
chamados de estatsticas de ordem porque eles criam uma ordenao ou um rank das observaes.
A partir dessas ordens ou postos (ranks) possvel ento fazer-se inferncias sobre o nvel de uma
varivel qualquer.
Pera, que histria essa de nvel? Ns no estvamos falando de mdias??? Pois , aqui
h uma discusso. Muito embora rigor os testes baseados em estatsticas de ordem estejam
testando a diferena de ordens mesmo, muitos autores tomam a liberdade de dar um salto e dizer
que estes testes estariam mesmo inferindo diferenas entre mdias.

3
A rigor, o que estamos realmente testando so diferenas de medianas, que umas dessas
ordens, mas que tm a caracterstica de dividir nossa distribuio em partes iguais, ou seja
exatamente na metade. A fim de evitar confuses, eu acabo optando por ficar em cima do muro e
dizer que estamos testando diferenas nos nveis (conveniente, no?)
;-)
Tudo muito bonito, mas para que servem estes testes afinal de contas? O teste t no
relativamente robusto em relao distribuio Normal, por conta do TLC? Por que ento eu usaria
um teste desses? Bem, que nem sempre o TLC vai ajudar muito, especialmente se estamos
tratando de amostras pequenas.
Ah, mas isso para essas variveis que poderiam ser muito bem testadas pelo teste t, mas
temos tambm situaes onde a primeira opo seria mesmo um teste desse tipo. Algum arrisca
dizer que situao essa?
Bem, mas vamos adiante. O R tem implementado tambm funes que realizam esses testes
no-paramtricos. Vamos aplicar o teste que corresponde ao teste t para uma amostra, para o
mesmo exemplo que utilizamos anteriormente:

> wilcox.test(energia, mu=7725)

Wilcoxon signed rank test with continuity correction

data: energia
V = 8, p-value = 0.0293
alternative hypothesis: true mu is not equal to 7725

Warning message:
Cannot compute exact p-value with ties in: wilcox.test.default(energia, mu
= 7725)

Como voc deve ter notado, a funo que calcula esse tipo de teste se chama
wilcox.test() e os argumentos que usamos so essencialmente os mesmos que tnhamos usado
anteriormente. A sada da funo tambm bem semelhante, se bem que algo mais resumida.
Vamos ver a sada em maior detalhe.

Wilcoxon signed rank test with continuity correction

data: energia

Essa parte igualzinha ao do teste t, exceto pelo nome do teste que diferente e por essa
correo de continuidade, que veremos mais tarde o que significa.

V = 8, p-value = 0.0293

Essa a parte da sada que nos interessa, com a estatstica calculada e com o p-valor que
corresponde a esse valor para essa estatstica. Vamos ver o funcionamento disso mais adiante.

alternative hypothesis: true mu is not equal to 7725

Tambm igual ao teste t anteriormente.

Warning message:
Cannot compute exact p-value with ties in: wilcox.test.default(energia, mu
= 7725)

E aqui aparece um problema inerente ao teste no-paramtrico. a questo dos empates nos
postos (ranks). Como ns veremos mais tarde, para esse teste possvel calcular o valor exato,

4
construindo a distribuio da estatstica V. Porm quando o nmero de ranks muito elevado ou na
presena de empates, esse clculo exato fica bem mais complicado. No primeiro caso, essa
distribuio pode ser muito bem aproximada pela Normal, j que uma distribuio simtrica em
torno de 0 . Mas para o caso dos empates, e para um nmero reduzido de observaes, isso no
verdade e muitas vezes o resultado assinttico pode ficar prejudicado.
Repare que a funo wilcox.test() no calculou o valor exato por causa de empates,
apesar do tamanho da amostra ser bastante reduzido.
Mas vamos votar nossa estatstica V e tentar entender o que ela significa. Ele representa a
soma dos ranks positivos da diferena entre a nossa amostra e o valor a ser testado. Ihhh, complicou
bem... Vamos comear vendo a diferena qual :

> energia-7725
[1] -2465 -2255 -2085 -1545 -1335 -1210 -920 -210 -210 505 1045

Repare que das 11 observaes, temos duas diferenas positivas e as demais negativas.
Repare tambm que temos um empate: dois valores so -210. Bem, o prximo passo ordenarmos
essas diferenas, sem considerar o sinal, ou seja, vamos ordenar os seus valores absolutos. No R
podemos fazer assim:

> rank(abs(energia-7725))
[1] 11.0 10.0 9.0 8.0 7.0 6.0 4.0 1.5 1.5 3.0 5.0

Tudo muito bonito, mas o que diabos so esses dois 1.5 que aparecem no nosso vetor???
Isso ocorreu justamente por causa do empate que ns tnhamos. Quando acontece um empate,
atribui-se o rank mdio aos elementos empatados, o que seria apenas a mdia de fato. Nesse caso,
em termos absolutos, o 210 seria o primeiro elemento, rank nmero 1. como temos um segundo
210, que seria o rank nmero 2, temos que fazer (1 + 2)/2 = 1.5.
Muito bem, agora a nossa estatstica V ser a soma dos ranks para os valores cujas
diferenas haviam sido originalmente positivas. Isso pode ser feito facilmente no R:

> sum(rank(abs(energia-7725))[energia-7725>0])
[1] 8

Conseguiu entender esse cdigo? No? Ento tente mais uma vez... Pode ser um exerccio
interessante. Repare que estamos selecionando do vetor de ranks os valores cuja diferena
positiva ([energia-7725>0]) e somando esse resultado.
Conferiu com o valor achado pelo R l na sada?
Bom, o resto da teoria do clculo dos p-valores ou reas de rejeio para esta estatstica,
deixo para a curiosidade de cada um procurar em um livro-texto.
A questo da aproximao pela Normal, em geral, para um nmero de diferenas no nulas
(i.e. diferentes de zero) de pelo menos 16 os resultados so bastante satisfatrios. Para os demais
resultados, existem valores tabelados para valores crticos do teste de Wilcoxon.
S para lembrar da aula terica, sob a hiptese nula, a estatstica V tem mdia
n n 1 n n 1 2n 1
e varincia . Bem, se houver empates, a temos que descontar
4 24
um valor dessa varincia, cujo clculo um pouco complicado, e que veremos com mais detalhes
no teste para duas amostras.

Teste t para duas amostras

Como voc j deve ter depreendido da aula terica, o teste t para duas amostras no difere
muito do teste para uma amostra apenas. A diferena que testaremos a diferena entre duas

5
mdias diferentes, entre duas amostras independentes e no mais a diferena entre uma mdia de
uma amostra e um nmero fixo. claro que isso trar conseqncias em termos de clculos, mas
no em termos de conceito.
O clculo da estatstica T nesse caso deve ser feito levando-se em conta ambas as mdias a
serem testadas, e tambm ambas as varincias das mdias amostrais. De maneira geral:

x1 x 2
T=
2 2
s1 s2

n1 n2
O denominador dessa equao o erro-padro da diferena das mdias, que ns podemos
apelidar aqui de s dif .
A questo que classicamente se usa a condio onde as varincias das amostras so
homogneas, situao onde possvel calcular-se uma varincia conjunta ( na verdade uma mdia
ponderada das varincias de cada grupo.) Isso era bastante importante antigamente porque, para
calcular esses resultados na mo essa pressuposio tratvel. Assim, se assumirmos a
homogeneidade, podemos calcular a varincia conjunta:
2 2
2
n1 1 s 1 n2 1 s 2
s conj
=
n1 n2 2
E ento poderamos reduzir a nossa equao para:

x1 x 2
T=
1 1
s conj
n1 n2
Acontece que nem sempre possvel obter-se varincias homogneas e aproximaes para
esses casos foram desenvolvidas para podermos obter resultados confiveis mesmo sem essa
pressuposio. Uma dessas aproximaes (existem outras) foi descrita por Welch, e implementada
no R. O que acontece que ns simplesmente usamos a equao l de cima, para calcular o T, que
passa a no ser mais distribudo como uma t n n 2 mas a sua distribuio pode ser aproximada
1 2

por uma t com ' graus de liberdade calculados assim:


2
s 12 s 22

n1 n2
' =


2 2
1 s 12 1 s 22

n1 1 n1 n2 1 n2
Bem, vamos usar ento um banco de exemplo do ISwR para estudar o nosso teste t. O banco
energy contm o gasto energtico de mulheres obesas (obese) e magras (lean), em Megajoules
(MJ).

data(energy)
attach(energy)

Verifique a disposio dos dados nesse data frame. Repare que ns temos uma varivel para
os valores e outra para a classificao dos grupos (obese e lean). Vamos ento usar a nossa funo
t.test() nesse banco:

> t.test(expend~stature)

Welch Two Sample t-test

data: expend by stature

6
t = -3.8555, df = 15.919, p-value = 0.001411
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-3.459167 -1.004081
sample estimates:
mean in group lean mean in group obese
8.066154 10.297778

Repare que ns usamos o til para indicar que a varivel expend est sendo classificada pela
varivel stature, da mesma maneira que ns usamos no boxplot, lembra?
Repare tambm que o default do R usar mesmo o procedimento de Welch, para varincias
heterogneas. As nicas diferenas dessa sada para a que ns j vimos anteriormente so:

data: expend by stature

Indicando que uma varivel classificada pela outra.

t = -3.8555, df = 15.919, p-value = 0.001411

Os graus de liberdade que devem ser calculados segundo aquela equao l em cima.

alternative hypothesis: true difference in means is not equal to 0

O teste que nesse caso a diferena das mdias ser ou no igual a zero

sample estimates:
mean in group lean mean in group obese
8.066154 10.297778

E duas estimativas de mdias, uma para cada grupo a ser comparado.


Vamos agora ver como o R calcula esse teste de Welch. Bem, primeiramente vamos calcular
os graus de liberdade, segundo a equao acima:

s1 <- var(expend[stature=="obese"])
s2 <- var(expend[stature=="lean"])
n1 <- length(expend[stature=="obese"])
n2 <- length(expend[stature=="lean"])
gl <- ((s1/n1)+(s2/n2))^2 / (((1/(n1-1))*(s1/n1)^2) + ((1/(n2-
1))*(s2/n2)^2))
gl

Veja se no bate com o resultado l de cima... Se quiser pode fazer isso tudo na mo
tambm, mas eu recomendaria que voc tentasse identificar a equao acima nesse cdigo. Voc
seria capaz de explicar o que foi feito antes de calcularmos os graus de liberdade propriamente
ditos?
Bem, agora falta ainda calcular a estatstica T. Mas isso fcil, tambm baseado na frmula
mais geral l de cima:

media1 <- mean(expend[stature=="obese"])


media2 <- mean(expend[stature=="lean"])
T <- (media1-media2)/sqrt((s1/n1)+(s2/n2))
T

Algo de errado com o valor de T? Est com o sinal trocado? Isso faz alguma diferena?
Como voc obteria o resultado com o mesmo sinal?

7
Bom, j que o resultado bate com o esperado, agora ficou fcil obter o p-valor no R, no?
a mesma coisa que para uma amostra:

> 2*pt(T, df=gl, lower.tail=F)


[1] 0.001410692

Ora, no que bateu direitinho... Ah, se fosse fazer com o resultado de T negativo,
precisaramos omitir o ltimo argumento:

> 2*pt(-T, df=gl)


[1] 0.001410692

Claro que podemos tambm testar as nossas hipteses baseado nesse mesmo teste. Para isso,
vamos primeiro estabelecer:
H0: 1 2 = 0
H1: 1 2 0
E agora vamos usar o mesmo raciocnio que usamos na ltima aula: vamos calcular um
valor crtico para essa nossa t sob a hiptese nula. Lembra como ? Vamos l:

> qt(0.025, df=gl)


[1] -2.120785
> qt(0.025, df=gl, lower.tail=F)
[1] 2.120785

Lembrou? A diferena que tivemos que usar os graus de liberdade corrigidos. Como a
nossa T maior que 2.12 (ou -T menor que -2.12, no importa), vamos rejeitar a hiptese nula,
para um alfa de 5%, corroborando o resultado que obtivemos atravs do p-valor.
Ah, j ia me esquecendo. Tem ainda o IC 95% para a diferena dessas mdias. Vamos usar
o nosso erro-padro da diferena para a nossa notao (o denominador da equao l em cima).
assim:
IC 95% =

x 1 x 2 t ' ,0.975 s diff , x 1 x 2 t ' ,0.975 s diff
Isso para o nosso procedimento de Welch, claro por isso estamos usando s dif e ' .

No R:

> media1-media2-qt(0.975, df=gl)*sqrt((s1/n1)+(s2/n2))


[1] 1.004081
> media1-media2+qt(0.975, df=gl)*sqrt((s1/n1)+(s2/n2))
[1] 3.459167

Bateu? No? Ihhhh, esse sinal...


Mas claro que o R permite que voc use tambm o mtodo clssico para varincias
supostamente iguais. Basta um argumento para isso:

> t.test(expend~stature, var.equal=T)

Two Sample t-test

data: expend by stature


t = -3.9456, df = 20, p-value = 0.000799
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-3.411451 -1.051796
sample estimates:
mean in group lean mean in group obese

8
8.066154 10.297778

Repare que agora houve uma mudana em uma das sadas:

t = -3.9456, df = 20, p-value = 0.000799

Todos esses valores so diferentes, pois T foi calculado a partir da varincia conjunta, os
graus de liberdade da t so um nmero inteiro (usual) e iguais ao tradicional n1 n 2 2 e o p-
valor evidentemente calculado a partir desta distribuio e deste valor de T e portanto tambm
bastante diferente. Nossa concluso sobre o teste de hipteses no mudou, porm.
J sei: voc est achando que eu vou repetir toda aquela contaria que eu fiz para o
procedimento de Welch agora para o mtodo clssico, no ? Se enganou, vai ficar para um longo
exerccio...

Comparao de varincias

Bem, de qualquer maneira, precisamos ter um meio de testar se as varincias so


homogneas ou no, para podermos usar o teste clssico. O R oferece como opo o teste F para
razo de varincias. O procedimento no R bem simples:

> var.test(expend~stature)

F test to compare two variances

data: expend by stature


F = 0.7844, num df = 12, denom df = 8, p-value = 0.6797
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
0.1867876 2.7547991
sample estimates:
ratio of variances
0.784446

Esse teste bem intuitivo e ele testa se a razo das varincias das amostras ou no igual a
1 (caso em que elas seriam iguais, obviamente.) Ele baseado no fato de uma razo de varincias
seguir uma distribuio F de Snedecor. Isso no difcil de entender se voc souber que na verdade
a distribuio F uma razo de duas distribuies 2gl divididas pelos seus respectivos graus de
liberdade. Alm disso, a distribuio F tem como parmetros justamente os graus de liberdade do
numerador e do denominador, que correspondem aos graus de liberdade das 2gl do numerador e
do denominador dessa razo, respectivamente:
2
gl 1

gl 1
F gl , gl 2
=
1
2gl 2

gl 2
Vamos ver como isso funciona ento. Como voc deve se lembrar, a varincia da amostra
2
segue uma distribuio n 1 , se for feito um pequeno ajuste. Lembra?
n 1 s 2
2
~ 2n 1

Ento, para comparar duas varincias, podemos fazer o seguinte: vamos comparar as
varincias s 12 e s 22 de duas amostras, inicialmente fazendo uma diviso de duas expresses
como a acima:

9
n1 1 s 12
12
2
n 2 1 s 2
22
Bem, por enquanto, nada podemos dizer desta expresso acima, apenas que representa a
diviso de duas distribuies Qui-quadradas. Mas se ns dividirmos o numerador por n1-1 e o
denominador por n2-1, que so os graus de liberdade dessas distribuies, teremos o que estvamos
procurando, ou seja, uma F n 1, n 1 : 1 2

s 12 / 12
~ Fn 1, n 2 1
s 22 / 22 1

Mas h um outro detalhe: o tipo de teste de hipteses que vamos fazer neste caso seguinte:
H0: 12 / 12 = 1
H1: 12 / 12 1
Ora, isso quer dizer que sob a hiptese nula, 12 = 22 e podemos ento cancel-los na
expresso acima. Sendo assim, a razo entre s 12 e s 22 segue uma distribuio F n 1 , n 1 .
1 2

No nosso caso:

> s2/s1
[1] 0.784446

O mesmo resultado da sada l em cima. Mas e o nosso p-valor? Como ele foi calculado?
Antes disso, vamos ver o jeito dessa distribuio F

curve(df(x, df1=n2-1, df2=n1-1), from=0, to=5)


abline(v=1)

Repare que ns estamos testando uma igualdade com a unidade e no com zero. Bem, se a
estatstica obtida for menor que 1, estaremos procurando um p-valor que vai desde zero (limite
inferior da F) at este ponto e depois, claro, multiplicar por dois, para obtermos um p-valor
bicaudal. Veja no grfico abaixo.
A rea hachurada representa a rea de zero at 0.784, o valor da nossa estatstica. Para
calcular essa rea, basta ento usarmos uma funo para calcular a funo de densidade acumulada
de uma F com esses parmetros e multiplicar por 2:

> 2*pf(s2/s1, df1=n2-1, df2=n1-1)


[1] 0.679746

Confere? timo. Repare que tanto faz qual varincia est no numerador e qual est no
denominador. Voc vai conferir como o resultado o mesmo como um exerccio.

10
Testes para normalidade

Muito embora o teste t seja bastante robusto em relao normalidade da populao de


onde provm a amostra, especialmente pra um tamanho de amostra suficientemente grande, muitas
vezes desejamos verificar se a amostra vem ou no de uma distribuio Normal.
Ns j aprendemos a fazer essa verificao visualmente, atravs especialmente do Q-Q plot,
mas ainda no definimos nenhum teste formal para isso.
Um dos testes mais usados para esse fim o teste de Shapiro-Wilk, que nada mais faz do
que testar a linearidade de um Q-Q plot. O R tem uma implementao desse teste. Vamos ver como
se comporta o nosso banco energy para cada uma das classes:

> shapiro.test(expend[stature=='lean'])

Shapiro-Wilk normality test

data: expend[stature == "lean"]


W = 0.8673, p-value = 0.04818

> shapiro.test(expend[stature=='obese'])

Shapiro-Wilk normality test

data: expend[stature == "obese"]


W = 0.876, p-value = 0.1426

Repare que o grupo de magras tem um p-valor que rejeita a normalidade (essa a hiptese
nula), mas de maneira bem fronteiria. Compare com o Q-Q plot para esses grupos e vejam se voc
se sentiria vontade de usar um teste paramtrico para esse banco.

Teste de Wilcoxon para duas amostras

11
Assim como a idia do teste t para duas amostras tem a mesma lgica do que o para uma
amostra, o mesmo acontece com o teste no paramtrico. Para esse teste vamos descrever um pouco
mais detalhdamente o processo de obteno do p-valor, usando uma aproximao Normal.
Resumindo, voc pode lanar mo de um teste no paramtrico caso no se sinta seguro em
assumir a normalidade da populao de onde veio a sua amostra, ou a sua amostra pequena e voc
no est muito certo se o TLC vai mesmo ajudar.
Vamos ver um exemplo com a mesma base acima:

> wilcox.test(expend~stature)

Wilcoxon rank sum test with continuity correction

data: expend by stature


W = 12, p-value = 0.002122
alternative hypothesis: true mu is not equal to 0

Warning message:
Cannot compute exact p-value with ties in: wilcox.test.default(x = c(7.53,
7.48, 8.08, 8.09, 10.15, 8.4,

Repare que essa sada bastante parecida com aquela do teste para uma amostra somente. A
diferena est na estatstica calculada agora W e no mais V. Note tambm que o problema dos
empates continuam a nos incomodar nesse caso tambm.
O clculo da estatstica W um pouco diferente e consiste em ordenar as observaes em
ambos os grupos, independentemente do grupo ao qual a observao pertence e ento calcular a
soma dos ranks em um dos grupos, diminuindo-se a soma do mnimo terico para esse mesmo
grupo. No faz diferena que grupo escolhemos, mas vamos adotar o mesmo que o R usou, que foi
o grupo de magros. Primeiro vamos ordenar a varivel expend:

> rank(expend)
[1] 14.0 5.0 3.5 8.0 9.0 18.0 11.0 19.0 1.0 7.0 20.0 22.0 2.0 21.0
17.0 3.5 12.0 16.0 15.0 6.0 13.0 10.0

Note que existem de fato empates, denotados pelo rank 3.5 presente nesse vetor acima.
Agora, temos que pegar a soma dos ranks no grupo de magros:

> soma.lean <- sum(rank(expend)[stature=='lean'])


> soma.lean
[1] 103

Bem, agora temos que diminuir esse valor da soma do mnimo terico. Parece enigmtico?
Mas no , isso significa apenas que esse o caso onde todos os ranks desse grupo so os menores
possveis, logo esse valor nada mais do que a soma de um vetor que vai de 1 at o tamanho do
vetor formado apenas pelo grupo de magros, entendeu? como se os todos os magros tivessem os
menores valores para a varivel expend. Vamos ver como fica:

> soma.teorica <- sum(1:length(expend[stature=='lean']))


> soma.teorica
[1] 91

Se voc no entendeu o cdigo acima, veja o que acontece dentro dessa soma:

> 1:length(expend[stature=='lean'])
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13

12
Entendeu? s um vetor seqencial de 1 at o nmero de observaes do grupo de magros.
Agora ficou fcil computar a estatstica W, no mesmo?

> soma.lean-soma.teorica
[1] 12

Muito bem. Agora vamos precisar de alguma teoria para podermos obter o p-valor que o R
calculou. Sem entrar em detalhes, pode ser mostrado que para um tamanho de amostra
suficientemente grande estamos falando de pelo menos 10 obervaes em cada grupo, o que
quase acontece no nosso caso, teremos:
n1 n2 onde, por conveno n1 o tamanho da amostra no grupo para o qual
E W =
2
calculamos W e n2 para o outro grupo. Alm disso:
Var W = n12n n n 1
1 2
1 2

Existe um pequeno problema, porm. Na presena de empates, a mdia esperada de W no


alterada, mas a sua varincia tem que sofrer uma correo, que consiste em subtrair um valor,
calculado segundo o nmero de empates presentes na amostra. Vamos ver como fica, na presena
de empates:

[ ]
g

t i t 2i 1 onde g o nmero de grupos


Var W = 12n1 n 2
n1 n 2 1
i =1

n1 n2 n1 n2 1
de ranks empatados e t o nmero de valores empatados nesse grupo.
Ihhhh! Complicou, n? Mas mais fcil do que parece. Isso s quer dizer que podemos ter
mais de um grupo de valores iguais em uma mesma amostra. Por exemplo, podemos ter 2 valores
iguais a, digamos 10. Se esses fossem os ranks 3 a 4, cada um deles receberia o valor 3.5. Esses
dois valores seriam um grupo, com 2 valores empatados. Poderamos ento ter outro grupo de
valores, por exemplo 20, que seriam os ranks de 10 a 13, e cada um deles receberia o valor de 5.75,
e teramos ento 4 valores empatados nesse grupo.
Ns j desconfivamos que havia pelo menos um grupo de empates no nosso banco. Vamos
conferir:

> sort(expend)
[1] 6.13 7.05 7.48 7.48 7.53 7.58 7.90 8.08 8.09 8.11 8.40
8.79 9.19 9.21 9.68 9.69 9.97 10.15 10.88 11.51 11.85 12.79

Parece que ns s temos mesmo um grupo, correspondendo ao valor 7.48, com o rank de 3.5
e com apenas 2 valores para eles. Ora, ento a nossa conta vai ser bem simples, no verdade?
Vamos ver mais adiante...
Bem, com as informaes com essas informaes, fica fcil ns calcularmos um z de uma
Normal e calcular um p-valor para esse escore. Vamos aos clculos. Primeiro vamos colocar os
nossos tamanhos dos grupos em vetores para facilitar a nossa vida:

n1 <- length(expend[stature=='lean'])
n2 <- length(expend[stature=='obese'])

Agora vamos calcular a mdia de W:

media<-(n1*n2)/2

13
Para facilitar a vida, vamos primeiro calcular aquele fator de correo l de cima. Observe
que no haver soma alguma, pois s temos um nico grupo, e que o valor de t 2:

correcao<-(2*((2^2)-1))/((n1+n2)*(n1+n2-1))

Agora vamo varincia, no nos esquecendo de acrescentar (ou melhor, diminuir) o fator de
correo para os empates:

variancia<-(n1*n2/12)*(n1+n2+1-correcao)

Bem, agora o clculo de z ficou muito fcil , no mesmo? Todos j cansamos de fazer isso:

> (12-media)/sqrt(variancia)
[1] -3.106057

E agora voc deve estar pensando: basta eu ver a rea sob a curva da Normal que
corresponde a esse valor de z, multiplicar por 2 e obter o p-valor, certo? Bem, no bem assim...
Vamos tentar fazer isso:

> 2*pnorm((12-media)/sqrt(variancia))
[1] 0.001896004

Esse valor no bate com o p-valor achado por causa de um detalhe que ainda no vimos,
mas que ser abordado em uma outra aula. Repare o que essa linha da sada diz:

Wilcoxon rank sum test with continuity correction

por causa dessa correo de continuidade que no obtemos o mesmo resultado.


Rapidamente, o que isso significa que como estamos aproximando uma distribuio discreta (a
soma dos ranks so na verdade distribudas como uma varivel aleatria discreta), por uma
distribuio contnua (a Normal), necessrio fazer uma correo para que o valor seja melhor
aproximado. Na verdade essa correo bastante fcil de se fazer: basta ns acrescentarmos meia
unidade diferena da mdia observada e da mdia terica, sempre em direo hiptese nula, i.e.
se a diferena for negativa, vamos somar 0.5; se for positiva, vamos diminuir 0.5. Como j vimos
que no nosso caso o z foi negativo, vamos somar:

> 2*pnorm((12-media+0.5)/sqrt(variancia))
[1] 0.002121613

Ufa! Chegamos ao resultado finalmente. Mas agora, algum arrisca dizer como poderamos
fazer esta conta dar certo com a correo de continuidade, mesmo sem sabermos se o z positivo ou
negativo? Exerccio vista...

Teste t pareado

Testes pareados so empregados quando temos duas medidas em uma mesma unidade
experimental. Um exemplo seria a mensurao de uma certa caracterstica antes e aps uma
determinada interveno, ou mesmo em dois perodos distintos no tempo, como o banco de dados
que j vimos de aporte energtico no perodo pr- e ps-menstrual (intake).
A idia do teste simplesmente subtrair uma observao da outra em uma mesma unidade e
ento tratar o teste como se fosse um teste t de amostra nica, que j vimos anteriormente. Nesse
caso, obviamente estaremos usando menos graus de liberdade, pois o nosso tamanho de amostra

14
ser o nmero de unidades experimentais, ou seja, o nmero de pares e no o nmero de
observaes.
Existe porm um pr-requisito para a validade do teste que a independncia entre a
distribuio das diferenas e os seus nveis, ou seja, a distribuio das diferenas no pode ter
nenhum padro definido em relao, por exemplo mdia das observaes dos pares. Alis, um
mtodo grfico usado para verificar este fato exatamente um grfico de disperso (scatter plot)
exatamente assim, conhecido como grfico de Bland-Altman.
Vamos usar ento o banco intake para esse nosso exemplo:

data(intake)
attach(intake)

Verifique o seu contedo e note que so as mesmas 11 observaes que j tnhamos usado,
mas agora com as observaes pareadas tambm.
Vamos comear verificando o grfico de Bland-Altman

diferenca <- post-pre


medias <- apply(intake,1,mean)
plot(diferenca,medias)

A distribuio parece estar bem aleatria, no sendo preciso nenhum tipo de transformao
desses dados para adequao. Para fazer esse teste no R, o cdigo bem parecido:

> t.test(post, pre, paired=T)

Paired t-test

data: post and pre


t = -11.9414, df = 10, p-value = 3.059e-07
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-1566.838 -1074.072
sample estimates:
mean of the differences
-1320.455

No creio que seja necessrio explicar essa sada, no mesmo? No tem nada de muito
diferente em relao aos outros tipos de teste t. Repare que os graus de liberdade nesse caso igual
a 10 e no 20, como seria no caso de um teste t para duas amostras.
sempre bom frisar que uma vez tendo observaes pareadas, no podemos analisar esses
dados como se eles no fossem pareados. Isso porque uma das pr-suposies bsicas do teste t
para duas amostras que elas sejam independentes, o que obviamente no acontece no caso do teste
pareado. O que acontece nesta situao um inflacionameto da varincia da nossa estimativa com
uma conseqente perda de poder do teste.
Vale a pena tambm mostrar que esse teste exatamente igual a fazermos a diferena entre
as observaes e aplicar um teste t para uma amostra, comparando com uma mdia igual a zero (se
a diferena em mdia for zero, no haveria diferena entre os grupos). Veja como ficaria:

> t.test(diferenca)

One Sample t-test

data: diferenca
t = -11.9414, df = 10, p-value = 3.059e-07
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
-1566.838 -1074.072

15
sample estimates:
mean of x
-1320.455

Teste de Wilcoxon pareado

O teste no paramtrico para observaes pareadas tambm igual a se aplicar o teste do


sinal do posto s diferenas, o mesmo caso do teste t que acabamos de ver. Os argumentos so
inclusive bem parecidos com o anterior. Veja:

> wilcox.test(post, pre, paired=T)

Wilcoxon signed rank test with continuity correction

data: post and pre


V = 0, p-value = 0.00384
alternative hypothesis: true mu is not equal to 0

Warning message:
Cannot compute exact p-value with ties in: wilcox.test.default(post, pre,
paired = T)

A nica possvel surpresa neste caso seria o fato de o p-valor ser bem mais alto que no caso
do teste paramtrico. Isso acontece porque como o teste t usa as mdias de fato, a sua significncia
pode ser muito grande, dependendo de quo grande a diferena entre as mdias. J o teste no-
paramtrico limitado, pois ele usa os ranks e no os valores mesmo. Por exemplo, esse p-valor
que foi calculado o menor p-valor possvel para esse tamanho de amostra, pois todas as diferenas
so negativas (veja que o V = 0).
Repare que nesse caso, como no teste t pareado, o teste de Wilcoxon pareado se reduz
tambm a um teste a uma amostra das diferenas. Confira:

> wilcox.test(pre-post)

Wilcoxon signed rank test with continuity correction

data: pre - post


V = 66, p-value = 0.00384
alternative hypothesis: true mu is not equal to 0

Warning message:
Cannot compute exact p-value with ties in: wilcox.test.default(pre - post)

Poder e tamanho de amostra para testes t

Na aula passada, ns vimos como calcular o poder de um teste e tambm o tamanho de


amostras, usando o exemplo de um teste t para uma amostra, e atravs de mtodos aproximados e
simulaes (que como dissemos muitas vezes o nico recurso que temos para alguns casos.)
Comentamos ento que existem sim mtodos especficos para o teste t, mas que em geral usa-se a
aproximao pela Normal.
A idia geral do poder j foi passada, e no entraremos em detalhes aqui sobre o que
significa cada uma dessas coisas, e procuraremos apenas mostras as funes disponveis no R para
esse fim. Para dizer a verdade, nessa seo falaremos apenas da funo power.t.test(), cujo
nome no deixa dvidas sobre o que ela faz.
Como discutimos anteriormente, o poder de um teste depende basicamente de 4 fatores: o
tamanho da amostra, a diferena a ser detectada, a disperso da populao e o nvel de significncia
estabelecido (o nosso alfa). Obviamente, se ns estabelecermos 4 desses 5 fatores envolvidos, o

16
quinto pode ser calculado (reveja a funo de poder que ns discutimos na aula passada.)
exatamente isso que esta funo faz. D uma olhada na sua ajuda:

?power.t.test

Repare que ela tem justamente esses 5 argumentos e mais dois que estabelecem que tipo de
teste t est sendo aplicado e se se trata de um teste uni ou bicaudal. Vamos ver ento como ele
funciona, usando o mesmo exemplo que usamos na ltima aula. Tnhamos criado uma funo para
calcular aproximadamente o tamanho de uma amostra, lembra?

tamanho.amostra <- function(alfa=0.05, poder=0.8, dif, var, bilateral=T)


{
if (bilateral){
zalfa<-qnorm(1-(alfa/2))
}else{
zalfa<-qnorm(1-alfa)
}
ceiling(((qnorm(poder)+zalfa)^2)*var/(dif^2))
}

E achamos o seguinte tamanho de amostra para esse problema:

> tamanho.amostra(alfa=0.05, poder=0.8, dif=10, var=625, bilateral=T)


[1] 50

Agora vamos conferir com a funo que no usa a aproximao Normal:

> power.t.test(n=NULL, delta=10, sd=25, sig.level=0.05, power=0.8,


type="one.sample")

One-sample t test power calculation

n = 51.00957
delta = 10
sd = 25
sig.level = 0.05
power = 0.8
alternative = two.sided

A primeira coisa a ser notada que tivemos que modificar um pouquinho as coisas aqui, j
que os argumentos desta funo so diferentes dos da funo que ns criamos anteriormente.
Repare que o argumento n ganhou o valor NULL, significando que eu quero achar esse valor (ele
poderia simplesmente se omitido tambm.) O valor foi bem aproximado, no mesmo? Tente
comparar com outros valores.
claro que voc pode brincar com qualquer um dos valores, basta deixar um deles sem
valor algum, que ele ser calculado. Agora podemos tambm fazer uma outra brincadeira que
comparar os valores obtidos com essa funo como os valores simulados para o poder do teste,
como fizemos na aula passada. Para este exemplo a nica modificao que a diferena era de 6 e
no de 10mmHg. Vamos comparar. Primeiro, vamos recordar a funo:

poder.sim <- function(x, k=1000, H0, H1, sd)


{
#Iniciando as variveis
p <- 0
poder.t<-0
#Loop para vrios tamanhos de amostra
for (m in 1: length(x))
{

17
#Loop para o nmero de simulaes
for (i in 1:k)
{
data <- rnorm(x[m], mean=H1, sd=sd) #Gerao da amostra
sob H1
p[i] <- t.test(data, mu=H0)$p.value #Clculo do p-valor
para o teste t
}
poder.t[m] <- sum(p<=0.05)/k #Clculo do Poder para cada tamanho de
amostra o nmero de vezes que o p-valor menor que 0.05, dividido pelo nmero
de simulaes
}
plot(x, poder.t, ylab="Poder", xlab="n", type="b") #Plotando a curva
de poder
cbind(x, poder.t) #Retornando os tamanhos e os poderes
}

E agora vamos simulao, com o grfico:

poder.t.sim<-poder.sim(seq(25,350,25), k=1000, H0=100, H1=106, sd=25)

Agora, acrescentando a aproximao normal no grfico:

x<-seq(25,350,25)
lines(x, pnorm(qnorm(0.975, mean=100, sd=sqrt(625/x)), mean=106,
sd=sqrt(625/x), lower.tail=F), pch=20, type="b")

Por enquanto, s cola do que fizemos na aula passada, certo? Estamos vendo as curvas que
batem bastante bem. Agora, vamos comparar tambm com a nossa nova funo. Vamos usar um
bacalhau em vez de uma frmula, usando o mesmo vetor x:

poder<-0
for (i in 1:length(x)){
poder[i] <- power.t.test(n=x[i], delta=6, sd=25, sig.level=0.05,
power=NULL, type="one.sample")$power}

Agora vamos acrescentar os poderes calculados ao nosso grfico:

points(x, poder, pch='t', cex=2)

Que tal? Se quiser, compare visualmente os vetores poder.t.sim e poder para uma
visualizao melhor, faa um grfico de disperso, para ver se parecem uma linha reta:

plot(poder.t.sim[,2], poder)

Muito, bem. Esta mesma funo pode ento ser usada para os outros testes t que ns vimos,
apenas mudando-se as opes necessrias. Vamos ver s mais um exemplo para o teste t para duas
amostras.
Vamos por exemplo ver que tamanho de amostra precisaramos para realizar o estudo que
ns vimos no banco energy se quisssemos detectar uma diferena de 2 Mj com um poder de 80%
e uma significncia de 0.05. Baseado em estudos anteriores, a varincia foi estimada em torno de
1.7 Mj:

> power.t.test(n=NULL, delta=2, sd=1.7, sig.level=0.05, power=0.8)

Two-sample t test power calculation

n = 12.37967

18
delta = 2
sd = 1.7
sig.level = 0.05
power = 0.8
alternative = two.sided

NOTE: n is number in *each* group

Precisaramos de 13 pessoas em cada grupo neste caso ( claro que sempre vamos
arredondar para cima esse nmero.)

19
Exerccios

1. Verifique se o tamanho de amostra para o banco ashima (na biblioteca ISwR) adequado
para o estudo em questo. Use tambm simulaes para descrever as suas concluses.

2. Mostre que o teste de varincias independe de qual delas est no numerador ou no


denominador (i.e. Mostre que o resultado ser o mesmo se invertermos o nosso teste na
aula). Mostre o cdigo do programa que voc usou ou os clculos feitos mo.

3. Mostre passo-a-passo como o R obteve o IC 95%, a estatstica T e o p-valor para o teste t


para duas amostras com varincias homogneas. Use o mesmo exemplo da aula. Mostre o
cdigo do programa que voc usou ou os clculos feitos mo.

4. Como poderamos calcular o p-valor para o teste de Wilcoxon com a correo de


continuidade, mesmo sem sabermos se o z positivo ou negativo?

5. Aplique, erradamente, um teste t para duas amostras independentes no banco intake e


descreva o que acontece. Voc tem alguma explicao para isso?

6. Faa as anlises necessrias nos bancos (a) intake, (b) vitcap e (c) react da biblioteca
ISwR, para comparar os nveis de energia e de capacidade vital e tamanho do teste
tuberculnico entre os grupos, respectivamente. Use tanto o mtodo paramtrico quanto o
no-paramtrico adequado para o caso. Para informaes sobre os bancos, consulte a ajuda
do R. Obs: para fazer a anlise completa, o que significa descrio do banco, verificao
de pr-suposies, etc.

Questo extra (0.1 ponto):

Observe o bacalhau para o poder que ns usamos acima e faa uma funo que calcule
poderes para vrios tamanhos de amostra para o teste t para duas amostras. Entregue o cdigo que
voc criou.

20
Exerccios - Respostas

Aula 5 - Testes para uma e duas amostras (contnuos)


Livro: pginas 81 a 93

1. Verifique se o tamanho de amostra para o banco ashina adequado para o estudo em


questo. Use tambm simulaes para descrever as suas concluses.
A primeira providncia nesse caso conhecer melhor o banco ashina, o que pode ser feito
atravs da ajuda do R. Vemos ento que se trata de um estudo tipo cross-over, onde todos os
participantes fizeram uso da substncia ativa ou de um placebo, aleatoriamente, mas todos usaram
ambos. Isso caracteriza de cara um estudo pareado, j que as colunas com os valores a serem
testados no so independentes.
Uma observao que voc deve ter feito logo de sada que estamos lidando aqui com
dados derivados de uma escala (muito embora seja uma diferena mdia de escalas em diferentes
pontos no tempo.) Ainda assim, podemos encarar isso como um ranqueamento, o que nos remeteria
a um teste no-paramtrico.
Muito bem, vamos tratar disso j. Mas agora, a pergunta que foi feita pode parecer um
pouco estranha a princpio, no mesmo? O que significa verificar se um tamanho de amostra foi
adequado ou no para o que j testamos? Significa que eu gostaria de verificar se o poder desse
teste seria adequado ou no para o que estou testando. Pera! Mas o poder no depende do
verdadeiro valor da hiptese alternativa, o qual no conhecemos? O poder no simplesmente uma
funo?
isso mesmo!!! Por isso no faz muito sentido falarmos em calcular apenas um nico poder
para o tamanho de amostra e a diferena em questo nesse estudo. Precisamos estudar essa funo...
Tudo muito bonito, mas vamos ento verificar o nosso banco:

> library(ISwR)
> data(ashina)
> attach(ashina)
> summary(ashina)
vas.active vas.plac grp
Min. :-167.00 Min. :-102.00 Min. :1.000
1st Qu.: -81.25 1st Qu.: -36.75 1st Qu.:1.000
Median : -51.50 Median : -5.00 Median :1.000
Mean : -56.81 Mean : -13.94 Mean :1.375
3rd Qu.: -14.25 3rd Qu.: 11.25 3rd Qu.:2.000
Max. : 29.00 Max. : 32.00 Max. :2.000

O que nos interessa aqui so as variveis vas.active e vas.plac. Alis, para ser mais
exato o que realmente nos interessa a diferena entre essas variveis, certo? Dado o desenho deste
estudo, estamos lidando com um grupo pareado, logo podemos testar a diferena desses valores
com um teste t para uma amostra, por exemplo. Vamos ver o que acontece com esse teste, nesse
caso:

> t.test(vas.active-vas.plac)

One Sample t-test

data: vas.active - vas.plac


t = -3.2269, df = 15, p-value = 0.005644
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
-71.1946 -14.5554
sample estimates:
mean of x

1
-42.875

Tudo bem, mas se olharmos o grfico de Bland-Altman, veremos uma certa tendncia das
mdias serem maiores quanto maiores forem as diferenas. Alm disso, a amostra pequena e
estamos falando de um escore. ... vamos usar um teste no-paramtrico:

> wilcox.test(vas.active-vas.plac)

Wilcoxon signed rank test

data: vas.active - vas.plac


V = 20, p-value = 0.01099
alternative hypothesis: true mu is not equal to 0

Bem, at que no mudou o nosso resultado, certo? T, mas e clculo do poder afinal de
contas? Pois ... precisamos abordar isso de alguma maneira... Que tal tentarmos usar aquela funo
power.t.test() que ns tnhamos usado anteriormente, usando o n fixo, uma diferena varivel e
um desvio-padro qualquer? Epa! O n tudo bem, mas e os outros dois, como fazer? fcil: vamos
ver qual foi a mdia calculada da amostra, e fazer deltas em torno dessa mdia. Para o DP, vamos
usar o melhor que temos que o DP da amostra mesmo.
Vamos comear fazendo uma brincadeira, mas admitindo que estivssemos falando de um
teste t ento, usando uma pequena modificao do cdigo que vimos na aula, poderamos fazer:

x<-seq(5,60,5)
poder<-0
for (i in 1:length(x)){
poder[i] <- power.t.test(n=16, delta=x[i], sd=53, sig.level=0.05,
power=NULL, type="one.sample")$power}
plot(x,poder, type="b", xlab="Diferena", ylab="Poder")
abline(h=0.8)

Repare que a nica diferena que agora o vetor refere-se a vrias diferenas, mantendo o n
fixo e as diferenas indo de 5 a 60, o que inclui a diferena de 42.8 (em mdulo) calculada l no
nosso teste t. Para o SD, usamos o SD da diferena da amostra. Veja o resultado:

2
Repare que para uma diferena em torno de 40, o poder desse teste fica prximo de 80%.
Mas por que eu falei em usar simulaes se ns temos essa funo exata para o clculo do
poder? Isso mesmo: no aprendemos a fazer isso para um teste no-paramtrico. Bem, ns tnhamos
a nossa funo poder.sim() que poderia nos ajudar bastante com isso. O problema que ela foi
criada para variar os tamanhos de amostra apenas, para uma hiptese alternativa fixa. No nosso
caso, seria mais interessante variar bastante a hiptese alternativa e testar alguns tamanhos de
amostra prximos ao que foi utilizado. Teramos que fazer uma pequena modificao. Que tal
essa:

poder.sim1 <- function(x, k=1000, H0, H1, sd)


{
#Iniciando as variveis
p <- 0
poder.w<-matrix(nrow=length(x), ncol=length(H1))
#Loop para vrios tamanhos de amostra
for (m in 1: length(x))
{
#Loop para o nmero de diferenas
for (n in 1:length(H1))
{
#Loop para o nmero de simulaes
for (i in 1:k)
{
data <- rnorm(x[m], mean=H1[n], sd=sd)
#Gerao da amostra sob cada H1
p[i] <- wilcox.test(data,
mu=H0)$p.value #Clculo do p-valor
}
poder.w[m,n] <- sum(p<=0.05)/k #Clculo do Poder para cada
tamanho de amostra e delta
}
}
dimnames(poder.w) <- list(n=x, delta= H1)
t(poder.w) #Retornando os tamanhos e os poderes

3
}

Repare que algumas coisas foram assumidas para isso: primeiro, a diferena entre os escores
foi considerada normal. Essa no uma pressuposio muito longe da realidade, no mesmo?
Lembre-se que ela usada quando calculamos os p-valores dos testes no-paramtricos. A segunda,
ns j falamos: sobre o DP da distribuio, que usaremos o estimado a partir da amostra.
A partir da poderamos fazer um grfico para ver como o poder se comporta para vrios
deltas e alguns tamanhos de amostra. Primeiro vamos criar um objeto com a sada da nossa funo,
para tamanhos de amostra 10, 16 20 e 32, e com os mesmos deltas que usamos l em cima:

poderes<-poder.sim1(c(10,16,20,32), k=10, H0=0, H1=seq(5,60,5),


sd=sd(vas.active-vas.plac))

Agora vamos ao grfico:

plot(dimnames(poderes)$delta, poderes[,1], type="b", ylab="Poder",


xlab="Deltas", ylim=c(0,1))
lines(dimnames(poderes)$delta,poderes[,2], type="b")
lines(dimnames(poderes)$delta,poderes[,3], type="b")
lines(dimnames(poderes)$delta,poderes[,4], type="b")
abline(v=abs(mean(vas.active-vas.plac)))
abline(h=0.8)

Como voc pode perceber pelo grfico, o poder para uma hiptese alternativa igual mdia
da amostra, o poder desse teste seria acima de 80%. A questo a ser discutida se essa diferena de
mais de 40 pontos seria de fato o mnimo que se queria encontrar. Repare que um tamanho de 32
daria um poder de 80% para uma diferena de cerca de 25 pontos.
Compare agora o resultado dessas curvas de poder usando o teste t em vez do teste de
Wilcoxon. Quais so as suas concluses em relao ao que deu de diferente entre eles? Quem
entregar at a prxima aula ganha 0.1 ponto.

2. Mostre que o teste de varincias independe de qual delas est no numerador ou no


denominador (i.e. Mostre que o resultado ser o mesmo se invertermos o nosso teste na
aula). Mostre o cdigo do programa que voc usou ou os clculos feitos mo.

4
Essa fcil, n? Temos que inverter as varincias e os graus de liberdade na nossa frmula.
Ah, e tambm a cauda! Repare que agora a razo maior que 1, logo estamos procurando uma rea
na causa superior, certo? Vamos ver:

> s1/s2
[1] 1.274785

Isso vai me obrigar a usar aquela opo:

> 2*pf(s1/s2, df1=n1-1, df2=n2-1, lower.tail=F)


[1] 0.679746

Confere? Veja a rea que estamos procurando (e depois multiplicando por 2):

3. Mostre passo-a-passo como o R obteve o IC 95%, a estatstica T e o p-valor para o teste t


para duas amostras com varincias homogneas. Use o mesmo exemplo da aula. Mostre o
cdigo do programa que voc usou ou os clculos feitos mo.
Bom, essa voc deve estar j cansado de fazer, no mesmo? Alm disso, praticamente
copiar e colar o cdigo da aula, mudando apenas os graus de liberdade e o erro padro, certo?
Vamos ver o que no mudaria:

s1 <- var(expend[stature=="obese"])
s2 <- var(expend[stature=="lean"])
n1 <- length(expend[stature=="obese"])
n2 <- length(expend[stature=="lean"])
media1 <- mean(expend[stature=="obese"])
media2 <- mean(expend[stature=="lean"])

E os graus de liberdade e a varincia da mdia:

gl <- n1+n2-2

5
var.media<-(s12/n1)+(s12/n2)

Agora s calcular o IC (de novo):

> (media1-media2)+(c(-1,1)*qt(0.975, df=gl)*sqrt(var.media))


[1] 1.051796 3.411451

Confira com a sada do R. Ainda o problema do sinal? Ihhhhhhhhh...

4. Como poderamos calcular o p-valor para o teste de Wilcoxon com a correo de


continuidade, mesmo sem sabermos se o z positivo ou negativo?
Essa s uma questo algbrica mesmo. Dada a simetria da Normal, podemos trabalhar
sempre com o quantil positivo. Para isso, basta aplicarmos o mdulo diferena, diminuir sempre
0.5 e calcular sempre a cauda superior da fdp:

2*pnorm((abs(12-media)-0.5)/sqrt(variancia), lower.tail=F)
[1] 0.002121613

Confere?

5. Aplique, erradamente, um teste t para duas amostras independentes no banco intake e


descreva o que acontece. Voc tem alguma explicao para isso?
Bem, inicialmente, vamos acrregar o banco:

data(intake)
attach(intake)

E agora, basta aplicar o teste sem a opo paired=T:

> t.test(post, pre)

Welch Two Sample t-test

data: post and pre


t = -2.6242, df = 19.92, p-value = 0.01629
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-2370.3458 -270.5633
sample estimates:
mean of x mean of y
5433.182 6753.636

O que se observa que o p-valor bem menor que no teste parado e o IC muito mais
alargado. Isso demonstra a perda de eficincia quando analisamos dados que tm estrutura de
dependncia, como se fossem independentes (h um inflacionamento da varincia).

6. Faa as anlises necessrias nos bancos (a) intake, (b) vitcap e (c) react da biblioteca
ISwR, para comparar os nveis de energia e de capacidade vital e tamanho do teste
tuberculnico entre os grupos, respectivamente. Use tanto o mtodo paramtrico quanto o
no-paramtrico adequado para o caso. Para informaes sobre os bancos, consulte a ajuda
do R. Obs: para fazer a anlise completa, o que significa descrio do banco, verificao
de pr-suposies, etc.
(a)
Bem, esse banco ns efetivamente usamos na aula, ento facilita bastante. Trata-se de um

6
banco com aferies de ingesta energtica de mulheres nas fases pr e ps menstruais em kJ.
Podemos descrever o banco da maneira usual, usando a funo summary() para o banco
todo:

> summary(intake)
pre post
Min. :5260 Min. :3885
1st Qu.:5910 1st Qu.:4450
Median :6515 Median :5265
Mean :6754 Mean :5433
3rd Qu.:7515 3rd Qu.:6383
Max. :8770 Max. :7335

Ou ainda, mais interessante, usar a funo eda() na diferena:

Apesar do histograma no aparentar uma distribuio muito normal, o Boxplot e o Q-Q plot
parecem indicar alguma normalidade. Conferindo:

> shapiro.test(pre-post)

Shapiro-Wilk normality test

data: pre - post


W = 0.9374, p-value = 0.4901

Enfim, um estudo pareado, como vimos e vamos testar se a ingesta difere nessas duas
fases:
H0: pre pos =0
H1: pre pos 0

7
Alm da normalidade, o grfico de Bland-Altman parece no mostrar tendncia alguma:

Mesmo assim, vamos usar o teste no-paramtrico tambm:

> t.test(post-pre)

One Sample t-test

data: post - pre


t = -11.9414, df = 10, p-value = 3.059e-07
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
-1566.838 -1074.072
sample estimates:
mean of x
-1320.455

> wilcox.test(post-pre)

Wilcoxon signed rank test with continuity correction

data: post - pre


V = 0, p-value = 0.00384
alternative hypothesis: true mu is not equal to 0

Warning message:
Cannot compute exact p-value with ties in: wilcox.test.default(post pre)

Apesar da menor eficincia do teste no-paramtrico (esperado), ambos os testes rejeitam a


hiptese nula de que a ingesta igual em ambas as fases. Logo, a concluso que a ingesta pr-
menstrual menor que a ps, e esse resultado estatisticamente significativo para um alfa de 5%.

(b)
Esse banco contm informaes sobre a capacidade vital de trabalhadores da indstria de

8
cdmio. As variveis descrevem, alm da capacidade vital, a idade do trabalhador e ainda o tipo de
exposio (nesse caso somente no exposto e expostos h mais de 10 anos). Evidentemente o que
queremos estudar nesse caso a associao do tempo de exposio ao cdmio com a capacidade
vital. A idade importante porque pode ser uma varivel de confundimento nesse caso.
A descrio pode ser feita com a funo tambm, sem problemas para a capacidade vital e
para a idade, e pode-se inclusive separar por grupo. No vou nem mostrar aqui, que isso j
bsico... Os comandos:

eda(vital.capacity[group==1])
eda(vital.capacity[group==3])

Outra maneira usando aquela funo que ns vimos na aula 2, lembra?

> resumo.grupo(vital.capacity,group)
Mnimo Mximo Mediana Mdia DP
1 2.70 5.52 3.865 3.949167 1.0330578
3 3.67 5.86 4.985 4.992500 0.6796272
> resumo.grupo(age,group)
Mnimo Mximo Mediana Mdia DP
1 39 65 48.0 49.75000 9.106691
3 18 33 25.5 25.91667 4.776045

Bem, d para perceber que a idade tem uma relao importante com a exposio, no
mesmo? Voc saberia dizer porque? Vamos ver um boxplot com indentaes:

As idades parecem ser bem diferentes, no?


Muito bem, mas agora, com o que aprendemos, s podemos testar mesmo se a exposio
afeta ou no a capacidade vital desses trabalhadores, no mesmo? Vamos ver se podemos assumir
normalidade (repare que o n pequeno nesse caso:
> shapiro.test(vital.capacity[group==1])

Shapiro-Wilk normality test

data: vital.capacity[group == 1]
W = 0.9163, p-value = 0.257

> shapiro.test(vital.capacity[group==3])

9
Shapiro-Wilk normality test

data: vital.capacity[group == 3]
W = 0.9342, p-value = 0.4269

Hummm. Que tal uma visualizao grfica?

> plot(density(vital.capacity[group==3]), xlim=c(0,8), main="Densidades


por grupo")
> lines(density(vital.capacity[group==1]), lty=2)

melhor fazer os dois, no ?

> t.test(vital.capacity~group)

Welch Two Sample t-test

data: vital.capacity by group


t = -2.9228, df = 19.019, p-value = 0.008724
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-1.7904211 -0.2962456
sample estimates:
mean in group 1 mean in group 3
3.949167 4.992500

> wilcox.test(vital.capacity~group)

Wilcoxon rank sum test with continuity correction

data: vital.capacity by group


W = 30.5, p-value = 0.01783
alternative hypothesis: true mu is not equal to 0

Warning message:
Cannot compute exact p-value with ties in: wilcox.test.default(x = c(4.62,
5.29, 5.52, 3.71, 4.02, 5.09,

10
A concluso que existe uma associao estatisticamente significativa entre o tempo de
exposio ao cdmio e a capacidade vital desses trabalhadores (que menor nos expostos). Voc
ficaria satisfeito com esse resultado? Por que? Responda e proponha uma soluo (no para fazer,
s propor) at a prxima aula e ganhe 0.1 ponto.

(c)
Esse o mais simples de todos os bancos e contm apenas as diferenas entre 2 testes de
PPD na mesma enfermeira em tempos diferentes. Nesse caso ele apenas um vetor, e podemos
apenas descrev-lo de maneira bsica.

Apesar do estranho Q-Q plot (por que?) parece que podemos aproximar bem pela normal,
no mesmo? Mesmo assim, vamos ver as duas maneiras de se fazer:

> t.test(react)

One Sample t-test

data: react
t = -7.7512, df = 333, p-value = 1.115e-13
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
-0.9985214 -0.5942930
sample estimates:
mean of x
-0.7964072

> wilcox.test(react)

Wilcoxon signed rank test with continuity correction

data: react
V = 9283.5, p-value = 2.075e-13
alternative hypothesis: true mu is not equal to 0

Deixo as concluses para voc....

11
Questo extra (0.1 ponto):

Observe o bacalhau para o poder que ns usamos acima e faa uma funo que calcule
poderes para vrios tamanhos de amostra para o teste t para duas amostras. Entregue o cdigo que
voc criou.

poderes.t <- function(n, delta, sd, sig.level=0.05, power=NULL,


type="two.sample")
{
poder<-0
for (i in 1:length(n))
{
poder[i] <- power.t.test(n=n[i], delta=delta, sd=sd,
sig.level=sig.level, power=NULL, type=type)$power
}
poder
}

12
Mdulo Estatstica I no R
Autor: Antonio Guilherme Fonseca Pacheco

Pr-requisitos: Conhecimento prvio do ambiente R. Especificamente, o leitor deve estar


familiarizado com os mdulos Bsico, Entrada e Sada de Dados e tambm Manuseando
dados no R.

Bibliotecas necessrias: ISwR

Aula 6 - Propores
Livro: pginas 129 a 138

Nesta aula vamos ver como podemos analisar dados categricos. O R possui diversas
funes para tratar desse tipo de dados, mas s abordaremos as comparaes mais simples,
deixando as mais complexas para um curso mais avanado em estatstica.

Propores Simples
Duas propores independentes
Teste de McNemar
k propores independentes
Teste de tendncia (linear)
Tabelas r x c
Poder para propores
Exerccios

Propores Simples

Os testes para comparar propores simples (ou seja, uma proporo conhecida contra a
proporo de uma amostra) so feitos a partir da distribuio Binomial. Pode-se usar tanto uma
aproximao pela distribuio Normal, para um tamanho de amostra suficientemente grande, ou
ento usar um teste exato, baseado na prpria Binomial.
Existem vrias regrinhas para se saber se a amostra suficientemente grande ou no e voc
j deve ter ouvido vrias delas. Para citar duas, uma se o valor esperado de sucessos e de fracassos
na sua amostra maior que 5; a outra se o produto de n por p0(1 p0) for maior ou igual a 5.
Repare que no caso de uma amostra, estamos falando do p e do q tericos e do n da amostra. Vamos
ver isso brevemente.
Vamos apenas refrescar a memria sobre a nossa aproximao. A Normal em questo ter
mdia np0 e varincia np0(1 p0), para o nmero absoluto de sucessos dessa Binomial, ou, se
quisermos falar de propores propriamente ditas, dividimos ambas as medidas por n e ento
teremos que:

p p0 ser distribuda como uma Normal-padro, onde a proporo
z= p
p 0 1 p0 / n
da amostra e p0 a proporo contra a qual queremos testar a nossa amostra.
Cuidado: o denominador foi dividido por n2. Por que?
Uma informao nova que pode e deve ser introduzida neste momento a relao que existe
entre a Normal e a distribuio Qui-quadrada (ns j vimos a relao desta com a distribuio F,
lembra?) Pois , a distribuio Qui-quadrada uma soma de distribuies Normais (0,1) ao
quadrado, sendo que o seu parmetro que so os graus de liberdade correspondem ao nmero de

1
Normais sendo somadas. No caso de apenas elevarmos uma nica Normal-padro ao quadrado (sem
somar outra), estaremos diante de uma 12 .
Voc pode estar achando estranho eu falar em elevar a distribuio Normal-padro ao
quadrado, mas isso mesmo. Isso se chama transformar uma distribuio em outra distribuio.
Podemos inclusive testar esse fato no R. Vamos fazer o seguinte: se o que estou dizendo verdade,
ento a densidade acumulada para um quantil qualquer da 12 tem que ser igual densidade
acumulada desse mesmo quantil ao quadrado em uma Normal (0,1), certo? Bem, no exatamente...
H uma complicao ao elevarmos uma Normal ao quadrado, especialmente no que diz respeito ao
seu range, que obviamente passar a no admitir nmeros negativos.
Sem entrar em muitos detalhes, sempre que esta transformao for feita, a relao que
vamos facilmente encontrar entre os p-valores de um teste bilateral para a Normal. O que isso
significa que se ns pegarmos as reas das caudas de uma Normal determinadas por um quantil e
seu simtrico, essa rea corresponder rea determinada por este quantil ao quadrado em uma
Qui-quadrada com 1 grau de liberdade, ou seja, as reas no grfico abaixo so equivalentes:

No se engane por conta da escala, onde parece que a rea da Normal ( esquerda) maior
que a da Qui-quadrada ( direita). Vamos conferir isso numericamente. Os quantis em questo so o
-2 e o 2 para a Normal e o 4 para a 12 :

> 2*pnorm(-2)
[1] 0.04550026

2
> 1-pchisq(4,df=1)
[1] 0.04550026

Entendeu a relao entre as duas? Simples, no? Essa uma relao importante de se
entender, pois muitas vezes vocs vo se deparar com este tipo de transformao.
Bom, mas isso foi apenas um parnteses, pois estvamos falando do teste para uma
proporo simples, aproximado por uma Normal (0,1). Vamos usar o mesmo exemplo da livro,
onde foi feito um estudo com 215 pessoas e feito o diagnstico de asma em 39 delas. Vamos testar
se para esta amostra a proporo de pessoas com asma seria significativamente diferente de 0.15.
No R:

> prop.test(39,215,.15)

1-sample proportions test with continuity correction

data: 39 out of 215, null probability 0.15


X-squared = 1.425, df = 1, p-value = 0.2326
alternative hypothesis: true p is not equal to 0.15
95 percent confidence interval:
0.1335937 0.2408799
sample estimates:
p
0.1813953

Esta funo tem como argumentos o nmero de sucessos (ateno, no a proporo!!!), o


nmero de experimentos e, neste caso, a proporo contra a qual queremos testar a amostra em
questo. Ainda usaremos esta funo de novo, mas se voc preferir, d uma olhada na ajuda...
Vamos ver a nossa sada devagar:

1-sample proportions test with continuity correction

Indica que trata-se de um teste de proporo para uma amostra e que foi usada uma correo
de continuidade. Ns j falamos nela na aula passada, mas vamos dissec-la um pouco mais daqui a
pouco, aguarde.

data: 39 out of 215, null probability 0.15

Indica o que foi fornecido quando chamamos a funo: o nmero de sucessos em tantos
experimentos e a probabilidade a ser testada.

X-squared = 1.425, df = 1, p-value = 0.2326

Repare que a estatstica fornecida pelo R na verdade a Qui-quadrada e no a z. De cara


voc percebeu que este teste foi feito bilateralmente, no mesmo? Vamos conferir rapidamente no
R como seria com a Normal? Veja:

> 1-pchisq(1.425,1)
[1] 0.2325822
> 2*(1-pnorm(sqrt(1.425)))
[1] 0.2325822

Mas voc deve estar curioso para saber como esse valor de 1.425 foi achado, no mesmo?
fcil: basta aplicar a transformao l de cima para uma Normal e ento elevar este nmero ao
quadrado. Podemos usar tanto o nmero de sucessos quanto as propores, certo (este ltimo
obtido simplesmente dividindo os sucessos por n). Vamos usar o nmero de sucessos para ficar
igual ao R:

3
> z<-(abs((215*0.15)-39)-0.5)/(sqrt(215*0.15*(1-0.15)))
> z^2
[1] 1.424989

A nica diferena em relao frmula acima esse que foi colocado no numerador e que
como j vimos corresponde correo de continuidade... No se afobe, a explicao j vem...
Continuando:

alternative hypothesis: true p is not equal to 0.15

Nada de novo....

95 percent confidence interval:


0.1335937 0.2408799

O IC 95% para a proporo da amostra, construdo tambm a partir da Normal. Voc j


deve estar cansado de calcular isso, mas deixo para voc conferir se for do seu interesse.

sample estimates:
p
0.1813953

E a estimativa da proporo amostral, que obviamente :

> 39/215
[1] 0.1813953

Bem, mas como voc j devia desconfiar, podemos muito bem lanar mo de um teste exato
para esta proporo. Claro, podemos usar a distribuio Binomial propriamente dita, sem usar
aproximao alguma:

> binom.test(39,215,.15)

Exact binomial test

data: 39 and 215


number of successes = 39, number of trials = 215, p-value = 0.2135
alternative hypothesis: true probability of success is not equal to 0.15
95 percent confidence interval:
0.1322842 0.2395223
sample estimates:
probability of success
0.1813953

Bem, como voc pode notar, a chamada exatamente igual ao teste anterior e a sada bem
parecida tambm. H no entanto diferenas nos valores do p-valor e do IC 95%. Vamos ver como
que eles foram obtidos. Bem, claro que tudo isso baseado na nossa velha Binomial, que j
estamos carecas de conhecer. Vamos ver o jeito dessa a, sob a hiptese nula:

x<-0:75
plot(x, dbinom(x, size=215, prob=0.15), type="h")

Bom, mas isso no me ajuda muito, pois para calcular o p-valor precisamos, como na
Normal, calcular a rea sob essa curva, que venha de 0 at o valor a ser testado vezes dois (se o

4
valor a ser testado for < 39) ou desse valor at 215 vezes dois tambm, se o valor for > 39. Mas
afinal, que valor esse? Fcil, como queremos testar o valor 0.15:

> 0.15*215
[1] 32.25

Epa! Mas esse valor no inteiro! Como que vamos testar isso? Pois , comeam os
problemas... Bem, mas pelo menos sabemos que camos no primeiro caso, ou seja o valor procurado
menor que a mdia... S que isso no ajuda tambm muito. Repare o que est acontecendo:
Lembra que para calcular o p-valor ns construmos a distribuio sob a hiptese nula e depois
calculamos a rea? Pois , acontece que a nossa hiptese nula uma Binomial com 32.25
sucessos... Isso no existe!!! Que enrascada, hein??? Calma. Essa a mdia da Binomial, e pode ser
um nmero no inteiro, sim!
Para sair dessa, existem vrias maneiras propostas por diferentes autores. Uma delas, menos
complicada, defende o clculo de um p-valor unilateral, multiplicando-se por dois o valor
encontrado. Para encontrar esse valor, teremos que fazer assim: se o nmero de sucessos
observados for maior que o nmero de sucessos esperados (nosso caso aqui 39 e 32.25,
respectivamente), calculamos 2 vezes o valor da probabilidade do nmero de sucessos ser maior ou
igual ao valor observado numa Binomial sob a hiptese nula. Caso contrrio ser a mesma coisa,
mas para a probabilidade de ser menor ou igual ao valor esperado.
Repare bem que no nosso caso a probabilidade de ser igual a 39 deve estar includa, e o R
no vai ser nosso amigo neste momento. Lembre-se que a funo pbinom() vai nos dar
P X k e portanto o seu complemento nos fornecer P X k . Mas o que queremos
P X k e portanto temos que tomar cuidado aqui. Uma maneira de fazer isso com facilidade
calcular a soma das densidades de todos os valores possveis, que no nosso caso seriam de 39 a 215
sucessos:

> sum(dbinom(39:215, size=215, prob=0.15))


[1] 0.1178394

Esta ento a soma de todos os valores maiores ou iguais a 39 sucessos em uma Binomial
(0.15, 215). Agora, basta multiplicar por 2:

> 2*sum(dbinom(39:215, size=215, prob=0.15))


[1] 0.2356789

E teremos ento o nosso p-valor. Acontece que o R usa um mtodo algo mais complicado
para esse clculo. Em vez de simplesmente multiplicar por 2, ele calcula a rea para um valor
terico, simtrico mdia da Binomial sob a hiptese nula. Ficou difcil, n? Ns j fizemos algo
parecido no exerccio da primeira aula, com a Normal. assim: calculamos a diferena entre o
nmero observado e o esperado e a adicionamos essa diferena para o outro lado da reta, para obter
um nmero simtrico em torno da mdia terica. No nosso caso:

> 39-32.25
[1] 6.75

Agora, basta diminuir esse valor de 32.5:

> 32.25-(39-32.25)
[1] 25.5

Vamos olhar no grfico o que foi feito para ficar mais claro:

5
A linha azul central a mdia dessa Binomial, a linha da direita o valor 39 (sua densidade
est inclusive encoberta pela linha azul) e a linha da esquerda o seu simtrico em relao mdia.
Bem o que o R faz calcular a soma das densidades esquerda da linha azul da esquerda e direita
da linha azul da direita. Assim:

> pbinom(25.5, size=215, prob=0.15)+(sum(dbinom(39:215, size=215,


prob=0.15)))
[1] 0.2135205

Que na verdade o valor que j tnhamos calculado somado P X 25.5 .


Tudo muito bonito, mas e o IC 95%, que calculado na verdade a partir da amostra, como
que se calcula isso? Bem, baseado no que acabamos de ver, j deu para perceber que ser meio
difcil calcular um IC 95% que seja exatamente 95%, concorda? Ou ele ser um pouquinho mais, ou
um pouquinho menos...
Acontece que o clculo desses intervalos, mesmo os exatos ainda so um assunto de intensa
discusso em estatstica e existem vrias formas de se calcular esses intervalos. Vamos ver aqui um
exemplo.

6
Se ns fssemos calcular um IC 95% conservador para esse valor, ns poderamos
simplesmente estabelecer que valores desta Binomial corresponderiam a uma rea de 0.025 e 0.975
esquerda da nossa curva:

> qbinom(0.025, size=215, prob=39/215)


[1] 28
> qbinom(0.975, size=215, prob=39/215)
[1] 50

Agora, poderamos conferir se esse intervalo de fato comporta 95% da massa de


probabilidade:

> sum(dbinom(28:50, size=215, prob=39/215))


[1] 0.9587535

Muito bem, um pouquinho mais que 95%, logo o intervalo (28/215,50/215) aberto mesmo
seria um IC 95% exato, conservativo para essa amostra. Isso d:

> 28/215
[1] 0.1302326
> 50/215
[1] 0.2325581

Repare que esses valores so diferentes dos obtidos pelo R:

95 percent confidence interval:


0.1322842 0.2395223

Os intervalos calculados pelo R so os chamados intervalos de Clopper-Pearson, e que so


considerados bastante conservadores, ou seja eles tm no mnimo 1-alfa de massa de probabilidade.
A explicao da teoria por trs do clculo desse intervalo foge totalmente ao escopo dessa aula, mas
como o clculo em si bem fcil no R, vou explicar rapidamente.
o seguinte: para calcular um IC 95% para uma Binomial com k sucessos observados, basta
usarmos uma distribuio Beta (alis duas, uma para o limite inferior e outra para o superior.)
assim: L k ~ Beta k , n k 1 e U k ~ Betak 1, n k , onde L(k) o limite inferior
(de lower) e U(k) o limite superior (de upper) do intervalo. Nesse caso, basta calcular os quantis
para 0.025 na primeira distribuio e o quantil para 0.975 na segunda, para termos os nossos
limites. Como temos k (39) e tambm n (215), ficou fcil. No R:

> qbeta(0.025, 39, 215-39+1)


[1] 0.1322842
> qbeta(0.975, 39+1, 215-39)
[1] 0.2395223

Bem, agora vamos voltar para a nossa correo de continuidade. Como havamos visto, ela
necessria para que distribuies discretas sejam melhor aproximadas por distribuies contnuas.
Acontece sempre quando aproximamos uma Binomial por uma Normal ou por uma Qui-quadrada.
Tnhamos visto tambm na aproximao das distribuies das estatsticas de ordem, nos testes no-
paramtricos. A idia simples: como so distribuies discretas, em vez de calcularmos a
probabilidade contida entre dois pontos (no caso de um intervalo de confiana.)
Ns j tivemos muitos problemas para entender o IC 95% a em cima, ento vamos trabalhar
com a distribuio acumulada de uma binomial, para entendermos melhor o que acontece. Primeiro,
vamos plotar a funo acumulada da Binomial que a gente acabou de trabalhar:

x<-0:100

7
acumulada.binom<-pbinom(x, size=215, prob=0.15)
plot(x, acumulada.binom, type="s")

igual ao grfico anterior, ,lembrando que fizemos s at 100 para poupar espao. Agora
vamos calcular a aproximao Normal sem correo e ver como fica a sua distribuio acumulada
no grfico:

acumulada.norm<-pnorm(x, mean=215*0.15, sd=sqrt(215*0.15*(1-0.15)))


points(x, acumulada.norm)

Repare que vrios dos pontos esto claramente entre os degraus da escada, ou seja eles esto
correspondendo a nmeros diferentes no eixo y. Lembre-se que o valor da funo acumulada de
uma distribuio discreta na verdade o degrau mesmo. Veja qual seria o valor para 30 sucessos,
no grfico:

abline(v=30)
arrows(20, pbinom(30, size=215, prob=0.15), 30, pbinom(30, size=215,
prob=0.15) )

Repare que o valor correto o assinalado pela seta, ou seja, o degrau superior da escada.
Para este ponto, a Normal estimou uma probabilidade acumulada menor, quase na metade do
degrau. Vamos ver as diferenas?

> pbinom(30, size=215, prob=0.15)


[1] 0.3767186
> pnorm(30, mean=215*0.15, sd=sqrt(215*0.15*(1-0.15)))
[1] 0.3336915

Uma diferena considervel, dependendo do que estamos fazendo com essa distribuio.
Isso pode fazer por exemplo um IC 95% conter um valor para um caso e no cont-lo no outro. A
entra a correo de cotinuidade. Ela serve para chegar esse ponto da Normal mais para perto
daquele degrau. Vamos ver como funciona: basta acrescentar 0.5 aos pontos de x:

acumulada.norm.corr<-pnorm(x+0.5, mean=215*0.15, sd=sqrt(215*0.15*(1-


0.15)))
points(x, acumulada.norm.corr, pch=19)

Veja como todos os pontos fechados esto muito mais prximos do degrau do que os pontos
abertos. Vamos ver agora a diferena:

> pbinom(30, size=215, prob=0.15)


[1] 0.3767186
> pnorm(30.5, mean=215*0.15, sd=sqrt(215*0.15*(1-0.15)))
[1] 0.3690977

Duas propores independentes

Teste para propores aproximado pela Normal

A mesma funo prop.test() pode ser usada para comparar tambm duas ou mais
propores. Nesse caso, em vez de entrar nmeros, devemos entrar vetores com o nmero de
sucessos e o nmero de experimentos em cada grupo, respectivamente.
A teoria por trs desse teste simples e consiste em considerar que a diferena d entre as
propores sendo testadas seguir uma distribuio aproximadamente Normal, com mdia zero e

8
varincia V p d = 1/ n1 1/ n 2 p 1 p , para um p igual para ambas as amostras o que
verdade sob a nossa hiptese nula, certo?
H0: p1 = p2
H1: p1 p2
Logo, a quantia
d
u= pode ser testada em relao a uma Normal-padro (e, claro, u2 pode ser

V pd
testada em relao a uma Qui-quadrada com 1 grau de liberdade). O p comum nesse caso
simplesmente a soma do nmero total de sucessos em ambos os grupos dividido pelo tamanho total

da amostra, ou seja, uma mdia ponderada pelo tamanho: p= x 1 x 2 / n1 n 2
Vamos usar um exemplo novamente do livro, mas sem entrar no mrito do contexto aqui.
Vamos comparar um grupo com 9 sucessos em 12 tentativas e outro com 4 sucessos em 13
tentativas):

> prop.test(c(9,4),c(12,13))

2-sample test for equality of proportions with continuity


correction

data: c(9, 4) out of c(12, 13)


X-squared = 3.2793, df = 1, p-value = 0.07016
alternative hypothesis: two.sided
95 percent confidence interval:
0.01151032 0.87310506
sample estimates:
prop 1 prop 2
0.7500000 0.3076923

H algo de estranho nessa sada, no mesmo? Voc saberia dizer o que ? As


aproximaes usadas nesse teste apresentam problemas quando queremos calcular um IC 95% para
a diferena das propores, e portanto uma aproximao que foge do escopo desta aula usada.
Mas para o p-valor possvel fazer-se o clculo e deixaremos as explicaes para um exerccio.

Teste do Qui-quadrado

At agora, ns vimos as propores serem testadas como diferenas entre propores


propriamente ditas. Voc deve at estar estranhando: onde esto as tabelas 2 x 2? E o teste do Qui-
quadrado para estas tabelas que a gente v a toda hora relatado em trabalhos, artigos, etc? Pois , se
voc estava ansioso, chegou a hora.
Vamos usar o mesmo exemplo acima para trabalhar, mas agora digamos que se trata de um
estudo de caso-controle, onde teremos uma certa condio sendo estudada em relao a uma
exposio qualquer. Faa assim:

tabela<-matrix(c(9,4,3,9),2)
tabela<-cbind(tabela,apply(tabela,1,sum))
tabela<-rbind(tabela,apply(tabela,2,sum))
rownames(tabela)<-c("Casos","Controles", "Total")
colnames(tabela)<-c("Expostos","No Expostos", "Total")

Teremos ento a nossa tabela 2 x 2:

> tabela
Expostos No Expostos Total

9
Casos 9 3 12
Controles 4 9 13
Total 13 12 25

Muito bem. Vamos ver algumas caractersticas dessa tabela. Primeiro ela contm 4 clulas
no seu corpo (da o nome 2 x 2) e ainda uma terceira linha e uma terceira coluna, com os totais das
linhas e das colunas, respectivamente. Elas se chamam as marginais da tabela.
Mas ser que existe alguma relao entre esta tabela e as propores que estvamos
estudando? Claro que existe: se eu disser que ser exposto um sucesso em uma Binomial, ento ns
podemos recuperar exatamente as propores que estvamos vendo anteriormente, veja:

> tabela/tabela[,3]
Expostos No Expostos Total
Casos 0.7500000 0.2500000 1
Controles 0.3076923 0.6923077 1
Total 0.5200000 0.4800000 1

Confira com a sada acima e veja se as propores de exposio entre casos e controles no
correspondem exatamente ao que acabamos de testar. Bem simples, no ? Mas repare que neste
caso as propores so de fato diferentes e eu tenho que testar uma hiptese nula qualquer. Ns
mencionamos anteriormente que sob a hiptese nula, ambas as propores seriam iguais, e que uma
maneira de fazermos isso era calcular uma proporo nica para os dois grupos ponderada pelo
tamanho da amostra em cada um deles. Isso equivale a somar todos os sucessos e dividir pelo
nmero total da amostra, no ? Nesse caso seria 13/25, certo? Exatamente o que aparece na
marginal dessa tabela a em cima: 0.52.
Ora, mas nesse caso, ns podemos reconstruir essa tabela, sem alterar obviamente o nmero
de casos ou de controles e nem o de expostos e no expostos, mas apenas rearranjando o corpo da
tabela para que ela nos diga os nmeros esperados nessa tabela, caso as propores em ambos os
grupos fossem iguais, certo? Basta aplicarmos a nossa proporo esperada quela coluna de totais,
no mesmo? Ora, se temos um total de 12 casos e 0.52 ou 52% deles seriam esperados terem sido
expostos, ento, 6.24 pessoas, em mdia estariam expostas nesse grupo. Da mesma forma, para o
grupo de 13 controles, 52% estariam expostos, ou seja, 6.76 pessoas, em mdia.
Na verdade, poderamos fazer a conta para cada uma das caselas, mas acontece que se
mantivermos as marginais fixas e calcularmos essa proporo para apenas uma delas, as outras
necessariamente tero valores fixos tambm, bastando subtrair as marginais para obt-los (menos
trabalho que multiplicar, n?) Ou seja, mantidas as marginais fixas, s temos a liberdade de alterar
1 casela, as outras sero fixas... Hummm... 1 grau de liberdade... Eu j ouvi falar nisso...
Acontece que este procedimento corresponde quelas milhares de multiplicaes e divises
que voc j deve ter visto em algum lugar para calcular a tabela esperada. Ns no faremos isso
aqui. Vamos deixar o R fazer para ns:

> chisq.test(tabela[1:2,1:2])$expected
Expostos No Expostos
Casos 6.24 5.76
Controles 6.76 6.24

Tivemos que retirar as marginais, pois esta funo s aceita o corpo da tabela para os
clculos.
Muito bem, e para esta disposio voc deve ter aprendido que o somatrio para as 4 clulas
desta tabela para as diferenas ao quadrado dos valores observados e esperados ao quadrado sobre
os valores esperados seguem uma distribuio Qui-quadrada com 1 grau de liberdade (olha ele a,
gente!!!), isto :
2
O E
E
~ 12

10
Vamos fazer a conta no R, para ver o que temos:

> esperado<-chisq.test(tabela[1:2,1:2])$expected
> sum(((tabela[1:2,1:2]-esperado)^2)/esperado)
[1] 4.890902

Agora, basta calcular um p-valor de uma Qui-quadrada (1):

> pchisq(sum(((tabela[1:2,1:2]-esperado)^2)/esperado),1,lower.tail=F)
[1] 0.02699857

Sem problemas, n? Vamos s conferir agora com o R:

> chisq.test(tabela[1:2,1:2])

Pearson's Chi-squared test with Yates' continuity correction

data: tabela[1:2, 1:2]


X-squared = 3.2793, df = 1, p-value = 0.07016

Eu tenho certeza que voc j sabia que no ia dar certo... Afinal, cad a correo de
continuidade? Pois , na verdade ns fazemos:
2
O E 0.5
E
~ 12

No R:

> sum(((abs(tabela[1:2,1:2]-esperado)-0.5)^2)/esperado)
[1] 3.279350
> pchisq(sum(((abs(tabela[1:2,1:2]-esperado)-
0.5)^2)/esperado),1,lower.tail=F)
[1] 0.07015673

Teste Exato de Fisher

claro que temos uma verso exata para testar duas propores, mas devido s dificuldades
de se testar propores (ns j vimos vrias delas), o teste empregado para este fim um pouco
diferente do que estvamos j acostumados a lidar aqui. o famoso teste exato de Fisher. Ele
baseado na verdade em distribuies de tabelas 2 x 2, essas que ns acabamos de ver.
Soa estranho falar em distribuio de tabelas, no mesmo? Mas isso mesmo: possvel
calcular-se probabilidades de termos uma determinada configurao em uma tabela 2 x 2, sob a
hiptese nula de que no h diferena entre as propores a serem testadas.
Essa idia baseada nessa mesma propriedade de podermos mudar a configurao do corpo
de uma tabela 2 x 2, mantidas as marginais fixas e alterando apenas uma das caselas, j que as
outras estaro determinadas automaticamente. Alis, tente fazer esta brincadeira e veja se no
verdade.
Ora, nesse caso, podemos determinar probabilidades para determinados valores a serem
encontrados em uma casela, por exemplo a casela superior esquerda (chamada de a) em relao a
margens fixas. Acontece que este tipo de experimento poder ser descrito por uma distribuio muito
importante, porm pouco citada em cursos de estatstica bsica. a distribuio Hipergeomtrica.
Para entender o que esta distribuio faz, vamos voltar um pouco ao nosso exemplo da
primeira aula, onde tnhamos uma urna com bolinhas verdes e azuis. Digamos que eu queira retirar
bolinhas desta urna, sem reposio, e estou interessado em saber a probabilidade de retirar x
bolinhas azuis, de uma urna com m bolinhas azuis e n bolinhas verdes, em k retiradas. Uma

11
pergunta ento que essa distribuio responderia : qual a probabilidade de eu retirar 1 (x) bolinha
azul, dentre 2 (k) tentativas, sendo que h 7 bolinhas azuis (m) e 3 bolinhas verdes (n) sem
reposio.
Essa podemos fazer sem problema, n? Para sair somente uma em duas tentativas temos
duas possibilidades: ou saiu na primeira ou saiu na segunda tentativa; sem reposio, seria o
seguinte:

> ((7/10)*(3/9))+((3/10)*(7/9))
[1] 0.4666667

Certo? Parecido com o que a gente viu naquele exerccio, n? Pois bem, podemos usar a
distribuio Hipergeomtrica para nos ajudar a ver esse nmero:

> dhyper(x=1, m=7, n=3, k=2)


[1] 0.4666667

Tudo muito bonito, mas o que isso tem a ver com as tabelas 2 x 2??? Que papo estranho
esse de bolinhas?
Acontece que podemos fazer uma analogia entre estas tabelas e as bolinhas. Vamos ver.
Imagine que os expostos so o total de bolinhas verdes e os no expostos, as azuis e que os casos
so o nmero total de bolinhas que eu vou sortear, sem reposio. Ora, os controles seriam apenas o
total menos os casos, veja:

Verdes Azuis Total


Sorteados 9 3 12
Total-Sorteados 4 9 13
Total 13 12 25

Veja s: eu pergunto agora: qual a probabilidade de eu sortear 9 bolinhas verdes, em 12


tentativas, sendo que temos 13 bolinhas verdes e 12 bolinhas azuis, sem reposio? A sua dvida
pode surgir aqui: por que sem reposio? fcil: como os 12 sorteados so fixos, se o nmero de
verdes mudar, o nmero de azuis tambm muda, ou seja, h dependncia entre esses fenmenos,
caracterizando a no reposio.
Bem, seguindo esse raciocnio, podemos ento calcular qual a probabilidade de termos 9 ou
mais bolinhas verdes sorteadas, no mesmo? Seria a soma de termos 9 ou 10 ou 11 ou 12:

> sum(dhyper(x=9:12, m=13, n=12, k=12))


[1] 0.03406053

Ora, isso seria equivalente a testar a probabilidade de, dada a hiptese nula, a proporo de
casos expostos ser maior ou igual a 0.75, lembra da tabela l em cima?

Expostos No Expostos Total


Casos 0.7500000 0.2500000 1
Controles 0.3076923 0.6923077 1
Total 0.5200000 0.4800000 1

Bem, vamos ento aplicar um teste de Fisher unidirecional, para ver a chance de uma
observao ser to extrema ou mais do que essa. Vamos usar a opo alternative="greater":

> fisher.test(tabela[1:2,1:2], alternative="greater")

Fisher's Exact Test for Count Data

data: tabela[1:2, 1:2]

12
p-value = 0.03406
alternative hypothesis: true odds ratio is greater than 1
95 percent confidence interval:
1.148427 Inf
sample estimates:
odds ratio
6.180528

Hummm. Bateu direitinho o p-valor. Mas e o bilateral? Como que se faz. Bem, a fica
parecido com a Binomial, que ns vimos. Calculamos o afastamento desse valor (9) para o valor
esperado nessa casela (6.24) e calculamos o simtrico de 9 em relao a esse valor:

> 6.24-(9-6.24)
[1] 3.48

Como 3.48 no inteiro, vamos calcular para valores iguais ou mais extremos que 3. No
total, teramos:

> sum(dhyper(x=c(0:3,9:12), m=13, n=12, k=12))


[1] 0.04717997

Vamos comparar agora com o teste bilateral:

> fisher.test( )

Fisher's Exact Test for Count Data

data: tabela[1:2, 1:2]


p-value = 0.04718
alternative hypothesis: true odds ratio is not equal to 1
95 percent confidence interval:
0.9006803 57.2549701
sample estimates:
odds ratio
6.180528

Bem, para finalizar precisamos fazer algumas consideraes sobre essa sada, especialmente
as linhas abaixo do p-valor. Vamos devagar:

alternative hypothesis: true odds ratio is not equal to 1

Repare que agora o nosso teste de hipteses no diz respeito a propores, mas sim odds
ratio (OR) da qual voc j deve ter ouvido falar bastante. Para refrescar a memria, uma odds um
valor que indica quantas chances de ganhar algo versus a chance de perder algo. Assim, a odds de
um caso ser exposto de 9:3, ou se preferir 3:1 ou 3 simplesmente, enquanto a odds de um controle
ser exposto de 4:9, ou 0.44. Essas chances podem tambm ser expressas atravs de suas
propores. Assim, a chance de um caso ser exposto 0.75:1-0.75, ou 0.75:0.25 = 3. So
equivalentes.
So equivalentes de tal sorte que comparar se p1 p2 = 0 o mesmo que comparar se
p1 /1 p1
= 1 , ou seja, se a razo das odds igual a 1. Esta a famosa OR.
p2 /1 p2

95 percent confidence interval:


0.9006803 57.2549701

13
Tudo estaria indo bem, no fosse esse IC para a OR, no mesmo? Notou algo de estranho?
No? Ento olhe o p-valor calculado de novo. E agora? Pois , no bate, no mesmo? Bem, esse
um problema que temos por causa das nossas aproximaes, mesmo em um teste exato. Mas tem
um outro problema. Olha s a estimativa que o R d para a OR:

sample estimates:
odds ratio
6.180528

Voc que j est cansado de calcular ORs no seu curso de Epidemiologia, calcule para mim
a OR da nossa tabela, por favor:

Expostos No Expostos Total


Casos 9 3 12
Controles 4 9 13
Total 13 12 25

Calculou? Conferiu para ver se est certo? Bateu com esse resultado aqui do R?
Pois , no bate n? Algum j tinha te dito que existe mais de um tipo de OR? No?
Aconteceu o mesmo comigo quando descobri que existe. No se preocupe, eu conheo essa
sensao de decepo. Parece muito quando voc descobre que Papai Noel no existe...
;-)
Acontece que o que todos ns aprendemos e usamos, a famosa razo dos produtos cruzados
chamada de estimador de mxima verossimilhana incondicional da OR. Quer dizer que existe
uma estimador condicional? Isso mesmo! E essa que o R calcula... Isso porque vrios estudos
mostram que este estimador mais acurado que a razo dos produtos cruzados para estimar o risco;
mas isso uma discusso para a Epidemio, no mesmo? Bom, a m notcia que esse
estimador no pode ser calculado na mo, pois depende de mtodos iterativos, e portanto no
poderemos refaz-lo aqui... O IC ento, nem me pergunte!!!
:-(
Mas no fique to triste. Vamos implementar uma funo para calcular a OR que voc
conhece e de quebra calcular um IC aproximado para essa OR.
O mtodo aproximado mais popular para se calcular o IC de uma OR a que voc
provavelmente j viu, que se chama mtodo de Woolf, que baseada como voc j deve ter
desconfiado em uma aproximao normal. Vamos criar uma funo no R para calcular isso:

or.woolf <- function(x, alfa=0.05)


{
y<-c((x[1,1]*x[2,2])/(x[1,2]*x[2,1])) # Calculando a OR
z<-exp(log(y)+(c(-1,1)*qnorm(1-
(alfa/2))*sqrt((1/x[1,1])+(1/x[1,2])+(1/x[2,1])+(1/x[2,2])))) # Calculando o IC
round(c("OR"=y, "IC"=z),3)
}

Bem, o clculo da OR no cdigo acima no deve deixar dvidas (se ainda deixa, preocupe-
se!!! J estava na hora de ser entendido.) O clculo do IC propriamente dito, ficar para um
exerccio para voc.
Tudo muito bonito, mas eu mencionei que esse o mtodo mais popular. Isso: significa que
existem outros... Pelo menos um outro tambm badalado por a, e foi proposto por Miettinen, e
esse baseado no resultado do teste Qui-quadrado. Vamos ver como isso funciona. A equao para
o clculo desse IC at bem simples:

14
1 / X , onde
IC 100 1 %= OR
2
1,1
2
X 2 nada mais do que o valor da estatstica
do Qui-quadrado com correo de continuidade que o R calcula para ns. Bem, a implementao
tambm fcil:

or.miett <- function(x, alfa=0.05)


{
y<-c((x[1,1]*x[2,2])/(x[1,2]*x[2,1])) # Calculando a OR
qui<-chisq.test(x)$statistic
z<-y^(1+(c(-1,1)*sqrt(qchisq(1-alfa, 1)/qui)))
round(c("OR"=y, "IC"=z),3)
}

No fique aflito, vamos usar essas funes em um exerccio...

Teste de McNemar

Ainda falando em duas amostras para propores, precisamos tambm de um teste para dar
conta de estudos pareados, como vimos na ltima aula, no caso de um teste t pareado. Esse tipo de
estudo muito comum em Epidemiologia, como a maioria de vocs j deve ter percebido.
No abordaremos os estimadores para a razo dos pares discordantes, assunto certamente
abordado pela Epidemio, mas vamos ver um teste Qui-quadrado especfico para testar dados
pareados, que chamado de teste de McNemar.
Como o nosso livro no comenta esse teste, vamo usar um exemplo do livro Fundamentals
of Biostatistics, de Bernard Rosner, 5 edio, pgina 376, Exemplo 10.21, que trata de dois
regimes diferentes de quimioterapia em mulheres, sendo que o desfecho em questo nmero de
mulheres que sobrevivem em 5 anos aps a cirurgia. Para tornar os grupos sob diferentes
tratamentos mais comparveis, pares so formados em respeito idade e a uma classificao
clnica.
Vamos ver o resultado desse estudo na clssica apresentao de uma tabela para dados
pareados. No R:

sobrevida<-matrix(c(526, 5, 16, 90), nr=2, dimnames = list("Tratamento A"


= c("Sobreviveu", "Faleceu"), "Tratamento B" = c("Sobreviveu", "Faleceu")))

O objeto sobrevida ficou assim:

> sobrevida
Tratamento B
Tratamento A Sobreviveu Faleceu
Sobreviveu 526 16
Faleceu 5 90

No causa nenhuma surpresa para quem j viu esse tipo de resultado, onde a tabela retrata o
resultado dos pares e no dos indivduos em relao aos tratamentos e tambm aos desfechos. Para
aplicar o teste de McNemar, basta fazermos:

> mcnemar.test(sobrevida)

McNemar's Chi-squared test with continuity correction

data: sobrevida
McNemar's chi-squared = 4.7619, df = 1, p-value = 0.02910

A interpretao da sada exatamente a mesma que a do teste no pareado. A que concluso


voc chega, nesse caso?

15
No vamos entrar em detalhes para esse teste.

k propores independentes

claro que muitas vezes voc pode estar interessado em comparar mais de duas propores.
Neste caso estaremos diante de uma distribuio Multinominal e no mais uma Binomial apenas.
Os detalhes no sero comentados, mas para uma Multinomial, ns teremos vrias categorias com
probabilidades diferentes de ocorrncia.
As categorias em questo podem ser tanto nominais, ou seja, desprovidas de qualquer
ordenao natural, quanto ordinais. Um exemplo do primeiro caso seria etnia, local de residncia,
etc. No segundo caso, grupo etrio, escolaridade, renda, etc.
Para categorias nominais, a nica alternativa testar se as distribuies dessas categorias
so independentes entre si, ou seja, no faz sentido fazer inferncias sobre possveis tendncias
presentes entre essas categorias. Claro que o contrrio no verdadeiro, e podemos testar categorias
ordenadas dessa forma tambm.
Para usar um exemplo nico, vamos seguir o mesmo do nosso livro-texto e usar o banco
caesarian que contm informaes sobre realizao de cesarianas e tamanho de calado de
mulheres (medida britnica). Faa

data(caesarean)
caesar.shoe

E veja a disposio dos dados. Muito bem, agora podemos usar a nossa j conhecida funo
prop.test() para realizar um teste aproximado para independncia entre as propores. Claro que
voc j deve estar imaginando que o teste bem semelhante ao que ns j vimos h pouco.
O detalhe que teremos que entrar com dois vetores, um para os sucessos em cada grupo de
tamanho de sapato e outra para o total de experimentos, da mesma forma que fizemos com duas
propores apenas. Nesse caso, teremos que selecionar a primeira linha e somar a primeira com a
segunda, para termos os vetores que precisamos:

cesaria.sim<-caesar.shoe["Yes",]
cesaria.total<-caesar.shoe["Yes",]+caesar.shoe["No",]

Agora, basta aplicar o nosso j conhecido teste:

> prop.test(cesaria.sim,cesaria.total)

6-sample test for equality of proportions without continuity


correction

data: cesaria.sim out of cesaria.total


X-squared = 9.2874, df = 5, p-value = 0.09814
alternative hypothesis: two.sided
sample estimates:
prop 1 prop 2 prop 3 prop 4 prop 5 prop 6
0.22727273 0.20000000 0.14285714 0.14583333 0.14814815 0.06666667

Warning message:
Chi-squared approximation may be incorrect in: prop.test(cesaria.sim,
cesaria.total)

Vamos olhar a sada desse teste devagar.

6-sample test for equality of proportions without continuity


correction

16
Repare ento que estamos testando 6 amostras independentes e que o teste foi feito sem
correo de continuidade. Isso acontece porque no caso especfico desse teste, quando estamos
testando mais de duas propores, demonstrou-se que a correo de continuidade no acrescenta
nenhum ganho de preciso, como acontece nos demais casos.

data: cesaria.sim out of cesaria.total

Apenas o que foi analisado: os eventos dentre os experimentos

X-squared = 9.2874, df = 5, p-value = 0.09814

O nosso Qui-quadrado, que calculado da mesma forma que o para a tabela 2 x 2, mas
agora a soma em relao a todas as clulas e no mais as quatro somente, e repare que a gora
estamos lidando com uma Qui-quadrada com 5 graus de liberdade. No coincidncia, claro: essa
estatstica segue mesmo uma Qui-quadrada com k 1 graus de liberdade, k sendo o nmero de
grupos. Como temos 6 grupos, teremos 5 graus de liberdade. O p-valor, no tem mistrio. Vamos
at conferir esse:

> 1-pchisq(9.2874, 5)
[1] 0.0981354

alternative hypothesis: two.sided


sample estimates:
prop 1 prop 2 prop 3 prop 4 prop 5 prop 6
0.22727273 0.20000000 0.14285714 0.14583333 0.14814815 0.06666667

A indicao do teste ser bilateral e as propores para cada grupo

Warning message:
Chi-squared approximation may be incorrect in: prop.test(cesaria.sim,
cesaria.total)

E a indicao que o teste pode no estar correto. Algum chutaria por que?
Vamos adiante, para facilitar essa resposta. Como no caso de duas propores, aqui
podemos tambm usar a funo chisq.test() que apesar de ter uma sada mais resumida, nos
permite calcular outras coisas. Vamos experimentar, lembrando que no precisamos ajeitar o objeto
caesar.shoe nesse caso:

> chisq.test(caesar.shoe)

Pearson's Chi-squared test

data: caesar.shoe
X-squared = 9.2874, df = 5, p-value = 0.09814

Warning message:
Chi-squared approximation may be incorrect in: chisq.test(caesar.shoe)

Repare que a sada a mesma e que a mensagem continua l. Vamos calcular esse Qui-
quadrado? igualzinho ao que a gente j fez antes:

> esperado<-chisq.test(caesar.shoe)$expected
Warning message:
Chi-squared approximation may be incorrect in: chisq.test(caesar.shoe)
> sum(((caesar.shoe-esperado)^2)/esperado)
[1] 9.287382

17
Que interessante! O R reclamou de novo! Acho que a resposta desse mistrio da advertncia
deve estar no objeto esperado. Experimente verificar esse objeto...
claro que podemos fazer tambm um teste exato de Fisher para esses dados, mas isso eu
vou deixar para voc se divertir...

Teste de tendncia (linear)

Ainda para esse tipo de dados, podemos lanar mo de um teste de tendncia, j que as
nossas classes so ordenveis. Esse teste ser apresentado guisa de curiosidade, e no
exploraremos ele mais a fundo, embora considere importante mencion-lo.
Esse teste na verdade pondera as propores segundo um escore qualquer, que representa a
ordem de cada uma das categorias. Em geral, se no temos nenhuma outra razo para fazer
diferente, a ordem natural uma seqncia simples indo de 1 at k, o nmero de classes. No
toa que o default da funo que usaremos exatamente essa.
A entrada da funo igual a da funo prop.test(). Vamos ver como fica:

> prop.trend.test(cesaria.sim,cesaria.total)

Chi-squared Test for Trend in Proportions

data: cesaria.sim out of cesaria.total ,


using scores: 1 2 3 4 5 6
X-squared = 8.0237, df = 1, p-value = 0.004617

Fcil, no ? Bastou acrescentar a palavra trend no meio da nossa velha conhecida, que
alis quer dizer tendncia em ingls.
No h muito o que comentar na sada dessa funo. L est a nossa velha estatstica e o
nosso p-valor. De diferente s os escores, que como j disse so o default e os graus de liberdade,
que agora voltou a ser igual a 1 de novo.
Dada a complexidade do assunto e o tempo disponvel, no vamos detalhar os clculos para
esse teste e nem demonstrar a sua relao com o teste no-paramtrico de Wilcoxon para duas
amostras (que um caso particular desse teste), ficando isso para os mais curiosos.
Vamos apenas comentar o linear entre parnteses acima. que esse teste funciona como
se fosse uma regresso linear ponderada dessas propores em relao aos escores. Sendo assim,
temos que assumir que o efeito do tamanho do sapato linear entre os grupos em questo, muito
embora isso no precise ser garantido matematicamente, mas apenas assumido mesmo, dispensando
qualquer tipo de verificao, por exemplo.
Quem quiser mais informaes, procure em um livro de Bioestatstica, com o Rosner, que
eu mencionei anteriormente.

Tabelas r x c

Assim como o caso de duas propores, que nada mais do que uma tabela 2 x k, tabelas
maiores, com r linhas e c colunas tambm podem ser testadas para independncia tanto com a
funo chisq.test() quanto com a funo fisher.test(). Esse tipo de teste serve para vrios
tipos diferentes de desenhos, o que modifica a interpretao dos resultados, mas no o teste em si.
Esse assunto porm, foge do escopo desta aula, e vamos nos ater apenas no teste em si e no em
aspectos de desenho de experimentos.
A idia novamente a mesma do teste anterior, e teremos que calcular valores esperados
para todas as clulas, mantidas as marginais fixas e calcular a mesmssima coisa de antes:
2
O E , s que com um detalhe. Agora a distribuio no segue mais uma 2 , mas sim
E 1

18
2
uma r 1 c 1 . Isso acontece, como voc j deve ter adivinhado porque numa tabela desse tipo,
fixadas as margens, podemos alterar at (r-1) x (c-1) caselas da tabela vontade, antes das outras
no poderem mais ser alteradas, ou seja, esses so os seus graus de liberdade. Alis isso j
aconteceu no caso da 2 x k , no mesmo? Faa a conta.
Para exemplificar, vamos usar os dados referentes ao grau da resposta ao tratamento para
Gonorria com 3 diferentes esquemas teraputicos. Este um exerccio do livro Fundamentals of
Biostatistics, de Bernard Rosner, 5 edio, tabela 10.25 na pgina 415. Essa teremos que digitar
tambm:

gono.trat<-matrix(c(40,10,15,30,20,40,130,70,45), nr=3, dimnames =


list("Tratamento" = c("Penicilina", "Spectinomicina (baixa)", "Spectinomicina
(alta)"), "Resposta" = c("Esfregao +", "Esfregao +, Cultura +", "Ambos -")))
gono.trat

Para fazer o teste:

> chisq.test(gono.trat)

Pearson's Chi-squared test

data: gono.trat
X-squared = 29.1401, df = 4, p-value = 7.322e-06

No h muito a se comentar sobre essa sada. Poderamos conferir os clculos, como antes:

> esperado<-chisq.test(gono.trat)$expected
> sum(((gono.trat-esperado)^2)/esperado)
[1] 29.14007

Confira o p-valor. Conferem os graus de liberdade? Muito bem. Aqui tambm no temos a
nossa correo de continuidade, pelos mesmos motivos j mencionados. Experimente fazer um teste
exato tambm.
Bem, agora eu aposto que alguns de vocs gostariam de saber como identificar qual desses
valores de fato diferente dos demais, no mesmo? Ainda que fosse para uma tabela 2 x k, como
que podemos satisfatoriamente saber qual grupo difere de qual? Bem, infelizmente esse no um
problema trivial, e modelos muito mais avanados dos que estamos lidando aqui devem ser usados.
Vocs sero apresentados a esses modelos no prximo curso de estatstica.
Uma advertncia que deve ser feita que no correto, ao contrrio do que muitos acham,
testar um dos grupos contra a soma dos demais, repetindo esse procedimento para todos os grupos.
Existem a vrios problemas entre comparaes mltiplas e dependncia entre os grupos.

Poder para propores

O R tambm possui uma funo para calcular poder, tamanho de amostra, etc para
propores, no mesmo estilo da que ns vimos para o teste t. A implementao, porm s para
duas amostras. O nome da funo tambm bastante parecido, power.prop.test() e os seus
argumentos so bastante parecidos tambm, exceto pela ausncia do desvio-padro, j que no caso
de propores, ele depende dos valores de p. Por exemplo, para saber o poder de um teste para a
diferena de uma proporo p1 de 0.15 e p2 de 0.30, com um alfa de 0.05 e 140 indivduos em cada
grupo, basta fazer:

> power.prop.test(p1=0.15, p2=0.30, n=140)

Two-sample comparison of proportions power calculation

19
n = 140
p1 = 0.15
p2 = 0.3
sig.level = 0.05
power = 0.8560383
alternative = two.sided

NOTE: n is number in *each* group

Claro que este procedimento tambm serve para calcular tamanhos de amostra para poderes
pr-estabelecidos.

20
Exerccios

1. Faa todos os passos do teste para diferenas de duas propores independentes, de modo
a obter o p-valor para a aproximao Normal e Qui-quadrada. Faa (a) sem a correo de
continuidade e (b) com a correo de continuidade. (c) O que est estranho na sada
mostrada na aula? Use o mesmo exemplo da aula. Mostre o cdigo do software que voc
usou, ou os clculos feitos mo. Dica: para a correo de continuidade nesse caso, some,
ao mdulo da diferena das propores a quantia 1/ 2n1 1/ 2n2

2. Por que o teste do Qui-quadrado para as k propores no recomendado para o nosso


exemplo da aula. Faa um teste que contorne esse problema.

3. Explique o cdigo usado para o clculo do IC da OR pelo mtodo de Woolf

4. Volte ao exemplo do teste de Fisher. Calcule agora a OR e os ICs pelos mtodos de Woolf
e Miettinen. Todos os resultados so coerentes uns com os outros? Discuta esses
resultados.

5. Usando a funo power.prop.test() faa uma curva de poder para um experimento que
testa duas propores quaisquer. Estabelea o problema, o teste de hipteses e discuta
diferentes tamanhos de amostra para o seu problema. Que sugesto voc teria para
construir essa curva para um experimento que usasse apenas uma amostra?

Do livro:

6. (7.2.) Em 747 casos de febre das Montanhas Rochosas, foram registrados 210 bitos em
uma determinada regio dos EUA. Em outra regio, de 661 casos, 122 faleceram. A
diferena de letalidade da doena entre essas regies estatisticamente significante?

7. (7.3 ) Duas drogas foram testadas para lcera pptica e comparadas quanto sua
efetividade. Os resultados foram:
Curou No curou Total

Pirenzepina 23 7 30

Tritiozina 18 13 31

Total 41 20 61
Estabelea o teste de hipteses para este experimento e faa um teste Qui-quadrado e
tambm o teste exato de Fisher sobre esses dados e discuta as diferenas entre eles. Baseie-se tanto
no p-valor quanto no IC 95%.

Do Rosner:

8. A tabela abaixo apresenta o resultado de um estudo feito no Lbano para aferir o efeito da
viuvez na mortalidade. Para isso, Vivos e vivas foram pareados com pessoas casadas na
mesma poca, com idade semelhante (mais ou menos 2 anos) e mesmo sexo. Na tabela, o

21
nmero de pares onde pelo menos uma das pessoas faleceu at um certo perodo de
seguimento:

O total de pares no estudo foi de 151 vivos e 544 vivas, sempre na proporo de 1:1.
Considerando que todos os pares foram considerados para a anlise, formula o teste de hipteses,
aplique o teste adequado, e comente o resultado.
Obs.: Como est meio apagado: n1 so os pares onde o vivo ou viva faleceu e o casado
est vivo e o n2, o contrrio.

22
Exerccios - Respostas

Aula 6 - Propores
Livro: pginas 129 a 138

1. Faa todos os passos do teste para diferenas de duas propores independentes, de modo a
obter o p-valor para a aproximao Normal e Qui-quadrada. Faa (a) sem a correo de
continuidade e (b) com a correo de continuidade. (c) O que est estranho na sada
mostrada na aula? Use o mesmo exemplo da aula. Mostre o cdigo do software que voc
usou, ou os clculos feitos mo. Dica: para a correo de continuidade nesse caso, some,
ao mdulo da diferena das propores a quantia 1/ 2n1 1/ 2n 2
(a) Primeiro vamos ver a sada sem correo, para conferir depois:

> prop.test(c(9,4),c(12,13), correct=F)

2-sample test for equality of proportions without continuity


correction

data: c(9, 4) out of c(12, 13)


X-squared = 4.8909, df = 1, p-value = 0.027
alternative hypothesis: two.sided
95 percent confidence interval:
0.09163853 0.79297686
sample estimates:
prop 1 prop 2
0.7500000 0.3076923

Agora basta seguir as equaes apresentadas na aula mesmo. Precisamos calcular o p


comum, a diferena e a varincia:

prop<-13/25
dif<-(9/12)-(4/13)
varian<-((1/12)+(1/13))*prop*(1-prop)

Tranqilo? S segui as instrues. Agora podemos calcular o nosso z:

z<-dif/sqrt(varian)

E ento calcular um p-valor:

> 2*pnorm(z, lower.tail=F)


[1] 0.02699857

Claro que isso seria o mesmo que fazer z ao quadrado e calcular o p-valor pela Qui-
quadrada, certo?

> pchisq(z^2, df=1, lower.tail=F)


[1] 0.02699857

Alis, podemos tambm conferir o valor dessa estatstica com a sada acima:

> z^2
[1] 4.890902

(b) Novamente a sada para conferir:

1
> prop.test(c(9,4),c(12,13))

2-sample test for equality of proportions with continuity


correction

data: c(9, 4) out of c(12, 13)


X-squared = 3.2793, df = 1, p-value = 0.07016
alternative hypothesis: two.sided
95 percent confidence interval:
0.01151032 0.87310506
sample estimates:
prop 1 prop 2
0.7500000 0.3076923

pena que haja um erro no enunciado e na verdade ns temos que diminuir a quantidade do
mdulo da diferena e no somar. Bem, faz parte... Vamos calcular a correo:

corr<-(1/24)+(1/26)

E agora vamos usar o mesmo cdigo, apenas calculando o mdulo e diminuindo a correo:

z1<-(abs(dif)-corr)/sqrt(varian)

Conferindo como na letra (a):

> 2*pnorm(z1, lower.tail=F)


[1] 0.07015673
> pchisq(z1^2, df=1, lower.tail=F)
[1] 0.07015673
> z1^2
[1] 3.279350

(c) O que h de estranho nessa sada que o IC no concordante com o p-valor relatado
quando usamos a correo de continuidade: para um p-valor de 0.07, que no nos permitiria rejeitar
a hiptese nula, temos um IC 95% que no contm zero, ou seja, pelo IC ns poderamos rejeitar
H0.

2. Por que o teste do Qui-quadrado para as k propores no recomendado para o nosso


exemplo da aula. Faa um teste que contorne esse problema.
Pelo motivo mais popular de todos: pelo menos um dos valores esperados para uma das
caselas foi menor que 5. Vamos ver:

> chisq.test(caesar.shoe)$expected
<4 4 4.5 5 5.5 6+
Yes 2.695157 4.287749 5.145299 5.880342 6.615385 18.37607
No 19.304843 30.712251 36.854701 42.119658 47.384615 131.62393
Warning message:
Chi-squared approximation may be incorrect in: chisq.test(caesar.shoe)

Isso necessita um teste exato: Fisher. Como tnhamos usado o exemplo caesar.shoe,
vamos aplic-lo:

> fisher.test(caesar.shoe)

Fisher's Exact Test for Count Data

data: caesar.shoe

2
p-value = 0.05766
alternative hypothesis: two.sided

Ainda assim no podemos rejeitar H0.

3. Explique o cdigo usado para o clculo do IC da OR pelo mtodo de Woolf


O cdigo simplesmente a aplicao dos clculos da OR e sua varincia e estabelecimento
dos ICs. Vamos ver:

or.woolf <- function(x, alfa=0.05)


{
y<-c((x[1,1]*x[2,2])/(x[1,2]*x[2,1])) # Calculando a OR
z<-exp(log(y)+(c(-1,1)*qnorm(1-
(alfa/2))*sqrt((1/x[1,1])+(1/x[1,2])+(1/x[2,1])+(1/x[2,2])))) # Calculando o IC
round(c("OR"=y, "IC"=z),3)
}

Primeiro a funo definida com 2 argumentos, um sem default, que o x e outro com um
valor pr-estabelecido, alfa=0.05. Em seguida, o objeto y recebe o clculo da razo dos produtos
cruzados (como est indicado, inclusive). Depois o objeto recebe aquela contaria toda para calcular
o IC. O interessante que foi possvel fazer tudo em um passo apenas, o que pode parecer confuso
inicialmente, mas foi possvel criar apenas um objeto para isso. Repare que o ltimo passo
exponenciar o IC calculado para o log da OR. Finalmente, a sada arredondada para 3 casas
decimais e o objeto ganha os nomes nas colunas OR e IC.

4. Volte ao exemplo do teste de Fisher. Calcule agora a OR e os ICs pelos mtodos de Woolf
e Miettinen. Todos os resultados so coerentes uns com os outros? Discuta esses
resultados.
Essa questo acabou ficando com um peguinha por causa de um descuido na hora de criar a
funo para calcular o IC pelo mtodo de Miettinen. O problema que para funcionar, voc tem
que entrar s o corpo da tabela como fizemos para o teste de Fisher:

or.miett(tabela[1:2,1:2]) #certo
OR IC1 IC2
6.750 0.855 53.318

> or.miett(tabela) #ERRADO!!!


OR IC1 IC2
6.750 1.243 36.667

O primeiro que est certo. Lembre-se que o IC de Miettinen tem sempre que concordar
com o teste do Qui-quadrado:

> chisq.test(tabela[1:2,1:2])

Pearson's Chi-squared test with Yates' continuity correction

data: tabela[1:2, 1:2]


X-squared = 3.2793, df = 1, p-value = 0.07016

No qual no rejeitamos H0. Logo o esse IC tem que conter o zero. Para o IC de Woolf, tanto
faz usar o corpo da tabela somente ou a tabela com as marginais:

> or.woolf(tabela[1:2,1:2])
OR IC1 IC2
6.750 1.162 39.200

3
> or.woolf(tabela)
OR IC1 IC2
6.750 1.162 39.200

Bem, mas o importante notar como os intervalos so diferentes, e se compararmos com o


teste de Fisher, veremos que na verdade o IC de Miettinen bem mais prximo do IC calculado
para o IC da OR de mxima verossimilhana condicional que o de Woolf. Alm disso, e mais
importante, eles so coerentes, ou seja ambos apontam para no rejeio da hiptese nula. Vamos
conferir:

> fisher.test(tabela[1:2,1:2])

Fisher's Exact Test for Count Data

data: tabela[1:2, 1:2]


p-value = 0.04718
alternative hypothesis: true odds ratio is not equal to 1
95 percent confidence interval:
0.9006803 57.2549701
sample estimates:
odds ratio
6.180528

Na verdade, recentemente o mtodo de Woolf vem sendo bastante criticado por causa da sua
instabilidade e falta de acurcia em algumas situaes.

5. Usando a funo power.prop.test() faa uma curva de poder para um experimento que
testa duas propores quaisquer. Estabelea o problema, o teste de hipteses e discuta
diferentes tamanhos de amostra para o seu problema. Que sugesto voc teria para
construir essa curva para um experimento que usasse apenas uma amostra?
Vamos testar se a freqncia allica do alelo delta-32 do gene codificador do receptor CCR5
diferente entre caucasianos e negros. Nosso teste de hipteses seria:
H 0 : p1 = p 2
H 0 : p1 p 2
Baseado na literatura, a diferena de propores bastante grande para esse problema, da
ordem de 20% para os caucasianos e 1% para os negros. Para manter tudo bem simples, vamos
admitir que a diferena que queremos essa mesmo e vamos estudar apenas o poder que teremos
para tamanhos de amostra diferentes, mas vamos fazer ao contrrio: fornecer o poder e ver o
tamanho necessrio:

x<-seq(0.5,0.95,0.05)
tamanho<-0
for (i in 1:length(x))
tamanho[i]<-ceiling(power.prop.test(p1=0.2, p2=0.01, power=x[i])$n)

O resultado em na verdade o tamanho em cada grupo. Podemos ento fazer um grfico,


multiplicando por 2 esse vetor:

> plot(tamanho*2,x, type="b")


> abline(h=0.85)

Veja o resultado abaixo:

4
Para conhecer exatamente o tamanho de amostra por grupo para termos 85% de poder:

> tamanho[x=="0.85"]
[1] 46

Esse tamanho de amostra parece bastante razovel para o nosso problema.


A sugesto para uma amostra, como no est implementado no R seria ou implementar ou
ento usar simulaes para calcular os poderes para diferentes tamanhos de amostra.

Do livro:

6. (7.2.) Em 747 casos de febre das Montanhas Rochosas, foram registrados 210 bitos em
uma determinada regio dos EUA. Em outra regio, de 661 casos, 122 faleceram. A
diferena de letalidade da doena entre essas regies estatisticamente significante?
Aqui temos vrias alternativas para testar. Primeiro pela proporo

> prop.test(c(210,122),c(747,661))

2-sample test for equality of proportions with continuity


correction

data: c(210, 122) out of c(747, 661)


X-squared = 17.612, df = 1, p-value = 2.709e-05
alternative hypothesis: two.sided
95 percent confidence interval:
0.05138139 0.14172994
sample estimates:
prop 1 prop 2
0.2811245 0.1845688

Poderamos criar uma tabelinha para usar o teste Qui-quadrado e Fishher tambm:

tabelinha<-matrix(c(210,122,747-210,661-122), nrow=2)

E agora podemos aplicar os testes:

5
> chisq.test(tabelinha)

Pearson's Chi-squared test with Yates' continuity correction

data: tabelinha
X-squared = 17.612, df = 1, p-value = 2.709e-05

> fisher.test(tabelinha)

Fisher's Exact Test for Count Data

data: tabelinha
p-value = 2.39e-05
alternative hypothesis: true odds ratio is not equal to 1
95 percent confidence interval:
1.331814 2.246053
sample estimates:
odds ratio
1.727031

Nesse caso, no h dvida: todos os testes apontam para a rejeio de H0, portanto a
diferena das propores estatisticamente significante. Fique vontade para aplicar as nossas
funes para OR tambm.

7. (7.3 ) Duas drogas foram testadas para lcera pptica e comparadas quanto sua
efetividade. Os resultados foram:
Curou No curou Total

Pirenzepin
23 7 30
a

Tritiozina 18 13 31

Total 41 20 61
Estabelea o teste de hipteses para este experimento e faa um teste Qui-quadrado e
tambm o teste exato de Fisher sobre esses dados e discuta as diferenas entre eles. Baseie-se tanto
no p-valor quanto no IC 95%
Vamos criar a nossa tabela para esse problema

drogas<-matrix(c(23,18,7,13), nrow=2)

Agora podemos aplicar os testes. Primeiro o Qui-quadrado:

> chisq.test(drogas)

Pearson's Chi-squared test with Yates' continuity correction

data: drogas
X-squared = 1.6243, df = 1, p-value = 0.2025
Acontece que o R no fornece IC algum para esse teste. Vamos ento usar o IC de Miettinen
para a OR, at para ficar comparvel com o teste de Fisher:

> or.woolf(drogas)
OR IC1 IC2
2.373 0.785 7.177

6
Tudo sem problemas. Os teste (claro) so coerentes e no nos permitem rejeitar H0. Vamos
agora fazer o teste de Fisher:

> fisher.test(drogas)

Fisher's Exact Test for Count Data

data: drogas
p-value = 0.1737
alternative hypothesis: true odds ratio is not equal to 1
95 percent confidence interval:
0.6936416 8.4948588
sample estimates:
odds ratio
2.339104

Sem problemas, n? Tudo bate direitinho, inclusive as ORs so bastante prximas.

Do Rosner:
8. A tabela abaixo apresenta o resultado de um estudo feito no Lbano para aferir o efeito da
viuvez na mortalidade. Para isso, Vivos e vivas foram pareados com pessoas casadas na
mesma poca, com idade semelhante (mais ou menos 2 anos) e mesmo sexo. Na tabela, o
nmero de pares onde pelo menos uma das pessoas faleceu at um certo perodo de
seguimento:

O total de pares no estudo foi de 151 vivos e 544 vivas, sempre na proporo de 1:1.
Considerando que todos os pares foram considerados para a anlise, formula o teste de hipteses,
aplique o teste adequado, e comente o resultado.
Obs.: Como est meio apagado: n1 so os pares onde o vivo ou viva faleceu e o casado
est vivo e o n2, o contrrio.
Nesse caso evidentemente estamos lidando com um estudo pareado. O teste de hipteses
pode ser estabelecido de diferentes maneiras. Vamos ver um bastante geral:
H0: no h associao entre viuvez e mortalidade
H1: h associao entre viuvez e mortalidade
O peguinha dessa questo aqui que a tabela s mostra na verdade os pares discordantes,
sendo que os demais tm que ser calculados. O problema que no sabemos nada sobre os pares
concordantes. Mas no tem problema: eles no contribuem em nada para o teste de McNemar.
Logo, teremos um total de 247 pares discordantes. Logo, no importa o nmero que joguemos na

7
tabela. Vamos fazer o seguinte: vamos colocar metade dos pares concordantes em cada uma das 2
caselas. Eles so 695-247=378, logo colocaremos 189 em cada uma delas:

viuvez<-matrix(c(189, 144, 103, 189), nr=2, dimnames = list("Viuvo" =


c("Sobreviveu", "Faleceu"), "Casado" = c("Sobreviveu", "Faleceu")))
> viuvez
Casado
Viuvo Sobreviveu Faleceu
Sobreviveu 189 103
Faleceu 144 189

Podemos ento calcular a OR para ver o risco de um vivo falecer em relao aos casados.
Isso seria apenas n1/n2 (repare que a tabela est ao contrrio. Isso importa no resultado?):

> 144/103
[1] 1.398058

Bem, o risco maior. Agora vamos ver se significativamente maior:

> mcnemar.test(viuvez)

McNemar's Chi-squared test with continuity correction

data: viuvez
McNemar's chi-squared = 6.4777, df = 1, p-value = 0.01092

A nossa concluso que h associao entre a viuvez e a mortatlidade, e que o risco de


mortalidade 40% maior entre os vivos.

8
Mdulo Estatstica I no R
Autor: Antonio Guilherme Fonseca Pacheco

Pr-requisitos: Conhecimento prvio do ambiente R. Especificamente, o leitor deve estar


familiarizado com os mdulos Bsico, Entrada e Sada de Dados e tambm Manuseando
dados no R.

Bibliotecas necessrias: ISwR

Aula 7 - ANOVA
Livro: pginas 111 a 121

Esta aula e tambm a prxima, ns vamos seguir o livro-texto mais de perto, e ento ns
vamos apenas comentar cada uma das sees de interesse, juntamente com o cdigo utilizado em
cada uma das passagens. Como no h muito o que modificar nesses captulos, o aluno dever ler os
captulos correspondentes e seguir a aula com os comentrios.

ANOVA
Comparaes 2 a 2 e testes mltiplos
Relaxando a pressuposio de homoscedasticidade
Apresentao grfica
Teste de Bartlett
Teste de Kruskal-Wallis
Comparaes 2 a 2 e testes mltiplos
Exerccios

ANOVA

Vamos comear pela compreenso da breve teoria que o livro introduz para em seguida
entrarmos na parte do teste propriamente dito.
fundamental que se entenda o que acontece nessa decomposio a qual o livro se refere,
tanto em relao s observaes, como em relao s somas dos quadrados. Para nos ajudar nessa
tarefa, vamos gerar um banquinho de exemplo:

groupa<-rnorm(5, 200, 25)


groupb<-rnorm(5, 110, 30)
groupc<-rnorm(5, 50, 30)
group<-c(rep("A",5),rep("B",5),rep("C",5))
grupos<-data.frame(valor=c(groupa, groupb, groupc), grupo=group)
attach(grupos)

No acho que seja a maneira mais elegante de se fazer isso, mas criamos um data frame
com uma varivel chamada valor gerada a partir de Normais para 3 grupos diferentes com 5
observaes por grupo e tambm uma varivel grupo com os nomes dos grupos A, B e C. Depois
anexamos o objeto para nos facilitar a vida. Confira como ficou.

summary(grupos)

Vamos agora usar um grfico que nunca usamos antes, mas que vai dar uma boa
visualizao desses dados. Os pontos parecem um pouquinho afastados uns dos outros em relao

1
ao eixo horizontal, mas isso um artifcio, gerado pelo argumento "jitter" na funo abaixo, j
que todos devem estar alinhados em relao ao seu grupo:

stripchart(valor~grupo, vert=T, "jitter", jit=0.01, pch=21)

Voc deve estar vendo algo como esse grfico a embaixo: as observaes por cada um dos
grupos (no igualzinho, claro, pois ns geramos isso aleatoriamente).

Muito bem, vamos guardar ento esse grfico por enquanto. Vamos tentar entender a
relao que ele coloca. Ele diz que um ponto qualquer desse grfico, xij (i.e. a j-sima observao
do grupo i) determinado por 3 elementos diferentes: a mdia geral (sem levar em conta os
grupos), a diferena entre a mdia do grupo e a mdia geral e a diferena entre a prpria observao
e a mdia do grupo. Agora, repare que isso apenas um truque matemtico. Repare o que ele fez.
Comeamos de uma igualdade:
xij = xij .
A, somamos e diminumos x , a mdia geral:


xij = x x xij

2
Ainda ficou a mesma coisa, certo? Agora, para finalizar, ele soma e subtrai x , a mdia
i
de cada grupo i:

xij = x xi x xij xi .
Isso simples de conferir tambm no nosso grfico, quer ver? Vamos calcular a mdia geral
e a mdia de cada um dos grupos para o nosso banquinho de exemplo:

xbarra<-tapply(valor, grupo, mean)


media<-mean(valor)

Agora, vamos acrescentar esses clculos no nosso grfico:

points(1:3, xbarra, pch="-", cex=3)


abline(h=media)

A linha horizontal a mdia geral e os tracinhos a mdia de cada grupo. Pegue um lpis e
desenhe nesse grfico agora as distncias que acabamos de mencionar e veja se as relaes no se
mantm.

3
Agora vamos ver a questo da variabilidade, tambm comentada no texto. No fica muito
claro como dessa relao se chega nas variabilidades. Sem entrar em detalhes, podemos reescrever
essa igualdade assim, certo?

xij x = xi x xij xi
Pode-se ento provar que se elevarmos esses termos ao quadrado e somarmos todas as
observaes em todos os grupos, essa relao se mantm. Vamos usar uma notao mais rgida que
a do livro, especificando os k grupos e os ni elementos de cada grupo:
k n k n k n
i
2 i
2 i

xij x = xi x xij xi 2
i =1 j =1 i =1 j =1 i =1 j =1
O primeiro termo seria a disperso de cada observao em relao media geral, o segundo,
a disperso entre a mdia de cada grupo e essa mesma mdia geral e o terceiro a disperso entre
cada observao e a mdia do seu prprio grupo. Hummm, poderia dizer ento que so as
disperses totais, entre os grupos e dentro dos grupos, respectivamente, no mesmo?
Ns aprendemos que uma medida de variabilidade com boas caractersticas matemticas era
a varincia, seja da populao, seja da amostra, como ns vimos anteriormente. Ambas nada mais
so do que a soma dos quadrados dos afastamentos (ou diferenas) entre as observaes e a mdia
dessas observaes, s que dividido pelo nmero de observaes (ou n-1, se for a amostral). Bem,
mas acontece que se ns no dividssemos por N ou n-1, ainda assim isso seria uma medida de
variabilidade, certo? S para lembrar a varincia da amostra por exemplo:
n
1 2
2
s =
n1 i =1
xi x

Essa seria logicamente a variabilidade mdia total da nossa amostra. Mas agora ns temos
uma amostra dividida em grupos, e ns precisamos de uma medida de variabilidade tambm. Mas
espere a. Essas relaes l de cima nada mais so do que variabilidades, no mesmo? So
somatrios de desvios das observaes em relao a mdias ao quadrado. Ento o primeiro termo
dessa relao uma medida de disperso total das observaes. Usando a notao do livro:
2
SS total = xij x
i j
Eu sei que desde l de cima j tinha complicado um pouco a notao por causa desse
somatrio duplo, no ? Mas isso ocorreu porque a gente tem que dividir os grupos e as
observaes, mas na verdade isso s quer dizer que o somatrios das j observaes dos i grupos,
mais nada. Ela corresponde nossa variabilidade total, mas no a varincia propriamente dita,
pois ao contrrio da varincia, no representa uma variabilidade mdia. Agora voc deve estar
pensando por que no se usa a varincia que ns j vimos que tem propriedades to boas... Espere
um pouco e veremos que essa tambm possui.
Ah, e SS soma dos quadrados (de sum of squares em ingls.) No livro eles usam SSD soma
dos quadrados das diferenas mais descritivo...
Bem, acontece que como as observaes, essa variabilidade pode tambm ser dividida em
dois componentes, um que diz respeito ao prprio grupo (a variabilidade interna do grupo, as
distncias entre as observaes pertencentes a um grupo e a mdia desse grupo) e ainda a
variabilidade entre os grupos (as diferenas entre as mdias dos grupos e a mdia total.) Alis, para
o nosso teste nessa que estamos interessados, no mesmo? Bem, estamos interessados em
ambas...
Ento podemos escrever esses componentes, como no livro, no ? Ah, mas j est l, no
precisa escrever de novo. Vamos logo fazer algo que ele no faz, que conferir se isso verdade ou
no. Vamos comear conferindo quanto vale o SStotal, que s fazer a soma das diferenas das
observaes para a mdia geral ao quadrado. Essa fcil, pois ns j calculamos a mdia geral:

4
sum((valor-media)^2)
[1] 60884.83

Vamos agora calcular a soma dentro dos grupos. Esse um pouquinho mais chato de fazer,
porque a gente tem que subtrair as observaes das mdias dos seus grupos. Ento temos que criar
um vetor com esses valores. Veja se isso funciona:

rep(xbarra, each=5)

Ns repetimos os valores de xbarra 5 vezes cada, que o nmero de observaes em cada


grupo, justamente. Ah, agora podemos fazer e fica bem parecido com a frmula, veja:

> sum((valor-rep(xbarra, each=5))^2)


[1] 10910.57

Repare que com esse macete no precisamos nos preocupar com o duplo somatrio, pois
essa nossa funo rep() substituiu um deles para ns.
E agora finalmente a soma entre os grupos. Para facilitar os clculos, vamos usar a forma
simplificada do livro:

SS entre = n i xi x 2
i
Aqui o macete so os ni's que no nosso caso so 3 e todos iguais a 5. A facilita at:

> sum(rep(5,times=3)*(xbarra-media)^2)
[1] 49974.26

Repare que aqui fizemos uma operao vetorial, de outra maneira no daria certo. Veja se a
soma desses dois no d exatamente a soma total. Vou deixar como exerccio indicar no grfico
acima onde esto esses componentes das variabilidades.
Muito bem. Sobre o teste F, alm das explicaes do livro, que me parecem claras, vamos
recordar o que aprendemos na aula 5 sobre aquele teste para homogeneidade das varincias,
lembra? Pois , isso a mesma coisa, so somas de diferenas ao quadrado sobre os seus graus de
liberdade. S que nesse caso, nos interessa a direo desse teste, pois o que estamos procurando
se a variabilidade entre os grupos explica uma parte maior da varincia total do que a variabilidade
dentro dos grupos. Assim, como os graus de liberdade sero sempre k-1 (as mdias dos k grupos
menos a mdia geral) para a soma entre e n-k (todas as observaes menos as k mdias dos grupos)
para a soma dentro dos grupos, se dividirmos essas somas pelos seus graus de liberdade e fizermos
a diviso, teremos exatamente o mesmo teste F para diferena de varincias, que mostrado no alto
da pgina 113.
O detalhe que neste caso ser um teste unidirecional, pois s nos interessa testar se a
varinca entre os grupos maior do que a dentro dos grupos.
Repare tambm que estranhamente o que estamos testando aqui so varincias, mas estamos
interessados em saber se as mdias dos grupos so diferentes.
Bem, vamos ento ao exemplo do livro:

library (ISwR)
data (red.cell.folate)
attach(red.cell.folate)
summary(red.cell.folate)

Pela ordem do livro, a regresso linear j foi vista e por isso que ele fala tanto sobre ela,
comparando com a ANOVA. No se preocupe com isso, na prxima aula ns vamos falar sobre
isso.

5
Indo adiante com a anlise mesmo:

anova(lm(folate~ventilation))

Segue ento a explicao da sada do R, no creio que haja problemas quanto a isso. Note
que esse banco tem 22 observaes em 3 grupos, e portanto sempre bom conferir os graus de
liberdade. Claro que podemos usar aquelas continhas que fizemos anteriormente para conferir as
contas, apenas mudando algumas coisas:

xbarra<-tapply(folate, ventilation, mean)


media<-mean(folate)

At aqui nada mudou, s os nomes. Agora ns vamos ter um pouco de dificuldade em criar
aquelas nossas repeties para as mdias, no ? Vamos ver. Os grupos tm 8, 9 e 5 observaes
respectivamente e a gente precisa do xbarra repetido nessas freqncias, certo? Que tal tentarmos:

rep(xbarra, times=c(8,9,5))

Parece que funciona, n? Ento vamos fazer assim para a soma dentro dos grupos:

ssw<-sum((folate-rep(xbarra, times=c(8,9,5)))^2)

A seguinte at fcil, pois precisamos apenas de um vetor com esses valores de ni:

ssb<-sum(c(8,9,5)*(xbarra-media)^2)

Confira os valores dos objetos ssw e ssb para ver se bate com os valores na tabela. Bem,
agora para obter o valor de F, ficou fcil, n?

> (ssb/2)/(ssw/19)
[1] 3.711336

E o p-valor derivado de uma distribuio F2,19, lembra?

> pf((ssb/2)/(ssw/19), 2, 19, lower.tail=F)


[1] 0.04358933

Lembrando que o teste unilateral e claro que estamos olhando para a cauda superior
dessa F. Bateu, n? Confira:

> anova(lm(folate~ventilation))
Analysis of Variance Table

Response: folate
Df Sum Sq Mean Sq F value Pr(>F)
ventilation 2 15516 7758 3.7113 0.04359 *
Residuals 19 39716 2090
---
Signif. codes: 0 `***' 0.001 `**' 0.01 `*' 0.05 `.' 0.1 ` ' 1

Bem, em seguida ele comenta sobre um possvel erro se a sua varivel no estiver
corretamente codificada. Vamos s ver o exemplo certo aqui:

data(juul)
juul$tanner<-factor(juul$tanner, labels=c("I", "II", "III", "IV", "V"))
attach(juul)

6
summary(tanner)
anova(lm(igf1~tanner))

O passo-a-passo dessa fica como exerccio para voc. Note que no precisamos desanexar e
anexar o banco nesse caso, pois no fizemos o exemplo errado que ele prope.

Comparaes 2 a 2 e testes mltiplos

Bem, vamos pular essa parte da regresso linear, j que ns no vimos esse assunto ainda e
falar das comparaes 2 a 2, j no quarto pargrafo da pgina 116.
O que queremos fazer na verdade comparar os nossos grupos 2 a 2 para ver onde esta
diferena existe. O teste F que fizemos nos diz apenas que pelo menos 2 desses grupos so
diferentes entre si, mas no quais.
O problema que estamos comparando vrias coisas ao mesmo tempo e cada vez que
comparamos, estamos sujeitos a cometer um erro. Esse erro nada mais do que uma probabilidade
de se achar um valor muito extremo em uma distribuio (pensando no p-valor, por exemplo).
Acontece que essa probabilidade multiplicada cada vez que ns comparamos um grupo com outro
grupo. Isso quer dizer que se formos comparar pro exemplo uma varivel com 10 grupos, teramos
45 pares de grupos, e poderamos ter ento 0.05x(45) = 2.25, ou seja, cerca de 2 pares que tenham
uma diferena estatisticamente significante apenas devido ao acaso, s porque eu multipliquei o
meu erro.
Existem ento vrias maneiras de se corrigir esse fenmeno e uma das mais comuns a
correo de Bonferroni, que tambm a mais simples e a mais conservativa. O procedimento
apenas multiplicar o p-valor calculado pelo nmero de combinaes. A nica diferena que a
varincia conjunta dos grupos (que igual soma dos quadrados mdia dentro dos grupos) usada
para todos os pares, sob a pr-suposio que as varincias so homogneas.
Vamos ver como fica a varincia conjunta para mais de duas amostras (para duas ns j
2 n1 1 s 12 n2 1 s 22
vimos na aula 5, lembra?): s conj = . Mas repare que se temos k grupos em
n1 n 2 2
vez de 2, poderamos reescrever essa equao:
k

ni 1 s 2i
2 i =1
s conj = k .
ni 1
i =1

Mas podemos expandir essa equao para s 2i :


k ni

ni 1 xij x j 2 / ni 1 . Veja que o denominador foi tambm alterado
i =1 j =1
s 2conj =
n k
(s fiz a conta, o somatrio dos n's de todos os grupos, que nada mais do que o prprio n total,
menos k vezes 1, que k.) Agora, vamos deslocar esses somatrios e cortar os n i 1 :
k ni

xij x j 2
2 i =1 j =1
s conj =
n k
Hummmm. Isso est parecendo a doma dos quadrados entre os grupos, dividido pelos seus
graus de liberdade. E isso mesmo!!! A varincia conjunta igual quela sada da tabela da
ANOVA, e podemos us-la para os nossos clculos. Podemos at conferir isso numericamente para

7
k

ni 1 s 2i
2 i =1
o nosso exemplo aqui. Vamos calcular s conj = k no R e comparar com a tabela da
ni 1
i =1

ANOVA. Vamos primeiro criar um vetor para os ni's e outro para os s 2i 's:

ni<-c(8,9,5)
si<-tapply(folate, ventilation, var)

Agora podemos facilmente calcular:

> sum((ni-1)*si)/sum((ni-1))
[1] 2090.321

Arredondando confere, n? Bem, essa varincia que temos que usar para fazer os nossos
clculos 2 a 2. Mas agora, vamos ver o que acontece quando fazemos o nosso teste no R com a
correo de Bonferroni:

> pairwise.t.test(folate, ventilation, p.adj="bonferroni")

Pairwise comparisons using t tests with pooled SD

data: folate and ventilation

N2O+O2,24h N2O+O2,op
N2O+O2,op 0.042 -
O2,24h 0.464 1.000

P value adjustment method: bonferroni

Usamos ento a funo pairwise.t.test() com o argumento p.adj="bonferroni", j


que como voc percebeu no livro o default no esse.
Bem, o que essa correo faz na verdade multiplicar o p-valor originalmente calculado
pelo nmero de combinaes. No nosso caso, para 3 grupos:

> choose(3,2)
[1] 3

Legal, ento vamos ver quais seriam os p-valores sem a correo. Para isso basta usar o
argumento p.adj="none":

> pairwise.t.test(folate,ventilation, p.adj="none")

Pairwise comparisons using t tests with pooled SD

data: folate and ventilation

N2O+O2,24h N2O+O2,op
N2O+O2,op 0.014 -
O2,24h 0.155 0.408

P value adjustment method: none

8
Confira se valores corrigidos so esses valores aqui multiplicados por 3. Um deles no ,
por que?
Bem, claro que esses p-valores podem ser facilmente obtidos a mo, e esse ser um
exerccio para voc

Relaxando a pressuposio de homoscedasticidade

Como voc deve ter aprendido, a ANOVA tambm exige que as varincias entre os grupos
seja homognea, ou seja que haja homoscedasticidade entre os grupos. Assim como no caso do este
t para duas amostras, e tambm graas a Welch, possvel fazermos um teste que no leva a
homoscedaticidade em conta. Seria muito longo e tedioso mostrar, como fizemos para o teste t o
caminho a ser seguido para essas contas, e portanto nos limitaremos a mostrar como o R faz esse
teste.
Para o caso da comparao geral da ANOVA, teremos que usar uma funo diferente da que
usamos anteriormente. Trata-se da oneway.test() que implementa a correo de Welch. Vamos
ver como fica:

> oneway.test(folate~ventilation)

One-way analysis of means (not assuming equal variances)

data: folate and ventilation


F = 2.9704, num df = 2.000, denom df = 11.065, p-value = 0.09277

Note que a sada mais resumida que o teste anterior, mas que agora os graus de liberdade
do denominador so fracionrios. Repare que agora o p-valor no mais significativo, o que pode
significar, como diz o livro que a diferena que estvamos vendo era na verdade devida ao fato de
um dos grupos terem no uma mdia maior, mas uma varincia maior.
Esse mesmo procedimento pode ser usado para comparaes mltiplas, usando a mesma
funo de antes, mas com um argumento extra, indicando que no queremos a varincia (ou o
desvio-padro) agrupada. Vamos fazer diferente do livro e usar a correo de Bonferroni tambm:

> pairwise.t.test(folate, ventilation, pool.sd=F, p.adj="bonferroni")

Pairwise comparisons using t tests with non-pooled SD

data: folate and ventilation

N2O+O2,24h N2O+O2,op
N2O+O2,op 0.087 -
O2,24h 0.482 0.893

P value adjustment method: bonferroni

O argumento pool.sd=F pede ento que usemos desvios-padro no agrupados. Repare que
agora nenhum p-valor significativo tambm. O problema das varincias diferentes entre os grupos
tambm ocorre aqui, como vimos no teste geral acima.

Apresentao grfica

Essa seo do livro mais uma curiosidade de como apresentar esse tipo de dados no R.
Ns j at usamos a funo stripchart() no incio dessa aula. Vou ento fornecer o cdigo para
voc no ter que digitar, mas no tenho nada a acrescentar ao texto:

xbar <- tapply(folate, ventilation, mean)

9
s <- tapply(folate, ventilation, sd)
n <- tapply(folate, ventilation, length)
sem <- s/sqrt(n)
stripchart(folate~ventilation, "jitter", jit=0.05,pch=16, vert=T)
arrows(1:3, xbar+sem, 1:3, xbar-sem, angle=90, code=3, length=0.1)
lines(1:3, xbar, pch=4, type="b", cex=2)

O cdigo bem parecido com o que usamos anteriormente para construir os grficos dos
intervalos de confiana, e essas funes podem ser melhor entendidas atravs da ajuda para cada
uma delas, alm da explicao do livro.

Teste de Bartlett

No entendi porque esta seo est aqui e no antes da seo de relaxamento da


homoscedasticidade, mas como estou seguindo o livro, deixa para l. Como no caso de duas
amostras, voc pode querer comparar as varincias de 3 ou mais amostras ao mesmo tempo para
saber se deve ou no fazer a ANOVA com ou sem homoscedasticidade. O R tem implementado o
teste de Bartlett (usurios do Epiinfo vo se lembrar dele).
No vamos entrar em detalhes tambm sobre este teste, mas estaremos testando a
homogeneidade das varincias entre os grupos, e este teste, assim como o teste F que j tnhamos
visto para duas varincias na aula 5, tambm bastante sensvel a distribuies no-normais.
Vamos ver como fica:

> bartlett.test(folate~ventilation)

Bartlett test for homogeneity of variances

data: folate by ventilation


Bartlett's K-squared = 2.0951, df = 2, p-value = 0.3508

Surpreendentemente, o teste no nos permite concluir que alguma das varincias sejam
diferentes, apesar dos nossos testes terem se modificado bastante, quando no assumimos
homoscedasticidade anteriormente e apesar tambm do primeiro grupo parecer mais disperso que os
demais (veja no livro ou faa o grfico.) A normalidade pode ter nos atrapalhado aqui...

Teste de Kruskal-Wallis

Tambm no vamos nos estender muito nesse teste que nada mais do que uma
generalizao do teste de Wilcoxon para mais de duas amostras, ou seja um teste no-paramtrico
para mais de dois grupos independentes.
Os clculos so na verdade bastante parecidos com o teste de Wilcoxon, mas vamos poup-
los das contas infindveis. A idia dos ranks a mesma e agora estamos comparando vrios
conjuntos de ranks em vez de apenas 2.
A funo kruskal.test() implementa esse teste no R:

> kruskal.test(folate~ventilation)

Kruskal-Wallis rank sum test

data: folate by ventilation


Kruskal-Wallis chi-squared = 4.1852, df = 2, p-value = 0.1234

Acrescento somente o comentrio do livro sobre a eficincia do teste no-paramtrico em


relao ao seu correspondente paramtrico, e bom frisar que isso verdade para qualquer teste
no paramtrico, ou seja, se o teste paramtrico for aplicado sobre amostras que obedecem aos pr-

10
requisitos (e.g. normalidade), ento o teste paramtrico ser mais eficiente que o no-paramtrico.
O problema sempre ser assumir que esses pr-requisitos so verdadeiros.

Comparaes 2 a 2 e testes mltiplos

O livro no comenta nada sobre comparaes 2 a 2 para testes no paramtricos, mas eles
tambm esto implementados no R. Vamos ver um exemplo com o mesmo banco de dados:

> pairwise.wilcox.test(folate,ventilation, p.adj="bonferroni")

Pairwise comparisons using Wilcoxon rank sum test

data: folate and ventilation

N2O+O2,24h N2O+O2,op
N2O+O2,op 0.18 -
O2,24h 0.85 1.00

P value adjustment method: bonferroni

Usamos ento a funo pairwise.wilcox.test() e usamos tambm a correo de


Bonferroni. No h surpresas sobre os resultados.

11
Exerccios

1. Indique no grfico que fizemos no primeiro exemplo os componentes das variabilidades


totais dentro e entre os grupos. Faa com um lpis.

2. (a)Faa a ANOVA do banco juul e interprete o resultado. Apresente o cdigo que voc
usou ou os clculos feitos a mo. (b) Faa as comparaes mltiplas necessrias entre
todos os grupos. Use a correo de Bonferroni. Quantas comparaes estaremos fazendo
nesse caso? Quais as concluses que voc pode tirar dos resultados? Obs.: estabelea os
testes de hipteses que voc realizou.

3. Calcule passo-a-passo as comparaes 2 a 2 para o banco red.cell.folate que usamos


como exemplo na aula. Faa tambm a correo de Bonferroni. Por que uma delas no
2
exatamente 3 vezes a no corrigida. Dica: No calcule a s conj a mo. Use a sada da
tabela de ANOVA, ou calcule com a ajuda de um software qualquer.

4. Exerccio 6.1 do livro (pgina 127)

5. Repita o exerccio acima usando testes no-paramtricos. Quais as suas concluses?

12
Exerccios - Respostas

Aula 7 - ANOVA
Livro: pginas 111 a 121

1. Indique no grfico que fizemos no primeiro exemplo os componentes das variabilidades


totais dentro e entre os grupos. Faa com um lpis.
Claro que nesse caso voc pode escolher um ponto como exemplo, e j saberemos que o
somatrio de todas essas distncias ao quadrado ser a nossa variabilidade. Veja como seria um
exemplo bem simples:

2. (a)Faa a ANOVA do banco juul e interprete o resultado. Apresente o cdigo que voc
usou ou os clculos feitos a mo. (b) Faa as comparaes mltiplas necessrias entre
todos os grupos. Use a correo de Bonferroni. Quantas comparaes estaremos fazendo
nesse caso? Quais as concluses que voc pode tirar dos resultados? Obs.: estabelea os
testes de hipteses que voc realizou.
Bem, o primeiro passo identificar que variveis do banco juul poderiam ser usadas para a
aplicao da ANOVA. Isso no l muito difcil, j que a varivel de interesse contnua, a IGF-I e
a nica varivel com mais de 2 categorias a classificao de Tanner.
(a)
Nesse caso, o nosso teste de hipteses ser:
H 0 : 1 =2 = 3 = 4 =5
H 1 : Pelo menos um par de mdias diferente
Onde as mdias se referem mdia de concentrao de IGF-I por cada umas das cinco

1
categorias da classificao de Tanner. Bem, vamos dar uma olhada nas nossas pressuposies:
Primeiro as varincias devem ser homogneas. Vamos ver. Primeiro vamos dar uma olhada
no grfico de distribuies dos pontos:

stripchart(igf1~tanner, vert=T, "jitter", jit=0.01, pch=21)

No me parecem l muito homogneas no... Vamos aplicar o teste:

> bartlett.test(igf1,tanner)

Bartlett test for homogeneity of variances

data: igf1 and tanner


Bartlett's K-squared = 55.6603, df = 4, p-value = 2.362e-11

... nada homogneas. Vamos ver os valores dos DPs:

> by(igf1, tanner, sd, na.rm=T)


INDICES: 1
[1] 90.27237
------------------------------------------------------------
INDICES: 2
[1] 122.5933
------------------------------------------------------------
INDICES: 3
[1] 152.2866
------------------------------------------------------------
INDICES: 4
[1] 119.0959
------------------------------------------------------------
INDICES: 5
[1] 134.4187

2
So de fato bastante diferentes. Bem, teremos que relaxar essa pressuposio. Vamos
normalidade. Vamos dar uma olhada no teste de Shapiro-Wilk em cada um dos grupos para ver
como estamos em termos de distribuio normal:

> by(igf1, tanner, shapiro.test)


INDICES: 1

Shapiro-Wilk normality test

data: data[x, ]
W = 0.9695, p-value = 3.764e-06

------------------------------------------------------------
INDICES: 2

Shapiro-Wilk normality test

data: data[x, ]
W = 0.9606, p-value = 0.02704

------------------------------------------------------------
INDICES: 3

Shapiro-Wilk normality test

data: data[x, ]
W = 0.9635, p-value = 0.1657

------------------------------------------------------------
INDICES: 4

Shapiro-Wilk normality test

data: data[x, ]
W = 0.9469, p-value = 0.01309

------------------------------------------------------------
INDICES: 5

Shapiro-Wilk normality test

data: data[x, ]
W = 0.9783, p-value = 0.0001284

Estamos mal. S uma das categorias parece ser normalzinha... Sinto um cheirinho de teste
no-paramtrico no ar...
Mas vamos fazer a ANOVA como pedido, mas relaxando a varincia homognea:

> oneway.test(igf1~tanner)

One-way analysis of means (not assuming equal variances)

data: igf1 and tanner


F = 258.5494, num df = 4.000, denom df = 154.677, p-value = < 2.2e-16

Foi rejeitado mesmo, sem dvida nenhuma, n? Mas vamos ver o teste de Kriskal-Wallis:

> kruskal.test(igf1~tanner)

Kruskal-Wallis rank sum test

data: igf1 by tanner

3
Kruskal-Wallis chi-squared = 462.3461, df = 4, p-value = < 2.2e-16

, parece que rejeitamos mesmo a hiptese nula e concluimos que pelo menos um par
dessas mdias diferente. Vamos ver quais...
(b)
Podemos comear com boxplots com indentaes para termos uma idia do que est
acontecendo:

boxplot(igf1~tanner, notch=T)

Pelos grficos, parece que os grupos 1 e 2 so diferentes de todos os outros (incluindo eles
mesmos) e os grupos 3, 4 e 5 so similares (dvida entre o 4 e o 5 talvez). Repare que esse grfico
permite tambm inspecionar a disperso da varivel por grupo, e que realmente parece diferente.
Bem, vamos fazer ento os testes 2 a 2. Vou poupar o leitor dos testes de hipteses que faremos,
pois so muitos... Repare que estou usando a correo de Bonferroni e que estou considerando as
varincias diferentes:

> pairwise.t.test(igf1,tanner, "bonferroni", pool.sd=F)

Pairwise comparisons using t tests with non-pooled SD

data: igf1 and tanner

1 2 3 4
2 8.8e-14 - - -
3 6.2e-15 6.5e-05 - -
4 < 2e-16 1.2e-10 1.000 -

4
5 < 2e-16 5.3e-09 1.000 0.075

P value adjustment method: bonferroni

Repare que os resultados corroboram o nosso mtodo grfico: os grupos 1 e 2 so diferentes


de todos, inclusive entre si, os grupos 3, 4 e 5 so semelhantes, sendo que o 4 e 5 tiveram um
resultado borderline.
Podemos, por via das dvidas aplicar a verso no-paramtrica tambm:

> pairwise.wilcox.test(igf1,tanner, "bonferroni")

Pairwise comparisons using Wilcoxon rank sum test

data: igf1 and tanner

1 2 3 4
2 < 2e-16 - - -
3 < 2e-16 5.7e-05 - -
4 < 2e-16 1.6e-09 1.000 -
5 < 2e-16 7.6e-09 1.000 0.052

P value adjustment method: bonferroni

Nada mudou, exceto o nosso borderline que ficou ainda mais limtrofe..
Para isso tudo fizemos 10 comparaes. Confira:

> choose(5,2)
[1] 10

3. Calcule passo-a-passo as comparaes 2 a 2 para o banco red.cell.folate que usamos


como exemplo na aula. Faa tambm a correo de Bonferroni. Por que uma delas no
2
exatamente 3 vezes a no corrigida. Dica: No calcule a s conj a mo. Use a sada da
tabela de ANOVA, ou calcule com a ajuda de um software qualquer.
Vamos ento seguir a dica e calcular a tabela de ANOVA:

> anova(lm(folate~ventilation))
Analysis of Variance Table

Response: folate
Df Sum Sq Mean Sq F value Pr(>F)
ventilation 2 15516 7758 3.7113 0.04359 *
Residuals 19 39716 2090
---
Signif. codes: 0 `***' 0.001 `**' 0.01 `*' 0.05 `.' 0.1 ` ' 1

Ento a nossa varincia connjunta de 2090. Vamos calcular as mdias agora:

medias<-tapply(folate, ventilation, mean)

E agora vamos aplicar a frmula que ns aprendemos:

> 2*pt(abs(medias[1]-medias[2])/sqrt(2090*((1/8)+(1/9))), 19,


lower.tail=F)
N2O+O2,24h
0.01391336
> 2*pt(abs(medias[1]-medias[3])/sqrt(2090*((1/8)+(1/5))), 19,
lower.tail=F)
N2O+O2,24h

5
0.1547313
> 2*pt(abs(medias[2]-medias[3])/sqrt(2090*((1/9)+(1/5))), 19,
lower.tail=F)
N2O+O2,op
0.4084441

No se preocupe com os ttulos das sadas, so apenas por causa do tapply() que eu tinha
aplicado antes.
Repare que esses p-valores so aqueles no corrigidos que vimos na aula:

> pairwise.t.test(folate,ventilation, p.adj="none")

Pairwise comparisons using t tests with pooled SD

data: folate and ventilation

N2O+O2,24h N2O+O2,op
N2O+O2,op 0.014 -
O2,24h 0.155 0.408

P value adjustment method: none

Para a correo, temos que multiplicar esses valores por 3. Vamos ver:

> 3*2*pt(abs(medias[1]-medias[2])/sqrt(2090*((1/8)+(1/9))), 19,


lower.tail=F)
N2O+O2,24h
0.04174008
> 3*2*pt(abs(medias[1]-medias[3])/sqrt(2090*((1/8)+(1/5))), 19,
lower.tail=F)
N2O+O2,24h
0.4641939
> 3*2*pt(abs(medias[2]-medias[3])/sqrt(2090*((1/9)+(1/5))), 19,
lower.tail=F)
N2O+O2,op
1.225332

Quase igual sada da aula:

> pairwise.t.test(folate, ventilation, p.adj="bonferroni")

Pairwise comparisons using t tests with pooled SD

data: folate and ventilation

N2O+O2,24h N2O+O2,op
N2O+O2,op 0.042 -
O2,24h 0.464 1.000

Exceto pelo ltimo valor que calculamos ser 1.22 e que o R relata como sendo 1. Isso
acontece obviamente porque o p-valor, como voc j est cansado de saber uma probabilidade, e
portanto no pode ser maior que 1. Logo, quando se faz essa correo, faz-se na verdade o mximo
entre a multiplicao e a unidade.

4. Exerccio 6.1 do livro (pgina 127)


A parte mais difcil desse exerccio na verdade passar esta lista para um formato adequado
para aplicar os testes. Trata-se de uma lista, ento podemos combinar os seus elementos em um
vetor de idades:

6
idades<-c(zelazo$active, zelazo$passive, zelazo$none, zelazo$ctr.8w)

Agora podemos criar um vetor de grupos (1, 2, 3 e 4) correspondendo ao tamanho de cada


um dos componentes da lista, repetindo esse nmero:

grupo<-c(rep(1, length(zelazo$active)), rep(2, length(zelazo$passive)),


rep(3, length(zelazo$none)), rep(4, length(zelazo$ctr.8w)))

Aplicando logo a ANOVA:

> anova(lm(idades~as.factor(grupo)))
Analysis of Variance Table

Response: idades
Df Sum Sq Mean Sq F value Pr(>F)
as.factor(grupo) 3 14.778 4.926 2.1422 0.1285
Residuals 19 43.690 2.299

Parece estar longe de rejeitar alguma coisa. Mas como o enunciado fala em usar testes t,
inclusive combinando grupos, vamos dar uma olhada no boxplot:

boxplot(idades~grupo, notch=T)

Hummm. Nmeros pequenos mesmo... Acho que vale no mximo juntar os grupos 3 e 4,
no s porque so semelhantes, mas por ambos representarem controles:

grupo1<-c(rep(1, length(zelazo$active)), rep(2, length(zelazo$passive)),


rep(3, length(zelazo$none)), rep(3, length(zelazo$ctr.8w)))

E agora podemos aplicar novamente:

7
> anova(lm(idades~as.factor(grupo1)))
Analysis of Variance Table

Response: idades
Df Sum Sq Mean Sq F value Pr(>F)
as.factor(grupo1) 2 13.655 6.827 3.0471 0.06996 .
Residuals 20 44.812 2.241
---
Signif. codes: 0 `***' 0.001 `**' 0.01 `*' 0.05 `.' 0.1 ` ' 1

Para esse podemos aplicar um teste pareado, s por fazer:

> pairwise.t.test(idades, grupo1, "bonferroni")

Pairwise comparisons using t tests with pooled SD

data: idades and grupo1

1 2
2 0.491 -
3 0.068 1.000

P value adjustment method: bonferroni

Como esperado, nenhum significativo.


Ah, j ia me esquecendo: as varincias so homogneas e eu nem vi a normalidade porque
vamos ter que fazer os teste no-paramtricos de qualquer maneira na prxima questo.

> bartlett.test(idades, grupo1)

Bartlett test for homogeneity of variances

data: idades and grupo1


Bartlett's K-squared = 1.035, df = 2, p-value = 0.596

5. Repita o exerccio acima usando testes no-paramtricos. Quais as suas concluses?


Bem, esses devem ser os testes mais recomendados de fato, especialmente porque os grupos
so bem pequenos. Comeando pelos 4 grupos:

> kruskal.test(idades~grupo)

Kruskal-Wallis rank sum test

data: idades by grupo


Kruskal-Wallis chi-squared = 6.8805, df = 3, p-value = 0.0758

J obtivemos um resultado mais significativo. Vamos ver juntando os ltimos:

> kruskal.test(idades~grupo1)

Kruskal-Wallis rank sum test

data: idades by grupo1


Kruskal-Wallis chi-squared = 6.2929, df = 2, p-value = 0.043

Hummm. J fica at significativo. Vamos ver os testes 2 a 2:

8
> pairwise.wilcox.test(idades, grupo1, "bonferroni")

Pairwise comparisons using Wilcoxon rank sum test

data: idades and grupo1

1 2
2 0.19 -
3 0.11 0.62

P value adjustment method: bonferroni


Warning messages:
1: Cannot compute exact p-value with ties in: wilcox.test.default(xi, xj,
...)
2: Cannot compute exact p-value with ties in: wilcox.test.default(xi, xj,
...)
3: Cannot compute exact p-value with ties in: wilcox.test.default(xi, xj,
...)

Bem, apesar desses valores no serem muito bons, pois o R no fez os testes exatos, o p-
valor geral foi limtrofe e provavelmente a correo para o teste exato no rejeitaria a hiptese nula
de qualquer maneira.

9
Mdulo Estatstica I no R
Autor: Antonio Guilherme Fonseca Pacheco

Pr-requisitos: Conhecimento prvio do ambiente R. Especificamente, o leitor deve estar


familiarizado com os mdulos Bsico, Entrada e Sada de Dados e tambm Manuseando
dados no R.

Bibliotecas necessrias: ISwR

Aula 8 - Regresso e correlao


Livro: pginas 95 a 110

Esta aula, assim como a anterior, ns vamos seguir o livro-texto mais de perto, e ento ns
vamos apenas comentar cada uma das sees de interesse, juntamente com o cdigo utilizado em
cada uma das passagens. Como no h muito o que modificar nesses captulos, o aluno dever ler os
captulos correspondentes e seguir a aula com os comentrios.

Regresso linear Simples


Resduos e valores ajustados
Tabela de ANOVA
Predio e bandas de confiana
Correlao
Correlao de Pearson
Correlao de Spearman
Correlao de Kendall
Exerccios

Regresso linear Simples

A idia da regresso linear simples identificar se uma varivel (y) linearmente


dependente de uma outra varivel (x) e tambm mensurar o quanto dependente ela . Nos interessa
saber ento se os valores de y aumentam, diminuem ou no no se alteram quando os de x
aumentam.
Na verdade isso nada mais do que uma generalizao do teste t que ns vimos para duas
amostras ou a ANOVA que ns vimos para mais de duas amostras. Agora, estudaremos a
associao de uma varivel contnua com outra varivel contnua. Mas como isso funciona?
Imagine a seguinte situao: temos uma varivel x qualquer que varia de 1 a 100 e uma
varivel y que queremos ver como se comporta em relao a x. Repare que se trata de um par, ou
seja, x e y so mensurados na mesma unidade (e.g. so duas variveis do mesmo paciente). Vamos
olhar para a figura abaixo. Que relao seria essa se estivssemos falando dos grficos A e B?
O que parece que o valor de y o mesmo, no importa o valor de x, ou seja, os valores de
y so independentes dos valores de x. A diferena do grfico A para o B que o primeiro quase no
apresenta variabilidade dos valores de y, enquanto que o segundo apresenta alguma variabilidade,
que ns poderamos nos referir como erro. As outras duas duplas representam uma relao
positiva entre x e y, ou seja, medida que x aumenta, y tambm aumenta (C e D), e na seguinte o
contrrio, ou seja a relao negativa e medida que x aumenta, y diminui (E e F). Tambm esto
presentes exemplos com erros pequenos (C e E) e grandes (D e F).
Mas e essa linha reta que aparece nos grficos? Voc vai dizer: Hummm, como uma aula
de regresso linear, deve ser a linha que corresponde a essa regresso, ou seja, a melhor linha que
descreve a relao entre x e y.

1
Afinal de contas, que reta essa? Por que justamente essa reta, calculada a partir de uma
regresso linear a melhor?

Bem, a que entram aqueles erros entre aspas mesmo. Vamos ver esse outro grfico. Ele
contm tambm uma nuvem de pontos. Estamos procurando uma reta que melhor explique essa
relao entre as variveis x e y. Ento, qual dessas retas mostradas melhor respondem a essa
questo? Todas elas descreveriam uma relao entre essas variveis... A que entra o nosso erro.
O que se convenciona que a melhor reta aquela que minimiza o erro. Repare que curioso,
pois a realidade o dado que temos, certo? Mas como assumimos que existe uma reta que descreve
essa relao, o que se afasta dessa reta terica, chamado de erro.
Mas como possvel achar uma reta que minimize o erro? um conceito parecido com o da
varincia. Digamos que a reta seja uma mdia (o que de fato , voc ver que ela a mdia
condicional da varivel y, dado x) e que a variabilidade medida entre os pontos e essa reta. Como
no caso da varincia, a soma dos afastamentos ao quadrado de todos esses pontos para essa reta
seria uma medida dessa disperso. A reta que proporcionar a mnima variabilidade ento
considerada a melhor reta. o famoso do mtodo dos mnimos quadrados.

2
Uma dvida inevitvel que vem a seguir : mas como possvel obter-se essa reta? Ser que
eu tenho que calcular esses afastamentos para todas as possveis retas? Na verdade, no. possvel
obter-se estimadores para esta reta, a partir de clculos que fogem do escopo desta aula. Mas vamos
s entender melhor. Primeiro, uma equao qualquer para essa reta (sem conhecer ainda) seria,
como voc j aprendeu em matemtica: y i = x i , onde o ponto onde essa reta corta o
eixo y e o coeficiente angular ou a tangente do ngulo que a reta faz com o eixo x. No caso
da nossa reta para a regresso linear, podemos ainda incluir o nosso erro: y i = x i i .
Esse erro no caso o afastamento dos pontos para a reta calculada, certo? Parece muito com
a idia da ANOVA, no mesmo? E bastante parecido sim. Mais adiante vamos inclusive mostrar
uma tabela de ANOVA para a regresso e vamos ver que graficamente essa questo dos erros
poder ser melhor visualizada.
Mas repare que para essa nossa equao da reta, podemos tirar o valor de i :
i = y i x i . E a partir daqui podemos calcular a soma dos quadrados dos erros,
no mesmo?
n n

= [ y i x i ] 2
2
i . A partir dessa equao que chegamos nos estimadores de
i=0 i=0
e :
n


x i x y i y
=
i=0 e
n
= y x
x i x 2
i=0
Ento, o que estamos fazendo estimar valores para esta melhor reta, que minimiza os
erros. Acho que no h muita dvida, no ?

3
Um outro conceito importante que deve ser mencionado, mas no provado nesta aula o
fato dessa reta ter uma outra conotao tambm. Ela representa na verdade a mdia da varivel y
condicional aos valores observados de x. Isso significa que o nosso modelo de regresso linear
simples pode ser escrito da seguinte forma:
E Y X = x i
Na verdade isso pode ser percebido tambm nas equaes que mostramos acima para os

estimadores e . Repare que este ltimo representa a relao entre a variao conjunta de x

e y (no numerador) e a varincia de x (no denominador). Note como isso nos remete idia de uma
probabilidade condicional, sendo a probabilidade de x e y sobre a probabilidade de x, s que nesse
caso estamos lidando com variabilidades e no probabilidades.
Bem, essa leitura complementa os conceitos da seo 5.1 do livro-texto. Vamos apenas
colocar o cdigo usado para facilitar a sua vida:

library(ISwR)
data(thuesen)
attach(thuesen)
lm(short.velocity~blood.glucose)
summary(lm(short.velocity~blood.glucose))

Vamos acrescentar mais dois detalhes que so discutidos no livro, s para no ficar muito
solto. O primeiro sobre erro-padro residual, que o livro explica tratar-se do estimador de .
S para no confundir, esse o desvio-padro dos erros, ou seja, a variabilidade de i e ele
igual, na verdade raiz quadrada da nossa expresso l de cima para a variabilidade do erro
dividido pelos seus graus de liberdade, que no caso da regresso simples ser sempre n-2:
n

[ y i x i ] 2
, que como j vimos pode ser escrita tambm da seguinte
2 i=0
=
n 2
forma:
n

y i y i 2
i=0
2=
n 2
Claro que o livro refere-se raiz quadrada da expresso acima. Isso vai aparecer de novo
quando virmos ANOVA no contexto de regresso.
O outro detalhe, que por sinal tambm veremos depois o R2. Ele conhecido como o
coeficiente de regresso e denota o quanto da variabilidade total do modelo pode ser explicado
pela(s) varivel(is) includa(s) no modelo. Ou seja, uma medida tambm de fitness, ajuste do
modelo. Isso ficar mais claro quando virmos a tabela de ANOVA.
Vamos ao grfico poroposto:

plot(blood.glucose,short.velocity)
abline(lm(short.velocity~blood.glucose))

Por que o nome das variveis tm que ser invertidos nesses cdigos acima? Podemos
tambm acrescentar uma mdia incondicional de y nesse grfico, no verdade?

abline(h=mean(short.velocity, na.rm=T))

Resduos e valores ajustados

4
Para a seo 5.2 teremos o seguinte cdigo (vou fazer comentrios tambm):

lm.velo<-lm(short.velocity~blood.glucose)
fitted(lm.velo)
resid(lm.velo)

A partir dessa observao dos valores, segue-se uma discusso grande sobre valores
faltantes no R (que pode ser bem chato na verdade). Vamos usar somente a ltima opo que ele
sugere para ns:

options(na.action=na.exclude)
lm.velo<-lm(short.velocity~blood.glucose)
fitted(lm.velo)

Bem, agora podemos fazer o grfico que sugerido pelo livro para os valores ajustados, mas
cuidado que tem uns peguinhas. Para fazer exatamente o que o livro faz, devemos fazer a seguinte
seqncia:

plot(blood.glucose,short.velocity)
lines(blood.glucose,fitted(lm.velo))
segments(blood.glucose, fitted(lm.velo), blood.glucose, short.velocity)

Muito bem. Repare que os afastamentos que esto representados nesse grfico so
exatamente o erro do modelo, ou seja o somatrio do quadrado desses segmentos, ou
n

y i y i 2 que representam a nossa variabilidade.
i=0
Bom, para finalizar essa seo, o livro comenta muito superficialmente sobre inspeo dos
resduos. Isso muito importante em qualquer modelo, para podermos avaliar se as pressuposies
do modelo no so desrespeitadas, avaliando assim a adequao do modelo escolhido. A
verificao mais bsica de todas estudar se os resduos tm uma distribuio aproximadamente
normal e com uma variabilidade constante ao longo dos valores ajustados. Para isso o livro sugere 2
grficos:

plot(fitted(lm.velo), resid(lm.velo))
qqnorm(resid(lm.velo))

Mas faa um de cada vez, por favor... Voc sugere algum teste para esta normalidade dos
resduos?
No primeiro grfico, estamos na verdade procurando tendncias nesses resduos, o que
poderia denotar no normalidade, heteroscedasticidade ou ambos.
Agora, claro que o R tem umas facilidades tambm que vocs vero com mais detalhes
quando virem modelos lineares em um curso futuro. Mas se ns pedirmos para o R fazer um plot de
um objeto classe lm, ele vai fazer por default 4 grficos. Veja:

par(mfrow=c(2,2))
plot(lm.velo)
par(mfrow=c(1,1))

Os dois primeiros (de cima) so exatamente os que acabamos de fazer, s que com os
outliers marcados para ns. O de baixo esquerda parecido com o primeiro, s que os valores do
erro so padronizados, para remover o efeito de possveis assimetrias presentes na distribuio e
facilitar a visualizao de tendncias. O ltimo grfico mostra o clculo de uma medida de anlise
de influncia de pontos extremos, cuja teoria foge do escopo dessa aula.

5
Um ltimo comentrio sobre diagnstico do modelo que uma outra pressuposio que
voc poderia estar interessado em testar a autocorrelao dos erros (lembra? Os erros de um ponto
so independentes dos erros em outros pontos). Podemos testar isso com um grfico tambm, mas
voc vai precisar da biblioteca ts (de sries temporais):

library(ts)
acf(resid(lm.velo)[!is.na(resid(lm.velo))])

O grfico mostra os limites de confiana em azul. Repare que para o ponto 0, a correlao
1 (claro, pois isso significa a correlao do ponto com ele mesmo):

Tabela de ANOVA

Vamos partir agora para a tabela de ANOVA aplicada regresso linear, que est no nosso
livro no captulo de ANOVA, seo 6.5, pgina 126. Toda a explicao vem do simples comando:

anova(lm.velo)

Os comentrios so bastante completos, inclusive sobre o R2, mas eu queria complementar


algumas coisas. Primeiro uma visualizao grfica do que est acontecendo nessa tabela de
ANOVA. Vamos fazer assim:

plot(blood.glucose,short.velocity)
segments(blood.glucose, rep(mean(short.velocity,
na.rm=T),length(blood.glucose)), blood.glucose, short.velocity, lty=2)
abline(h=mean(short.velocity, na.rm=T))
lines(blood.glucose,fitted(lm.velo))
segments(blood.glucose, fitted(lm.velo), blood.glucose, short.velocity)

Repare que nesse grfico ns teremos as distncias dos pontos at a mdia de y e tambm
at a mdia condicional de y. Faa o seguinte: identifique na figura abaixo os componentes da

6
variabilidade total, i.e. a variabilidade do modelo e a variabilidade dos resduos. Percebeu como a
mesma idia da ANOVA?

A outra observao sobre a relao entre os p-valores para a estatstica t e a F que


comentada no texto. Essa relao entre essas distribuies existe mesmo e a seguinte: Seja X uma
distribuio t com graus de liberdade. Ento X2 ter uma distribuio F 1, , ou seja uma F com
1 grau de liberdade no denominador e o mesmo nmero de graus de liberdade no denominador.
Vamos conferir usando o prprio exemplo do livro. Antes tnhamos um t de 2.101 para o nosso
beta, lembra? Vamos ver:

2*pt(2.101,21, lower.tail=F)
[1] 0.04789171

Confere com o valor. Vamos ver agora para uma F:

> pf(2.101^2,df1=1,df2=21, lower.tail=F)


[1] 0.04789171

Claro que agora no vamos multiplicar por 2, no ? O nosso quadrado j fez isso para ns.
Conferiu?

Predio e bandas de confiana

Essa seo do livro s para curiosidade e ento no farei comentrios a respeito.

Correlao

Vamos passar agora para os 3 tipos de correlao abordados no livro. Conforme destacado
na parte inicial do texto, o coeficiente de correlao denota a associao entre duas variveis
aleatrias. Note que isso um conceito diferente da regresso, onde estvamos estudando o

7
comportamento de uma varivel aleatria (y) dados valores fixos de x. Comenta tambm da
associao direta ou positiva (quando o sinal positivo) e da inversa ou negativa (quando o
sinal negartivo.)

Correlao de Pearson

Bem ele j comea de cara com esse papo de elipse, reta... ihhhhhh, uma confuso danada...
No vamos abordar isso aqui, mas quem tiver curiosidade a respeito, grite.
Um comentrio importante voc observar como a equao do coeficiente de correlao do
livro se parece com o estimador do beta na regresso. Olhe s:
n
n

x i x y i y
x i x y i y
i=0 i=0
r= e =
n n n
2 2
x i x y i y x i x 2
i=0 i=0 i=0

Notou a diferena? O numerador igual a covarincia de x e y. Mas o denominador de r


no a varincia de x, mas sim o produto dos desvios-padro de x e y. Voc conseguiu enxergar
isso? timo, ento... Isso tem alguma implicao quando fazemos testes de hipteses para r ou para
o beta?
Acho que o resto est bem explicado. O cdigo usado vai abaixo:

cor(blood.glucose, short.velocity)
cor(blood.glucose, short.velocity, use="complete.obs")
cor(thuesen, use="complete.obs")
cor.test(blood.glucose, short.velocity)

Voc desconfia por que ele menciona que o p-valor do teste para correlao o mesmo para
o valor obtido na regresso?
Uma observao importante que no estamos tocando no caso de querermos testar a
correlao de suas variveis contra um valor fixo qualquer. No vimos, porque isso no muito
usado e o mtodo algo complicado (bem, nem tanto...). Mas para quem for curioso, basta procurar
em qualquer livro a transformao z de Fisher (de novo!!!).

Correlao de Spearman

No acho que tenha algo a acrescentar aqui. A idia substituir o valor das observaes
pelos ranks e calcular normalmente o r que ns vimos anteriormente. O cdigo usado:

cor.test(blood.glucose, short.velocity, method="spearman")

Correlao de Kendall

Tambm no tenho nada a acrescentar. O livro descreve tambm pouco, mas eu concordo
que a interpretao mais fcil... mais ou menos... O cdigo:

cor.test(blood.glucose, short.velocity, method="kendall")

Exerccios

Do livro (pgina 110):

1. 5.1 - No precisa calcular o IC 95%

8
2. 5.2

3. 5.3

4. 5.4

9
Exerccios - Respostas

Aula 8 - Regresso e correlao


Livro: pginas 95 a 110

Do livro (pgina 110):

1. 5.1 - No precisa calcular o IC 95%


Segundo a ajuda do R esse banco contm dados sobre peso corporal e taxa de metabolismo
de 44 mulheres. Pelo que entendi, o estudo visa saber se o peso corporal determina a taxa de
metabolismo dessas mulheres. Vamos dar uma olhada nessa relao:

At que parece bastante linear a relao...


O exerccio simples e pede simplesmente para ajustar um modelo de regresso linear a
essas variveis. Para isso, basta o cdigo:

rmr.lm<-lm(metabolic.rate~body.weight,data=rmr)

D uma verificada na sada, e se quiser veja os grficos para a anlise dos resduos primeiro:

par(mfrow=c(2,2))
plot(rmr.lm)
par(mfrow=c(1,1))

1
Nada mau, eu diria... Vamos ver o modelo mesmo:

> summary(rmr.lm)

Call:
lm(formula = metabolic.rate ~ body.weight, data = rmr)

Residuals:
Min 1Q Median 3Q Max
-245.74 -113.99 -32.05 104.96 484.81

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 811.2267 76.9755 10.539 2.29e-13 ***
body.weight 7.0595 0.9776 7.221 7.03e-09 ***
---
Signif. codes: 0 `***' 0.001 `**' 0.01 `*' 0.05 `.' 0.1 ` ' 1

Residual standard error: 157.9 on 42 degrees of freedom


Multiple R-Squared: 0.5539, Adjusted R-squared: 0.5433
F-statistic: 52.15 on 1 and 42 DF, p-value: 7.025e-09

Significativo, tudo nos conformes. Para encontrar o valor ajustado para um peso de 70 kg,
basta usarmos a constante e o coeficiente preditos pelo modelo, no ponto x = 70:

> 811.2267+(7.0595*70)
[1] 1305.392

Tranqilo, n? Vamos ver um grfico desse ponto:

plot(metabolic.rate~body.weight,data=rmr)
abline(rmr.lm)
abline(v=70)
abline(h=1305.392)

2
2. 5.2
Esse exerccio tambm parece bem simples, com o nosso velho conhecido juul. A nica
dificuldade seria para alguns selecionar o subconjunto que ele pede (maiores de 25 anos). Vamos
ver um grfico dessas variveis:

plot(sqrt(igf1)~age, data=juul, subset=age>25)

Repare que eu usei a opo subset=age>25 para selecionar apenas parte dos dados. Alm
disso, a opo data=juul permite que voc acesse um banco de dados com o nome das variveis
apenas, sem ter que anexar o objeto. A relao parece ser boa e inversa:

O modelo poderia ser ajustado da mesma forma:

juul.lm<-lm(sqrt(igf1)~age, data=juul, subset=age>25)

3
Faa a mesma verificao agora:

par(mfrow=c(2,2))
plot(juul.lm)
par(mfrow=c(1,1))

Agora, faa o seguinte: ajuste um modelo sem usar a raiz quadrada. O que voc notou de
diferente?

juul.lm1<-lm(igf1~age, data=juul, subset=age>25)


par(mfrow=c(2,2))
plot(juul.lm1)
par(mfrow=c(1,1))

Bem, o nosso modelo final aqui ficaria assim:

> summary(juul.lm)

Call:
lm(formula = sqrt(igf1) ~ age, data = juul, subset = age > 25)

Residuals:
Min 1Q Median 3Q Max
-4.8642 -1.1661 0.1018 0.9450 4.1136

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 18.71025 0.49462 37.828 <2e-16 ***
age -0.10533 0.01072 -9.829 <2e-16 ***
---
Signif. codes: 0 `***' 0.001 `**' 0.01 `*' 0.05 `.' 0.1 ` ' 1

Residual standard error: 1.741 on 120 degrees of freedom


Multiple R-Squared: 0.446, Adjusted R-squared: 0.4414
F-statistic: 96.6 on 1 and 120 DF, p-value: < 2.2e-16

A interpretao que para cada acrscimo de uma unidade na idade do indivduo, a raiz
quadrada da IGF-I decresce 0.1053 unidade.

3. 5.3
Esse banco, segundo a ajuda do R descreve nveis de um determinado anticorpo em crianas
de 3-15 anos em Gana. O exerccio pede uma anlise da relao entre os nveis desses anticorpos,
transformados (log) e a idade. Para estudar essa relao podemos usar novamente a regresso linear.

ab.lm<-lm(log(ab)~age, data=malaria)
summary(ab.lm)

Call:
lm(formula = log(ab) ~ age, data = malaria)

Residuals:
Min 1Q Median 3Q Max
-4.0753 -1.0622 0.1181 1.1012 2.7335

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 3.83697 0.38021 10.092 <2e-16 ***
age 0.10350 0.03954 2.618 0.0103 *
---
Signif. codes: 0 `***' 0.001 `**' 0.01 `*' 0.05 `.' 0.1 ` ' 1

4
Residual standard error: 1.478 on 98 degrees of freedom
Multiple R-Squared: 0.06536, Adjusted R-squared: 0.05582
F-statistic: 6.853 on 1 and 98 DF, p-value: 0.01025

A relao parece significativa. Os grficos para diagnstico:

par(mfrow=c(2,2))
plot(ab.lm)
par(mfrow=c(1,1))

A disposio dos dados parece estranha mesmo... Vamos ver como o grfico com a linha
de regresso:

plot(log(ab)~age, data=malaria)
abline(ab.lm)

A nica peculiaridade que eu vejo que a idade parece uma varivel discreta, j que ela foi
anotada como um nmero inteiro.

4. 5.4
ANULADA