You are on page 1of 95

UNIVERSIDADE FEDERAL DO CEARÁ

CENTRO DE CIÊNCIAS
DEPARTAMENTO DE ESTATÍSTICA E MATEMÁTICA
APLICADA

CURSO DE R

Professora
Ana Maria Souza de Araujo

Aluno
José Roberto Silva dos Santos

Fortaleza, Dezembro de 2009


Sumário

1 Introdução 4
1.1 Como utilizar o R . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2 Pacotes Libraries . . . . . . . . . . . . . . . . . . . . . . . . . 5

2 Tipos de Objetos 6
2.1 Vetores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.2 Matrizes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.3 Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.4 Data-frames . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.5 Listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.6 Funções . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.7 Importação de dados . . . . . . . . . . . . . . . . . . . . . . . 18
2.7.1 A função read.table() . . . . . . . . . . . . . . . . . . . 19
2.7.2 Importando planilhas do Microsoft Excel (Arquivos xls) 21

3 Estatística Descritiva 22
3.1 Rotinas Grácas . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.1.1 Funções grácas de alto nível . . . . . . . . . . . . . . 22
3.1.2 Funções grácas de baixo nível . . . . . . . . . . . . . 23
3.1.3 Funções grácas interativas . . . . . . . . . . . . . . . 23
3.2 Parâmetros grácos. A função par() . . . . . . . . . . . . . . . 23
3.3 Descrevendo um conjunto de dados . . . . . . . . . . . . . . . 29
3.3.1 Descrição Univariada . . . . . . . . . . . . . . . . . . . 32
3.3.2 Descrição Bivariada . . . . . . . . . . . . . . . . . . . . 41
3.3.3 Alguns grácos mais elaborados . . . . . . . . . . . . . 48

4 Probabilidade e Inferência 53
4.1 Controle de uxo e denição de funções . . . . . . . . . . . . . 53
4.1.1 Execução condicional . . . . . . . . . . . . . . . . . . . 53
4.1.2 Ciclos . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
4.1.3 Denindo funções . . . . . . . . . . . . . . . . . . . . . 55

2
SUMÁRIO 3

4.2 Distribuições de Probabilidade . . . . . . . . . . . . . . . . . . 56


4.2.1 Distribuição Normal . . . . . . . . . . . . . . . . . . . 57
4.2.2 Distribuição t-Student . . . . . . . . . . . . . . . . . . 60
4.2.3 F-Snedecor . . . . . . . . . . . . . . . . . . . . . . . . 61
4.2.4 Distribuição Gama . . . . . . . . . . . . . . . . . . . . 63
4.2.5 Distribuição Binomial . . . . . . . . . . . . . . . . . . 67
4.2.6 Distribuição de Poisson . . . . . . . . . . . . . . . . . . 69
4.3 Inferência . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
4.3.1 Teorema Central do Limite . . . . . . . . . . . . . . . . 72
4.3.2 Distribuições Amostrais . . . . . . . . . . . . . . . . . 75
4.3.3 Estimação de máxima verossimilhança . . . . . . . . . 79
4.3.4 Intervalos de Conança . . . . . . . . . . . . . . . . . . 84
4.3.5 Testes de Hipóteses . . . . . . . . . . . . . . . . . . . . 89
.1 Apêndice Software R no Curso de Estatística da UFC . . . . . 94
Referências Bibliográcas . . . . . . . . . . . . . . . . . . . . . . . 95
Capítulo 1
Introdução
R é uma linguagem e também um ambiente para cálculos estatísticos e grá-
cos. Semelhante a linguagem e ambiente S, R oferece uma ampla variedade de
metodologias estatísticas (análise descritiva, modelagem linear e não-linear,
testes estatísticos paramétricos e não-paramétricos, análise de séries tempo-
rais,...) além de um vasto ferramental gráco. Este é distribuído livremente
sob os termos da Free Software Foundation's GNU General Public License
em forma de código fonte. Compila e executa em uma ampla variedade de
plataformas UNIX e sistemas similares (incluindo FreeBSD e Linux), Win-
dows e MacOS.

1.1 Como utilizar o R


O R está disponível para download no site http://www.r-project.org/. Após
a instalação inicie o R (isso pode ser feito utilizando o ícone que será criado
na área de trabalho do seu computador) e veja que será aberta a seguinte
tela:
Este é o ambiente R que possui uma janela denominada console. Para limpar
o conteúdo que aparece na tela do console basta combinar as teclas "Ctrl"e
"L". Nesta janela é possível digitar e executar comandos, porém, a melhor
forma de se editar comandos é usando o editor de script, disponível a partir
da versão 2.1.1. Para ativar o editor, basta ir até a barra de menus e clicar
sequencialmente em: Arquivo e Novo script. No ambiente R as janelas
podem ser organizadas por título (uma ao lado da outra) ou em forma de
cascata. Para isso, basta ir até o menu Janelas e escolher uma dessas opções.
Para executar comandos no script, deixe o cursor na linha de comandos dese-
jada e combine as teclas "Ctrl"e "R"; no caso de comandos ocupando várias
linhas, selecione todas as desejadas e após isso faça a mesma combinação de

4
CAPÍTULO 1. INTRODUÇÃO 5

Figura 1.1: Tela inicial do R

teclas.

1.2 Pacotes Libraries


Ao instalar o R, este vem com uma quantidade padrão de ferramentas que es-
tão na forma de pacotes, por exemplo, os pacotes "stats"e "base"que contêm
funções básicas como plot(), mean(), matrix() entre outras, são exem-
plos de pacotes padrões do R. No entanto, o usuário não precisa limitar-se
somente a estes, ou seja, é possível instalar mais pacotes sempre que for
necessário. O R conta com inúmeros colaboradores no mundo inteiro que
criam e disponibilizam estes pacotes. Estas contribuições podem ser adquiri-
das, na forma de arquivos "zip", diretamente da home page citada na sub-
seção anterior. Ou também, podem ser instaladas diretamente do ambiente
R, bastando para isso, que o computador do usuário esteja conectado à in-
ternet.
Capítulo 2
Tipos de Objetos
No R, a manipulação de dados é feita através de objetos, sob os quais estão
denidas uma série de comandos que permitem, entre outras, operações de
aritmética, armazenamento de dados, descrição e análise. Os objetos básicos
do R são dos tipos: vetores, matrizes, arrays, data-frames, listas e funções. Os
quatro primeiros tipos, são objetos que armazenam dados diferindo apenas
pela forma de armazenamento e operação destes. Já os objetos do tipo
função, sempre recebem um "input" e produzem um "output".

2.1 Vetores
No R, a atribuição de um valor a um objeto é feita utilizando o símbolo "=",
por exemplo:
> x1=2
>x1
[1] 2

Na primeira linha deste comando estamos atribuindo o valor numérico 2 ao


objeto x1, na segunda linha pede-se para mostrar o valor de x1,e na terceira
linha é exibido o valor de x1. Para separar comandos em uma mesma linha
deve-se usar ";" por exemplo, o código acima poderia ser escrito da seguinte
forma:
> x1=2;x1
[1] 2
Agora vamos examinar os seguintes comandos:

6
CAPÍTULO 2. TIPOS DE OBJETOS 7

> x2=c(1,2,3);x2
[1] 1 2 3

> x3=1:10;x3
[1] 1 2 3 4 5 6 7 8 9 10

