Professional Documents
Culture Documents
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
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
CAPÍTULO 1. INTRODUÇÃO 5
teclas.
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
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
[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
> 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
> 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
> 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.
> 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
> 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:
, , 2
[2,] 11 14 17
[3,] 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.
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.
read.table("http://www.ime.usp.br/~pam/D-IBV")
CAPÍTULO 2. TIPOS DE OBJETOS 21
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.
22
CAPÍTULO 3. ESTATÍSTICA DESCRITIVA 23
• 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.
• 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.
• 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]
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"
• 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
> 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.
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))
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
[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="")
> stem(IMC)
20 | 3
21 | 13469
22 | 1677788
23 | 24455799
24 | 333578
25 | 34588
26 | 788
27 | 1358
28 | 0146
29 |
30 | 11
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
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
> #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
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:
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
> 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
> 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
[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
[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)
θα Γ(α) θ
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
[1] 4
> Moda_gama(5,4,2)
[1] 1
$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.
>#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
>População Poisson
> op=par(mfrow=c(2,2))
> TCL(function(n){rpois(n,2)},2,sqrt(2))
> par(op)
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
> 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)
e
P
L(λ) = e−nλ λ xi
l(λ) = Σxi ln λ − nλ
CAPÍTULO 4. PROBABILIDADE E INFERÊNCIA 80
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
5
X pi
l(α, β) = yi ln + ni ln(1 − pi )
i=1
1 − pi
5
X
l(α, β) = [yi (α + βdi ) + ni ln(1 − pi )]
i=1
p̂ = 1 − (1 + e−4,8869+3,1035d )−1
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
+ ic
+ }
+ }
+ 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
Logo,
" r #
p̂(1 − p̂)
IC(p, 1 − α) p̂ ± zα/2
n
> 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
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
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)
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
95