Escolar Documentos
Profissional Documentos
Cultura Documentos
∗
Luı́s Ramos
2 de Novembro de 2018
Resumo
O R é um software para tratamento estatı́stico de distribuição gratuita. Pode ser
instalado em windows, MacOS e em várias distribuições do sistema UNIX. Pretende-se
com este manual fornecer um guia que permita uma fácil integração com o software
R na disciplina de Estatı́stica Aplicada.
1 Introdução
O software R é uma aplicação de distribuição gratuita que permite fazer análises es-
tatı́sticas de dados. Este texto, ainda em construção, constitui um guia para a disciplina de
Estatı́stica Aplicada. A página principal do projecto é http://www.r-project.org. O pro-
grama e alguns manuais podem ser descarregados da página http://neacm.fe.up.pt/CRAN.
1.2 Ajuda no R
Para obter uma lista de funções relacionadas com uma palavra-chave, podemos utilizar o
comando
∗
Faculdade de Ciências e Tecnologia, Universidade Nova de Lisboa, 2018
1
> help.search(”palavra − chave”)
Caso se pretenda obter uma janela de diálogo com a informação duma função podemos
utilizar a sintaxe
>help(função)
Nas janelas de ajuda das funções pode-se encontrar uma função ou lista de funções re-
lacionadas, por vezes mais apropriadas para a tarefa pretendida. Outra função útil para
ajuda é a função apropos(conceito) que nós dá a informação sobre todas as funções do R
que envolvam conceito.
> source(”comandos.r”)
2 Comandos elementares
O R pode ser utilizado para fazer operações aritméticas
> 6 + 10 ∗ 3 − 1
[1] 35
podendo-se, por exemplo atribuir (<− ) o resultado anterior a um escalar (objecto) através
da sintaxe
> a <− 6 + 10 ∗ 3 − 1
Uma forma alternativa para atribuir o resultado duma operação aritmética ou o conteúdo
de um objecto é
> 6 + 10 ∗ 3 − 1 −> a
Observe que o R distingue letras minúsculas de maiúsculas, sendo necessário ter cui-
dado na definição dos nomes dos vários objectos. Para se ter uma ideia dos objectos já
utilizados podemos utilizar a seguinte função com a lista de argumentos vazia
> ls()
2
Outra funcionalidade interessante desta função é a impressão na consola da lista de funções
dos ”packages”, bastando para isso indicar um inteiro 1, 2, ... como argumento.
> (x <− 2 + 1)
[1] 3
Caso se esteja a correr um script e se pretenda que os resultados das operações aritméticas
sejam, para além de ser atribuı́dos a um objecto, apresentados na consola, deve-se utilizar,
por exemplo
3
4 Objectos, o seu tipo e atributos
4.1 Atributos: tipo e tamanho
O R tem uma estrutura orientada por objectos. Por exemplo, temos valores reais, vectores
reais, valores complexos, vectores complexos, vectores de elementos booleanos, vectores de
caracteres e arrays, objectos cujos elementos são todos do mesmo tipo, sendo os vectores
do tipo numérico, complexo, booleano, caracter, etc... Para este tipo de objectos existe,
aparentemente, uma excepção que é um ”valor especial”designado por NA para quanti-
dades não disponı́veis. Note-se que um vector pode ser vazio e ainda possuir um tipo.
O R também opera com objectos chamados listas, os quais são do tipo ”list”. Estas são
sequências ordenadas de objectos, podendo ser de vários tipos.
Outro tipo de objectos são as funções que fazem parte do R, bem como aquelas que po-
derão ser definidas pelo utilizador.
As funções mode(object) e length(object) podem ser utilizadas para obter o tipo e tama-
nho de uma qualquer estrutura definida. Outras propriedades dum objecto são usualmente
obtidas por attributes(object).
Por exemplo, se z é um vector complexo definido por
> mode(z)
[1] ”complex”
> length(z)
[1] 2
Existe uma larga colecção de funções da forma as.xxx() para converter objectos de um
tipo para outro, ou, para fornecer a um objecto com um qualquer atributo um outro que
ele não possui. Um exemplo interessante da necessidade de fornecer um atributo a um
objecto é a função dim(), que pode ser utilizada com vectores, sendo necessário atribuir
ao objecto vector o atributo ”dim”de um array, utilizando-se para tal a função as.array(),
de forma a que esta devolva um valor diferente de ”NULL”
4
> x <− c(1, 2, 3)
> dim(x)
N U LL
> dim(as.array(x)
[1] 3
e assim foi eliminado o terceiro elemento. Pode-se também usar a função length() para
alargar a dimensão dum dado objecto, sendo neste caso atribuı́do às novas componentes
o valor ”NA”.
5 Vectores
O vector é uma colecção ordenada de elementos do mesmo tipo.
5
> x
[1] 2 3 5 4 9
As seguintes linhas de comandos são úteis para atribuir a um vector uma parte ou trans-
formações do vector x
No exemplo
em vez de xb2 podı́amos utilizar x ∗ x, onde ∗ não representa o produto matricial, mas
o produto elemento a elemento, sendo o resultado um vector com elementos obtidos pelo
quadrado elemento a elemento das componentes do vector x.
O produto matricial de vectores é feito utilizando-se o operador % ∗ %, ficando ilustrado
pelo exemplo seguinte, onde t(x) representa a transposta do vector x
Sequência de valores de 3 a 8
> print(a <− 3 : 8)
[1] 3 4 5 6 7 8
6
to=5) e seq(to=5, from=1) produzem o mesmo resultado que 1:5, isto é, o vector c(1, 2, 3, 4, 5).
Outros exemplos da utilização desta função são
gerando em s um vector c(−1.0, −0.5, 0.0, 0.5, 1.0). De forma similar temos
> rep(x, 5)
[1] 1 2 1 2 1 2 1 2 1 2
Podemos também repetir os elementos dum objecto, mas desta vez tendo em conta a
ordem deles nesse objecto, utilizando o comando
6 Arrays e matrizes
6.1 Array
Um array pode ser considerado como uma colecção de dados, por exemplo do tipo numérico,
à qual se associa um vector de dimensões. O R permite criar com facilidade arrays e, em
particular, matrizes. Uma matriz é um array definido por um vector de 2 dimensões. Se
a dimensão for k então temos um array k-dimensional, isto é, ao qual está associado um
vector de dimensões de tamanho k. As dimensões de um array são indexadas desde um
até ao número de elementos dados por um vector. Vejamos o exemplo,
> z <− 1 : 24
7
atributo de array, atribuindo-lhe um vector de dimensões c(3,4,2)
passando a ser um array do tipo 3 × 4 × 2. Outras funções tais como matrix() e array()
podem ser usadas para criar de forma mais simples e natural arrays de k dimensões. Por
exemplo, se for c(3,4,2), o vector de dimensões para um array, então temos 3 × 4 × 2 = 24
entradas e o vector de dados, associado ao array, constituı́do pelos valores ordenados
a[1, 1, 1], a[2, 1, 1], a[3, 1, 1], ..., a[1, 4, 2], a[2, 4, 2], a[3, 4, 2].
Um array pode ter uma única dimensão, tal array é normalmente tratado como um vector.
[, 1] [, 2] [, 3]
[1, ] 1 4 7
[2, ] 2 5 8
[3, ] 3 6 9
e a matriz de ı́ndices, isto é, o array i de 3 × 2
[, 1] [, 2]
[1, ] 1 3
[2, ] 2 2
[3, ] 3 1
8
Podemos assim extrair os elementos pretendidos utilizando
> X[i]
[1] 7 5 3
[, 1] [, 2] [, 3]
[1, ] 1 4 0
[2, ] 2 0 8
[3, ] 0 6 9
Índices negativos não são permitidos nas matrizes de ı́ndices. ”NA”e zeros são permitidos,
entradas na matriz de ı́ndices contendo zeros são ignoradas e contendo ”NA”produzem
”NA”como resultado.
[, 1] [, 2] [, 3] [, 4]
[1, ] 1 4 7 10
[2, ] 2 5 8 11
[3, ] 3 6 9 12
Neste caso, o vector ”1:12”e o vector de dados do array X têm o mesmo número de
elementos. Se em vez de um vector com 12 elementos tivermos um vector com número de
elementos inferior a 12, por exemplo, o vector 1 : 10, o array X de 3 × 4 é construı́do na
mesma, mas os últimos dois elementos obtidos na construção de X são os dois primeiros
elementos do vector 1 : 10
9
> X <− array(1 : 10, dim = c(3, 4))
> X
[, 1] [, 2] [, 3] [, 4]
[1, ] 1 4 7 10
[2, ] 2 5 8 1
[3, ] 3 6 9 2
Esta forma de construção de arrays, fazendo reciclagem, pode ser muito útil, caso preten-
damos um array cujos elementos sejam todos iguais. Para tal basta, por exemplo, utilizar
o comando
para obter um array com elementos todos nulos. Neste ponto dim(X) dá-nos o vec-
tor de dimensões de X e X[1 : 12] o vector de dados do array.
Arrays podem ser utilizados em operações numéricas, sendo o resultado um array obtido
pelas operações elemento a elemento dos vectores de dados que lhe estão associados. Em
geral o atributo ”dim”deverá ser o mesmo para todos os array, sendo este atributo o
mesmo no resultado final da operação. Vejamos o seguinte exemplo
[, 1] [, 2]
[1, ] 1 3
[2, ] 2 4
> Y <− array(c(10, 20, 30, 40), dim = c(2, 2))
> Y
[, 1] [, 2]
[1, ] 10 30
[2, ] 20 40
> D <− 2 ∗ X + Y + 100
> D
[, 1] [, 2]
[1, ] 112 136
[2, ] 124 148
> dim(D)
[1] 2 2
Assim D é um array do mesmo tipo que X e Y ,isto é, com o mesmo vector de dimensões
c(2,2), contendo um vector de dados resultante das operações elemento a elemento. Con-
tudo a mesma regra considerando operações entre array e vectores tem de ser considerada
com um pouco mais de cuidado.
10
6.5 Matrizes
Tal como já foi referido, uma matriz é um caso especial de um array. Devido à sua
importância, precisa ser abordado separadamente, uma vez que o R contém ferramentas,
operadores e funções, que apenas são utilizadas para este caso especial de arrays. Por
exemplo as funções nrow() e ncol() que definem ou identificam o número de linhas e
colunas de uma matriz, respectivamente.
> A∗B
> A %∗% B
> x % ∗ % A% ∗ % x
> solve(A, b)
11
mesmo tempo ineficiente e potencialmente instável, quando se utiliza
em vez de
> x % ∗ % solve(A, x)
...
As componentes são sempre numeradas e podem ser sempre referidas pela sua ordem.
Assim, no exemplo anterior podemos chamar individualmente as componentes da lista l
por l[[1]], l[[2]], l[[3]] e l[[4]], e, caso se queira chamar o primeiro elemento da componente
número 4 da lista l, isto é, o primeiro elemento do vector tel.numeros, devemos utilizar
l[[4]][1].
As componentes de uma lista podem ter nomes. Tal como se pode ver no exemplo as
componentes têm os nomes: nome, apelido, idade e tel.numeros. Neste caso pode-
mos chamar qualquer das componentes da lista l pelo seu nome, utilizando o comando
l$nome da componente ou l[[”nome da componente”]]. No exemplo anterior l[[1]][1],
l$tel.numeros[1] e l[[”tel.numeros”]][1] são iguais e devolvem o valor 221234567. Isto é
especialmente útil, quando o nome da(s) componente(s) estão armazenados numa variável
ou vector, como se vê no exemplo a seguir
12
[1] ”P edro”
> l[[x[2]]]
[1] ”P ereira”
> l[[x[3]]]
[1] 221234567 961234567
13
matrizes numéricas, listas, ou outros data frames.
• Matrizes, listas e data frames fornecem tantas variáveis ao novo data frame quantas
colunas, elementos, ou, variáveis elas tenham respectivamente.
• Vectores que apareçam como variáveis de um data frame têm de ter todos o mesmo
número de elementos, e matrizes tem de ter o mesmo número de linhas.
Um data frame pode ser tratado, para algumas utilizações, como uma matriz, embora
os atributos não sejam os mesmos. Pode ser apresentado na forma de matriz, e, as suas
linhas e colunas, extraı́das utilizando a indexação convencional de matrizes.
i l
1 1 A
2 2 B
3 3 C
> names(d)
[1] ”i” ”l”
mas, neste caso, não atribuı́amos o nome às colunas do data frame, ficando estas com
nomes definidos pelo R, sendo, neste exemplo,
> names(d)
[1] ”X1.3” ”LET T ERS.1.3.”
Uma lista cujas componentes estão de acordo com as restrições impostas sobre os data
frames podem ser convertidas utilizando a função as.data.frame(). Uma forma simples de
construir um data frame é através da função read.table(), que permite ler um conjunto de
dados dum ficheiro externo. Esta função será abordada na secção: Leitura de ficheiros de
dados.
As notações $, utilizadas, por exemplo, em l$nome, l$aplido na lista l, são por vezes
pouco convenientes. Uma funcionalidade útil é tornar as componentes de uma lista, ou
data frame temporariamente visı́veis como variáveis definidas sobre o nome das suas com-
ponentes, sem ter necessidade de indicar explicitamente o nome da lista, ou data frame, a
14
que pertencem.
A função attach() pode ser utilizada para tornar visı́vel as componentes de uma lista ou
data frame. Vejamos o exemplo anterior
> attach(d)
> i
[1] 1 2 3
A função detach() faz o inverso, tornando invisı́vel as componentes de listas ou data frames
que a função attach() tornou visı́veis.
A função attach() permite tornar visı́vel as componentes de uma lista ou data frame,
chamando-as pelos respectivos nomes. Contudo não é possı́vel modificar essas componen-
tes sem necessidade de especificar o nome da lista ou data frame, isto é, se no exemplo
anterior pretendêssemos modificar a componente i de 1 : 3 para c(2, 4, 6) terı́amos de es-
crever
> x<4
[1] T RU E F ALSE T RU E F ALSE T RU E
15
Às componentes com valor lógico ”TRUE” é atribuı́do o valor 1, e às componentes
”FALSE” o valor 0, para que a soma dessas componentes corresponda ao número de
componentes com valor lógico verdadeiro. Se por outro lado utilizarmos o comando
obtemos a soma das componentes do vector x que sejam inferiores a 4. Observe-se neste
caso que o vector que dá entrada como argumento da função sum() é c(1, 3, 2).
• Cada linha adicional tem como primeiro elemento a descrição da linha e os valores
para cada uma das variáveis.
16
Nome Apelido Casado Telefone
01 Jose Dias TRUE 212233449
02 Carla Sousa FALSE 224478442
03 Rosa Pereira TRUE 216663659
04 Pedro Matos FALSE 232673541
Por defeito dados do tipo numérico (com excepção da descrição das linhas) são lidos como
variáveis numéricas e variáveis não numéricas, tal como ”Nome” são lidas como variáveis
do tipo caracter. Podemos assim utilizar directamente a função read.table() para ler estes
dados da forma
17
V1 V2 V3 V4
1 Jose Dias TRUE 212233449
2 Carla Sousa FALSE 224478442
3 Rosa Pereira TRUE 216663659
4 Pedro Matos FALSE 232673541
para atribuir os dados ao objecto ListaT el, ficando a i-ésima linha descrita por i e a
j-ésima variável com o nome V j.
...
11 Distribuições de Probabilidade
Uma utilidade importante do R é poder obter um conjunto de tabelas estatı́sticas. São
fornecidas, para cada distribuição de probabilidade, ferramentas que permitem calcular
a distribuição (cumulativa) P (X ≤ x), a função densidade de probabilidade, a função
quantil (dado q, permitem obter o menor valor de x tal que P (X ≤ x) > q) e obter
um conjunto de observações pseudo-distribuı́das. A seguinte tabela fornece uma lista dos
nomes utilizados para cada distribuição de probabilidade
Temos de utilizar o prefixo ”d” para a função densidade de probabilidade (função de pro-
babilidade), ”p” para a função (cumulativa) de distribuição, ”q” para a função quantil e
”r” para simulação de valores pseudo-distribuı́dos. O primeiro argumento para as funções
dxxx é x, q para pxxx, p para qxxx e n para as rxxx (excepto para rhyper e rwilcox, para
as quais é nn). O parâmetro de não centralidade, ncp, pode não estar ainda disponı́vel
para todos os casos: ver na ajuda on-line os detalhes. Todas as funções pxxx e qxxx têm
argumentos booleanos, lower.tail e log.p, e as funções dxxx têm o argumento booleano log.
Estes argumentos permitem, por exemplo, obter a função cumulativa (ou integrada) de
18
hazard H(t) = −log(1 − F (t)), da seguinte forma pxxx(t, ..., lower.tail = FALSE, log.p =
TRUE) ou mais concretamente a função log-likelihoods (logaritmo da função de verosimi-
lhança) utilizando directamente dxxx(..., log = TRUE). Vejamos agora alguns exemplos
de utilização destas funções.
> pnorm(0, 0, 1)
[1] 0.5
> pnorm(0)
[1] 0.5
Em algumas destas funções podemos omitir argumentos, uma vez que, por defeito eles
estão definidos. No caso da normal, o valor médio e desvio padrão são, por defeito, 0 e 1
respectivamente. Iremos ver, mais à frente, como se definem funções com parâmetros que
podem ser omitidos na utilização destas.
valor com probabilidade cumulativa (superior), igual a 0.05 para a distribuição t-Student
com 2 graus de liberdade.
19
12 Representações gráficas
...
20