> x4=seq(0,1,by=0.1);x4
[1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0

> x5=rep(1,3);x5
[1] 1 1 1

> x6=rep(c(1,2),c(3,5));x6
[1] 1 1 1 2 2 2 2 2

Essas são diferentes formas de denir um vetor. Vejamos. O vetor x2 foi


denido usando o comando "c" que concatena os valores que estão entre
parênteses. Para x3, foi utilizado um comando que gera sequências, o símbolo
":" indica que o vetor será preenchido com valores de 1 a 10. Outra forma
de gerar sequências é utilizando a função "seq", sendo que nesta podemos
escolher o valor de incremento, que é especicado no argumento by=. Para o
exemplo acima vemos que x4 foi preenchido com uma sequência iniciando em
0 e terminando em 1 com incremento de 0, 1. Por último, temos os vetores
x5 e x6 que foram denidos usando a função "rep", muito útil para criação
de vetores com elementos repetidos. No primeiro argumento 1 da função
deve ser informado o elemento que será repetido e no segundo argumento
informamos o número de vezes que este será repetido. No vetor x5 temos o
número 1 repetido 3 vezes e, note que, também podemos usar vetores nos
argumentos da função rep. É o que foi feito para denir x6. Neste caso, o
primeiro vetor deve conter os elementos que se deseja repetir, e o segundo
irá conter o número de repetições de cada elemento do primeiro. É possível
selecionar elementos de um vetor usando colchetes, por exemplo:
> x4[x4>0.5]
[1] 0.6 0.7 0.8 0.9 1.0
Aqui foi utilizado o operador lógico > para selecionar os elementos de x4
maiores do que 0,5.
> x4[3]
1 Os argumentos de uma função devem ser sempre separados por vírgula
CAPÍTULO 2. TIPOS DE OBJETOS 8

[1] 0.2

> x4[-3]
[1] 0.0 0.1 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0

> x4[1:3]
[1] 0.0 0.1 0.2

Nos comandos acima, primeiro é selecionado o terceiro elemento de x4 (a


posição dos elementos é contada a partir de 1), depois foi utilizado o operador
de subtração para excluir o terceiro elemento de x4 e por último estamos
selecionando os três primeiros elementos de x4. Note que a linguagem R
é bastante intuitiva, por exemplo, imagine se nosso interesse fosse excluir
mais de um elemento de x4 de uma só vez, seria razoável pensar no seguinte
comando:
> x4[-(1:3)]
[1] 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
que está excluindo os elementos 1, 2 e 3 de x4.

Operações com vetores: Há diversas operações numéricas denidas sobre


vetores. Vejamos algumas.
> x2+2
[1] 3 4 5

> x2+3:5
[1] 4 6 8

> x2*3
[1] 3 6 9

> x2^(1:3)
[1] 1 4 27

> x5/x2
[1] 1.0000000 0.5000000 0.3333333

> round(x5/x2,1)
[1] 1.0 0.5 0.3
CAPÍTULO 2. TIPOS DE OBJETOS 9

Vemos que no primeiro comando estamos somando 2 a todos elementos do


vetor x2. Em seguida, somamos cada elemento de x2 com cada elemento
do vetor (3,4,5). No terceiro comando, multiplicamos cada elemento de x2
por 3. Logo depois, elevamos o primeiro elemento de x2 a 1, o segundo a 2
e o terceiro a 3. No último comando introduzimos a função round() onde
o primeiro argumento desta é um valor ou vetor numérico, e o segundo é o
número de casas decimais que se deseja no valor ou valores.

Vetores de caracteres: Também podemos atribuir caracteres a um objeto,


por exemplo:
> x7=c("fulano","ciclano","beltrano");x7
[1] "fulano" "ciclano" "beltrano"

> x8=c("a",x2);x8
[1] "a" "1" "2" "3"

> is.numeric(x8)
[1] FALSE

> is.character(x8)
[1] TRUE
Os caracteres devem estar sempre entre aspas. Caso não estejam, o R irá
processá-los como objeto. Observe que, para criar o vetor x8, concatenamos
x2 com o caractere "a", ou seja, tínhamos um vetor que era numérico e lhe foi
acrescentado um caractere. Porém o vetor x8 não possui elemento numérico
algum, o que foi vericado com a função is.numeric(), que informa ao
usuário a natureza do objeto testado. Para x8 a função retornou o valor
lógico FALSE, indicando que este não é numérico. Isso é devido ao fato de
que, no R, objetos do tipo vetor só aceitam elementos de um único tipo
(caractere ou numérico). Mais adiante iremos ver um objeto que permite
elementos de mais de um tipo.

2.2 Matrizes
Matrizes são objetos que possuem as mesmas propriedades dos vetores, diferindo
apenas na dimensão. Uma das formas de criar uma matriz no R é utilizando
a função abaixo:
matrix(um vetor, nrow =número de linhas, ncol =número de colunas,
byrow = FALSE,...)
CAPÍTULO 2. TIPOS DE OBJETOS 10

Esta função recebe um vetor e o organiza em uma matriz conforme indicado


no argumento byrow. Se byrow=FALSE2 o vetor será organizado por colunas
da matriz, senão byrow=TRUE (que signica por linha = verdade), ou seja, o
vetor será organizado por linhas. Vejamos um exemplo:
> m1=matrix(1:9,nc=3);m1
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
Veja que é suciente escrever apenas as duas primeiras letras dos argumentos
(ao invés de ncol basta digitar nc) e também, basta informar o número de
linhas ou colunas, uma vez que estes devem ser sempre múltiplos do total de
elementos da matriz. Vamos agora denir uma outra matriz usando o mesmo
vetor que foi usado na anterior, porém, vamos agora ordená-lo por linha.
> m2=matrix(1:9,nc=3,byrow=T);m2
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
Uma outra maneira de denir uma matriz é usando a função cbind, que serve
para concatenar vetores, por exemplo:
> m3=cbind(1:5,6:10,11:15);m3
[,1] [,2] [,3]
[1,] 1 6 11
[2,] 2 7 12
[3,] 3 8 13
[4,] 4 9 14
[5,] 5 10 15
Podemos usar esta função para concatenarmos quantos vetores quisermos, e
estes corresponderão às colunas da matriz que está sendo criada.

Seleção de elementos: Assim como foi visto na seção anterior, também


podemos selecionar elementos de uma matriz utilizando colchetes agora na
forma: [ , ] onde antes da vírgula indica(m)-se a(s) linhas e depois a(s)
colunas. Por exemplo:
2 Este é a opção default, ou seja, se nada for especicado este será a opção utilizada
CAPÍTULO 2. TIPOS DE OBJETOS 11

> m3[1,2]
[1] 6

> m3[,2]
[1] 6 7 8 9 10

> m3[2,]
[1] 2 7 12

> m3[-2,]
[,1] [,2] [,3]
[1,] 1 6 11
[2,] 3 8 13
[3,] 4 9 14
[4,] 5 10 15

> m3[4:5,1:2]
[,1] [,2]
[1,] 4 9
[2,] 5 10
No primeiro comando estamos selecionando o elemento que está na primeira
linha e segunda coluna de m3. No segundo selecionamos apenas a segunda
coluna. No terceiro é selecionada a segunda linha. E no quarto comando
estamos excluindo a segunda linha de m3 e por último selecionamos uma sub-
matriz constituída de alguns elementos das linhas 4 e 5 e das colunas 1 e 2
de m3.

Operações com matrizes: Existem várias operações denidas sob ma-


trizes. Vejamos algumas através de exemplos.
> m1+m2
[,1] [,2] [,3]
[1,] 2 6 10
[2,] 6 10 14
[3,] 10 14 18

> m1*m2
[,1] [,2] [,3]
[1,] 1 8 21
[2,] 8 25 48
[3,] 21 48 81
CAPÍTULO 2. TIPOS DE OBJETOS 12

> t(m3)
[,1] [,2] [,3] [,4] [,5]
[1,] 1 2 3 4 5
[2,] 6 7 8 9 10
[3,] 11 12 13 14 15

> m3%*%m2
[,1] [,2] [,3]
[1,] 102 120 138
[2,] 114 135 156
[3,] 126 150 174
[4,] 138 165 192
[5,] 150 180 210

> t(m2)%*%m2
[,1] [,2] [,3]
[1,] 66 78 90
[2,] 78 93 108
[3,] 90 108 126

Nos dois primeiros comandos temos adição e multiplicação das matrizes m1


e m2 elemento a elemento. No terceiro comando foi utilizado a função t()
que faz transposição de matrizes. O produto matricial é feito utilizando %*%.
No exemplo temos o produto matricial de m3 com m2. Por último temos o
produto matricial da transposta de m2 com m2. Esta operação é conhecida
como produto cruzado e no R existe uma função especíca para realizá-la.
Basta fazer:
> crossprod(m2)
[,1] [,2] [,3]
[1,] 66 78 90
[2,] 78 93 108
[3,] 90 108 126
Podemos destacar também as funções det(), solve() e eigen() que retor-
nam, respectivamente, o determinante, a inversa e os auto-valores e autove-
tores de uma matriz. Vejamos um exemplo:

> m4=matrix(c(6,5,4,1,3,0,2,-1,1),nc=3);m4
[,1] [,2] [,3]
[1,] 6 1 2
[2,] 5 3 -1
CAPÍTULO 2. TIPOS DE OBJETOS 13

[3,] 4 0 1

> det(m4)
[1] -15

> solve(m4)
[,1] [,2] [,3]
[1,] -0.2 0.06666667 0.4666667
[2,] 0.6 0.13333333 -1.0666667
[3,] 0.8 -0.26666667 -0.8666667

> eigen(m4)
$values
[1] 8.021597 2.676943 -0.698540

$vectors
[,1] [,2] [,3]
[1,] -0.6895898 0.1176905 -0.3086003
[2,] -0.6083940 -0.9525448 0.6136865
[3,] -0.3928393 0.2807263 0.7267425

2.3 Arrays
Array é a generalização de uma matriz, uma vez que neste tipo de objeto
podemos denir bem mais do que duas dimensões. No R denimos um array
usando a função array() que tem a seguinte forma:

array(vetor_de_dados, vetor_de_dimensões) Por exemplo:


> ar1=array(1:20,c(3,3,2));ar1
, , 1

[,1] [,2] [,3]


[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9

, , 2

[,1] [,2] [,3]


[1,] 10 13 16
CAPÍTULO 2. TIPOS DE OBJETOS 14

[2,] 11 14 17
[3,] 12 15 18

Neste caso estamos trabalhando com três dimensões. É como se tivéssemos


uma matriz formada por duas submatrizes, conforme a estrutura abaixo:
 
1 4 7

 2 5 8 


 3 6 9 


 10 13 16 

 11 14 17 
12 15 18

Vamos agora inserir mais uma dimensão neste array. Basta fazer:
> ar2=array(1:20,c(3,2,2,2));ar2
, , 1, 1

[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6

, , 2, 1

[,1] [,2]
[1,] 7 10
[2,] 8 11
[3,] 9 12

, , 1, 2

[,1] [,2]
[1,] 13 16
[2,] 14 17
[3,] 15 18

, , 2, 2

[,1] [,2]
[1,] 19 2
CAPÍTULO 2. TIPOS DE OBJETOS 15

[2,] 20 3
[3,] 1 4
Agora temos uma estrutura do tipo:
 
1 4 13 16

 2 5 14 17 


 3 6 15 18 


 7 10 19 2 

 8 11 20 3 
9 12 1 4
A seleção de elementos de um array é semelhante a seleção de elementos de
uma matriz, veja alguns exemplos:
> ar2[,,1,1]
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6

> ar2[,,1,2]
[,1] [,2]
[1,] 13 16
[2,] 14 17
[3,] 15 18

> ar2[,,2,1]
[,1] [,2]
[1,] 7 10
[2,] 8 11
[3,] 9 12

> ar2[,,2,2]
[,1] [,2]
[1,] 19 2
[2,] 20 3
[3,] 1 4
Note que, estamos selecionando todas as submatrizes 3 × 2 do array ar2. R
possui vários bancos de dados internos, dentre eles temos o banco de dados
UCBAdmissions, que é um array. Para vê-lo basta digitar UCBAdmissions
desta forma e executar.
CAPÍTULO 2. TIPOS DE OBJETOS 16

2.4 Data-frames
Data-frames são objetos que podem armazenar elementos de mais de um
tipo, diferentemente de vetores matrizes e arrays, que forçam todos os seus
elementos a serem de um mesmo tipo. Sua estrutura é semelhante a de uma
matriz, sendo que, aqui todas as colunas são tratadas individualmente. A
função usada para criar data-frames é data.frame(). Segue um exemplo:
> d1=data.frame(individuo=x7,altura=c(1.65,1.70,1.80));d1
individuo altura
1 fulano 1.65
2 ciclano 1.70
3 beltrano 1.80
Podemos ver que a primeira coluna de d1 é formada por caracteres e a se-
gunda é constituída por valores numéricos. Vale observar que, dentro de cada
coluna de um data-frame continua-se tendo a restrição dos elementos serem
do mesmo tipo. O tratamento individual é apenas entre as colunas. Um data
frame pode ser tratado como uma matriz. Assim a seleção de elementos é
feita da mesma forma. Por exemplo:
> d1[2,2]
[1] 1.7

> d1[,2]
[1] 1.65 1.70 1.80
A seleção de uma coluna de um data-frame também é feita utilizando o
símbolo $ da seguinte forma:
> d1$altura
[1] 1.65 1.70 1.80
Podemos tratar as colunas de um data-frame como se fossem objetos, para
isso basta utilizar a função attach(), aplicando-a em d1:
> attach(d1)
> altura
[1] 1.65 1.70 1.80

> individuo
[1] "fulano" "ciclano" "beltrano"
Ou seja, ao se fazer attach(d1) R criou o objeto altura e individuo.
CAPÍTULO 2. TIPOS DE OBJETOS 17

2.5 Listas
Lista é uma coleção de objetos, ou seja, podemos organizar vários objetos de
tamanho e/ou tipos diferentes em uma lista. A função usada para criar uma
lista é list(). Vejamos um exemplo:
> l1=list(A=1:10,B="caractere",C=matrix(1:4,nc=2));l1
$A
[1] 1 2 3 4 5 6 7 8 9 10

$B
[1] "caractere"

$C
[,1] [,2]
[1,] 1 3
[2,] 2 4

Aqui temos uma lista formada por três objetos de tipos e tamanhos diferentes.
Primeiro temos um vetor numérico, depois temos um caractere e por último
temos uma matriz. Há duas maneiras de selecionar elementos de uma lista.
A primeira é usando colchetes simples [ ]. Neste caso o elemento selecionado
ainda será uma lista. A segunda é usando colchetes duplos [[ ]] e neste caso,
será retornado o objeto que está na posição indicada da lista. Exemplo:
> l1[2]
$B
[1] "caractere"

>
> l1[[2]]
[1] "caractere"
>
> is.character(l1[2])
[1] FALSE
>
> is.character(l1[[2]])
[1] TRUE
CAPÍTULO 2. TIPOS DE OBJETOS 18

2.6 Funções
Como já citado anteriormente, no R funções são também objetos. Estas
possuem uma lista de argumentos cujos valores, quando não padronizados,
devem ser informados pelo usuário (input). O retorno (output) fornecido
pelas funções pode ser um objeto de qualquer classe, ou um valor de qualquer
natureza ( caracter, numérico, etc). No R, a maioria das funções são escritas
com a própria linguagem R. Para estas, é possível visualizar seu conteúdo
digitando o nome da função desejada, por exemplo:
> matrix
function (data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)
{
data <- as.vector(data)
if (missing(nrow))
nrow <- ceiling(length(data)/ncol)
else if (missing(ncol))
ncol <- ceiling(length(data)/nrow)
.Internal(matrix(data, nrow, ncol, byrow, dimnames))
}
<environment: namespace:base>
No caso das funções que não são escritas em linguagem R3 , como é o caso de
min, max, lines etc, não é possível visualizar o conteúdo diretamente. Para
estas, é preciso examinar os arquivos do código fonte do R. Podemos obter
ajuda sobre qualquer função do R utilizando o símbolo "?". Por exemplo,
para obter informações sobre a função matrix, basta digitar ?matrix e o
help do R será disponibilizado. No R, é possível criar funções (isto será visto
mais adiante) e também modicar as funções escritas em linguagem R já
existentes. Para isto, basta utilizar o comando: fix(nome_da_função), que
cria um novo "script" com o conteúdo da função desejada pronta para edição.

2.7 Importação de dados


Como foi visto nas subseções anteriores, no R a entrada de dados pode ser
feita diretamente na forma de vetores, matrizes, etc. No entanto, é possível
obter dados externos provenientes de outros programas. Vejamos então como
fazer isso.
3 Em geral as funções são escritas em linguagem C
CAPÍTULO 2. TIPOS DE OBJETOS 19

2.7.1 A função read.table()


Esta função permite importar dados nos formatos txt (AscII) e csv (separado
por vírgulas). Sua sintaxe é descrita abaixo:
read.table(file, header = FALSE, sep = "",dec=".", ...)
Aqui as reticências foram colocadas para indicar que há mais argumentos
nesta função. Os demais argumentos podem ser vistos acessando a ajuda do
R usando o comando: ?read.table. Abaixo estão descritos os principais
argumentos da função read.table.
• file: é onde deve ser informado o diretório onde está gravado o ar-
quivo, também o nome e a extensão do mesmo (txt ou csv), tudo entre
aspas. Aconselha-se ao usuário denir um único diretório de trabalho
onde devem estar gravados todos os arquivos a serem importados. Para
denir um diretório padrão, basta seguir os seguintes passos: no con-
sole, vá até a barra de menus e clique sequencialmente em Arquivo e
Mudar dir... (mudar diretório). Após isso, aparecerá uma caixa de
diálogo pedindo para informar o diretório desejado. Se isso for feito,
então basta informar o nome do arquivo com a extensão, pois o R já
irá procurá-lo no diretório que foi denido. Também podemos ler um
arquivo diretamente da internet para isso, ao invés de um diretório,
informaremos agora a URL onde está o arquivo.
• header: Se igual a TRUE a primeira linha do banco do dados será as-
sumida como rótulo das variáveis. Se igual a FALSE os dados serão lidos
a partir da primeira linha.
• sep: Informa ao R qual o separador de campos e valores que está sendo
usado no arquivo a ser importado. Para arquivos csv é usado ponto e
vírgula (;).
• dec: Informa ao R qual o separador de decimais que está sendo usado
no arquivo. O default do R é dec=. portanto se no banco de dados
a ser importado estiver sendo usado outro separador de decimais, este
deverá ser informado aqui.
Exemplos:

1. Importando um banco de dados no formato txt, com rótulos


na primeira linha e com vírgula como separador de decimais.
CAPÍTULO 2. TIPOS DE OBJETOS 20

> read.table("E:/Monitoria/Aula de R/consumo diário de proteína.txt"


,header=T,dec=",")

pais Carne Porco_aves Ovos Leite Peixe Cereais


1 Albânia 10.1 1.4 0.5 8.9 0.2 42.3
2 Áustria 8.9 14.0 4.3 19.9 2.1 28.0
3 Bélgica_Luxemb. 13.5 9.3 4.1 17.5 4.5 26.6

Aqui vemos o comando usado para a importação e abaixo estão as três


primeiras linhas e sete primeiras colunas do banco de dados. Note que
aqui estamos informando o caminho que deve ser seguido para encontrar
o arquivo, se já tivéssemos denido um diretório padrão, bastaria fazer:

> read.table("consumo diário de proteína.txt",header=T,dec=",")

Para obter o mesmo resultado.

2. Importando um banco de dados em formato csv, com rótulos


na primeira linha, sem casas decimais e com diretório padrão
denido
> read.table("dados - livro aberto-fechado.csv",header=T,sep=";")

mec.f vet.f alg.a ana.a est.a


1 77 82 67 67 81
2 63 78 80 70 81
3 75 73 71 66 81

Em arquivos csv, os campos são separados por ponto e vírgula, por isso
a necessidade de fazer sep=; como visto no comando acima.

3. Importando um banco de dados txt diretamente da Internet

read.table("http://www.ime.usp.br/~pam/D-IBV")
CAPÍTULO 2. TIPOS DE OBJETOS 21

2.7.2 Importando planilhas do Microsoft Excel (Arquivos


xls)
É muito comum o uso de planilhas eletrônicas para confecção de banco de
dados. Por isso imagina-se que a maioria dos usuários de R possua seus
bancos de dados em formato xls. É claro que estes arquivos podem ser con-
vertidos em formato txt ou csv (que é uma das opções de formato do Excel) e
trazidos para o R usando a função read.table() conforme visto na subseção
anterior. Porém, pode ser mais cômodo para o usuário trabalhar diretamente
com seus arquivos xls, sem precisar gerar outros. Para importar arquivos em
formato xls é preciso, primeiramente, baixar o pacote RODBC. Suponha que
desejamos importar os dados que estão em um arquivo chamado Planilha.xls
na aba Plan1. Então devemos usar o seguinte grupo de comandos:
require(RODBC)
xlscon=odbcConnectExcel("Planilha.xls")
dados1=sqlFetch(xlscon, "Plan1")
odbcClose(xlscon)

dados1
Na primeira linha de comandos estamos fazendo a requisição do pacote RODBC
usando a função require(). Após isso criamos o objeto xlscon usando
a função odbcConnectExcel, que abre a conexão do R com o Excel. Na
terceira linha de comandos estamos criando o objeto dados1, que receberá
os dados desejados. Para isso é utilizada a função sqlFecth que recebe como
argumentos o objeto xlscon e o nome da planilha onde estão os dados (no
caso Plan1). Na quarta linha de comandos, usamos a função odbcClose, que
é usada para fechar a conexão com o Excel. E por último pedimos para o R
ler o conteúdo do objeto dados1 que irá conter o banco de dados desejado.
Capítulo 3
Estatística Descritiva
No R, temos um grande número de funções para a análise descritiva de da-
dos. Resumos estatísticos, bem como distribuições de frequências, cálculo de
correlações etc, são facilmente obtidos com o uso dos comandos adequados.
Além disso, tem-se aqui um vasto ferramental para a representação gráca
de dados. As rotinas grácas de R, são um dos principais atrativos desse
software, por conta da grande exibilidade e versatilidade que estas oferecem
ao usuário. Portanto, antes de prosseguirmos com a análise descritiva de
dados iremos apresentar as principais funções grácas disponíveis no R, uma
vez que doravante neste texto, estas serão bastante utilizadas.

3.1 Rotinas Grácas


Os comandos para criação de grácos podem ser agrupados em três catego-
rias:
• Funções grácas de alto nível, que criam novos grácos na janela grá-
ca, denindo os eixos, etiquetas, títulos, etc.
• Funções de baixo nível, que permitem adicionar novas informações a
grácos já criados, tal como novos dados, linhas, etiquetas.
• Funções grácas interativas, que permitem adicionar ou remover intera-
tivamente informação aos grácos existentes, utilizando um dispositivo
apontador, como por exemplo o mouse.

3.1.1 Funções grácas de alto nível


Este tipo de função gráca gera um gráco a partir dos dados que são infor-
mados como argumento para a função. A principal função dessa categoria

22
CAPÍTULO 3. ESTATÍSTICA DESCRITIVA 23

é a função plot() cuja descrição é: plot(x,y,...): x e y são vetores de


dados e as reticências indica que podem ser incluídos mais parâmetros (ver
mais adiante os argumentos da função par).

3.1.2 Funções grácas de baixo nível


Algumas vezes pode acontecer das funções grácas de alto nível não pro-
duzirem exatamente o gráco pretendido. Neste caso, os comandos de baixo
nível podem ser usados para adicionar alguma informação adicional ( tal
como pontos, linhas ou texto) ao gráco atual. As funções de baixo nível
mais usadas são descritas abaixo: points(x,y)
lines(x,y) Acrescenta pontos ou linhas ao gráco atual.
text(x,y, etiquetas,...): Acrescenta texto aos pontos (x, y). Geral-
mente, etiquetas é um vetor de valores inteiros ou de caracteres.
abline(a,b)
abline(h=y)
abline(v=x)
O primeiro comando acrescenta uma reta com declive b e ordenada na origem
a ao gráco atual. A opção h = y representa uma linha à altura y ; a opção
v = x representa uma linha vertical no ponto de abcissa x.

3.1.3 Funções grácas interativas


São funções que permitem extrair ou adicionar informação a um gráco uti-
lizando o mouse. A principal delas é a função locator():
locator(n,type): Permite ao usuário selecionar regiões do gráco usando
o botão esquerdo do mouse até que se tenha selecionado um máximo de n
(por default, n=512) pontos, ou até pressionar o botão direito para terminar
a seleção.

3.2 Parâmetros grácos. A função par()


A função par() é usada para modicar, de forma permanente, a lista dos
parâmetros grácos do dispositivo gráco atual. A maioria dos parâmetros
da função par() podem ser usadas diretamente como parâmetros adicionais
das funções grácas. Isso permite alterar apenas uma rotina gráca especí-
ca (alteração provisória). Vamos então descrever a função par().

A função par possui a seguinte sintaxe:


CAPÍTULO 3. ESTATÍSTICA DESCRITIVA 24

par(<nome do argumento >=<valor >, no.readonly=FALSE)

Segue abaixo a descrição de seus argumentos:


• no.readonly: Argumento lógico. Se especicado igual a TRUE e não
houver outros argumentos na função, então será retornado uma lista
com os parâmetros grácos que poderam ser ajustados em uma chamada
subsequente de "par".
• adj: O valor de adj determina a forma que o texto (Strings) será
justicados.
1. 0 para justicar o texto à esquerda
2. 0,5 para centralizar o texto
3. 1 para justicar o texto à direita
é permitido também qualquer valor no intervalo [0,1] e em muitos dis-
positivos também funcionam valores fora deste intervalo. Para a função
text temos a seguinte forma: adj=c(x, y) onde x e y determinam, res-
pectivamente, a justicação e a direção do texto.
• ann: Argumento lógico. Se especicado FALSE então, para funções
grácas de alto nível, os rótulos dos eixos são retirados.
• ask: Argumento lógico. Se TRUE solicita ao usuário um input antes
que uma nova gura seja plotada.
• bg: Especica a cor a ser usada no fundo dos grácos. Ver mais adiante
a especicação das cores.
• bty: Uma cadeia de caracteres que determina o tipo de caixa que será
traçada ao redor dos grácos. Se for especicado um dos seguintes
caracteres (entre aspas): "o", "l", "7", "c", "u", "]", a caixa resultante
se assemelha-rá a forma da correspondente letra maiúscula. O valor
"n"(entre aspas) suprime a caixa.
• cex: Valor numérico que dene a scala do texto e dos símbolos grácos
em relação ao valor padrão.
• cex.axis: Especica a ampliação a ser utilizada para a notação sobre
os eixos em relação ao valor atual.
• cex.lab: Especica a ampliação a ser usada nos títulos dos eixos x e
y em relação ao valor atual.
CAPÍTULO 3. ESTATÍSTICA DESCRITIVA 25

• cex.main: Especica a ampliação a ser usada nos títulos principais dos


grácos em relação ao valor atual.
• cex.sub: Especica a ampliação a ser usada nos subtítulos em relação
ao valor atual.
• cin: R.O.; Tamanho do caractere (largura, altura) em polegadas.

• col: Para especicar as cores dos símbolos a serem plotados. As


cores podem ser especicadas das seguintes formas: con uma cadeia
de caracteres dando o nome da cor (em inglês) entre aspas, por exem-
plo "blue". Uma lista de possíveis cores pode ser obtida com a função
colors. Outra maneira de especicar cores é em termos de compo-
nentes RGB com uma cadeia da forma "#RRGGBB"onde cada um
dos pares RR, GG, BB consiste em dígitos hexadecimais com valores na
faixa 00 a FF. As cores também podem ser especicadas por um índice
de uma pequena tabela de cores que é compatível com S. Também as
funções rgb, hsv, gray e rainbow proporcionam formas adicionais
de gerar cores.
• col.axis: Usado para especicar a cor das notações sobre os eixos

• col.lab: Usado para especicar a cor a ser usada nos títulos dos eixos
X"e "Y".
• col.main: Cor a ser usada nos títulos principais dos grácos.

• col.sub: Cor a ser usada nos subtítulos.

• cra: R.O.; Tamanho do caractere (largura, altura) em "pixels".

• crt: Um valor numérico para especicar em graus como devem ser


rotacionados os caracteres individuais. Devem ser usados apenas val-
ores múltiplos de 90.
• csi: R.O.; Especica a altura em polegadas dos caracteres.

• cxy: R.O.; Retorna um vetor do tipo (largura, altura) com o tamanho


padrão dos caracteres do gráco.
• din: R.O.; Dimensões do dispositivo em polegadas.

• err: (Não implementado; R não avisa quando pontos fora da região


gráca não são plotados.) Para o grau de relatório de erro desejado.
CAPÍTULO 3. ESTATÍSTICA DESCRITIVA 26

• fg: Especica a cor a ser usada no primeiro plano dos grácos. Esta é a
cor padrão usada em objetos como eixos e caixas ao redor dos grácos.
• fig: Um vetor numérico da forma c(x1, x2, y1, y2) que dá as coorde-
nadas da região da gura na região de apresentação do dispositivo.
• fin: Um vetor numérico da forma c(x, y) que especica o tamanho da
região da gura em polegadas.
• font: Um número inteiro que especica a fonte a ser usada no texto,
de modo que:
- 1 corresponde a texto simples
- 2 corresponde a texto em negrito
- 3 corresponde a texto em itálico e
- 4 corresponde a texto em itálico-negrito
• font.axis: Usado para especicar o tipo de letra a ser utilizada nas
notações sobre os eixos.
• font.lab: Usado para especicar o tipo de letra a ser usada nos títulos
dos eixos.
• font.main: Tipo de letra a ser usada nos títulos principais dos grácos.

• font.sub: Especica o tipo de fonte a ser usada nos subtítulos dos


grácos.
• gamma: Para a correção gamma, ver hsv(...,gamma) mas adiante.

• lab: Um vetor numérico da forma c(x, y, len), o qual modica a forma


de notação dos eixos. Os valores de x e y especicam o número aprox-
imado de marcas de escala nos eixos x e y, respectivamente, len es-
pecica o tamanho das notações sobre os eixos, no entanto, atualmente
ainda não está implementado. O valor padrão de lab é c(5, 5, 7).
• las: Um número em {0,1,2,3} com o qual se especica o estilo da
notação dos eixos:
- 0: sempre paralelo ao eixo (valor padrão);
- 1: sempre horizontal;
- 2: sempre perpendicular ao eixo;
CAPÍTULO 3. ESTATÍSTICA DESCRITIVA 27

- 3: sempre vertical. Note que a rotação de cadeias de caracteres ou


de caracteres individuais ( via par(srt=...)) não afeta os rótulos
dos eixos.
• lty: Usado para especicar o tipo de linha. Os tipos são especicados
com um número inteiro
• lwd: Um número inteiro para determinar a largura da linha. o valor
padrão é 1.
• mai: Um vetor numérico da forma c(abaixo, esquerda, acima, direita)
que dá os tamanhos das margens especicados em polegadas.
• mar: Um vetor numérico da forma c(abaixo, esquerda, acima, dire-
ita) a partir do qual especicamos o número de linhas entre as mar-
gens do dispositivo gráco e as margens da gura. O valor padrão é
c(5,4,4,2)+0.1.
• mex: Possui a mesma nalidade do argumento mar (expandir ou con-
trair a gura) a diferença e que ao invés de um vetor, usa-se um único
valor numérico. Para um bom funcionamento deste argumento use
valores no intervalo (0, 3].
• mfcol, mfrow: Um vetor da forma c(nl, nc). As guras seguintes
apareceram em um único dispositivo gráco como se fossem elementos
de uma matriz nl × nc, ordenadas por coluna (se for utilizado mfcol)
ou por linha (se for utilizado mfrow). Alternativas a este argumento
são as funções layout(...) e split.screen(...).
• mfg: Um vetor numérico da forma c(i, j) onde i e j indicam qual
gura (considerando cada gura como um elemento de uma matriz) será
plotada em continuação a última plotagem. A matriz de guras deve ser
previamente ajustada por par(mfcol=c(...)) ou par(mfrow=c(...)).
• mgp: Um vetor da forma c(t, n, e) especicando a distância ( em unidades
"mex") dos títulos dos eixos, notações dos eixos e eixos, respectiva-
mente, à margem da gura. O valor padrão é c(3, 1, 0).
• mkh: Especica a altura em polegadas dos símbolos a serem plotados
quando o valor de pch é um inteiro. Atualmente este é completamente
ignorado.
• new: Argumento lógico. O valor padrão é FALSE, se for especicado
como TRUE o comando gráco de alto nível seguinte não limpará a
janela atual, sobrepondo a nova gura à gura anterior.
CAPÍTULO 3. ESTATÍSTICA DESCRITIVA 28

• oma: Um vetor da forma c(abaixo, esquerda, acima, direita) que dá o


tamanho das margens exteriores em linhas de texto.
• omd: Um vetor da forma c(x1,x2,y1,y2) usado para especicar outras
margens a região interna da gura em NDC (normalized device coor-
dinates), isto é, como fração (em [0,1]) da região do dispositivo gráco.
• omi: Um vetor da forma c(abaixo, esquerda, acima, direita)para es-
pecicar o tamanho das margens exteriores em polegadas.
• pch: Pode ser um número inteiro ou um caractere a ser usado como
padrão em grácos de pontos. Possíveis valores de pch são especicados
no documento de ajuda da função points.
• pin: Especica as dimensões do gráco atual (largura, altura), em
polegadas.
• plt: Um vetor da forma c(x1, x2, y1, y2) que dá as coordenadas da
região gráca como fração da região da gura atual.
• ps: Um inteiro que determina o tamanho das notações e títulos dos
eixos.
• pty: Um caractere entre aspas para especicar o tipo de região gráca
a ser usada:
- "S"gera uma região gráca quadrada;
- "m"gera uma região gráca máxima.
• smo: (não-implementada) Rotação em graus de uma cadeia de cara-
cteres.
• tck: Usado para especicar a longitude dos marcadores de escala como
uma fração do menor valor entre a largura e altura da região gráca.
Se tck=1, serão inseridas linhas de grade no gráco. O valor padrão é
tck=NA e este é equivalente a tcl=-0.5.
• tcl: A longitude dos marcadores de escala como uma fração da altura
de uma linha de texto. O valor padrão é −0.5.
• type: Um caractere entre aspas que determina o tipo de gráco a ser
plotado. Possíveis valores deste argumento estão descritos no docu-
mento de ajuda da função plot.
CAPÍTULO 3. ESTATÍSTICA DESCRITIVA 29

• usr: Um vetor da forma c(x1, x2, y1, y2) que dá os extremos das co-
ordenadas da região gráca. Quando uma escala logarítmica estiver
sendo usada, então o x-limite será

10 ^ par("usr")[1:2]

. Do mesmo modo para o eixo y .


• xaxp: Um vetor da forma c(x1, x2, n) que determina as coordenadas
dos marcadores de escala e o número de intervalos entre estes no eixo
x.

• xaxs: O estilo de cálculo de intervalo de eixo para o eixo x. Seus


possíveis (entre aspas) são:
- "r", regular,

Observações:
1. Argumentos R.O (Read-only) são usados apenas para consultas.
2. Os seguinte argumentos juntamente com os argumentos do tipo R.O,
só podem ser ajustados com a chamada de par():
• "ask",
• "g","n",
• "lheight",
• "mai", "mar", "mex", "mfcol", "mfrow", "mfg",
• "new",
• "oma", "omd", "omi",
• "pin", "plt", "ps", "pty",
• "usr",
• "xlog", "ylog"

3.3 Descrevendo um conjunto de dados


Para iniciar a descrição de um conjunto de dados é fundamental sabermos
quais são os tipos de variáveis disponíveis. As variáveis são classicadas do
seguinte modo:
CAPÍTULO 3. ESTATÍSTICA DESCRITIVA 30

• quantitativas
- discretas
- contínuas
• qualitativas
- ordinais
- nominais
Em nosso estudo vamos considerar os dados da Tabela 1, que são oriundos
de uma pesquisa antropométrica realizada com mulheres acima de 60 anos
(Pinheiro et.al, 2008).
Pela Tabela 1 podemos ver que dispomos de variáveis qualitativas, como
é o caso de "Categoria", e também de variáveis quantitativas, é o caso de
"Idade". Caso se queira entrar com os dados diretamente no R, o objeto
adequado ao armazenamento é um data-frame. O usuário pode digitar os
dados usando o editor do R, que é semelhante a uma planilha eletrônica.
Segue então os comandos necessários:
PA=edit(data.frame())
Aqui estamos denido o objeto PA que é o data-frame contendo os dados.
Após digitado, se houver necessidade de alguma alteração nos dados isso
pode ser feito usando a função fix() do seguinte modo:
fix(PA)
Precisamos também do comando attach(PA) para trabalharmos com as co-
lunas do objeto como variáveis. Vamos examinar então as seis primeiras
linhas do objeto PA:
> PA[1:6,]
Categoria Idade Peso Altura IMC Classe_IMC Cintura Quadril RCQ Closse
1 Ativa 61 58.2 154 24.5 normal 87 109 0.80 MR
2 Sedentária 69 63.0 152 27.3 sobrepeso 89 104 0.86 GR
3 Sedentária 61 70.1 158 28.1 sobrepeso 106 123 0.86 GR
4 Sedentária 71 73.2 156 30.1 sobrepeso 110 122 0.90 GR
5 Ativa 63 58.6 152 25.4 sobrepeso 99 121 0.82 MR
6 Sedentária 71 77.0 160 30.1 sobrepeso 125 132 0.95 GR

Note que trocamos os nomes das variáveis, isso porque espaços não são cara-
cteres válidos para nomear objetos, e além disso, um objeto com o nome de
Altura(cm), por exemplo, seria entendido como função. As variáveis qualita-
tivas devem ser do tipo fator. Devemos então redenir estas variáveis usando
a função factor(). Por exemplo, para a variável Categoria temos:
CAPÍTULO 3. ESTATÍSTICA DESCRITIVA 31

Tabela 3.1: Pesquisa antropométrica realizada em mulheres idosas acima de


60 anos que receberam atendimento no Hospital do Idoso em Dezembro de
2008
Categoria Idade Peso Altura IMC Classe Cintura Quadril RCQ Classe RCQ
(Kg) (cm) IMC (cm) (cm) KCQ
Ativa 61 58,2 154,0 24,5 normal 87 109 0,80 MR
Sedentária 69 63,0 152,0 27,3 sobrepeso 89 104 0,86 GR
Sedentária 61 70,1 158,0 28,1 sobrepeso 106 123 0,86 GR
Sedentária 71 73,2 156,0 30,1 sobrepeso 110 122 0,90 GR
Ativa 63 58,6 152,0 25,4 sobrepeso 99 121 0,82 MR
Sedentária 71 77,0 160,0 30,1 sobrepeso 125 132 0,95 GR
Sedentária 72 76,2 165,0 28 sobrepeso 115 125 0,92 GR
Sedentária 68 59,8 160,0 23,4 normal 85 103 0,83 MR
Ativa 66 64,3 155,0 26,8 sobrepeso 100 120 0,83 MR
Sedentária 69 52,1 151,0 22,8 normal 74 83 0,89 GR
Sedentária 72 62,0 156,0 25,5 sobrepeso 90 111 0,81 MR
Sedentária 67 52,1 151,0 22,8 normal 76 90 0,84 MR
Sedentária 63 58,0 157,0 23,5 normal 80 102 0,78 MR
Sedentária 66 55,0 154,0 23,2 normal 78 96 0,81 MR
Sedentária 63 50,1 157,0 20,3 normal 72 81 0,89 GR
Ativa 63 57,9 160,0 22,6 normal 78 90 0,87 GR
Ativa 67 56,2 152,0 24,3 normal 76 95 0,80 MR
Ativa 71 68,6 159,0 27,1 sobrepeso 106 117 0,91 GR
Ativa 63 51,0 150,0 22,7 normal 71 83 0,86 GR
Ativa 60 53,4 150,0 23,7 normal 76 89 0,85 MR
Ativa 69 61,3 154,0 25,8 sobrepeso 89 106 0,84 MR
Ativa 64 53,2 158,0 21,3 normal 73 86 0,85 MR
Ativa 63 54,6 150,0 24,3 normal 80 108 0,74 PR
Ativa 66 56,2 152,0 24,3 normal 84 110 0,76 PR
Ativa 71 60,3 156,0 24,8 normal 82 99 0,83 MR
Ativa 64 54,7 158,0 21,9 normal 76 95 0,80 MR
Ativa 70 60,0 160,0 23,4 normal 81 104 0,78 MR
Ativa 63 51,3 154,0 21,6 normal 76 89 0,85 MR
Ativa 66 50,0 153,0 21,4 normal 76 87 0,87 GR
Ativa 64 49,8 150,0 22,1 normal 72 106 0,68 PR
Ativa 69 55,2 156,0 22,7 normal 81 98 0,83 MR
Ativa 69 58,2 160,0 22,7 normal 78 90 0,87 GR
Sedentária 64 51,6 156,5 21,1 normal 76 87 0,87 GR
Sedentária 63 62,7 153,0 26,8 sobrepeso 90 103 0,87 GR
Sedentária 72 75,6 165,0 27,8 sobrepeso 98 110 0,89 GR
Sedentária 73 65,2 154,0 27,5 sobrepeso 96 110 0,87 GR
Sedentária 68 61,8 152,0 26,7 sobrepeso 82 93 0,88 GR
Sedentária 71 64,3 150,0 28,6 sobrepeso 78 89 0,88 GR
Sedentária 72 59,2 153,0 25,3 sobrepeso 73 82 0,89 GR
Ativa 69 63,4 163,0 23,9 normal 93 120 0,78 MR
Sedentária 68 66,0 160,0 25,8 sobrepeso 90 117 0,77 PR
Sedentária 68 61,7 158,0 24,7 normal 90 116 0,78 MR
Sedentária 73 68,2 155,0 28,4 sobrepeso 107 120 0,89 GR
Sedentária 79 60,1 160,0 23,5 normal 92 110 0,84 MR
CAPÍTULO 3. ESTATÍSTICA DESCRITIVA 32

> Categoria=factor(Categoria)
> Categoria[1:10]
[1] Ativa Sedentária Sedentária Sedentária Ativa Sedentária
[7] Sedentária Sedentária Ativa Sedentária
Levels: Ativa Sedentária
O mesmo deve ser feito para as demais variáveis qualitativas. Poderíamos
também entrar com estes dados através da importação de um arquivo ex-
terno, como foi visto na subseção 2.2. Neste caso, não há necessidade de
redenir as variáveis qualitativas como fator, pois as funções de importação
de dados já o fazem automaticamente, desde que os valores destas sejam
caracteres.

3.3.1 Descrição Univariada


Consiste em classicar, apresentar (através de grácos e/ou tabelas) e resumir
(através de medidas) cada uma das variáveis em estudo de forma individual.
Vejamos agora as principais representações e medidas para cada tipo de va-
riável.

Variável qualitativa
Vamos escolher a variável Categoria para ilustração. Podemos obter uma
tabela de frequências simples e relativas, um gráco de setores ou de colunas e
a "moda"como medida resumo. As frequências simples e relativas são obtidas
da seguinte forma:
> Cat.freq=table(Categoria)
> Cat.freq
Categoria
Ativa Sedentária
22 23
>Cat.prop=prop.table(Cat.freq)
>Cat.prop
Categoria
Ativa Sedentária
0.4888889 0.5111111
Se quisermos o percentual basta fazer:
> Cat.perc=100*Cat.prop
> Cat.perc
CAPÍTULO 3. ESTATÍSTICA DESCRITIVA 33

Categoria
Ativa Sedentária
48.88889 51.11111
Uma das maneiras de se obter a moda é utilizando a função Mode() do pacote
"prettyR".
> #Carregar pacote
> require(prettyR)
> Cat.mo=Mode(Categoria)
> Cat.mo
[1] "Sedentária"
Neste mesmo pacote há uma função que nos permite obter todas as infor-
mações acima com um único comando. Vejamos:
> describe.factor(Categoria)
Factor
Ativa Sedentária
x 22 23
Percent 48.89 51.11
mode = Sedentária Valid n = 45
Onde os valores de x são as frequências simples, Percent retorna os per-
centuais e mode a moda. Vamos obter agora um gráco de barras e um em
setores.
> barplot(Cat.freq)
> barplot(Cat.freq,col="blue",space=0.8,ylab="número de mulheres",ylim=c(0,25))

O resultado é exibido nas guras 2 e 3. Note que no segundo comando


trocamos a cor das colunas, aumentamos o espaço entre estas, adicionamos
um título ao eixo y e aumentamos o seu limite. Vamos agora gerar um gráco
de setores.
> pie(Cat.freq)
> text(locator(2),c("48,89%","51,11%"),font=2)
Veja que usamos a função de baixo nível text() combinada com a função
interativa locator() para poder inserir os percentuais em cada setor do grá-
co.
CAPÍTULO 3. ESTATÍSTICA DESCRITIVA 34

Figura 3.1: Gráco de barras Figura 3.2: Gráco de barras


para a variável Categoria com para a variável Categoria com
padrão do R alguns ajustes

Variável quantitativa discreta


Para este tipo de variáveis temos uma maior variedade de representações
grácas e também de medidas resumo. Vamos tomar então a variável Idade
como exemplo. Podemos, da mesma forma que zemos para as variáveis
qualitativas, obter tabelas de frequências absoluta e relativas.
> Ida.freq=table(Idade)
> Ida.freq
Idade
60 61 63 64 66 67 68 69 70 71 72 73 79
2 2 8 4 4 2 4 6 1 5 4 2 1
> Ida.prop=prop.table(Ida.freq)
> Ida.prop
Idade
60 61 63 64 66 67
0.04444444 0.04444444 0.17777778 0.08888889 0.08888889 0.04444444
68 69 70 71 72 73
0.08888889 0.13333333 0.02222222 0.11111111 0.08888889 0.04444444
79
0.02222222
> Ida.perc=100*Ida.prop
> Ida.perc
Idade
CAPÍTULO 3. ESTATÍSTICA DESCRITIVA 35

Figura 3.3: Gráco em setores para a variável Categoria

60 61 63 64 66 67 68
4.444444 4.444444 17.777778 8.888889 8.888889 4.444444 8.888889
69 70 71 72 73 79
13.333333 2.222222 11.111111 8.888889 4.444444 2.222222
Podemos obter várias medidas resumo para esta variável, abaixo segue algu-
mas delas. Para os coecientes de assimetria e curtose é necessário instalar
o pacote agricolae:
> #Média
> Ida.media=mean(Idade);Ida.media
[1] 67.2
> #Mediana
> Ida.mediana=median(Idade);Ida.mediana
[1] 68
> #Moda
> Ida.mo=Mode(Idade);Ida.mo
[1] "63"
> #Decis
> Ida.decis=quantile(Idade,probs = seq(0, 1, 0.1));Ida.decis
0% 10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
60 63 63 64 66 68 69 69 71 72 79
> #Quartis
CAPÍTULO 3. ESTATÍSTICA DESCRITIVA 36

> Ida.quartis=quantile(Idade,probs = seq(0, 1, 0.25));Ida.quartis


0% 25% 50% 75% 100%
60 63 68 71 79
> #Os dez primeiros percentis
> Ida.percentis=quantile(Idade,probs = seq(0, 1, 0.01))
> Ida.percentis[1:10]
0% 1% 2% 3% 4% 5% 6% 7% 8% 9%
60.00 60.00 60.00 60.32 60.76 61.00 61.00 61.16 62.04 62.92
> #Variância
> Ida.var=var(Idade);Ida.var
[1] 17.48182
> #Desvio-padrão
> Ida.dp=sd(Idade);Ida.dp
[1] 4.181126
> #Distância interquartil
> Ida.dq=Ida.quartis[4]-Ida.quartis[2];Ida.dq
75%
8
> #Desvio médio
> Ida.dm=sum(abs(Idade-mean(Idade)))/length(Idade);Ida.dm
[1] 3.484444
> #Coeficiente de variação
> Ida.cv=Ida.dp/Ida.media;Ida.cv
[1] 0.06221914
> #Assimetria
> require(agricolae)
> Ida.ass=skewness(Idade);Ida.ass
[1] 0.2782522
> # Distribuição assimétrica à direita
> #Curtose
> Ida.cur=kurtosis(Idade);Ida.cur
[1] -0.1312109
> #Distribuição leptocúrtica
As frequências absolutas de uma variável discreta podem ser representada
gracamente da seguinte forma:
>plot(Ida.freq,ylab="número de mulheres")
Uma outra representação é através de um gráco boxplot :
>boxplot(Idade,ylab="Idade")
CAPÍTULO 3. ESTATÍSTICA DESCRITIVA 37

Podemos obter algumas medidas de uma só vez utilizando a função summary().


> summary(Idade)
Min. 1st Qu. Median Mean 3rd Qu. Max.
60.0 63.0 68.0 67.2 71.0 79.0

Figura 3.4: Gráco de frequências absolutas da variável Idade

Figura 3.5: Gráco Boxplot da variável Idade


CAPÍTULO 3. ESTATÍSTICA DESCRITIVA 38

Variável quantitativa contínua


Para obtermos representações semelhantes às anteriores neste tipo de vari-
ável, devemos inicialmente dividi-las em classes de tamanhos iguais. Desta
forma, ao invés de termos uma tabela de frequências simples ou relativas
para cada valor observado, teremos as frequências para cada classe. No R,
podemos denir classes em uma variável usando a função cut(). Vamos en-
tão, primeiramente, examinar esta função:
Sintaxe:
cut(x,breaks,...), onde:
x é a variável que se deseja separar e breaks é um vetor contendo os pon-
tos de cortes. Esses pontos de cortes irão corresponder aos limites inferior
e superior de cada classe. Uma maneira simples de denir o vetor breaks é
utilizando a função seq(), por exemplo, para a variável Peso:
> seq(min(Peso),max(Peso),l=8)
[1] 49.80000 53.68571 57.57143 61.45714 65.34286 69.22857 73.11429 77.00000
Ou seja, estamos separando a variável Peso em 8 partes, vejamos como ca
então a tabela de frequências simples.
> Peso.freq=table(cut(Peso,seq(min(Peso),max(Peso),l=8)))
> Peso.prop=prop.table(Peso.freq)
> Peso.perc=100*Peso.prop
> Peso.df=data.frame(Peso.freq,Peso.prop,Peso.perc)
> Peso.cl=Peso.df[,-c(3,5)]
> colnames(Peso.cl)=c("Peso","Freq simples","Freq relativa","Percentual")
> Peso.cl
Peso Freq simples Freq relativa Percentual
1 (49.8,53.7] 9 0.20454545 20.454545
2 (53.7,57.6] 6 0.13636364 13.636364
3 (57.6,61.5] 12 0.27272727 27.272727
4 (61.5,65.3] 9 0.20454545 20.454545
5 (65.3,69.2] 3 0.06818182 6.818182
6 (69.2,73.1] 1 0.02272727 2.272727
7 (73.1,77] 4 0.09090909 9.090909
Veja que aqui já concatenamos em uma mesma tabela as frequências simples,
relativa e os percentuais. As medidas resumo não diferem daquelas mostradas
para o caso discreto. Vejamos então:
> #Média
> peso.media=mean(Peso);peso.media
CAPÍTULO 3. ESTATÍSTICA DESCRITIVA 39

[1] 59.99111
> #Mediana
> peso.mediana=median(Peso);peso.mediana
[1] 59.2
> #Moda
> peso.mo=Mode(Peso);peso.mo
[1] "58.2"
> #Decis
> peso.decis=quantile(Peso,probs = seq(0, 1, 0.1));peso.decis
0% 10% 20% 30% 40% 50% 60% 70% 80% 90% 100%
49.80 51.42 53.36 55.40 58.12 59.20 60.70 62.56 64.48 69.50 77.00
> #Quartis
> peso.quartis=quantile(Peso,probs = seq(0, 1, 0.25));peso.quartis
0% 25% 50% 75% 100%
49.8 54.7 59.2 63.4 77.0
> #Os dez primeiros percentis
> peso.percentis=quantile(Peso,probs = seq(0, 1, 0.01))
> peso.percentis[1:10]
0% 1% 2% 3% 4% 5% 6% 7% 8% 9%
49.800 49.888 49.976 50.032 50.076 50.280 50.676 51.024 51.156 51.288
> #Variância
> peso.var=var(Peso);peso.var
[1] 51.15674
> #Desvio-padrão
> peso.dp=sd(Peso);peso.dp
[1] 7.152394
> #Distância interquartil
> peso.dq=peso.quartis[4]-peso.quartis[2];peso.dq
75%
8.7
> #Desvio médio
> peso.dm=sum(abs(Peso-mean(Peso)))/length(Peso);peso.dm
[1] 5.563852
> #Coeficiente de variação
> peso.cv=peso.dp/peso.media;peso.cv
[1] 0.1192242
> #Assimetria
> require(agricolae)
> peso.ass=skewness(Peso);peso.ass
[1] 0.7067071
> # Distribuição assimétrica à direita
CAPÍTULO 3. ESTATÍSTICA DESCRITIVA 40

> #Curtose
> peso.cur=kurtosis(Peso);peso.cur
[1] 0.05477938
> #Distribuição leptocúrtica
> summary(Peso)
Min. 1st Qu. Median Mean 3rd Qu. Max.
49.80 54.70 59.20 59.99 63.40 77.00
A representação gráca é feita especicamente, através de histogramas que é
um gráco de colunas contíguas, com bases proporcionais aos intervalos das
classes e a área de cada retângulo proporcional à respectiva frequência. No
R, usamos a função hist(), para gerar um histograma. Vejamos então o
relativo à variável Peso.
> hist(Peso,ylab="Frequência",main="")

Figura 3.6: Histograma da variável Peso

Outra forma de representarmos variáveis contínuas é através do diagrama


Ramos-e-Folhas. A função utilizada é stem(). Por exemplo, um Ramo-e-
Folha para a variável IMC é obtido da seguinte forma:
CAPÍTULO 3. ESTATÍSTICA DESCRITIVA 41

> stem(IMC)

The decimal point is at the |

20 | 3
21 | 13469
22 | 1677788
23 | 24455799
24 | 333578
25 | 34588
26 | 788
27 | 1358
28 | 0146
29 |
30 | 11

3.3.2 Descrição Bivariada


Frequentemente estamos interessados em analisar o comportamento conjunto
de duas ou mais variáveis, no intuito de encontrar possíveis relações entre
estas. Assim como foi visto no caso univariado, as técnicas de análise de-
penderão dos tipos de variáveis envolvidas. Considerando duas variáveis,
podemos ter as seguintes situações:
(a) as duas variáveis são qualitativas;
(b) as duas variáveis são quantitativas; e
(c) uma variável é qualitativa e outra é quantitativa.

Qualitativa vs Qualitativa
Neste caso a representação tabular será feita por meio de uma tabela de
dupla entrada onde cada elemento desta representa a frequência observada
das realizações simultâneas das duas variáveis em estudo. Vamos tomar como
exemplo as variáveis Categoria e Classe IMC. Como vimos no caso univariado
a tabela de frequências absolutas é dada pela função table():
> cat.cimc.tab=table(Categoria,Classe_IMC);cat.cimc.tab
Classe_IMC
Categoria normal sobrepeso
Ativa 18 4
Sedentária 9 14
CAPÍTULO 3. ESTATÍSTICA DESCRITIVA 42

No caso de frequências relativas, existem três possibilidades de expressarmos


a proporção de cada casela:
(a) em relação ao total geral;
(b) em relação ao total de cada linha;
(c) ou em relação ao total de cada coluna.
Vejamos então como obter essas três representações:
> #Prop. em relação ao total geral
>
> cat.cimc.tab/sum(cat.cimc.tab)
Classe_IMC
Categoria normal sobrepeso
Ativa 0.40000000 0.08888889
Sedentária 0.20000000 0.31111111
>
> #Prop. em relação ao total de cada linha
>
> prop.table(cat.cimc.tab,mar=1)
Classe_IMC
Categoria normal sobrepeso
Ativa 0.8181818 0.1818182
Sedentária 0.3913043 0.6086957
>
> #Prop. em relação ao total de cada coluna
>
> prop.table(cat.cimc.tab,mar=2)
Classe_IMC
Categoria normal sobrepeso
Ativa 0.6666667 0.2222222
Sedentária 0.3333333 0.7777778
Primeiro dividimos cada elemento da tabela pelo total geral, obtendo assim a
primeira representação. Note que para obtermos as proporções com relação às
linhas e colunas, foi utilizado o argumento mar=1 e mar=2, respectivamente.
A representação gráca pode ser feita através de grácos de barras como
ilustra a gura 7.
> barplot(cat.cimc.tab,legend=T)
> barplot(cat.cimc.tab,legend=T,beside=T)
CAPÍTULO 3. ESTATÍSTICA DESCRITIVA 43

Figura 3.7: Grácos do cruzamento entre as variáveis Categoria e Classe IMC

A associação entre duas variáveis qualitativas é avaliada através da estatística


chi-quadrado dada por:
k
X (oi − ei )2
χ2 =
i=1
ei
onde oi e ei são, respectivamente, frequências observadas e esperadas nas k
posições da tabela de dupla entrada. Outras medidas derivadas desta são o
coeciente de contingência C e o coeciente de contingência modicado T :
s
χ2 C
C= , T =
χ2 + n [(t − 1)/t]2

onde n é o número de observações e t é o mínimo entre linhas e colunas da


tabela. Vamos ver então como obter estas medidas.
> #Teste de associação
> summary(cat.cimc.tab)
Number of cases in table: 45
Number of factors: 2
Test for independence of all factors:
Chisq = 8.538, df = 1, p-value = 0.003479
> #Vendo os valores de summary(cat.cimc.tab)
> names(summary(cat.cimc.tab))
[1] "n.vars" "n.cases" "statistic" "parameter" "approx.ok" "p.value"
[7] "call"
CAPÍTULO 3. ESTATÍSTICA DESCRITIVA 44

> #Estatística qui-quadrado


> est.chi=summary(cat.cimc.tab)$stat;est.chi
[1] 8.53755
> #Coeficiente de contingência
> n=summary(cat.cimc.tab)$n.ca;n
[1] 45
> C=sqrt(est.chi/(est.chi+n));C
[1] 0.399335
> #Coeficiente de contigência modificado
> t=min(dim(cat.cimc.tab));t
[1] 2
> T=C/((t-1)/t)^2;T
[1] 1.59734

Quantitativa vs Qualitativa
Nesta situação é comum analisarmos como se comporta a variável quantita-
tiva em cada nível da variável qualitativa. Vamos tomar então as variáveis
RCQ e Classe_RCQ para exemplicar este conceito. Inicialmente iremos obter
uma tabela de frequências simples, para isso vamos agrupar a variável RCQ
em três classes:
> #Separando a variável RCQ
> RCQ.cl=cut(RCQ,seq(min(RCQ),max(RCQ),l=4))
> #Obtendo a tabela de frequência simples
> RCQ.CRCQ.tb=table(Classe_RCQ,RCQ.cl);RCQ.CRCQ.tb
RCQ.cl
Classe_RCQ (0.68,0.77] (0.77,0.86] (0.86,0.95]
GR 0 3 17
MR 0 20 0
PR 4 0 0
As tabelas de frequências relativas são obtidas da seguinte forma:
> RCQ.CRCQ.tb/sum(RCQ.CRCQ.tb)
RCQ.cl
Classe_RCQ (0.68,0.77] (0.77,0.86] (0.86,0.95]
GR 0.00000000 0.06818182 0.38636364
MR 0.00000000 0.45454545 0.00000000
PR 0.09090909 0.00000000 0.00000000
CAPÍTULO 3. ESTATÍSTICA DESCRITIVA 45

> prop.table(RCQ.CRCQ.tb,mar=1)
RCQ.cl
Classe_RCQ (0.68,0.77] (0.77,0.86] (0.86,0.95]
GR 0.00 0.15 0.85
MR 0.00 1.00 0.00
RCQ.cl
Classe_RCQ (0.68,0.77] (0.77,0.86] (0.86,0.95]
GR 0.0000000 0.1304348 1.0000000
MR 0.0000000 0.8695652 0.0000000
PR 1.0000000 0.0000000 0.0000000

Uma possível representação gráca deste cruzamento seria um boxplot onde


no eixo y teremos a variável quantitativa, no caso, RCQ e no eixo x os níveis
da variável qualitativa, no caso, Classe_RCQ.
> boxplot(RCQ~Classe_RCQ,ylab="RCQ",xlab="Classe RCQ")

Figura 3.8: RCQ explicada por Classe RCQ

Podemos obter todos medidas descritivas vistas anteriormente, no entanto,


iremos resumir a variável quantitativa em cada nível da variável qualitativa.
No R, isso pode ser feito utilizando a função tapply():
> #Médias
> tapply(RCQ,Classe_RCQ,mean)
GR MR PR
0.8845 0.8175 0.7380
CAPÍTULO 3. ESTATÍSTICA DESCRITIVA 46

> #Medianas
> tapply(RCQ,Classe_RCQ,median)
GR MR PR
0.880 0.825 0.740
> #Quantis
> tapply(RCQ,Classe_RCQ,quantile)
$GR
0% 25% 50% 75% 100%
0.86 0.87 0.88 0.89 0.95

$MR
0% 25% 50% 75% 100%
0.780 0.800 0.825 0.840 0.850

$PR
0% 25% 50% 75% 100%
0.68 0.74 0.74 0.76 0.77

> #Variâncias
> tapply(RCQ,Classe_RCQ,var)
GR MR PR
0.0005102632 0.0006302632 0.0012200000
> #Desvios-padrão
> tapply(RCQ,Classe_RCQ,sd)
GR MR PR
0.02258901 0.02510504 0.03492850

Quantitativa vs Quantitativa
Quando as variáveis envolvidas são ambas do tipo quantitativo, procedemos
de forma similar ao que havia sendo feito. Para obter uma tabela de fre-
quências, por exemplo, devemos agrupar as variáveis em classes. Vejamos
um exemplo utilizando as variáveis Peso e IMC. Vamos inicialmente agrupar
cada uma em duas classes.
> #Agrupando as var. em duas classes
> peso.cl=cut(Peso,seq(min(Peso),max(Peso),l=3))
> IMC.cl=cut(IMC,seq(min(IMC),max(IMC),l=3))
> #Frequências simples
> pe.imc.tb=table(peso.cl,IMC.cl);pe.imc.tb
IMC.cl
CAPÍTULO 3. ESTATÍSTICA DESCRITIVA 47

peso.cl (20.3,25.2] (25.2,30.1]


(49.8,63.4] 25 7
(63.4,77] 0 11
As tabelas com de frequências relativas são obtidas da mesma que obtivemos
para os casos anteriores. Recomenda-se ao leitor fazê-lo como exercício. Um
dispositivo muito útil para representar e se vericar a associação entre duas
variáveis quantitativas é o gráco de dispersão. Vejamos um exemplo:
> plot(Peso,IMC)

Figura 3.9: Gráco de dispersão Peso vs IMC

Para quanticar a correlação entre duas variáveis quantitativas devemos usar


algum coeciente de correlação. A função cor() oferece três opções de coe-
cientes, tendo como padrão o coeciente de correlação linear de Pearson.
> #Coeficiente de correlação de Pearson
> cor(Peso,IMC)
[1] 0.8983048
> #Coeficiente de correlação de Kendall
> cor(Peso,IMC,method="kendall")
[1] 0.7414632
> #Coeficiente de correlação de Spearman
> cor(Peso,IMC,method="spearman")
[1] 0.9019382
CAPÍTULO 3. ESTATÍSTICA DESCRITIVA 48

3.3.3 Alguns grácos mais elaborados


Em complemento ao que foi feito nas subseções anteriores, exploraremos mais
um pouco os recursos grácos. Iremos acrescentar mais algumas informações
aos grácos mostrados anteriormente.

Gráco de setores com sombra: Vamos gerar o mesmo gráco de setores


feito anteriormente, agora com um efeito de sombra.
> #Definir a função pizza.sombra
> pizza.sombra=function (...) {
+ pie(...)
+ #criando a região que dará o efeito de sombra
+ op=par(new=T)
+ a=seq(0,2*pi,length=100)
+ for (i in (256:64)/256) {
+ r=0.8-0.1*(1-i)
+ polygon(0.1+r*cos(a), -0.2+r*sin(a), border=NA, col=rgb(i,i,i))
+ }
+ par(new=T)
+ pie(...)
+ par(op)
+ }
> #Aplicando à variável Categoria
> pizza.sombra(Cat.freq)

Gráco de dispersão com boxplots marginais


Neste gráco, além de visualizar o comportamento conjunto das variáveis,
visualizamos também o comportamento individual através dos boxplots.
> op=par()
> #Criar a divisão desejada para o dispositivo
> layout( matrix( c(2,1,0,3), 2, 2, byrow=T ),
+ c(1,6), c(4,1),
+ )
> #Definir as margens da primeira figura
> par(mar=c(1,1,5,2))
> #Gerar o gráfico de dispersão
> plot(Peso~IMC,
+ xlab='', ylab='',
+ las = 1)
CAPÍTULO 3. ESTATÍSTICA DESCRITIVA 49

> #Definir as margens da segunda figura


> par(mar=c(1,2,5,1))
> #Plotar o boxplot marginal no eixo y
> boxplot(Peso, axes=F,border=4)
> title(ylab='Peso (Kg)', line=0)
> #Definir as margens da terceira figura
> par(mar=c(5,1,1,2))
> #Plotar o boxplot marginal no eixo y
> boxplot(IMC, horizontal=T, axes=F,border=4)
> title(xlab='IMC (Kg/m2)', line=1)
>
> par(op)

Gráco de dispersão com histogramas marginais


Neste gráco ao invés de acrescentarmos boxplots nas margens da gura,
vamos acrescentar histogramas.
> #Definir os histogramas marginais
> xhist=hist(IMC,plot=F)
> yhist=hist(Peso,plot=F)
>
> top <- max(c(xhist$counts, yhist$counts))
> b<-matrix(c(2,0,1,3),2,2,byrow=TRUE)
>
> #Criar a divisão desejada para o dispositivo
>
> nf <- layout(b, widths=c(3,1), heights=c(1,3), respect=TRUE)
>
> #Definir as margens da primeira figura
>
> par(mar=c(4,4,1,1))
>
> #Plotar o gráfico de dispersão
>
> plot(Peso,IMC)
>
> #Definir as margens da segunda figura
>
> par(mar=c(0,4,1,1))
>
> #Plotar o histograma marginal no eixo x
CAPÍTULO 3. ESTATÍSTICA DESCRITIVA 50

> barplot(xhist$counts,axes=FALSE, ylim=c(0, top), space=0,


+ col=1, density=20, angle=-45)
>
> #Definir as margens da terceira figura
>
> par(mar=c(4,0,1,1))
>
> #Plotar o histograma marginal no eixo y
>
> barplot(yhist$counts, axes=FALSE, xlim=c(0, top),space=0,
+ col=1, density=20, angle=-45,horiz=TRUE)

Figura 3.10: Gráco em setores com efeito de sombra


CAPÍTULO 3. ESTATÍSTICA DESCRITIVA 51

Figura 3.11: Gráco de dispersão com boxplots marginais

Figura 3.12: Gráco de dispersão com histogramas marginais


CAPÍTULO 3. ESTATÍSTICA DESCRITIVA 52

Note que, nos histogramas marginais acrescentamos linhas como preenchi-


mento. Isso foi feito utilizando o argumento density que dene o número de
linhas a serem plotadas e angle, que dene o anglo de inclinação das linhas.
Capítulo 4
Probabilidade e Inferência
O objetivo deste capítulo é mostrar de que forma podemos utilizar o R para
trabalhar com distribuições de probabilidade, gerar amostras aleatórias, es-
timar parâmetros de uma população, etc. É conveniente, antes de iniciarmos
este estudo, aprendermos como denir nossas próprias funções. Note que, na
subseção 3.3.3 já utilizamos este recurso. Falaremos também sobre ordens de
controle, já que estas são habitualmente usadas na construção de funções.

4.1 Controle de uxo e denição de funções


Assim como em qualquer outra linguagem de programação, a linguagem R
possui várias instruções destinadas a alterar a sequência normal de execução
dos comandos. Vejamos então algumas.

4.1.1 Execução condicional


Instruções condicionais permitem ao usuário executar várias alternativas de-
pendendo se uma condição for satisfeita. A forma da instrução condicional
é a seguinte:

if (expres_1) expres_2 else expres_3

onde o resultado de expres_1 deve ser um valor lógico; se este é verdadeiro(T ou


TRUE), é calculada a expressão expres_2; caso contrário, e se a instrução
contém a expressão else, será executada a expressão expres_3. Essas ex-
pressões geralmente são construídas com o uso de operadores. Abaixo pode-
mos ver a descrição dos operadores básicos da linguagem R.

53
CAPÍTULO 4. PROBABILIDADE E INFERÊNCIA 54

1. Operadores Lógicos:
• ! : Indica negação
• & e && : Indica o argumento lógico (AND ou E). O primeiro se
aplica a todos os elementos de um vetor, e o segundo aplica-se a
vetores de comprimento unitário.
• | e || : Indica o argumento lógico (OR ou OU).

2. Operadores Relacionais:
• < : Menor
• > : Maior
• <= : Menor igual
• >= : Maior igual
• == : Igual
• != : Diferente

3. Operadores Aritméticos
• + : Soma
• - : Diferença
• * : Produto
• / : Divisão
• x%%y : Indica o resto da divisão de x por y
• x %/% y : Indica a divisão inteira de x por y
• %*% : Multiplicação matricial
• %x% : Produto de Kronecker

4.1.2 Ciclos
Ciclos no R são implementados com as ordens for(), repeat() e while().
Os ciclos do tipo for são da seguinte forma:

> for (nome in expres_1) expres_2

onde nome representa uma variável de controle das interações; expres_1 é


um vetor (geralmente uma sequência do tipo 1 : n, em que n é um número
natural), e expres_2 é uma expressão, frequentemente agrupada, em cujas
CAPÍTULO 4. PROBABILIDADE E INFERÊNCIA 55

sub-expressões pode aparecer a variável de controle; esta expressão é cal-


culada repetidamente à medida que a variável de controle nome percorre os
valores da expres_1. O exemplo a seguir ilustra este procedimento.
> a=c(1,2,3,4)
> b=c(5,6,7,8)
> c=numeric(length(a))
> for(i in 1:4){
+ c[i]=a[i]+b[i]
+ }
>
> c
[1] 6 8 10 12
Aqui o for é utilizado para percorrer os vetores a e b somando cada um de
seus elementos e criando assim o vetor c. Outras estruturas de ciclos são:
> repeat expressão
e
> while (condição) expressão

Vamos repetir o exemplo anterior utilizando while


> d=numeric(length(a))
> i=1
> while(i<=4){
+ d[i]=a[i]+b[i]
+ i=i+1
+ }
> d
[1] 6 8 10 12

4.1.3 Denindo funções


Como já referido neste texto, R permite a criação de objetos do tipo function,
que são funções que permitem generalizar e encapsular procedimentos, o que
torna mais simples e prática a posterior utilização destes. Desta forma, a
linguagem R ganha considerável poder e elegância. Uma função é denida
com a seguinte declaração:
> Nome_da_Função=function(arg1, arg2, ...) expressão
A nova função geralmente é chamada da seguinte forma:
CAPÍTULO 4. PROBABILIDADE E INFERÊNCIA 56

Nome_da_Função=function(arg1, arg2, ...)

e pode ser utilizada em qualquer altura do código. Vamos ilustrar o uso deste
recurso através de um exemplo simples. Neste criamos a função fatorial
que retorna o fatorial de um número natural.
> fatorial=function(n){
+ fat=1
+ {
+ if (n==0)
+ return(fat)
+ else{
+ for (i in 1:n){
+ fat=fat*(n-(n-i))
+ }
+ }
+ }
+
+ return(fat)
+ }
>
> fatorial(5)
[1] 120

4.2 Distribuições de Probabilidade


O R dispõe de uma série de funcionalidades que permitem operações com
distribuições de probabilidade. Aqui vamos resumir algumas delas, com o
objetivo de ilustrar o uso destas funções. As operações básicas com dis-
tribuições de probabilidade são: cálculo de densidade de probabilidade, cál-
culo de probabilidade acumulada, obtenção de quantis e geração de números
aleatórios. No R estas operações são representadas, respectivamente, pelas
letras: d, p, q e r. Para as funções precedidas de d e p o primeiro argumento
é sempre um quantil. Nas funções precedidas de q o primeiro argumento diz
respeito a uma probabilidade. E nos comandos precedidos de r o primeiro
argumento especica o tamanho da amostra aleatória a ser gerada. Por
exemplo, para gerar números aleatórios da distribuição exponencial devemos
usar a função rexp(), ou seja, devemos escrever o prexo da distribuição
precedido da letra que indica a operação desejada. O usuário pode consultar
a ajuda do R para ver os prexos de várias distribuições de probabilidade.
CAPÍTULO 4. PROBABILIDADE E INFERÊNCIA 57

4.2.1 Distribuição Normal


A distribuição normal é referenciada no R pelo prexo norm. Os argumen-
tos padrão das funções referentes à distribuição normal assumem a normal
padrão N (µ = 0, σ 2 = 1). Vejamos então algumas operações básicas.
> dnorm(0)
[1] 0.3989423
> pnorm(0)
[1] 0.5
> qnorm(0.5)
[1] 0
> set.seed(12)
> rnorm(10)
[1] -1.4805676 1.5771695 -0.9567445 -0.9200052 -1.9976421 -0.2722960
[7] -0.3153487 -0.6282552 -0.1064639 0.4280148
Com o primeiro comando calculamos f (0) em seguida F (0) = P (X ≤ 0).
O comando qnorm(0.5) retorna o valor de q ,tal que, P (X ≤ 0, 5) = q , o
que corresponde a mediana da distribuição. Note que antes do comando de
geração de números aleatórios, usamos a função set.seed(). Esta associa
a amostra aleatória gerada a um número (no nosso exemplo foi utilizado
12). Portanto, a mesma amostra aleatória poderá ser obtida várias vezes. Se
este não for utilizado, a cada repetição do comando de geração de números
aleatórios uma novos números seram gerados. Podemos repetir estas ope-
rações com qualquer distribuição normal, bastando para isso, dar valor aos
argumentos mu e sd, onde são especicados, respectivamente, a média e o
desvio padrão. Para ver a descrição completa dos argumentos, basta execu-
tar: ?Normal. Vejamos então para uma N (µ = 100, σ 2 = 100).
> dnorm(90,100,10)
[1] 0.02419707
> pnorm(90,100,10)
[1] 0.1586553
> qnorm(0.5,100,10)
[1] 100
> set.seed(13)
> rnorm(10,100,10)
[1] 105.54327 97.19728 117.75163 101.87320 111.42526 104.15526 112.29507
[8] 102.36680 96.34617 111.05144
Vamos ilustrar gracamente a probabilidade P (N (100, 100) ≤ 90) = 0, 159.
Isso pode ser feito utilizando a função polygon().
CAPÍTULO 4. PROBABILIDADE E INFERÊNCIA 58

> curve(dnorm(x,100,10),70,130,ylab="f (x)")


> polygon(c(60,seq(60,90,l=30),90),
+ c(0,dnorm(seq(60,90,l=30),100,10),0),density=10)

Figura 4.1: Representação gráca da P (N (100, 100) ≤ 90)

Vejamos a representação gráca de algumas funções de densidade e de dis-


tribuição da normal.
> #Funções densidade
> curve(dnorm(x,100,50),-50,250,ylab="f(x)")
> curve(dnorm(x,80,50),-50,250,ylab="f(x)",add=T,lty=2)
> curve(dnorm(x,100,80),-50,250,ylab="f(x)",add=T,lty=3)
> legend("topright",c("N(100,50)","N(80,50)","N(100,80)"),lty=1:3)
> #Funções de distribuição
> curve(pnorm(x,100,50),-50,250,ylab="F(x)")
> curve(pnorm(x,80,50),-50,250,ylab="F(x)",add=T,lty=2)
> curve(pnorm(x,100,80),-50,250,ylab="F(x)",add=T,lty=3)
> legend("topleft",c("N(100,50)","N(80,50)","N(100,80)"),lty=1:3)
As distribuições simétricas (como é o caso da distribuição normal) têm a
seguinte propriedade M d = X = M0 , ou seja, a sua mediana, média e
moda são iguais. Am de ilustrar esta propriedade vamos construir uma
função que retorne a moda de uma distribuição normal. Para encontrar o
argumento que maximiza a função usaremos a função opitmize(). Esta
examina uma função em um determinado intervalo, retornando o valor mí-
nimo ou máximo, desta. Para mais detalhes da função opitimize() execute
?opitimize. Segue então a função Moda_Normal().
CAPÍTULO 4. PROBABILIDADE E INFERÊNCIA 59

Figura 4.2: Algumas funções de densidade e funções de distribuição da dis-


tribuição Normal

> Moda_Normal=function(mu,dp){
+ fn=function(x){dnorm(x,mean=mu,sd=dp)}
+ op=optimize(fn,c(mu-3*dp,mu+3*dp),maximum=T)
+ return(round(op$maximum,1))
+ }
Esta função recebe como argumentos a média (mu) e o desvio padrão (dp) da
distribuição normal especicada. Vejamos então alguns exemplos:
> Moda_Normal(0,1)
[1] 0
> Moda_Normal(10,1)
[1] 10
> Moda_Normal(100,10)
[1] 100
> Moda_Normal(200,40)
[1] 200
Como podemos ver a moda da distribuição normal coincide com a sua média.
O leitor pode conrmar, como exercício, que os valores acima são também
as medianas destas normais.
CAPÍTULO 4. PROBABILIDADE E INFERÊNCIA 60

4.2.2 Distribuição t-Student


No R a distribuição t-Student é referenciada pelo prexo t. Para ver a des-
crição completa dos argumentos, basta executar ?TDist. Vejamos algumas
operações básicas para uma t-Student com 1 grau de liberdade.
> dt(0,1)
[1] 0.3183099
> pt(0,1)
[1] 0.5
> qt(0.5,1)
[1] 6.123032e-17
> set.seed(14)
> rt(10,1)
[1] -0.34515990 1.55183402 -0.26067314 -0.33269113 0.43430630
[6] 0.09066324 -1.79590300 -0.75266496 1.07633328 -3.11066112
O segundo argumento das funções especica o grau de liberdade da dis-
tribuição t. A distribuição t-Student se aproxima da distribuição normal
quando o grau de liberdade aumenta. Na Figura 16 ilustramos essa pro-
priedade.
#Densidades t
curve(dnorm(x),-4,4,ylab="f(x)",lty=2)
curve(dt(x,1),-4,4,add=T,col=2)
curve(dt(x,3),-4,4,add=T,col=3)
curve(dt(x,8),-4,4,add=T,col=4)
curve(dt(x,15),-4,4,add=T,col=5)
legend("topleft",c("N (0,1)","t (1)","t (3)",
"t (8)","t (15)"),col=1:5,lty=c(2,1,1,1,1))
#Funções de distribuição t
curve(pnorm(x),-4,4,ylab="F(x)",lty=2)
curve(pt(x,1),-4,4,add=T,col=2)
curve(pt(x,3),-4,4,add=T,col=3)
curve(pt(x,8),-4,4,add=T,col=4)
curve(pt(x,15),-4,4,add=T,col=5)
legend("topleft",c("N (0,1)","t (1)",
"t (3)","t (8)","t (15)"),col=1:5,lty=c(2,1,1,1,1))
Da mesma forma que foi feito para a distribuição normal, vamos implementar
uma função que retorne a moda distribuição t. Vamos chamar esta função
de Moda_t().
CAPÍTULO 4. PROBABILIDADE E INFERÊNCIA 61

Figura 4.3: Comparativo entre a distribuição t-Student e a distribuição nor-


mal

> Moda_t=function(gl){
+ fn=function(x){dt(x,df=gl)}
+ op=optimize(fn,c(-3,3),maximum=T)
+ return(round(op$maximum,1))
+ }
>
> Moda_t(1)
[1] 0
> Moda_t(5)
[1] 0
> Moda_t(10)
[1] 0
> Moda_t(30)
[1] 0
Podemos ver que a moda da distribuição t-Student é sempre igual a zero.

4.2.3 F-Snedecor
A distribuição F-Snedecor é referenciada por f e a descrição dos seus argu-
mentos pode ser vista executando ?FDist. Vejamos então alguns exemplos.
CAPÍTULO 4. PROBABILIDADE E INFERÊNCIA 62

> df(3,1,2)
[1] 0.05163978
> pf(3,1,2)
[1] 0.7745967
> qf(0.5,1,2)
[1] 0.6666667
> set.seed(15)
> rf(10,1,2)
[1] 0.3860004526 2.4215853368 4.1941878357 0.5356487440 0.2069921455
[6] 0.4694068847 0.0003382301 2.9451130609 0.2473070646 0.3069481961
O segundo e terceiro argumentos das funções especicam os graus de liber-
dade da distribuição F. Na Figura 17 temos os grácos da função de densidade
e da função de distribuição para algumas combinações de graus de liberdade.
> #Densidades F
> curve(df(x,1,2),0,10,ylab="f(x)")
> curve(df(x,2,5),0,10,add=T,col=2)
> curve(df(x,4,5),0,10,add=T,col=3)
> curve(df(x,8,6),0,10,add=T,col=4)
> curve(df(x,15,10),0,10,add=T,col=5)
> legend("topright",c("F (1,2)","F (2,5)","F (4,5)",
+ "F (8,6)","F (15,10)"),col=1:5,lty=1)
> #Funções de distribuição F
> curve(pf(x,1,2),0,10,ylab="F(x)",ylim=c(0,1))
> curve(pf(x,2,5),0,10,add=T,col=2)
> curve(pf(x,4,5),0,10,add=T,col=3)
> curve(pf(x,8,6),0,10,add=T,col=4)
> curve(pf(x,15,10),0,10,add=T,col=5)
> legend("bottomright",c("F (1,2)","F (2,5)","F (4,5)",
+ "F (8,6)","F (15,10)"),col=1:5,lty=1)
A moda da distribuição F é obtida com a função abaixo:
> Moda_F=function(gl1,gl2){
+ ff=function(x){df(x,df1=gl1,df2=gl2)}
+ op=optimize(ff,c(0,10),maximum=T)
+ return(round(op$maximum,1))
+ }
> Moda_F(2,2)
[1] 0
> Moda_F(10,2)
CAPÍTULO 4. PROBABILIDADE E INFERÊNCIA 63

Figura 4.4: Algumas funções de densidade e de distribuição F-Snedecor

[1] 0.4
> Moda_F(8,8)
[1] 0.6
> Moda_F(16,5)
[1] 0.6
O leitor pode vericar que a moda da distribuição F-Snedecor é dada por:
gl1 − 2 gl2
para gl1 > 2
gl1 gl2 + 2

4.2.4 Distribuição Gama


A referência da distribuição gama no R é gamma. Esta distribuição pos-
sui como casos particulares a distribuição exponencial e a distribuição qui-
quadrado. Para a descrição completa dos argumentos basta executar ?GammaDist.
Segue abaixo algumas operações básicas.
> dgamma(3,3,2)
[1] 0.08923508
> pgamma(3,3,2)
[1] 0.9380312
> qgamma(0.5,3,2)
CAPÍTULO 4. PROBABILIDADE E INFERÊNCIA 64

[1] 1.337030
> set.seed(16)
> rgamma(10,3,2)
[1] 1.6550091 1.1528434 0.8909968 2.3221277 0.9071140 1.6007216
[8] 0.7543756 1.7441700 3.1368359 1.3400572
Para distribuição gama temos dois tipos de parametrização. Na primeira, que
chamaremos de parametrização 1, a sua função de densidade é a seguinte:
1 x
f (x) = xα−1 exp (− )1l(0,∞) (t)
θα Γ(α) θ

onde, o parâmetro de forma α e o parâmetro de escala θ são especicados, res-


pectivamente pelos argumentos shape e scale. Já na outra parametrização,
que chamaremos de parametrização 2, temos a seguinte função de densidade:
1
f (x) = xα−1 exp (−βx)1l(0,∞) (t)
θα Γ(α)

onde, β = 1/θ é especicado pelo parâmetro rate. Alguns grácos da função


de densidade da distribuição gama para os dois tipos de parametrização po-
dem ser vistos na Figura 18.
> curve(dgamma(x,shape=1,scale=2),0,20,ylab="f (x)",
+ main="Parametrização 1")
> curve(dgamma(x,shape=2,scale=2),0,20,add=T,col=2)
> curve(dgamma(x,shape=5,scale=1),0,20,add=T,col=3)
> curve(dgamma(x,shape=9,scale=0.5),0,20,add=T,col=4)
> legend("topright",c("exp (1)","G (2, 1)","G (5, 1)",
+ "G (9, 0.5)"),col=1:4,lty=1)
> curve(dgamma(x,shape=1,rate=2),0,6,ylab="f (x)",
+ main="Parametrização 2")
> curve(dgamma(x,shape=2,rate=2),0,6,add=T,col=2)
> curve(dgamma(x,shape=5,rate=1),0,6,add=T,col=3)
> curve(dgamma(x,shape=9,rate=0.5),0,6,add=T,col=4)
> legend("topright",c("exp (1)","G (2, 1)","G (5, 1)",
+ "G (9, 0.5)"),col=1:4,lty=1)
CAPÍTULO 4. PROBABILIDADE E INFERÊNCIA 65

Figura 4.5: Algumas funções de densidade da distribuição Gama

Note que uma distribuição Gama(1, 2) corresponde a uma exp(1). Uma vari-
ável aleatória com distribuição Gama(k/2, 1/2) é também uma distribuição
Qui-quadrado com k graus de liberdade (Notação: χ2(k) ). Na Figura 19 ilus-
tramos gracamente esta propriedade para uma Gama(3/2, 1/2), ou seja,
neste caso tem-se também uma χ2(3) .
> curve(dgamma(x,shape=(3/2),scale=2),0,20,add=F,
+ col="#BFFFBF",lwd=5,ylab="f (x)")
> curve(dchisq(x,3),0,20,add=T,lty=2)
> legend("topright",c("G (1.5, 2)",expression(chi**2*(3))),
+ col=c(1,"#BFFFBF"),lty=c(2,1))
CAPÍTULO 4. PROBABILIDADE E INFERÊNCIA 66

Figura 4.6: Função de densidade de uma χ2(3) e uma G(3/2, 1/2)

A moda da distribuição gama para a parametrização 1 e 2 é dada, respecti-


vamente, por (α − 1)θ e (α − 1)/β . Para o cálculo da moda foi construída a
função Moda_gama(). Nesta função o argumento a especica o parâmetro de
forma da gama e s, o parâmetro de escala. Além de p que especica o tipo
de parametrização a ser usada (1=parametrização 1 e 2=parametrização 2).
Vejamos então alguns exemplos:
> Moda_gama=function(a,s,p){
+ if(p==1){
+ fg=function(x){dgamma(x,shape=a,scale=s)}
+ op=optimize(fg,c(0,a+(4*s)),maximum=T)
+ return(round(op$maximum,1))
+ }
+ else{
+ fg=function(x){dgamma(x,shape=a,rate=s)}
+ op=optimize(fg,c(0,a+(4*s)),maximum=T)
+ return(round(op$maximum,1))
+ }
+ }
>
>
> Moda_gama(3,2,1)
CAPÍTULO 4. PROBABILIDADE E INFERÊNCIA 67

[1] 4
> Moda_gama(5,4,2)
[1] 1

4.2.5 Distribuição Binomial


No R a distribuição binomial é referenciada por binom. Nas funções temos o
argumento size onde devemos especicar o número de provas independentes
de Bernoulli (Bussab e Morettin, 2005) e o argumento prob onde especi-
camos a probabilidade de sucesso. Vamos ilustrar algumas operações básicas
com a distribuição binomial através da resolução de um problema extraído
de Bussab e Morettin (2005).

Exemplo: Um curso de treinamento aumenta a produtividade de uma certa


população de funcionários em 80% dos casos. Se dez funcionários quaisquer
participam desse curso, encontre a probabilidade de:
(a) exatamente sete funcionários aumentarem a produtividade;
(b) não mais do que oito funcionários aumentarem a produtividade; e
(c) pelo menos três funcionários não aumentarem a produtividade.
Solução:
Devemos calcular probabilidades de uma distribuição binomial de parâmetros
n = 10 e p = 0, 8, conforme o enunciado do problema. Temos então:

(a) > dbinom(7,10,0.8)


[1] 0.2013266
(b) > pbinom(8,10,0.8)
[1] 0.6241904
(c) > pbinom(2,10,0.2,lower.tail=F)
[1] 0.3222005
Na Figura 20 temos a representação gráca de algumas distribuições de pro-
babilidade e distribuição de probabilidade acumulada da binomial.
> #Distribuição de probabilidade
> plot(dbinom(1:40,10,0.8),ty="p",pch=16,col=2,
+ ylab="P(X=x)",xlab="x")
> points(dbinom(1:40,20,0.7),ty="p",pch=16,col=3)
> points(dbinom(1:40,40,0.5),ty="p",pch=16,col=4)
CAPÍTULO 4. PROBABILIDADE E INFERÊNCIA 68

> legend("topright",c("B(10; 0,8)","B(20; 0,7)","B(40; 0,5)"),


+ col=2:4,bty="n",pch=16)
> #Distribuição de probabilidade acumulada
> plot(pbinom(1:40,10,0.8),ty="s",pch=16,col=2,
+ ylab=expression(P(X<=x)),xlab="x")
> points(pbinom(1:40,20,0.7),ty="s",pch=16,col=3)
> points(pbinom(1:40,40,0.5),ty="s",pch=16,col=4)
> points(pbinom(1:40,10,0.8),ty="p",pch=16,col=2)
> points(pbinom(1:40,20,0.7),ty="p",pch=16,col=3)
> points(pbinom(1:40,40,0.5),ty="p",pch=16,col=4)
> legend("bottomright",c("B(10; 0,8)","B(20; 0,7)","B(40; 0,5)"),
+ col=2:4,bty="n",pch=16,lty=1)

Figura 4.7: Representação gráca da distribuição binomial


A moda da distribuição binomial é sempre dada por b(n + 1)pc, ou seja o
menor inteiro que não ultrapassa a quantidade (n+1)p. No R o menor inteiro
de um número real pode ser obtido com a função floor(). Por exemplo, a
moda de uma B(10; 0, 8) é dada por:
> floor((10+1)*0.8)
[1] 8
Deixa-se ao leitor, como exercício, construir uma função que generalize este
procedimento.
CAPÍTULO 4. PROBABILIDADE E INFERÊNCIA 69

4.2.6 Distribuição de Poisson


A distribuição de Poisson é referenciada no R pelo prexo pois. A taxa
média λ é especicada no argumento lambda. Para ver a descrição completa
dos argumentos execute ?Poisson. Vejamos então algumas operações básicas
com uma distribuição poisson de parâmetro λ = 1 (notação: P (1)).
> dpois(4,1)
[1] 0.01532831
> ppois(4,1)
[1] 0.9963402
> qpois(0.5,1)
[1] 1
> set.seed(17)
> rpois(10,1)
[1] 0 3 1 2 1 1 0 0 2 0
A Figura 21 mostra a representação gráca da distribuição de probabilidade
e distribuição de probabilidade acumulada para diferentes valores de λ
> #Distribuição de Probabilidade
> plot(dpois(0:20,1),ty="p",pch=16,ylab="P(X=x)",xlab="x")
> points(dpois(1:20,4),ty="p",pch=16,col=2)
> points(dpois(1:20,10),ty="p",pch=16,col=3)
> legend("topright",c("P(1)","P(4)","P(10)"),
+ col=1:3,bty="n",pch=16)
> #Distribuição de probabilidade acumulada
> plot(ppois(0:20,1),ty="S",pch=16,ylab=expression(P(X<=x)),
+ ylim=c(0,1),xlab="x")
> points(ppois(1:20,4),ty="s",pch=16,col=2)
> points(ppois(1:20,10),ty="s",pch=16,col=3)
> points(ppois(1:20,1),ty="p",pch=16)
> points(ppois(1:20,4),ty="p",pch=16,col=2)
> points(ppois(1:20,10),ty="p",pch=16,col=3)
> legend("bottomright",c("P(1)","P(4)","P(10)"),
+ col=1:3,bty="n",pch=16,lty=1)
A distribuição de Poisson é um caso limite da distribuição binomial quando
n → ∞ e p → 0 (Bussab e Moretim, 2005). Para ilustrar esta propriedade
vamos considerar o gráco da distribuição de probabilidade acumulada da
distribuição de Poisson comparado com a distribuição acumulada da dis-
tribuição binomial com valores crescentes de n e decrescentes de p.
CAPÍTULO 4. PROBABILIDADE E INFERÊNCIA 70

Figura 4.8: Representação gráca da distribuição Poisson

#Aproximação da Binomial pela Poisson


> plot(ppois(1:40,1),ty="s",pch=16,lwd=7,col="yellow",
+ ylab=expression(P(X<=x)),xlab="x",ylim=c(0,1))
> points(pbinom(1:40,30,0.3),ty="s",pch=16,col=3)
> points(pbinom(1:40,40,0.05),ty="s",pch=16,col=4)
> points(pbinom(1:40,100,0.05),ty="s",pch=16,col=5)
> points(pbinom(1:40,100,0.01),ty="s",pch=16,col=6)
> legend("bottomright",c("P(1)","B(30; 0,3)","B(40; 0,05)",
+ "B(100; 0,05)","B(100; 0,01)"),col=c("yellow",3,4,5,6),bty="n",lty=1)
CAPÍTULO 4. PROBABILIDADE E INFERÊNCIA 71

Figura 4.9: Aproximação da Binomial pela Poisson

A distribuição de Poisson é bimodal quando λ é inteiro e unimodal para


λ fracionário. No primeiro caso as modas são dadas, respectivamente, por:
λ − 1 e λ. No segundo caso, temos que a moda da Poisson é igual a bλc.
Vamos construir a função Moda_poisson() que retornará a(s) moda(s) da
distribuição de Poisson.
> Moda_poisson=function(l){
+ if(l==trunc(l))
+ return(list(mo1=(l-1),mo2=l))
+ else
+ return(floor(l))
+ }
>
>
> Moda_poisson(1)
$mo1
[1] 0

$mo2
[1] 1

> Moda_poisson(3.3)
CAPÍTULO 4. PROBABILIDADE E INFERÊNCIA 72

[1] 3
> Moda_poisson(5.6)
[1] 5
> Moda_poisson(10)
$mo1
[1] 9

$mo2
[1] 10
Esta função recebe como argumento o valor de λ. Inicialmente a função
verica se o λ especicado é inteiro através do teste l==trunc(l) e retorna
uma lista com as duas modas caso este seja verdadeiro. Senão a função
retornará bλc.

4.3 Inferência
Nesta seção vamos utilizar o R para obter distribuições amostrais, ilustrar
propriedades de estimadores, teoremas, etc. Além disso, mostraremos algu-
mas funções que já prontas. Por exemplo, as funções t.test() e var.test()
que serão usadas na parte de testes de hipóteses.

4.3.1 Teorema Central do Limite


Vamos começar com a ilustração deste que é um dos mais importantes re-
sultados da Estatística Matemática. O Teorema Central do Limite procura
expressar o fato de que a média aritmética de n variáveis aleatórias indepen-
dentes e identicamente distribuídas, denotada por X , tem uma distribuição
cuja forma tende para uma forma limite que não depende da distribuição das
variáveis. A seguir temos o enunciado desse teorema.
Teorema 4.3.1.1 (Teorema Central do Limite - Lindeberg and Lévy). Se-
jam X1 , X2 , . . . , Xn variáveis independentes e identicamente distribuídas que
formam uma amostra de tamanho n proveniente de uma distribuição com
média µ e variância σ 2 , 0 < σ < ∞. Então, a variável aleatória Z = σ/ X−µ

n
tem distribuição limite que é normal com média zero e variância um, isto é,
√ 
n(X − µ)
lim P ≤ z = Φ(z),
n→∞ σ
CAPÍTULO 4. PROBABILIDADE E INFERÊNCIA 73

Onde Φ(.) denota a função de distribuição de uma variável aleatória normal


padrão.
Para ilustrar este teorema vamos construímos a função TCL(). Esta função
recebe como argumentos uma função que especica a população de referên-
cia, bem como a média e desvio-padrão desta (estabelecemos
√ por padrão uma
população uniforme com média 0.5 e desvio padrão 1/ 12. Além disso, pode-
mos indicar um vetor contendo tamanhos de amostras e também o número
de amostras simuladas. Esta função retornará os histogramas da variável Z
para cada tamanho de amostra especicado. São também traçadas a curva
teórica (linha pontilhada) e densidade simulada (linha vermelha).
> TCL=function(r=runif, m=0.5, s=1/sqrt(12),n=c(1,3,10,30), N=1000,par){
+ for (i in n) {
+ x=matrix(r(i*N),nc=i)
+ x=(apply(x, 1, sum) - i*m )/(sqrt(i)*s)
+ hist(x, col='light blue', probability=T, main=paste("n =",i),
+ ylim=c(0,max(0.4, density(x)$y)))
+ lines(density(x), col='red', lwd=3)
+ curve(dnorm(x), col='blue', lwd=3, lty=3, add=T)
+ if(N>100) {
+ rug(sample(x,100))
+ } else {
+ rug(x)
+ }
+ }
+ }
Apliquemos então para algumas populações.

>#População uniforme
> op=par(mfrow=c(2,2))
> TCL()
> par(op)

>#População exponencial
> op=par(mfrow=c(2,2))
> TCL(rexp,1,1)
> par(op)
CAPÍTULO 4. PROBABILIDADE E INFERÊNCIA 74

Figura 4.10: Ilustração do TCL para amostras provenientes


√ de uma popu-
lação uniforme com média 1/2 e desvio-padrão 1/ 12

Figura 4.11: Ilustração do TCL para amostras provenientes de uma popu-


lação exponencial com média 1 e desvio-padrão 1
CAPÍTULO 4. PROBABILIDADE E INFERÊNCIA 75

Figura 4.12: Ilustração do TCL para amostras


√ provenientes de uma popu-
lação Poisson com média 2 e desvio-padrão 2

>População Poisson
> op=par(mfrow=c(2,2))
> TCL(function(n){rpois(n,2)},2,sqrt(2))
> par(op)

4.3.2 Distribuições Amostrais


Na inferência paramétrica para obtermos informações sobre parâmetros de
interesse de uma determinada população é necessário conhecermos a dis-
tribuição de seus estimadores desses parâmetros. Essas distribuições são
chamadas distribuições amostrais. Vejamos, através de exemplos, como usar
o R para obter distribuições amostrais. De forma geral, devemos seguir os
seguintes passos:
• Escolher a população de interesse e seus parâmetros;

• Determinar um número N de amostras, bem como o tamanho n destas;

• Escolher um parâmetro de interesse e obter a sua estimativa para cada


uma das N amostras simuladas. Pode-se ainda fazer um histograma
destas estimativas e vericar se este sugere algum modelo conhecido;
CAPÍTULO 4. PROBABILIDADE E INFERÊNCIA 76

• Utilizar as amostras para obter estimativas da média e da variância


populacional.
Seja então a população X ∼ N (100, 10). Vamos
Pn
considerar o parâmetro µ e
2
σ e seus respectivos estimadores X e S =
2 2 i=1 (Xi −X)
n−1
. Vamos ilustrar que
2
X ∼ N (µ, σn ) e σ2 ∼ χ2n−1 . Vamos inicialmente calcular a distribuição
2 (n−1)S

de X . Seguindo os passos acima e estabelecendo N = 10000 e n = 20 temos.


> set.seed(456)
> amos1=matrix(rnorm(10000*20, mean = 100, sd = sqrt(10)), nc = 10000)
> xbar=apply(amos1, 2, mean)
> mean(xbar)
[1] 100.0094
> var(xbar)
[1] 0.5012133
Esperamos que a média das médias amostrais seja igual a 100 e a variância
seja igual a (10/20) = 0, 5. Como vemos, as estimativas obtidas pela sim-
ulação são bem próximas do esperado. A pequena discrepância entre estes
valores é devido estarmos trabalhando com um número nito de amostras. O
leitor poderá também, ao repetir esse procedimento, obter estimativas difer-
entes dependendo do valor da semente aleatória xada. É esperado também
que a distribuição das médias amostrais sejam normalmente distribuídas. Va-
mos então completar a ilustração fazendo um histograma com curva teórica
para as médias amostrais obtidas na simulação.
> hist(xbar,prob=T,main="",ylim=c(0,0.6),ylab="Densidade")
> curve(dnorm(x,100,sqrt(10/20)),add=T)
2
Vamos agora considerar a estatística P = (n−1)S σ2
. Como visto anterior-
mente esta tem distribuição χn−1 este fato fato garante que: E(S 2 ) = σ 2 e
2
2 )2
Var(S 2 ) = 2(σ
n−1
. Ilustremos então estes resultados.
> set.seed(457)
> amos2=matrix(rnorm(10000*20, mean = 100, sd = sqrt(10)), nc = 10000)
> S2=apply(amos2,2,var)
> p=apply(amos2,2,function(x){((nrow(amos2)-1)*var(x))/10})
> mean(S2)
[1] 9.967508
> var(S2)
[1] 10.43381
> hist(p,prob=T,main="",ylab="Densidade")
> curve(dchisq(x,nrow(amos2)-1),0,50,add=T)
CAPÍTULO 4. PROBABILIDADE E INFERÊNCIA 77

Figura 4.13: Histograma com curva teórica para as médias amostrais simu-
ladas

Figura 4.14: Histograma com curva teórica para as estatísticas P obtidas das
amostras simuladas

As estimativas para a média e variância de S 2 encontradas foram E(S


b 2) ≈
9, 9675 e Var(S
d 2 ) ≈ 10, 4338 estão bem próximas dos valores teóricos E(S 2 ) =
2
10 e Var(S 2 ) = 2(10)
20−1
= 10, 5263. As distribuições das estatísticas X e
P de uma população normal são facilmente obtidas analiticamente. Por
CAPÍTULO 4. PROBABILIDADE E INFERÊNCIA 78

meio de simulação podemos investigar distribuições amostrais mais com-


plicadas de serem obtidas analiticamente. Por exemplo, a distribuição de
S/X (coeciente de variação amostral). Considerando ainda a população
X ∼ N (100, 10) vamos determinar a média e a variância da estatística
cv = S/X .
> set.seed(458)
> amos3=matrix(rnorm(10000*20, mean = 100, sd = sqrt(10)), nc = 10000)
> cv=apply(amos3,2,function(x){(sd(x)/mean(x))})
> mean(cv)
[1] 0.03122713
> var(cv)
[1] 2.589526e-05
Temos então as estimativas E(cb v ) ≈ 0, 031 e var(c
c v ) ≈ 0, 000. Tomemos
agora a população Y ∼ U [0, 10]. Vamos ilustrar a distribuição da estatística
Yn = max(Y). Sabemos que se Y possui distribuição uniforme no intervalo
[0, θ] a densidade de Yn é dada por:
n n−1
fYn (y) = y 1l(0,θ) (y) (4.1)
θn
Desta forma temos que:
nθ nθ2
E(Yn ) = e Var(Yn ) =
n+1 (n + 1)2 (n + 2)
Vamos inicialmente obter estimativas para média e variância de Yn uti-
lizando o mesmo procedimento anterior, agora considerando a população
Y ∼ U [0, 10] e tomando N = 10000 e n = 20:
> set.seed(459)
> amos4=matrix(runif(10000*20,0,10), nc = 10000)
> yn=apply(amos4,2,max)
> mean(yn)
[1] 9.525264
> var(yn)
[1] 0.2026569
Os valores teóricos obtidos através da densidade de Yn são E(Yn ) = 20×1021
=
9, 5238 e Var(Yn ) = 212 ×22 = 0, 2061. Note que as estimativas obtidas através
20×102

da simulação estão bem próximas destas. Vamos agora gerar um histograma


para os máximos obtidos nas amostras simuladas e acrescentaremos neste a
curva teórica 4.1.
CAPÍTULO 4. PROBABILIDADE E INFERÊNCIA 79

> fyn=function(x,n,theta){
+ (n/(theta^n))*(y^(n-1))
+ }
> hist(yn,prob=T,main="",ylim=c(0,2),ylab="Densidade")
> curve(fyn(x,20,10),0,10,add=T)

Figura 4.15: Histograma com curva teórica para as estatísticas Yn obtidas


das amostras simuladas

4.3.3 Estimação de máxima verossimilhança


Vamos agora utilizar o R para ilustrar o método de estimação de máxima ve-
rossimilhança. Vamos traçar curvas de verossimilhança e log-verossimilhança,
ilustrar propriedades dos estimadores de verossimilhança, etc. Considere-
mos então X1 , X2 , . . . , Xn uma amostra aleatória da distribuição Poisson de
parâmetro λ. A função de verossimilhança (L(λ)) e log-verossimilhança (l(λ))
são dadas por:

e
P
L(λ) = e−nλ λ xi
l(λ) = Σxi ln λ − nλ
CAPÍTULO 4. PROBABILIDADE E INFERÊNCIA 80

Vamos gerar uma amostra aleatória de uma poisson de parâmetro λ = 2.


Em seguida escreveremos as funções L(λ) e l(λ) e plotaremos seus grácos
indicando o ponto de máximo que corresponde a λ̂. Examine o código abaixo:
> #Verossimilhança da Poisson
> #Gerar amostra aleatória de uma P(2)
> set.seed(165)
> xnpos=rpois(20,2)
> n=length(xnpos)
> s=sum(xnpos)
> L=function(lam){(lam^s)*exp(-n*lam)}
> l=function(lam){log(lam)*s-n*lam}
> op=par(mfrow=c(1,2))
> #Gráfico da Verossimilhança
> curve(L,0,4,xlab=expression(lambda),ylab=expression(L(lambda)))
> maxL=optimize(L,c(0,4),maximum=T)[[1]]
> obL=optimize(L,c(0,4),maximum=T)[[2]]
> lines(c(maxL,maxL),c(obL,-1),lty=2)
> points(maxL,obL,pch=20)
> #Gráfico da Log-verossimilhança
> curve(l,0,10,xlab=expression(lambda),ylab=expression(l(lambda)))
> maxl=optimize(l,c(0,10),maximum=T)[[1]]
> obl=optimize(l,c(0,10),maximum=T)[[2]]
> lines(c(maxl,maxl),c(obl,-1000),lty=2)
> points(maxl,obl,pch=20)
> par(op)
De uma forma geral podemos resumir esse procedimento nos seguintes passos:
• Escolher a população de interesse e seus parâmetros;

• Escrever as funções L(λ) e l(λ);

• Encontrar o máximo destas funções utilizando a função optimize();

• Plotar os grácos indicando o ponto de máximo. Isso pode ser feito


com as funções points() e lines().
Nem sempre é possível encontrar formas fechadas para os estimadores de
máxima verossimilhança. Nesses casos, as estimativas são encontradas por
meio de métodos numéricos. No exemplo a seguir utilizaremos o método de
Newton-Rapson para obter as estimativas dos parâmetros.
CAPÍTULO 4. PROBABILIDADE E INFERÊNCIA 81

Figura 4.16: Gráco de L(λ) e l(λ) para uma amostra da população


Poisson(λ = 2)

Exemplo (Kalbeisch, 1985): k = 5 diferentes doses de um inseticida são


aplicadas sobre condições padronizadas em uma amostra de uma espécie de
inseto. Os resultados são mostrados na Tabela 2. Vamos assumir que p,
a probabilidade de que um inseto morra, é relacionada com a dose através
de um modelo logístico. Desejamos encontrar as estimativas de máxima
verossimilhança (α̂, β̂).

Tabela 4.1: Dados de um Experimento Dose-Resposta


Concentração 2,6 3,8 5,1 7,7 10,2
Log Concentração 0,96 1,34 1,63 2,04 2,32
Número de insetos ni 50 48 46 49 50
Número de mortos yi 6 16 24 42 44
Fração de mortos 0,12 0,33 0,52 0,86 0,88

Se diferentes insetos são usados com diferentes doses, os Yi0 s (número de inse-
tos mortos) serão independentes e sua densidade de probabilidade conjunta
é
5  
Y ni
f (y1 , y2 , . . . , y5 ) = pyi i (1 − pi )ni −yi
i=1
yi
CAPÍTULO 4. PROBABILIDADE E INFERÊNCIA 82

As funções de verossimilhança e log-verossimilhança são


5  y i
Y pi
L(α, β) = (1 − pi )ni
i=1
1 − p i

5  
X pi
l(α, β) = yi ln + ni ln(1 − pi )
i=1
1 − pi

Mas sabemos que pi possui uma relação logística com di , ou seja, pi =


1 − (1 + eα+βdi )−1 . Logo,

5
X
l(α, β) = [yi (α + βdi ) + ni ln(1 − pi )]
i=1

Desta obtemos o vetor escore S(α, β) e a matriz de informação I(α, β):


   
Σ(yi − µi ) Σvi Σvi di
S(α, β) = I(α, β) =
Σ(yi − µi )di Σvi di Σvi d2i

Onde µi = ni pi e vi = ni pi (1 − pi ). Vamos inicialmente entrar com os dados


da Tabela 2.
> Con=c(2.6,3.8,5.1,7.7,10.2)
> n=c(50,48,46,49,50)
> y=c(6,16,24,42,44)##número de insetos mortos(dose d_i)
> d=log(Con)
Agora para dar início ao processo iterativo precisamos de uma estimativa
inicial para os parâmetros α e β . Vamos então tomar como valores iniciais
α ≈ −5 e β ≈ 3 (Veja Kalbeisch, 1985 para mais detalhes sobre este exem-
plo). A função NR() recebe como argumentos um vetor com o valor inicial
para os parâmetros e um critério de convergência. Essa função retornará o
valor das estimativas o número de iterações até a convergência, o valor das
estimativas e o valor da log-verossimilhança.
CAPÍTULO 4. PROBABILIDADE E INFERÊNCIA 83

> # Início do processo iterativo


> NR=function(teta=c(x,y),epsilon){
+ teta=teta # Chute inicial
+ p=1 -1/(1+ exp(teta[1]+ teta[2]*d))
+ u=n*p
+ v=n*p*(1-p)
+ Steta=c(sum(y-u),sum((y-u)*d))# Vetor escore
+ Iteta=matrix(c(sum(v),sum(v*d),sum(v*d),sum(v*d^2)),ncol=2)# Informação
+ epsilon=10^{-10} # Critério de convergência
+ j=0 # de iterações
+ while (sqrt(sum((solve(Iteta)%*%Steta)^2))>epsilon){
+ teta=teta+solve(Iteta)%*%Steta
+ p=1 -1/(1+ exp(teta[1]+ teta[2]*d))
+ u=n*p
+ v=n*p*(1-p)
+ Steta=c(sum(y-u),sum((y-u)*d)) # Vetor escore
+ Iteta= matrix(c(sum(v),sum(v*d),sum(v*d),sum(v*d^2)),ncol=2)# Informação
+ logver=sum(y*(teta[1]+ teta[2]*d)+n*log(1-p))
+ j=j+1
+ }
+ cat("\t","Resultado do Processo iterativo","\n")
+ cat("No de iterações =",j,"\t","alfa esti.=",teta[1],", beta esti.=",teta[2],"\n")
+ cat("Log-verossimilhança=",logver,"\n")
+ }
>
>
> NR(c(-5,3),10^(-10))
Resultado do Processo iterativo
No de iterações = 4 alfa esti.= -4.886912 , beta esti.= 3.103545
Log-verossimilhança= -119.8942

Obteve-se então, ao nal de 4 iterações, α̂ = −4, 8869 e β̂ = 3, 1035. Por-


tanto, o modelo de dose resposta estimado é

p̂ = 1 − (1 + e−4,8869+3,1035d )−1

Podemos utilizar também a função fitdistr() da biblioteca MASS que uti-


liza o algoritmo BFGS (Broyden et.al., 1970) para estimação de parâmetros.
Considere então o seguinte exemplo:

Exemplo (Kalbeisch, 1985): Suponha que para um teste de resistência


de um componente metálico, 23 amostras(corpos de prova) foram avaliadas
resultando nos valores:
CAPÍTULO 4. PROBABILIDADE E INFERÊNCIA 84

17,88 28,92 33,00 41,52 42,12 45,60 48,48 51,84 51,96 54,12 55,56 67,80
68,64 68,64 68,88 84,12 93,12 98,64 105,12 105,84 127,92 128,04 173,40

De estudos anteriores admite-se que a resistência apresenta aproximada-


mente uma distribuição de Weibull, cuja densidade é dada por f (x; α, β) =
αβxβ−1 exp (−αxβ ), 0 < x < ∞, onde α > 0 e β > 0. Nosso objetivo é
determinar (α̂, β̂) com base na amostra observada.
Vamos então aplicar a função fitdistr().

> x<-c(17.88, 28.92, 33.00, 41.52, 42.12, 45.60, 48.48,


+ 51.84, 51.96, 54.12, 55.56, 67.80, 68.64, 68.64, 68.88,
+ 84.12, 93.12, 98.64, 105.12, 105.84, 127.92, 128.04, 173.40)
> require(MASS)
> #Estimativa dos parâmetros
> fitdistr(x,"weibull")
shape scale
2.101337 81.836799
( 0.328613) ( 8.596717)

A função fitdistr() recebe como argumentos um vetor de dados e um string


indicando a distribuição que será utilizada. Esta retorna as estimativas dos
parâmetros e seus respectivos erros-padrão (valores entre parênteses).

4.3.4 Intervalos de Conança


Intervalo para a média de uma população normal com variância
desconhecida:
Vamos considerar uma amostra de tamanho 10 de uma população N (20, 16).
Suponhamos que não conhecemos o verdadeiro valor de µ e σ 2 e desejamos
construir um intervalo com γ % de conança para a média. Vamos primeira-
mente escrever uma função que retorne este intervalo para um nível de con-
ança xado.
> IC.media=function(amos,nc=0.95){
+ xb=mean(amos4)
+ s=sd(amos4)
+ lim.inf=(xb-qt(0.5*(1+nc),length(amos4)-1)*(s/sqrt(length(amos4))))
+ lim.sup=(xb+qt(0.5*(1+nc),length(amos)-1)*(s/sqrt(length(amos))))
+ cat("\t","IC para a média de uma pop. normal com var. desconhecida","\n")
+ cat("IC a", nc*100,"%","\n")
+ ic=c(lim.inf,lim.sup)
+ names(ic)=c("lim.inf","lim.sup")
CAPÍTULO 4. PROBABILIDADE E INFERÊNCIA 85

+ ic
+ }

Note que, estabelecemos como valor padrão o nível de conança de 95%.


Vamos então aplicar utilizando 95% e 99% de conança.
> IC.media(amos4)
IC para a média de uma pop. normal com var. desconhecida
IC a 95 %
lim.inf lim.sup
16.14058 21.03455
> IC.media(amos4,nc=0.99)
IC para a média de uma pop. normal com var. desconhecida
IC a 99 %
lim.inf lim.sup
15.07220 22.10292
Estes mesmos intervalos podem ser obtidos com a função t.test() da seguinte
forma:
> t.test(amos4)$conf.int
[1] 16.14058 21.03455
attr(,"conf.level")
[1] 0.95
> t.test(amos4,conf.level=0.99)$conf.int
[1] 15.07220 22.10292
attr(,"conf.level")
[1] 0.99
Usaremos agora a função t.test() para calcular o nível de conança do
intervalo para a média de uma população normal com variância desconhecida
usando simulação. A ideia é gerar um grade numero de amostras de tamanho
n, e para cada uma delas determinar um intervalo de conança. Devemos
também contar o número de intervalos que contém a verdadeira média. A
proporção destes intervalos será o nível de conança.
> nivel.conf=function(N,n,mu,sigma){
+ cont=0
+ for(i in 1:N){
+ amo=rnorm(n,mu,sigma)
+ inter=t.test(amo)$conf.int
+ if(mu>inter[1] & mu<inter[2])
+ cont=cont+1
CAPÍTULO 4. PROBABILIDADE E INFERÊNCIA 86

+ }
+ return(cont/N)
+ }
Vamos aplicar para n = 10 e n = 30. Note que obtemos uma maior cobertura
com a maior amostra.
> set.seed(556)
> nivel.conf(N=1000,n=10,mu=20,sigma=4)
[1] 0.944
> set.seed(643)
> nivel.conf(N=1000,n=30,mu=20,sigma=4)
[1] 0.963
Podemos ilustrar gracamente o que acabamos de fazer utilizando a função
conf.int(). Esta função calcula intervalos de conança para amostras de
uma distribuição normal padrão e estes são plotados como segmentos de
reta em gráco. Neste gráco também é traçada uma linha pontilhada que
representa a verdadeira média e a taxa de cobertura (coverage rate). Vejamos
um exemplo onde utilizamos 100 amostras de tamanho 20. O gráco é visto
na Figura 4.17
> require(animation)
>
> oopt=ani.options(interval = 0.1, nmax = 100)
> set.seed(900)
> conf.int(size=20,main="Demostração de Intervalo de Confiança")
> ani.options(oopt)
Intervalos para proporção:
Da mesma forma que zemos para a média, iremos também escrever uma
função que retorne uma estimativa intervalar para uma proporção. Vamos
considerar inicialmente o intervalo assintótico.Ou seja, sabendo que:

n(p̂ − p)
p ∼ N (0, 1)
p̂(1 − p̂)

Podemos calcular,


n(p̂ − p)
P {−zα/2 ≤p ≤ zα/2 } = 1 − α
p̂(1 − p̂)
CAPÍTULO 4. PROBABILIDADE E INFERÊNCIA 87

Figura 4.17: Intervalos de conança para a média de uma normal padrão


para 100 amostras de tamanho 20

Logo,

" r #
p̂(1 − p̂)
IC(p, 1 − α) p̂ ± zα/2
n

que um intervalo assintóticoPpara


n
p e p̂ é o estimador de máxima verossimi-
lhança de p dado por: p̂ = n i=1 yi

Escrevamos então uma função que retorne este intervalo.

> IC.prop=function(amos,nc=0.95){
+ pch=sum(amos)/length(amos)
+ lim.inf=(pch-qnorm(0.5*(1+nc))*(sqrt((pch*(1-pch))/length(amos))))
+ lim.sup=(pch+qnorm(0.5*(1+nc))*(sqrt((pch*(1-pch))/length(amos))))
+ cat("\t","IC para proporção","\n")
CAPÍTULO 4. PROBABILIDADE E INFERÊNCIA 88

+ cat("IC a", nc*100,"%","\n")


+ ic=c(lim.inf,lim.sup)
+ names(ic)=c("lim.inf","lim.sup")
+ ic
+ }
Gerando uma amostra de uma população de Bernoulli com p = 0, 6 e apli-
cando a função IC.prop() obtemos os seguinte resultados:
> set.seed(7856)
> amos5=rbinom(10,1,0.6);amos5
[1] 0 1 1 0 1 1 1 1 1 1
> IC.prop(amos5)
IC para proporção
IC a 95 %
lim.inf lim.sup
0.552082 1.047918
A função binom.wilson() da biblioteca epitools retorna um intervalo para
proporção baseado na correção de Wilson (Wilson, 1927). Este é dado por:
q 2
1 2 p̂(1−p̂) z1−α/2
p̂ + z
2n 1−α/2
± z1−α/2 n
+ 4n2
1 2
1+ z
n 1−α/2

Utilizando a mesma amostra anterior vamos determinar o intervalo de Wilson


e comparar o seu comprimento com o intervalo assintótico.
> require(epitools)
> IW=binom.wilson(sum(amos5),length(amos5));IW
x n proportion lower upper conf.level
1 8 10 0.8 0.4901625 0.9433178 0.95
> #comprimento do intervalo de Wilson
> comp.W=IW$upper-IW$lower;comp.W
[1] 0.4531554
>
> IA=binom.approx(sum(amos5),length(amos5));IA
x n proportion lower upper conf.level
1 8 10 0.8 0.552082 1.047918 0.95
> #Comprimento do intervalo assintótico
> comp.A=IA$upper-IA$lower;comp.A
[1] 0.495836
Vemos que para esta amostra o intervalo de Wilson apresentou um menor
comprimento comparado com o intervalo assintótico.
CAPÍTULO 4. PROBABILIDADE E INFERÊNCIA 89

4.3.5 Testes de Hipóteses


Teste para a média de uma população normal com variância des-
conhecida:
Vamos considerar a seguinte amostra retirada de uma população suposta-
mente normal:
32,18661 29,70124 31,12365 28,71436 33,05036 32,35136 30,37871
32,51114 27,57830 31,09745
Deseja-se testar:


H0 : µ = 30
H1 : µ 6= 30

Sabendo que:

n(X − µ0 )
T = ∼ t(n−1)
S
Vamos utilizar o R como uma calculadora e realizar o teste passo a passo.
> n=length(amos6);n
[1] 10
> xb=mean(amos6);xb
[1] 29.71069
> s=sd(amos6);s
[1] 3.169497
> #Estatística do teste
> T=(sqrt(n)*(xb-30))/s;T
[1] -0.2886489
>
> #nível de significância
> alfa=0.05
>
> #t crítico
> Tt=qt(1-alfa/2,n-1);Tt
[1] 2.262157
Vamos ilustrar gracamente a região crítica do teste e também a comparação
do valor da estatística do teste com o valor crítico.
CAPÍTULO 4. PROBABILIDADE E INFERÊNCIA 90

> #Região crítica


> curve(dt(x,n-1),-4,4,ylab="f (x)")
> polygon(c(-Tt,seq(-Tt,-4,l=30),-4),
+ c(0,dt(seq(-Tt,-4,l=30),n-1),0),density=10)
> polygon(c(Tt,seq(Tt,4,l=30),4),
+ c(0,dt(seq(Tt,4,l=30),n-1),0),density=10)
> text(0,0.2,"AC. Ho",font=2)
> text(c(-3.2,3.2),c(0.05,0.05),c("Rej. Ho","Rej. Ho"),font=2)

Figura 4.18: Região crítica do teste

> #Comaparando o valor tabelado com o calculado


> curve(dt(x,n-1),-4,4,ylab="f (x)",ylim=c(-0.1,0.4),
+ bty="n",axes=F,xlab="")
> axis(1,seq(-4,4,1),pos=0)
> axis(2,seq(0,0.4,0.1),pos=-4)
> polygon(c(-Tt,seq(-Tt,-4,l=30),-4),
+ c(0,dt(seq(-Tt,-4,l=30),n-1),0),density=10)
> polygon(c(Tt,seq(Tt,4,l=30),4),
+ c(0,dt(seq(Tt,4,l=30),n-1),0),density=10)
> text(0,0.2,"AC. Ho",font=2)
> text(c(-3.2,3.2),c(0.05,0.05),c("Rej. Ho","Rej. Ho"),font=2)
CAPÍTULO 4. PROBABILIDADE E INFERÊNCIA 91

> text(T,-0.1,"Tcal = -0,91",font=1)


> arrows(T,-0.085,T,0,lwd=2)

Figura 4.19: Marcando o valor da Estatística do teste

> #nível descritivo do teste (valor p)


> vp=2*pt(T,n-1);vp

Pelo exposto, vemos que não há evidências contra a hipótese de que a média
populacional é igual a 30, ao nível de signicância de 5%. Podemos obter
todos os resultados acima utilizando a função t.test().
#utilizando uma função do R
> t.test(amos6,mu=30)

One Sample t-test

data: amos6
t = -0.3239, df = 9, p-value = 0.7534
alternative hypothesis: true mean is not equal to 30
95 percent confidence interval:
27.63575 31.77196
sample estimates:
mean of x
CAPÍTULO 4. PROBABILIDADE E INFERÊNCIA 92

29.70386

Seja a população N (10, 4). Supondo desconhecida a verdadeira média desta


população, desejamos testar:

H0 : µ = 10
H1 : µ 6= 10
Chama-se poder do teste a probabilidade de se rejeitar a hipótese H0 dado
um valor qualquer de µ, especicado ou não pela hipótese alternativa, e será
denotado por φ(µ). Para um µ especicado o poder do teste é dado por:
   
X −µ X −µ
P Z > zα/2 + √ + P Z > zα/2 + √
σ/ n σ/ n
Tomando valores em torno de µ = 10 e com base na expressão acima vamos
calcular o desse teste para diferentes tamanhos de amostra.
> #poder do teste
> set.seed(89081)
> amos7=rnorm(9,10,4)
> #valores alternativos para média
> mus=seq(7,13,0.1)
>
> # poder do teste para n=9
> pt1=pnorm(1.96+((mean(amos7)-mus)/sqrt(4/9)),lower.tail=F)+pnorm(-1.96+((mean(amos7)-mus)/sqrt(4/9)))
> #poder do teste para n=20
> pt2=pnorm(1.96+((mean(amos7)-mus)/sqrt(4/20)),lower.tail=F)+pnorm(-1.96+((mean(amos7)-mus)/sqrt(4/20)))
> #poder do teste para n=30
> pt3=pnorm(1.96+((mean(amos7)-mus)/sqrt(4/30)),lower.tail=F)+pnorm(-1.96+((mean(amos7)-mus)/sqrt(4/30)))
>
> #plotando em um único gráfico
> plot(pt1,ty="l",ylab=expression(pi(mu)))
> points(pt2,ty="l",col=2)
> points(pt3,ty="l",col=3)
> legend("bottomleft",c("n=9","n=20","n=30"),col=1:3,lty=1,bty="n")
CAPÍTULO 4. PROBABILIDADE E INFERÊNCIA 93

Figura 4.20: Gráco do poder do teste

As principais funções do R para realizar testes paramétricos estão resumidas


na Tabela 3.

Tabela 4.2: Principais funções do R para realizar testes de hipóteses


Comparação de médias de populações normais
1 média t.test(x,...)
2 médias t.test(x,y,...)
2 médias (populações dependentes) t.test(x,y,paried=T)
2 médias com variâncias iguais t.test(x,y,var.equal=T)
Teste para proporções prop.test()
Comparação de variâncias var.test()
CAPÍTULO 4. PROBABILIDADE E INFERÊNCIA 94

.1 Apêndice Software R no Curso de Estatís-


tica da UFC
Há uma série de funções e bibliotecas que são constantemente usadas em dis-
ciplinas do curso de estatística da UFC. A pagina ocial do R http://www.r-project.org/
disponibiliza para download uma série de bibliotecas com as mais variadas
nalidades. A tabela abaixo traz um resumo das principais bibliotecas e
funções utilizadas no curso supracitado.

Tabela 3: Principais bibliotecas e funções do R usadas nas disciplinas do


curso de estatística da UFC
Disciplina Bibliotecas do R Principais funções Finalidade
summary(), hist(), Resumos estatísticos, histogramas,
Estatística Descritiva stats table() Tabelas de frequências
pie(), barplot() Gráco em setores e em colunas
prettyR∗ Mode() Moda de um conjunto de dados
pnorm(), rnorm() Obter probabilidades e números
Probabilidade e stats pbinom(), rbinom() aleatórios das distribuições normal
Inferência e binomial
t.test() Realiza o teste t de Student
Métodos Não- stats shapiro.test() Teste de normalidade
Paramétricos wilcox.test() Comparação de 2 grupos
epitools∗ binom.exact() Intervalos para proporção
lm() Ajustar um modelo de regressão
Análise de linear
Regressão stats anova() Análise de variância
residuals() Resíduos
predict() Valores preditos
aov() Ajuste do modelo
Planejamento de stats bartlett.test() Teste de homogeneidade
Experimentos TukeyHSD() Teste de Tukey
MASS boxcox() Transformação boxcox
Controle estatístico qcc∗ qcc() Grácos de controle
da Qualidade
factanal() Análise fatorial
stats princomp() Componentes principais
Análise Multivariada hclust() Análise de agrupamento
MASS lda() Análise discriminante linear
energy∗ mvnorm.etest() Teste de normalidade
Multivariada
chisq.test() Testes de
fisher.test() associação
Biometria stats mantelhaen.test() Teste Cochran-Mantel-Haenszel
glm() Regressão logística
ts() Denir a série
Séries filter() Filtros lineares
Temporáis stats acf() Correlograma
arima() Ajusta modelos autoregressivos
tsdiag() Diagnóstico do ajuste
(*): Estas bibliotecas não fazem parte do conjunto de bibliotecas padrão do R, e devem ser instaladas
posteriormente.
Referências Bibliográcas
[1] Bussab, W. de O. e Morettin, P. A. (2003). Estatística Básica. 5ª ed.
São Paulo: Editora Saraiva.
[2] Pinheiro J. I. D. et al. (2008). Estatística básica: A arte de trabalhar
com dados. 1 ed. Rio de Janeiro: Campus.
[3] James, B. R. (1981). Probabilidade: Um Curso em Nível Intermediário.
Projeto Euclides, Impa, Rio de Janeiro.
[4] Kalbeisch, J. G. (1985). Probability and Statistical Inference, 2d edition.
Springer-Verlag, New York.
[5] R Development Core Team (2005). R: A language and environment for
statistical computing. R Foundation for Statistical Computing, Vienna,
Austria, URL http://www.R-project.org.
[6] Wilson, E. B. (1927). Probable inference, the law of succession, and
statistical inference. Journal of the American Statistical Association 22:
209-212.

95

You might also like