Introdução ao uso do software R
UFBA | IM | DEST Kim Samejima
R é uma linguagem com foco em análises estatísticas e gráficas. É um projeto GNU com características similares à linguagem S, desenvolvida pela Bell Laboratories(atualmente Lucent Technologies) por John Chambers e sua equipe.
O R é composto por uma variedade de implementações de técnicas estatísticas(Modelos lineares e não-lineares, testes estatísticos, análise de séries temporais, clustering, análise multivariada etc) e técnicas gráficas. O R é um pacote estatístico open-source e esta flexibilidade o torna bastante popular no meio acadêmico.
Além disso, possui facilidade, robustez e qualidade na produção das análises e gráficos, incluindo símbolos e fórmulas matemáticas, uma vez que o usuário detém total controle sobre o que está sendo desenhado.
Mais sobre:
[R-project] (http://r-project.org “www.r-project.org”)
RStudio (http://rstudio.org “www.rstudio.org”)
[RJournal] (http://journal.r-project.org “R Journal”)
Parte 1:
- Instalação e Apresentação do Software;
- Apresentação dos principais operadores e funções do R;
- Os objetos do R: vetores, fatores, matrizes, listas e dataframes;
- Importação e exportação de banco de dados;
- Medidas descritivas;
- Medidas descritivas estratificadas em grupos e subgrupos;
Parte 2:
- Tabelas de frequência e contingência;
- Gráficos de barras, linha, Pareto, setor e boxplot para uma e mais variáveis;
- Introdução ao desenvolvimento e uso de funções.
Download RTools >- RTools contém uma série de pacotes e funções importantes na utilização do R;
>- É essencial para a construção de novos pacotes e para a execução de muitos dos pacotes utilizados no R;
>- Por exemplo, os pacotes que geraram esta apresentação (knitr e slidify) requerem o RTools para sua perfeita execução.
Lista de Pacotes disponíveis >- Pacotes são extensões do R, contendo funções e objetos específicos para a realização de determinadas rotinas e análises;
>- Os pacotes são criados pelos usuários da comunidade a partir do seu código-fonte e publicados com a finalidade de disseminação do conhecimento;
>- Para instalar o pacote no R, basta descompactar o arquivo ZIP na pasta ‘library’ do diretório em que o R está instalado. >- os Pacotes também podem ser instalados via menu, através da aba “packages”, ou ainda, utilizando alguma interface GUI; >- Para carregar o pacote no R utilizaremos o comando require() ou o comando library().
library(tseries)
require(tseries)
RStudio (http://rstudio.org “www.rstudio.org”)
O RStudio é uma GUI (Graphical User Interface) para o R. Com ele, é possivel interagir de forma mais ’amigável’com o console do R, por exemplo:
>- editando códigos em múltiplas linhas;
>- carregando pacotes e suas dependencias;
>- visualizando histórico de comandos e de saídas;
>- gerando relatórios em HTML e HTML5 (markdown) ;
>- publicando seus resultados em nuvens específicas e repositórios de projetos(Dropbox, GitHub, Rpubs).
Além disso, é possível utilizar o RStudio para trabalhos em rede, centralizando processamentos em um servidor.
Outras GUI bastante utilizadas na comunidade científica:
Para utilizar o RStudio em um dispositivo móvel no Windows, apenas copie os dados do diretório RStudio (normalmente localizado na pasta de Arquivos de Programas). Para utilizá-lo, execute o arquivo ‘rstudio.exe’ na pasta bin e direcioná-lo para o arquivo de execução do console do R.
Perl é uma linguagem de programação utilizada na construção de alguns pacotes do R. Neste cursp, utilizaremos alguns pacotes que tem o Perl como dependência.
Uma distribuição bastante comum de compilador desta linguagem é o Strawberry Perl
- Case Sensitive: Help é diferente de help e de HELP
- Possui arquivos dos tipos:
- RData: Armazena os dados da workspace;
- RHistory: Armazena o histórico de comandos utilizados durante o uso da sessão;
- R: Script para execução (é executado através do comando source);
- Rmd: Script em Markdown para a construção de arquivos HTML5;
- RProj: Formato específico do RStudio para armazenamento de projetos. Neste formato, é possível manter organizados os arquivos acima.
- Peça ajuda sempre que precisar!!!
help(solve)
?solve
help.search("linear model")
??"linear model"
RStudio e R-bloggers possuem grandes comunidades de usuários que podem ajudar com seu problema ou dúvida.
O Coursera é um site muito divulgado na comunidade científica com foco na divulgação e ensino de cursos online gratuitos. Há uma vasta lista de cursos de introdução e utilização do R, ou que utilizam o R com foco em análises estatísticas.
Utilize o comando ‘<-’ ou ‘->’ para atribuir valores para as suas variáveis. Apesar de ser funcional, o caracter ‘=’ é utilizado para comparações e para definir parametros de funções internas. Por este motivo, evita-se o seu uso para atribuir valores aos objetos.
# Isto e um comentario
x<-NA # Atribui NA a variavel x
y=1 # Atribui 1 a variavel y. Alternativamente, podemos fazer 1->y
y
## [1] 1
z<-w<-2 # Atribui 2 as variaveis z e w. Alternativamente, podemos fazer 2->w->z
ls() # Lista os objetos existentes na workspace
## [1] "w" "x" "y" "z"
rm(x) # Remove um determinado objeto da workspace
rm(list=ls()) # Remove todos os arquivos da Workspace
Work Directory é o caminho onde são armazenados os arquivos salvos do projeto em que estamos trabalhando.
getwd() # Verifica o caminho padrao para a workspace (working directory)
[1] "C:/Users/Kim/Documents/Academicos/UFBA/IntroductionR"
caminho<-getwd() # Armazena o caminho padrao atual na variavel 'caminho'
caminho # imprime o conteudo da variavel 'caminho' no output do console
[1] "C:/Users/Kim/Documents/Academicos/UFBA/IntroductionR"
setwd("C:/Windows") # define o caminho 'C:\Windows' como caminho padrao
getwd()
[1] "C:/Windows"
setwd(caminho) #Define de volta o caminho padrao para o diretorio armazenado na variavel 'caminho'
getwd()
[1] "C:/Users/Kim/Documents/Academicos/UFBA/IntroductionR"
Podemos armazenar mais de um valor para uma variável. Neste caso, a variável armazenará um vetor e não um único numero:
x<-c(5.1,4.3,2,0.5,9,2,10)
x
## [1] 5.1 4.3 2.0 0.5 9.0 2.0 10.0
Outras maneiras de se atribuir um valor ao objeto ‘x’:
assign("x", c(5.1,4.3,2,0.5,9,2,10))
c(5.1,4.3,2,0.5,9,2,10) -> x
É possivel construir vetores a partir de outros vetores já existentes:
y<-c(x,x,x)
y
## [1] 5.1 4.3 2.0 0.5 9.0 2.0 10.0 5.1 4.3 2.0 0.5 9.0 2.0 10.0
## [15] 5.1 4.3 2.0 0.5 9.0 2.0 10.0
Equivalentemente, a função rep replica um determinado objeto um número específico de vezes:
t<-rep(x,times=3)
t
## [1] 5.1 4.3 2.0 0.5 9.0 2.0 10.0 5.1 4.3 2.0 0.5 9.0 2.0 10.0
## [15] 5.1 4.3 2.0 0.5 9.0 2.0 10.0
s<-c(x,0,rep(NA,times=2),x)
s
## [1] 5.1 4.3 2.0 0.5 9.0 2.0 10.0 0.0 NA NA 5.1 4.3 2.0 0.5
## [15] 9.0 2.0 10.0
seq(...)
## Default S3 method:
seq(from = 1, to = 1, by = ((to - from)/(length.out - 1)),
length.out = NULL, along.with = NULL, ...)
A função seq cria uma sequencia (de)crescente:
seq(-1, 1, by=.1)
## [1] -1.0 -0.9 -0.8 -0.7 -0.6 -0.5 -0.4 -0.3 -0.2 -0.1 0.0 0.1 0.2 0.3
## [15] 0.4 0.5 0.6 0.7 0.8 0.9 1.0
seq(5, -2, by=-.5)
## [1] 5.0 4.5 4.0 3.5 3.0 2.5 2.0 1.5 1.0 0.5 0.0 -0.5 -1.0 -1.5
## [15] -2.0
Os operadores usuais +, -, *, / e ^ podem ser utilizados para operações aritméticas. Quando utilizadas em vetores, são aplicadas a cada elemento do vetor:
k<-4
z<-5
2*z + k + 1
## [1] 15
x^2
## [1] 26.01 18.49 4.00 0.25 81.00 4.00 100.00
t/3
## [1] 1.70000 1.43333 0.66667 0.16667 3.00000 0.66667 3.33333 1.70000
## [9] 1.43333 0.66667 0.16667 3.00000 0.66667 3.33333 1.70000 1.43333
## [17] 0.66667 0.16667 3.00000 0.66667 3.33333
As funções log, exp, sin, cos, tan, sqrt também estão disponíveis e funcionam de modo análogo aos operadores aritméticos acima, respeitando-se as restrições de cada uma.
| Função | resultado |
|---|---|
| round(x, digits = 0) | arredonda x com o número de casas decimais definido em ‘digits’ |
| ceiling(x) | arredonda x para cima |
| floor(x) | arredonda x para baixo |
| trunc(x) | retorna a parte inteira de x |
round(pi, digits = 2)
## [1] 3.14
ceiling(pi)
## [1] 4
floor(exp(1))
## [1] 2
trunc(pi)
## [1] 3
Os operadores:
Operador| Descrição –| ‘<’ | Menor ‘<=’| Menor ou igual ‘>’ | Maior ‘>=’| Maior ou igual ‘==’| Igual ‘!=’| Diferente
são utilizados para se realizar comparações entre objetos. O resultado de uma comparação é um valor lógico TRUE (ou T, de forma abreviada) se a condição é verdadeira ou FALSE (F, abreviado) se a condição é falsa.
> 2>3
[1] FALSE
> 5<=9
[1] TRUE
> z== 5*8-10
[1] FALSE
Condições compostas são construídas através dos conectores: ‘&’ significando conjunção (e) e ‘|’ representando uma disjunção (ou).
2>3 & 5<=9
## [1] FALSE
teste1<- z== 5*8-10 | k!=z
teste1
## [1] TRUE
Obs: Eventualmente, quando um resultado é armazenado em uma variável e esta é interagida com objetos numéricos, ela assume valores 1 para ‘TRUE’ e 0 para ‘FALSE’.
Variáveis de caracter são utilizadas em análise estatística, em geral, para se imprimir o label da observação, isto é, sua identificação/descrição ou para se representar um fator não numérico.
ex<-"Dados selecionados da região 21"
length(ex)
[1] 1
O comando paste é utilizado para concatenar variáveis caracter:
paste("Today is", date())
## [1] "Today is Mon Aug 31 10:57:45 2015"
Trat<-c("A", "B", "C")
ID<-c(1:12)
TratID<-paste(Trat,ID, sep="_")
TratID
## [1] "A_1" "B_2" "C_3" "A_4" "B_5" "C_6" "A_7" "B_8" "C_9" "A_10"
## [11] "B_11" "C_12"
Suponha, por exemplo, que desejamos construir uma variável Tratamento, contendo 3 níveis para, sexos masculino e feminino, com 5 observações em cada casela:
Trat<-rep(c(rep("A",times=5),rep("B",times=5),rep("C",times=5)),times=2)
Trat
## [1] "A" "A" "A" "A" "A" "B" "B" "B" "B" "B" "C" "C" "C" "C" "C" "A" "A"
## [18] "A" "A" "A" "B" "B" "B" "B" "B" "C" "C" "C" "C" "C"
Sexo<-c(rep("M",times=15),rep("F",times=15))
Sexo
## [1] "M" "M" "M" "M" "M" "M" "M" "M" "M" "M" "M" "M" "M" "M" "M" "F" "F"
## [18] "F" "F" "F" "F" "F" "F" "F" "F" "F" "F" "F" "F" "F"
#paste(Sexo,Trat,sep=":")
Futuramente, veremos como construir variaveis de fatores, que, numericamente, representarão estas informações em modelos estatisticos.
Outro uso bastante comum para variáveis do tipo caracter, é a identificação de elementos dos dados:
plot(mpg~wt, data=mtcars, col="darkblue", pch=20, main="Milhas/Galão x Peso")
identify(mtcars$mpg~mtcars$wt,n=3, labels=rownames(mtcars))
Índices são utilizados para restringir o conjunto de dados a ser selecionado. Podem ser utilizados na maioria dos objetos do R.
s
## [1] 5.1 4.3 2.0 0.5 9.0 2.0 10.0 0.0 NA NA 5.1 4.3 2.0 0.5
## [15] 9.0 2.0 10.0
s[2]
## [1] 4.3
s[c(1,5,10)]
## [1] 5.1 9.0 NA
É possivel definir condições compostas e restringir elementos:
s
## [1] 5.1 4.3 2.0 0.5 9.0 2.0 10.0 0.0 NA NA 5.1 4.3 2.0 0.5
## [15] 9.0 2.0 10.0
s_<-s[!is.na(s)]
s_
## [1] 5.1 4.3 2.0 0.5 9.0 2.0 10.0 0.0 5.1 4.3 2.0 0.5 9.0 2.0
## [15] 10.0
s[!is.na(s) & s>5]
## [1] 5.1 9.0 10.0 5.1 9.0 10.0
s[-(1:5)]
## [1] 2.0 10.0 0.0 NA NA 5.1 4.3 2.0 0.5 9.0 2.0 10.0
Também é possivel definir referências baseadas em nomes:
cal <- c(50, 250,2,0, 2000,30)
names(cal) <- c("banana", "hotdog", "tictac","coca-zero", "feijoada","helmanns")
almoco <- cal[c("coca-zero","feijoada","tictac")]
almoco
## coca-zero feijoada tictac
## 0 2000 2
sum(almoco) # Calcula o somatório da variável almoco
## [1] 2002
z<-c(1,3,10)
z[1]^100-z[2]+5*z[3]->w
x<-numeric()
for(i in 1:100){
if (runif(1)>0.3) x[i]<-rpois(1,3)
else x[i]<- 0/0
}
\[ z=\frac{y-3}{\sqrt{3}} \]
Todos os objetos no R fazem parte de classes. Cada classe possui características especificas. Vimos, até agora, objetos das classes numeric(), character. Com efeito, é possivel modificar a classe de um objeto desde que ele possa assumir as características da nova classe.
# exemplo retirado do livro 'Introduction to R, Venables et. al., 2013'
z <- 0:9
digits <- as.character(z) # transforma o objeto z, numérico, em caracter
d <- as.integer(digits) # transforma o objeto 'digits', vetor de caracteres, em numérico
e <- numeric() # cria um vetor numerico vazio, com alocação dinâmica
e[3] <- 17
alpha<-rep(NA,times=10)
alpha <- alpha[2 * 1:5] # selecionando apenas os pares de 2 a 10
length(alpha) <- 3 # truncando em 3
class(digits)
## [1] "character"
class(z)
## [1] "integer"
A função length nos mostra o tamanho do objeto, i.e., a quantidade de elementos que ele possui. O resultado depende da classe em que a função é aplicada.
length(digits)
[1] 10
x<-matrix(c(2,2,2,2),ncol=2)
length(x)
[1] 4
x<-list(a=c(1,2,3,4,5), b=c(5,6,6,7,7) )
length(x)
[1] 2
caminho<-getwd()
length(caminho)
[1] 1
Vetores são objetos que podem armazenar uma quantidade determinada de elementos do mesmo tipo, desde que eles sejam de algumas classes específicas. São elas: numeric, character,complex, logical.
Algumas operações com vetores:
x<-c(1,2,2,3,4,5,6)
y<-c(1,-1,0,2,1,1,6)
2*x
## [1] 2 4 4 6 8 10 12
2*x+1
## [1] 3 5 5 7 9 11 13
log(x)
## [1] 0.00000 0.69315 0.69315 1.09861 1.38629 1.60944 1.79176
c(1,2,3)+c(1,2,3,4,5,6)
[1] 2 4 6 5 7 9
Matrizes são vetores bidimensionais. São casos particulares de array (assim como os vetores). Portanto, nas matrizes, também são armazenados elementos de um mesmo tipo ou classe, desde que sejam do tipo numeric, character,complex ou logical.
#matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE,
# dimnames = NULL)
#as.matrix(x, ...)
#is.matrix(x)
#dim(x)
matrix(c(1,2,3,4,5,6,7,8,9),nrow=3)
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
matrix(c(1,2,3,4,5,6,7,8,9),nrow=3, byrow=T)
## [,1] [,2] [,3]
## [1,] 1 2 3
## [2,] 4 5 6
## [3,] 7 8 9
x<-matrix(c(10,5,4,3,2,-1),ncol=3,byrow=T)
dim(x) # Retorna um vetor de tamanho 2 com o número de linhas e colunas de x, respectivamente.
## [1] 2 3
> as.matrix(c(1,2,3,4))
[,1]
[1,] 1
[2,] 2
[3,] 3
[4,] 4
> is.matrix(mtcars)
[1] FALSE
> !is.matrix(caminho)
[1] TRUE
Cada elemento da matriz (assim como em um vetor) possui uma coordenada. a Primeira coordenada representa a linha, enquanto a segunda representa a coluna. Assim, para acessarmos a linha 2, coluna 1 da matriz x abaixo, fazemos:
[,1] [,2] [,3]
[1,] 10 5 4
[2,] 3 2 -1
x[1,2]
## [1] 5
Podemos fazer referências a linhas ou colunas inteiras das matrizes apenas ocultando a coordenada a qual se deseja generalizar:
x[1,]
## [1] 10 5 4
x[,2]
## [1] 5 2
Considere a matriz X abaixo: \[ x= \left( \begin{array}{ccc} 10 & 5 & 4 \\ 3 & 2 & -1 \\ 0 & 0 & 1 \end{array} \right) \] ### Transposição:
x<-matrix(c(10,5,4,3,2,-1,0,0,1),ncol=3,byrow=T)
t(x)
[,1] [,2] [,3]
[1,] 10 3 0
[2,] 5 2 0
[3,] 4 -1 1
solve(x)
[,1] [,2] [,3]
[1,] 0.4 -1 -2.6
[2,] -0.6 2 4.4
[3,] 0.0 0 1.0
Considere as matrizes X e Y abaixo: \[ x= \left( \begin{array}{ccc} 10 & 5 & 4 \\ 3 & 2 & -1 \\ 0 & 0 & 1 \end{array} \right) , y= \left( \begin{array}{ccc} 0 & 2 & 0 \\ 7 & 2 & 3 \\ 1 & 1 & 1 \end{array} \right) \]
x<-matrix(c(10,5,4,3,2,-1,0,0,1),ncol=3,byrow=T)
y<-matrix(c(0,2,0,7,2,3,1,1,1),ncol=3,byrow=T)
#O produto matricial entre x e y é:
x%*%y
[,1] [,2] [,3]
[1,] 39 34 19
[2,] 13 9 5
[3,] 1 1 1
> det(x)
[1] 5
> det(y)
[1] -8
São a classe generalizada das matrizes e vetores. Possuem até 3 dimensões e podem ser numeric, character,complex ou logical. Para acessar um elemento de um array, caso ele tenha 3 dimensões, a primeira coordenada representa a linha, a segunda coordenada representa a coluna e a terceira, a página.
array(data = NA, dim = length(data), dimnames = NULL)
as.array(x, ...)
is.array(x)
z<-rnorm(24,0,1) # um vetor pode ser transformado em array, desde que seu numero de elementos seja coerente com as dimensões do array desejado.
dim(z) <- c(4,3,2)
z
, , 1 , , 2
[,1] [,2] [,3] [,1] [,2] [,3]
[1,] 2.27348 2.91914 -0.32439 [1,] 0.31916 0.029518 -1.09777
[2,] 1.17350 0.67742 -0.27470 [2,] -1.07754 0.594274 0.71118
[3,] 0.28771 -0.68432 -0.93350 [3,] -3.23315 0.059135 0.71889
[4,] -0.65977 0.18649 0.11685 [4,] -0.25487 0.413399 0.25165
z[3,2,1]
[1] -0.68432
Assim como no caso matricial, é possível acessar as marginais de cada dimensão ocultando os índices das demais:
> z[1,,]
[,1] [,2]
[1,] 2.27348 0.319160
[2,] 2.91914 0.029518
[3,] -0.32439 -1.097772
> z[,1,]
[,1] [,2]
[1,] 2.27348 0.31916
[2,] 1.17350 -1.07754
[3,] 0.28771 -3.23315
[4,] -0.65977 -0.25487
> z[,,1]
[,1] [,2] [,3]
[1,] 2.27348 2.91914 -0.32439
[2,] 1.17350 0.67742 -0.27470
[3,] 0.28771 -0.68432 -0.93350
[4,] -0.65977 0.18649 0.11685
- As Expressões são executadas da esquerda para a direita, respeitando-se a hierarquia de parênteses;
- Se houver um vetor menor durante uma operação, os valores dele serão repetidos no final, até que ele alcançe o tamanho do vetor maior;
- Exceto pelo caso dos vetores, as dimensões dos arrays devem ser compatíveis durante a operação;
- Caso haja um array e um vetor em uma operação, a estrutura do array prevalecerá sobre a do vetor.
Considere agora a matriz
\[
Y=
\left(
\begin{array}{ccc}
0 & 2 \\
7 & 2 \\
1 & 1
\end{array}
\right)
\]
Calcule o produto Matricial X * Y;
Subtraia a linha 1 da matriz resultante do produto de X * Y da linha 2 da matriz Y e armazene seu valor na variável Srow.
Estas funções organizam objetos no formato de linhas (rbind) ou colunas (cbind)
x <- 1:3
y <- 10:12
z<-cbind(x, y)
z
## x y
## [1,] 1 10
## [2,] 2 11
## [3,] 3 12
rbind(z[,1],z[,2])
## [,1] [,2] [,3]
## [1,] 1 2 3
## [2,] 10 11 12
As funções de loop são aquelas que realizam uma determinada operação repetidamente para um grupo de observações, de acordo com um critério pré-determinado. As principais são:
- apply: Aplica uma função às marginais de uma matrix ou array;
- tapply: aplica uma função a subgrupos de um vetor;
- lapply e sapply: aplica uma função a elementos de uma lista. lapply sempre devolverá uma lista, enquanto sapply simplificará o resultado.
# apply(X, MARGIN, FUN, ...)
# X é o objeto ao qual 'FUN'será aplicado.
# MARGIN será igual a 1 para FUN aplicado às linhas e igual
# a 2 para FUN aplicado às colunas
x <- cbind(x1 = 3, x2 = c(4:1, 2:5))
row.sums <- apply(x, 1, sum)
col.sums <- apply(x, 2, sum)
row.sums
[1] 7 6 5 4 5 6 7 8
col.sums
x1 x2
24 24
Uma lista é um vetor que pode aceitar a maioria das classes de objetos em seu conteúdo. Por exemplo, podemos ter uma lista x, com um número na primeira posição, um caracter na segunda, e uma matriz na terceira:
a<-123456
b<-"João"
c<-matrix(c(6,7,8.5,6,4,5),byrow=T,nrow=3,
dimnames=list(disciplina=c("Cálculo","Estat I","AlgLin"),Notas=c("P1","P2")))
x<-list(Matricula=a,Nome=b,Notas=c)
x
## $Matricula
## [1] 123456
##
## $Nome
## [1] "João"
##
## $Notas
## Notas
## disciplina P1 P2
## Cálculo 6.0 7
## Estat I 8.5 6
## AlgLin 4.0 5
É possível acessar cada elemento da lista através do seu nome ou de sua posição:
x$Matricula
## [1] 123456
x[[2]]
## [1] "João"
x$Notas
## Notas
## disciplina P1 P2
## Cálculo 6.0 7
## Estat I 8.5 6
## AlgLin 4.0 5
#lapply(X, FUN, ...)
#sapply(X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE)
x <- list(a = 1:10, beta = exp(-3:3), logic = c(TRUE,FALSE,FALSE,TRUE))
x
## $a
## [1] 1 2 3 4 5 6 7 8 9 10
##
## $beta
## [1] 0.049787 0.135335 0.367879 1.000000 2.718282 7.389056 20.085537
##
## $logic
## [1] TRUE FALSE FALSE TRUE
sapply(x,mean)
## a beta logic
## 5.5000 4.5351 0.5000
lapply(x,mean)
$a
[1] 5.5
$beta
[1] 4.5351
$logic
[1] 0.5
lapply(x, quantile, probs = 1:3/4) # Podemos especificar comandos para FUN após sua declaração
$a
25% 50% 75%
3.25 5.50 7.75
$beta
25% 50% 75%
0.25161 1.00000 5.05367
$logic
25% 50% 75%
0.0 0.5 1.0
sapply(x, quantile,c(0.25,0.75))
a beta logic
25% 3.25 0.251607 0.0
75% 7.75 5.053669 1.0
Fatores são variáveis muito utilizadas em análises estatísticas. São, essencialmente, como listas, exceto que possuem elementos específicos.
factor(x = character(), levels, labels = levels, ordered = is.ordered(x))
ordered(x, ...)
is.factor(x)
is.ordered(x)
as.factor(x)
as.ordered(x)
factor(c(4,3,2,2,2,2,1,1,1,2,2,2,3,3,4,4,4,4,4,4))
## [1] 4 3 2 2 2 2 1 1 1 2 2 2 3 3 4 4 4 4 4 4
## Levels: 1 2 3 4
ordered(c(4,3,2,2,2,2,1,1,1,2,2,2,3,3,4,4,4,4,4,4))
## [1] 4 3 2 2 2 2 1 1 1 2 2 2 3 3 4 4 4 4 4 4
## Levels: 1 < 2 < 3 < 4
Podemos construir fatores a partir de variáveis caracter:
sex<-c(rep(1,times=15),rep(2,times=15))
tr<-rep(c(rep(1,times=5),rep(2,times=5),rep(3,times=5)),times=2)
f_sex<-factor(sex)
f_trat<-factor(tr)
f_sex
## [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## Levels: 1 2
f_trat
## [1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3
## Levels: 1 2 3
Note que, apesar de existir uma ordem sintática entre os elementos de alguns fatores (A,B,C), por exemplo, se não declararmos esta ordem com (ordered=TRUE), ela não será considerada, isto é, o fator será encarado como uma variável nominal ao invés de ordinal
y<-rnorm(mean=0,sd=1,n=30)
summary(aov(y~tr+sex))
## Df Sum Sq Mean Sq F value Pr(>F)
## tr 1 0.28 0.279 0.32 0.57
## sex 1 0.05 0.050 0.06 0.81
## Residuals 27 23.32 0.864
summary(aov(y~f_sex+f_trat))
## Df Sum Sq Mean Sq F value Pr(>F)
## f_sex 1 0.05 0.050 0.06 0.81
## f_trat 2 0.28 0.141 0.16 0.86
## Residuals 26 23.31 0.897
- Não utilizar a variável categórica da forma correta poderá, em alguns casos, ocasionar numa má interpretação dos dados e na tomada de decisão baseada em um ajuste não válido;
- É importante conhecer profundamente os dados que entrarão no modelo, para garantir que eles serão declarados da forma correta.
O R é uma linguagem orientada a objetos. Assim, é possível acessar as propriedades dos objetos de acordo com as características específicas de sua classe.
fit1<-aov(y~f_sex+f_trat)
class(fit1)
[1] "aov" "lm"
names(fit1)
[1] "coefficients" "residuals" "effects" "rank" "fitted.values" "assign"
[7] "qr" "df.residual" "contrasts" "xlevels" "call" "terms" "model"
attributes(fit1)
$names
[1] "coefficients" "residuals" "effects" "rank" "fitted.values" "assign"
[7] "qr" "df.residual" "contrasts" "xlevels" "call" "terms" "model"
$class
[1] "aov" "lm"
fit1$coefficients
(Intercept) f_sexB f_sexC f_tratM
-0.38265 0.24616 0.11951 0.79872
par(mfrow=c(2,2))
plot(fit1)
x<-numeric()
for (i in 1:7){
x[i]<-round(runif(1,min=1,max=30))
}
Data Frames são como matrizes, mas que possuem a faciclidade de aceitar colunas de diferentes classes. São a forma mais comum de utilização de dados importados, assim domo para análise e modelagem de dados.
data.frame(..., row.names = NULL, check.rows = FALSE,
check.names = TRUE, stringsAsFactors = default.stringsAsFactors())
- row.names: especificação da coluna que deve ser utilizada como nome das linhas
- check.rows: valor lógico - verificar consistencia das linhas?
- check.names: valor lógico - verificar consistencia dos nomes das variáveis em busca de duplicidade?
- stringsAsFactors: valor lógico - considerar variáveis caracter como fatores automaticamente?
y<-rnorm(mean=0,sd=1,n=30)
sex<-c(rep(1,times=15),rep(2,times=15))
tr<-rep(c(rep(1,times=5),rep(2,times=5),rep(3,times=5)),times=2)
f_sex<-factor(sex)
f_trat<-factor(tr)
f_sex
## [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
## Levels: 1 2
f_trat
## [1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3
## Levels: 1 2 3
dados<-data.frame(1:30,sex,tr,f_sex, f_trat,y,exp(y))
É possível modificar atributos específicos do data.frame
attributes(dados)
## $names
## [1] "X1.30" "sex" "tr" "f_sex" "f_trat" "y" "exp.y."
##
## $row.names
## [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
## [24] 24 25 26 27 28 29 30
##
## $class
## [1] "data.frame"
Retornam as ‘n’ primeiras(últimas) linhas do banco de dados.
head(dados)
## X1.30 sex tr f_sex f_trat y exp.y.
## 1 1 1 1 1 1 1.10230 3.01108
## 2 2 1 1 1 1 -0.47559 0.62152
## 3 3 1 1 1 1 -0.70944 0.49192
## 4 4 1 1 1 1 -0.50126 0.60577
## 5 5 1 1 1 1 -1.62909 0.19611
## 6 6 1 2 1 2 -1.16762 0.31111
tail(dados, n=3)
## X1.30 sex tr f_sex f_trat y exp.y.
## 28 28 2 3 2 3 -0.77335 0.46146
## 29 29 2 3 2 3 1.60591 4.98239
## 30 30 2 3 2 3 -1.15781 0.31417
attach(dados)
fit1<-aov(resp~f_sex+f_trat, data=dados)
summary(fit1)
Sem declarar o banco de dados com a opção ‘data’, seria necessário ajustar o modelo da seguinte forma:
fit1<-aov(dados$resp~dados$f_sex + dados$f_trat)
É possivel, ainda, anexar as variáveis do data.frame ao projeto, evitando, assim, a necessidade de se declarar o nome do banco de dados na sintaxe ‘dados$variavel’
attach(dados) # Utilize este comando para anexar o banco de dados 'dados'
## The following objects are masked _by_ .GlobalEnv:
##
## f_sex, f_trat, sex, tr, y
detach(dados) # DESanexa 'dados'
Nota: Variáveis que já estavam na workspace e que possuem o mesmo nome de variáveis do banco de dados anexado, sejam reais ou anexadas de outros data frames serão ocultadas.
a função merge é muito útil quando precisamos adicionar variáveis ao banco de dados em que estamos trabalhando, garantindo que elas serão adicionadas ao ‘sujeito’ correto.
O objetivo desta função é unir 2 bancos de dados a partir de uma coluna em comum, ou a partir dos nomes das linhas (row.names)
## Default S3 method:
merge(x, y, ...)
merge(x, y, by = intersect(names(x), names(y)), by.x = by, by.y = by, all = FALSE, all.x = all, all.y = all,
sort = TRUE, suffixes = c(".x",".y"), incomparables = NULL, ...)
Para termos o banco de dados unificado, considerando APENAS os casos que aparecem em ambos os bancos de dados(inner join), basta declararmos:
BancoFinal<-merge(banco1,banco2)
Já se desejamos a união de todos os casos, i.e, dos que aparecem em um ou outro banco de dados, devemos declarar:
BancoFinal<-merge(banco1,banco2, all=TRUE)
O merge identificará, automaticamente, as colunas que são comuns (i.e., possuem o mesmo nome) em ambos os bancos de dados e as utilizará como chaves para unificá-los.
rnorm(n=N, mean=mu, sd=sigma)
O R possui um grande poder de análise de dados. Para isso, no entanto, é necessário inserir os dados em sua workspace. Isto é possível através da importação dos dados em formato de arquivos de texto (TXT), tabulares ou delimitados(DAT,TAB,CSV), ou mesmo planilhas (XLS,XLSX). Vejamos inicialmente os dois primeiros casos. Para isso, duas funções são muito utilizadas: read.table e read.csv.
read.table {utils}
read.table(file, header = FALSE, sep = "", quote = "\"'",
dec = ".", row.names, col.names,
as.is = !stringsAsFactors,
na.strings = "NA", colClasses = NA, nrows = -1,
skip = 0, check.names = TRUE, fill = !blank.lines.skip,
strip.white = FALSE, blank.lines.skip = TRUE,
comment.char = "#",
allowEscapes = FALSE, flush = FALSE,
stringsAsFactors = default.stringsAsFactors(),
fileEncoding = "", encoding = "unknown", text)
read.csv(file, header = TRUE, sep = ",", quote="\"", dec=".",
fill = TRUE, comment.char="", ...)
read.delim(file, header = TRUE, sep = "\t", quote="\"", dec=".",
fill = TRUE, comment.char="", ...)
- file: Caminho e nome do arquivo que está sendo lido;
- header: Valor Lógico. Se ‘TRUE’ então o R entenderá que existe cabeçalho nos dados lidos
- sep: Caracter utilizado para separação de colunas (o valor padrão é ‘,’);
- dec: Caracter utilizado na separação de inteiro e decimal (o valor padrão é ‘.’);
- quote: Caracter utilizado para descriminar uma variável Caracter. o Padrão é ‘"’;
- Dados faltantes (missing) são gravados como ‘NA’.
Vejamos agora como importar dados a partir de um arquivo do excel. Para isso, é necessário ter um compilador Perl instalado.
A biblioteca gdata possui funções específicas para a leitura de planilhas em interfaces gráficas, como é o caso das planilhas do Microsoft Excel. Para executá-la, é preciso ter um compilador Perl instalado no computador.
read.xls {gdata}
read.xls(xls, sheet=1, verbose=FALSE, pattern, na.strings=c("NA","#DIV/0!"),
..., method=c("csv","tsv","tab"), perl="perl")
library(gdata)
gdata: read.xls support for 'XLS' (Excel 97-2004) files ENABLED.
gdata: read.xls support for 'XLSX' (Excel 2007+) files ENABLED.
Attaching package: ‘gdata’
The following object(s) are masked from ‘package:stats’:
nobs
The following object(s) are masked from ‘package:utils’:
object.size
Warning message:
package ‘gdata’ was built under R version 2.15.3
dados<-read.table("dados_cursoR.txt", sep="," head=T)
dados<-read.csv("dados_cursoR.csv", sep=";" head=T, skip=2)
dados<-read.xls("Exemplo_import.xlsx", sheet=1, skip=2)
Considere uma amostra aleatória de uma população com N observações. com n observações de uma variável X: \(\{X_1, X_2,...,X_n\}\).
A média amostral, \(\bar{X}\) é estimador não viesado para \(\mu\), média populacional e é definida por: \[
\bar{X}=\sum_{i=1}^{n} X_i
\] O desvio padrão amostral, \(S\) é um estimador não viesado para o desvio padrão populacional, \(\sigma=\sqrt{\sum_{i=1}^N \frac{(x_i-\mu)^2}{N}}\) e é definido por:
\[ S= \sqrt{\left( \sum_{i=1}^n \frac{(X_i-\bar{X})^2}{n-1}\right)} \]
A O Quartil 1 (\(Q_1\)), Mediana(\(Md\)) e o Quartil 3 (\(Q_3\)) são os valores que têm, menores que eles, respectivamente, 25%, 50% e 75% dos dados da variável considerada.
A moda é definida (informalmente) como o valor mais comum dentre os observados para a variável considerada.
Algumas funções comuns para o cálculo de medidas descritivas são:
x<-rnorm(30)
mean(x) # Calcula a média de x
[1] -0.23442
var(x) # Calcula a variância de x
[1] 1.3346
quantile(x, probs=c(0.25,0.5,0.75)) # Calcula os quantis de x, para as probabilidades dadas em 'probs'
25% 50% 75%
-1.00022 -0.41723 0.31696
var(x, y = NULL, na.rm = FALSE, use)
cov(x, y = NULL, use = "everything", method = c("pearson", "kendall", "spearman"))
cor(x, y = NULL, use = "everything", method = c("pearson", "kendall", "spearman"))
quantile(x, probs = seq(0, 1, 0.25), na.rm = FALSE, names = TRUE, type = 7, ...)
Uma outra função muito comum no cálculo de medidas descritivas é a função summary() Ela nos dá uma série de medidas descritivas de uma só vez para o conjunto de dados Seu resultado é, porém, dependente da classe do objeto:
summary(x)
Min. 1st Qu. Median Mean 3rd Qu. Max.
-2.080 -1.000 -0.417 -0.234 0.317 2.580
summary(Sexo)
Length Class Mode
30 character character
summary(factor(Trat))
A B C
10 10 10
```
summary(aov(y~tr+sex)) Df Sum Sq Mean Sq F value Pr(>F) tr 1 0.9 0.950 0.73 0.40 sex 1 0.1 0.112 0.09 0.77 Residuals 27 35.3 1.306
## Medidas descritivas por grupo
A função *tapply* aplica uma função específica para grupos dentro de um vetor.
Trat<-rep(c(rep(“A”,times=5),rep(“B”,times=5),rep(“C”,times=5)),times=2) Trat [1] “A” “A” “A” “A” “A” “B” “B” “B” “B” “B” “C” “C” “C” “C” “C” “A” “A” “A” “A” “A” “B” “B” “B” “B” “B” [26] “C” “C” “C” “C” “C” Sexo<-c(rep(“M”,times=15),rep(“F”,times=15)) Sexo [1] “M” “M” “M” “M” “M” “M” “M” “M” “M” “M” “M” “M” “M” “M” “M” “F” “F” “F” “F” “F” “F” “F” “F” “F” “F” [26] “F” “F” “F” “F” “F”
x<-rnorm(30) tapply(x,Trat,mean) A B C 0.10071 0.25269 0.27933 tapply(x,Sexo,mean) F M -0.060551 0.482365 ```
- Permitem que você controle a execução de um program dependendo da estrutura e condição dos dados. Funções comuns são:
- if, else: Testa uma condição
- for: executa uma rotina um número específico de vezes
- while: executa uma rotina até que uma condição seja satisfeita
- repeat: repete uma tarefa
- break: interrompe a execução de um loop
- next: pula uma execução para a próxima iteração
- return: termina uma função
Estas estruturas de controle são bastante utilizadas durante a construção de scripts e funções.
UFBA | Campus Ondina
Instituto de Matemática | Departamento de Estatistica
Sala 260