UFJF | FACULDADE DE ECONOMIA | ECONS

LABORATÓRIO DE ESTUDOS ECONÔMICOS

Introdução ao R - ECONS

André Suriane; Stephanie M.P. da Costa.

Antes de começar

Por que usar o R?

  • Livre e Gratuito;
  • Não serve somente para econometria/estatística;
  • Automatizar/repetir procedimentos;
  • Similiaridade e associação com outras linguagens de programação;
  • Facilidade de divulgar/dividar resultados com outros programas e formatos (LATEX, Shiny, PDF, MarkDown, Jupyter(HTML, GIT, ipynb,doc) ...);
  • Quantidade, diversidade e qualidade dos pacotes;
  • Tamanho da comunidade;
  • Facilidade de encontrar suporte na web;
  • Pacotes e funções são atualizados constantemente;
  • Mercado de trabalho (grandes empresas estão cada vez mais interessados em prossionais que saibam usar R);
  • Te obriga a ter um conhecimento teórico maior;
  • Conversa com outros softwares;
  • Liberdade na implementação e criação de scripts.

quais são os custos?

  • iniciação difícil;
  • necessidade de aprofundamento computacional para execução das tarefas;

1 Introdução

Este curso tem um perfil de introdutório de manipulação, análise e apresentação gráfica de dados. O objetivo deste curso é capacitar o usuário a visualizar, manipular e analisar dados no R a partir da compreensão da estrutura e funcionamento do software. Para isso são apresentados a operacionalização do R e algumas funções básicas, como manipular bancos de dados, melhorar a "aparência" dos dados, modificar e criar variáveis, calcular estatísticas descritivas e criar apresentações gráficas dos dados.

O curso está dividido em duas partes:

na primeira será mostrado a operacionalização do R, com funções e manipulação e definição de objetos. O foco é garantir ao aluno conhecimento que permita ele ingressar no uso do software sem maiores barreiras; a segunda parte, foca em mostrar elementos básicos da análises estatística e econômica no R.

Para mais informações acesse a página do ECONS (www.ufjf.br/econs/).

«

1.1 Instalando o R

O R é um software livre para computação estatística e construção de gráficos que pode ser baixado e distribuído gratuitamente de acordo com a licença GPL. O R está disponível para as plataformas UNIX, Windows e MacOS.

Windows - Instalação rápida

  • baixe a última versão do aplicativo no link, e execute seguindo as observações para instalação.

http://cran-r.c3sl.ufpr.br/bin/windows/base/

Interface R no sistema operacional Windows

Linux - distribuição Ubuntu

  • Execute em um terminal

Ubuntu

sudo apt-get install r-base r-base-core

Fedora/RHEL/CENTOS

sudo yum install R

Obs: Entre em http://cran-r.c3sl.ufpr.br/bin/linux e veja as instruções específicas para sua distribuição. As distribuições que já possuem pacotes pré-compilados são: Debian(Ubuntu), RedHat(CentOS), Fedora, Suse(OpenSuse).

Interface R no sistema operacional Linux - Ubuntu

«

1.2 Interface do R

Fazer dowload no link: https://www.rstudio.com/products/rstudio/download/

Escolher a ultima versão do RStudio para instalar, lembrando sempre que pode haver versões novas.

Interface do RStudio


«

2 Comandos Básicos

2.1 Utilizando Ajuda

O R conta com o comando help() para consultar a sintaxe de algum comando ou obter mais informações sobre determinada função. (Podemos usar também o painel do RStudio).

Exemplo:

In [ ]:
help(comando) # sintaxe 
help(sqrt)
help("sqrt")   #ajuda sobre o comando de raiz quadrada
?sqrt
help.search("sqrt")

Ao executar o exemplo acima no R, uma interface do menu de ajuda será executada mostrando o tópico da função sqrt, que é função matemática para a raiz quadrada.

Exemplo da descrição de ajuda para a função sqrt.

«

2.2 Pacotes

O R conta com uma infinidade de pacotes permitindo o usuário as mais diversificadas ações. Para installar um pacote use install.packages("pkg.name") ou use o painel do RStudio (Packages/Install).

Exemplo:

install.packages("ggplot2")


Pacotes úteis

Nome Descrição
Manipulação de dados
dplyr* manipulação de dados
feather Abrir e salvar dados de forma eficiente
foreign* Importar e exportar bases de/para outros programas
haven* Importar e exportar bases de/para outros programas
DBI Conectar com bases de dados
filehash Alocar memoria em HD para grandes bases de dados
RSQLite Conectar com bases SQLite (requer DBI)
tidyverse Data science
Gráficos
ggplot2* Criar manipular gráficos
ggfortify* Gráficos para resultados de modelos
ggcorrplot* Gráfico de correlações
grid Combinar, criar arranjos gráficos
lattice alternativa ao contour plot
viridis* Paleta de cores alternativa
plotly Criar manipular gráficos
Exportar resultados em LaTeX ou HTML
Hmisc Exportar em LATEX ou HTML e outras funções
xtable Exportar em LATEX ou HTML
Algebra
Matrix Operações com Matrizes
Rfast Funções eficientes de manipulação algebrica
Estatística
survival Regressões censuradas
systemfit Sistema de Equações
MASS Várias funções estatísticas
MVar.pt* Análise multivariada com saídas em português
nlme Efeitos fixos e Aleatórios
nls2 Regressões não lineares
nnet Multinomial logit/probit
Acesso a Dados
Quandl Acesso a dados financeiros e econômicos em geral
quantmod Acesso e ferrementas dados financeiros e econômicos em geral
BatchGetSymbols Acesso a dados financeiros
BETS Dados macroecônomicos do Brasil
microdadosBrasil Microdados do Brasil
lodown Microdados produzindos no mundo

*devem ser instaladas para o curso de introdução.

Para ter acesso as funções de pacote deve usar a função:

library(pacname) ou require(pacname)

Pelo RStudio basta selecionar o pacote pela janela Packages.

«

2.3 Atribuição de Valores

Como todo tipo de programação, é comum que tenhamos que atribuir valores para algumas variáveis antes de utilizá-las. No R podemos fazer uma atribuição de valores de várias formas, conforme os exemplos abaixo:

In [4]:
x <- 5 # x recebe o valor 5
x = 19 # x recebe o valor 19
assign ("x", 2i) # x recebe o numero imaginario 2i  
#obs: o ultimo valor que x recebe é o que permanece, neste caso x=19

Apesar das diferentes formas de atribuição mostradas acima. Utilizaremos nessa apostila, por uma questão de precedência de operadores, sempre os símbolos <- para atribuição de valores.

Para mostrar o valor armazenado em uma variável, basta digitar a variável no Console e apertar Enter. Qualquer valor digitado sem atribuição pode ser mostrado na tela.

In [54]:
x <- 50    # x recebe o valor 50
x/20        # x dividido por 20
2.5
In [55]:
x  <- 10:20    # cria uma sequencia de números de 10 a 20
x[1:5]    # mostra os 5 primeiros números da sequencia criada
  1. 10
  2. 11
  3. 12
  4. 13
  5. 14
In [56]:
y <- sum((10:20)^2)==sum(x^2)
 y
TRUE
In [1]:
x <- seq(0, 50, l = 101)               # cria uma sequencia de 0 a 50 com 101 números
y <- 1 - (1/x) * sin(x)                # cria um valor para y
plot(x,y,  type = "l", col = "blue")   # constrói um gráfico com as variáveis x e y na cor azul

«

2.4 Comandos Auxiliares

Abaixo veremos uma tabela com os principais comandos que ajudam a manipular os objetos e a "workspace" que estão sendo utilizados durante a execução do programa.

In [ ]:
install.packages() # Instalar pacotes
  library() # Loads packages 
  c() list() # Construir vetor; Listar vetor
  data.frame() # Construir data.frames 
  x:y seq(x,y,...) # Criar vetor entre valores x e y 
  getwd() # Mostrar o diretorio atual 
  setwd() # Definir o diretorio de trabalho 
  dir() # Listar os arquivos no diretorio de trabalho 
  ?  # Buscar ajuda
  read.table() read.csv() read.delim() # Importar dados 
  colnames() # Informar ou aplicar nomes em vetores
  head() tail() # Informar primeiro é ultimo dado em um data.frame 
  summary() aggregate() table(x) addmargins(table(x)) prop.table(table(x), 1:2) # Estimar tabelas estatisticas 
  x[i], x[i, j], x$j # Extrair ou aplicar a elementos de matrizes e data.frames
  plot(y ~ x) hist(y) boxplot(y ~ x) # Gerar graficos 
  na.omit() # omitit missins

Exemplos:

In [2]:
#setwd("C:/Rcurso 2020") ## definir pasta de trabalho
getwd()   # mostrar pasta de trabalho
x <- seq(0, 50, l = 101)
y <- 1 - (1/x) * sin(x)
mean(x)       # media de x
mean(y)     # media de y   **vai dar NaN
mean(y, na.rm=TRUE)    # media de y, removendo NaN
'/mnt/Disco1/Jupyter/R/Rcurso2019'
25
NaN
0.973985776746886
In [20]:
# remover Na NaN
mean(na.omit(y)) 
sum(y, na.rm = TRUE)
cor(x[2:50], y[2:50])
0.973985776746886
97.3985776746886
0.411679957637109

«

2.5 Operações matemáticas simples

As operações matemáticas simples que podem ser executadas no R são:

  • potenciação (^);
  • divisão (/);
  • divisão inteira ( % / %) - retorna o quociente inteiro da divisão;
  • divisão resto (%%); - retorna o resto da divisão
  • multiplicação (∗);
  • adição (+);
  • subtração (-)

    Exemplo:

In [28]:
x = 9.8*(36/10)
x = 40+ x*(40-x)
x
206.5216
In [29]:
20 / 3
20 %/% 3  # retorna o quociente inteiro da divisao
20 %% 3  # retorna o resto da divisao
6.66666666666667
6
2
In [25]:
x <- 4
y <- 3
x+y; x-y; x*y; x/y; x^y; x**y; x%/%y; x %% y # Operadores aritmeticos
7
1
12
1.33333333333333
64
64
1
1

«

2.6 Operações lógicas simples

  • não (!);
  • diferente(!=)
  • e (&)
  • ou (|)
  • ou exclusivo (xor(x,y));
  • verificando vetor unitário (isTrue(x));
  • e (&&) # operacao com vetor;
  • ou (||) # operacao com vetor.

Exemplo:

In [17]:
1!=2; 1!=1; 1&2<=1; 1&2>0; 1|2!=1; 1|2==1    #TRUE OR FALSE?
cat("verificar variável")
x <- 1
y <- -1
x<y; x>y; x<=y; x>=y; x==y; x!=y;  # Operadores relacionais 
cat("verificar valor em vetor")
x <- 1
Y <- -1:1
x%in%Y 
x>Y
TRUE
FALSE
FALSE
TRUE
TRUE
TRUE
verificar valor
FALSE
TRUE
FALSE
TRUE
FALSE
TRUE
verificar valor em vetor
TRUE
  1. TRUE
  2. TRUE
  3. FALSE
In [42]:
x <- c(3,0);    # cria objeto
(2<=x)&(4>=x)   #3 é maior ou igual a 2?  e  4 é maior ou igual a 0? 
(x<=1)|(x==4)
  1. TRUE
  2. FALSE
  1. FALSE
  2. TRUE
In [52]:
x <- c(TRUE, TRUE, FALSE, FALSE)
y <- rep(TRUE,4)
z <- rep(FALSE,4)
nx <- c( FALSE, FALSE,TRUE, TRUE)

# Operadores logicos 

cat("___ou___")
x&y; 
x&&y; x&&z;  y&&z; x&&nx;
cat("___e___")
x|y; 
x||y; x||z;  y||z; z||FALSE;
___ou___
  1. TRUE
  2. TRUE
  3. FALSE
  4. FALSE
TRUE
FALSE
FALSE
FALSE
___e___
  1. TRUE
  2. TRUE
  3. TRUE
  4. TRUE
TRUE
TRUE
TRUE
FALSE

«

2.7 Funções matemáticas simples

Algumas chamadas de funções matemáticas simples.

  • abs(x) # valor absoluto
  • log(x,b) # logaritmo de x com base b
  • log(x) # logaritmo natural de x
  • log10(x) # logaritmo de x com base 10
  • exp(x) # exponencial elevado a x
  • sin(x) # seno de x
  • cos(x) # cosseno de x
  • tan(x) # tangente de x
  • round(x, digits = n) # arredonda x com n decimais
  • ceiling(x) # arredondamento de x para o maior valor
  • floor(x) # arredondamento de x para o menor valor
  • length(x) # numero de elementos do vetores
  • sum(x) # soma dos elementos do vetor x
  • prod(x) # produto dos elementos do vetor x
  • max(x) # seleciona o maior elemento do vetor x
  • min(x) # seleciona o menor elemento do vetor x
  • range(x) # retorna o menor e o maior elemento do vetor x

«

3 Objetos básicos

O R é orientado a objetos. Os tipos básicos de objetos são: vetores, matrizes, dataframes, listas e funcões. Nessa seção aprenderemos um pouco mais sobre essas estruturas de dados e alguns comandos básicos para manipulá-las. É importante salientar que muitas funções são orientadas especificamente a natureza do objeto, assim uma mesma função pode retornar saídas diferentes dependendo da natureza do objeto, mas é mais comum existir funções que são exclusivas a uma natureza específica, levando ao erro caso da função caso a definição do objeto seja diferente da demandada pela função.

3.1 Vetores

Vetores são uma sequências de valores numéricos ou de caracteres(letras, palavras). Sua principal utilidade é poder armazenar diversos dados em forma de lista e aplicar funções e operações sobre todos os dados pertencentes a determinado vetor com apenas poucos comandos.

Exemplo:

In [58]:
vec1 <- c(1,4,10,13.10,91,15.8) #forma mais simples de declarar um vetor
vec1
  1. 1
  2. 4
  3. 10
  4. 13.1
  5. 91
  6. 15.8
In [59]:
vec2 <- 1:6 # cria um vetor com uma sequencia de 1 ate 6
vec2
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
In [60]:
vec3 <- c((1:3),(3:1))
vec3
  1. 1
  2. 2
  3. 3
  4. 3
  5. 2
  6. 1
In [61]:
vec4 <- c(0,vec3[1:2], vec3[5:6] , 0)
vec4
  1. 0
  2. 1
  3. 2
  4. 2
  5. 1
  6. 0
In [62]:
seq(from = 1, to = 8)  # vetor de 1 ate 8
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
In [66]:
seq(from = 1 ,to = 15, length.out = 3)   #vetor de 1 ate 15 com 2 elementos 
 seq(from = 1 , to = 15, by = 3)  #vetor de 1 ate 15 com passo 2
  1. 1
  2. 8
  3. 15
  1. 1
  2. 4
  3. 7
  4. 10
  5. 13
In [68]:
rep(10, 3)  # repete o elemento 10, dez vezes
  rep(3:4, 2)  #repete a sequência de 3 a 6, três vezes
  1. 10
  2. 10
  3. 10
  1. 3
  2. 4
  3. 3
  4. 4

«

3.2 Arrays

Podemos definir arrays como um conjunto de elementos de dados, geralmente do mesmo tamanho e tipo de dados. Elementos individuais são acessados por sua posição no array. A posição é dada por um índice, também chamado de subscrição. O índice geralmente utiliza uma sequência de números naturais. Arrays podem ser de qual- quer tipo, porém neste capítulo abordaremos apenas arrays numéricos, devido a sua grande importância para declaração de matrizes. Existem arrays unidimensionais e multi- dimensionais. Arrays numéricos unidimensionais nada mais são do que vetores, como já vimos. Já arrays numéricos multidimensionais podem ser usados para representação de matrizes.

Exemplo:

In [73]:
# x <- array (dados, dim = vetor_dimensao) #sintaxe
x <- array(c(10:20), dim = c(2,2))
 x
A matrix: 2 × 2 of type int
1012
1113

Obs: Vetores são arrays de uma dimensão. Já Arrays podem ser definidos com quantas dimensões o usuário desejar.

«

3.3 Matrizes

Matrizes são coleções de vetores em linhas e colunas, todos os vetores devem ser do mesmo tipo (numérico ou de caracteres).

 x <-matrix(data = dados, nrow = m, ncol = n, byrow = Q) #sintaxe
  • "m" = numero de linhas,
  • "n" = numero de colunas
  • se Q = 1 #ativa disposicao por linhas
  • se Q = 0, mantem disposicao por colunas
In [20]:
M <- matrix(c(21:28), 2,4 )   # matriz com uma sequencia de 21 a 28, de 2 linhas e 4 colunas
 M 
 M[1,3]                        # retorna o elemento que se encontra na linha 1 e coluna 3
 M[2,1:2]                      # retorna todos os elementos da linha 2
A matrix: 2 × 4 of type int
21232527
22242628
25
  1. 22
  2. 24
Operações e funções matriciais

Abaixo segue uma tabela com as principais operações e funções realizadas entre matrizes para algebra linear.

  • A*B # produto elemento a elemento de A e B
  • A%*%B #produto matricial de A por B
  • A %o% B # AB'
  • crossprod(A,B) # t(A)%*%B
  • tcrossprod(A,B) # A%*%t(B)
  • crossprod(A) # t(A)%*%A
  • A = aperm (A) # matriz transposta
  • A = t(A) # matriz transposta
  • B = solve(B) #matriz inversa B = B^{-1}
  • x = solve(A,b) #resolve o sistema linear Ax = b
  • det(C) # se C é matrix...retorna o determinante de C
  • diag(v) # se v é vetor...retorna uma matriz diagonal onde o vetor v é a diagonal
  • diag(A) # se A é matrix...retorna um vetor que é a diagonal da matriz A
  • diag(n) # se n é um inteiro, retorna uma matriz identidade de ordem n
  • eigen(A) # retorna os autovalores e autovetores de A
  • svd(A) # Decomposição em valores singulares
  • chol(A) # Decomposição de Choleski
In [13]:
n = 5
A=matrix(rnorm(n*n, 0, 2) , n , n)
v = c(1:10)
diag(v)
diag(A)
diag(n)
A matrix: 10 × 10 of type int
100000000 0
020000000 0
003000000 0
000400000 0
000050000 0
000006000 0
000000700 0
000000080 0
000000009 0
00000000010
  1. -0.556391402516848
  2. -0.383560495293595
  3. 1.08551809710898
  4. -1.49167923098229
  5. -0.707581172107287
A matrix: 5 × 5 of type dbl
10000
01000
00100
00010
00001
In [36]:
M <- matrix(c(1,2,3,5,7,11,13,17), 2,4 )
A <- M%*%t(M)
B <- t(M)%*%M
C <- kronecker(t(M), M) # == t(kronecker(M, t(M)))
D <- replicate(8,"_|_")
D<- cbind(rbind(A, matrix("-",6,2) ),D,rbind(B,matrix("-",4,4)),D,C)
colnames(D)<- c("A1", "A2", "T",  "B1", "B2","B3", "B4","T",  "C1", "C2","C3", "C4", "C5", "C6","C7", "C8" )
D

# rbind() # juntar matrizes verticalmente 
# cbind() # juntar matrizes horizontamente
A matrix: 8 × 16 of type chr
A1A2TB1B2B3B4TC1C2C3C4C5C6C7C8
228315_|_5 13 29 47 _|_1 3 7 13 2 6 14 26
315439_|_1334 76 124_|_2 5 11 17 4 1022 34
- - _|_2976 170278_|_3 9 21 39 5 1535 65
- - _|_47124278458_|_6 1533 51 102555 85
- - _|_- - - - _|_7 2149 91 113377 143
- - _|_- - - - _|_143577 1192255121187
- - _|_- - - - _|_133991 1691751119221
- - _|_- - - - _|_26651432213485187289

Resolver o sistema de equações:

  • x + y =0
  • y + 4z =1
  • y + 2z =5
In [57]:
b <- array(c(0,1,5), dim = c(3,1))
C <- matrix(c(c(1,1,0),c(0,1,4),c(0:2)),3,3,1)   # 1 linhas 0 colunas (0 é o padrão)
R = solve(C,b)
matrix(c("x","y","z", R) ,3,2)
x -9
y 9
z -2
  • rowSums(a) - Soma de elementos das linhas da matriz
  • colSums(a) - Soma de elementos das colunas da matriz
  • rowMeans(a) - média das linhas
  • colMeans(a) - média das colunas
In [63]:
A <- matrix(c(1,2,3,4),2,2)
matrix(c(colMeans(A),
       colSums(A),
       rowSums(A),
       rowMeans(A)), 2,4)
1.53 4 2
3.57 6 3
In [66]:
B <- D[,c(9,13,10,14,11)]
class(B) <- "numeric"
B <- B[B[,1]<10,]
B[1,4] <- B[2,3] 
B[4,1] <- B[3,2] 
B
A matrix: 5 × 5 of type dbl
C1C5C2C6C3
1 2 3 5 7
2 4 51011
3 5 91521
510152533
711213349
In [65]:
det(B)
round(solve(B),5)
4
A matrix: 5 × 5 of type dbl
C1-1.0 3-5.5-1.0 2.5
C5 3.0 0-1.0 0.0 0.0
C2-5.5-1 0.0 1.5 0.0
C6-1.0 0 1.5 0.0-0.5
C3 2.5 0 0.0-0.5 0.0

3.4 Listas

Listas são conjuntos de objetos de "qualquer" natureza no R, como vetores, data frames, matrizes, scalares ou até mesmo listas. Não precisam ter o mesmo tamanho ou a mesma natureza.

In [68]:
a = list(A = 1, "b", 34, c(1,2,3,4), f = function(x){x^2})
a$f(2)
a
4
$A
1
[[2]]
'b'
[[3]]
34
[[4]]
  1. 1
  2. 2
  3. 3
  4. 4
$f
function (x) 
{
    x^2
}

«

3.5 Data frames

Data frames também são coleções de vetores, mas aceitam vetores de tipos diferentes (numéricos e caracteres). Normalmente, guardamos dados em objetos do tipo data frame, pois sempre temos variáveis numéricas e variáveis categóricas, por exemplo, nome do aluno e idade do aluno, respectivamente. Desse modo, essa estrutura proporciona mais liberdade para manipulação de dados.

Com a função data.frame reunimos vetores de mesmo comprimento em um só objeto:

dataframe <- data.frame() #sintaxe

Exemplo:

In [71]:
df <- data.frame (ipca = c(6.62, 4.61,6.03,5.28, 5.70),
                selic = c(1.46, 1.15, 1.16, 1.21, 1.24))
df[1:2,]
A data.frame: 2 × 2
ipcaselic
<dbl><dbl>
6.621.46
4.611.15

Transformando outros objetos em um data.frame com a função as.data.frame()

In [68]:
ipca <-c(6.62,4.61,6.03,5.28, 5.70)           # cria objeto
selic <- c(1.46,1.15,1.16,1.21,1.24)
nivel_emprego <- c(159.1473,158.0703,156.1412,152.7011,150.9488)
df2 <-data.frame (ipca ,selic , nivel_emprego )   #criando data.frame com os objetos dados
df2[1:3,]      # mostra data.frame com as linhas de 1 a 3
A data.frame: 3 × 3
ipcaselicnivel_emprego
<dbl><dbl><dbl>
6.621.46159.1473
4.611.15158.0703
6.031.16156.1412

O data.frame sempre terá rownames e colnames.

In [69]:
rownames(df2)
names(df2)
colnames(df2)<- c("ipca" , "selic", "ne")
colnames(df2)
  1. '1'
  2. '2'
  3. '3'
  4. '4'
  5. '5'
  1. 'ipca'
  2. 'selic'
  3. 'nivel_emprego'
  1. 'ipca'
  2. 'selic'
  3. 'ne'

Ordenado data.frame

In [30]:
newdf <-df2[ order ( selic ) ,] # ordenando todo o data.frame segundo a variavel selic em ordem crescente
newdf
ipcaselicne
24.61 1.15 158.0703
36.03 1.16 156.1412
45.28 1.21 152.7011
55.70 1.24 150.9488
16.62 1.46 159.1473
In [34]:
newdf2 <-df2[ order (ipca ,selic ),]
newdf2
ipcaselicne
24.61 1.15 158.0703
45.28 1.21 152.7011
55.70 1.24 150.9488
36.03 1.16 156.1412
16.62 1.46 159.1473
In [38]:
df2[ order (-ipca , selic ) ,]
ipcaselicne
16.62 1.46 159.1473
36.03 1.16 156.1412
55.70 1.24 150.9488
45.28 1.21 152.7011
24.61 1.15 158.0703

Para remoção de uma coluna no dataframe basta atribuir NULL a coluna desejada.

Exemplo:

In [72]:
df$selr <- df$selic+df$ipca
df$ipca <-NULL
df
A data.frame: 5 × 2
selicselr
<dbl><dbl>
1.468.08
1.155.76
1.167.19
1.216.49
1.246.94

Fazer operações e agregar data frames por variáveis de grupo

In [97]:
datacsv <- read.csv2("Exemplo/Exemplo1_ipca.csv",header =T, sep=";", dec=".")
ipca <- datacsv
colnames(ipca)<- c("data", "ipca12")
ipca$ano <- floor(ipca[,1])
ipca$min <- ave(ipca$ipca12, ipca$ano, FUN = min)
ipca$max <- ave(ipca$ipca12, ipca$ano, FUN = max)
ipca$mean <- ave(ipca$ipca12, ipca$ano, FUN = mean)

ipca2 <- aggregate(x = ipca,
              by = list(ipca$ano),
              FUN = mean)
ipca2[1:5,];
ipca[1:5,]
A data.frame: 5 × 7
Group.1dataipca12anominmaxmean
<dbl><dbl><dbl><dbl><dbl><dbl><dbl>
19801980.065 5.92250019804.23 9.48 5.922500
19811981.065 5.75416719814.97 6.84 5.754167
19821982.065 6.16000019824.44 7.81 6.160000
19831983.065 8.43333319836.4810.30 8.433333
19841984.06510.04583319848.9411.9810.045833
A data.frame: 5 × 6
dataipca12anominmaxmean
<dbl><dbl><dbl><dbl><dbl><dbl>
1980.016.6219804.239.485.9225
1980.024.6219804.239.485.9225
1980.036.0419804.239.485.9225
1980.045.2919804.239.485.9225
1980.055.7019804.239.485.9225

Outras funções:

  • names() # retorna os nomes das colunas
  • with() # permite operacoes nas colunas sem repetir o nome do data.frame seguido de "$" , [ , ] ou [[]].
  • sapply()# aplica uma determinada funcao nas colunas de um data.frame
  • lapply() # aplica uma determinada funcao nas colunas de um data.frame , retornando uma lista
  • filter() # permite filtrar apenas colunas de uma determinada classe ou referente a alguma condicao
  • attach() # anexa ao conjunto de dados , de modo a poder chamar colunas diretamente
  • cumsum() # a soma cumulativa de todas as entradas tomadas coluna a coluna .
  • cumprod() # o produro cumulativo de todas as entradas tomadas coluna a coluna
  • cummin() # retorna um vetor onde o n- esimo elemento eh o minimo de x[1] ate x[i]
  • cummax() # retorna um vetor onde o n- esimo elemento eh o maximo de x[1] ate x[i]
  • saveRDS() # salvar um data.frame comprimindo os dados (pode levar tempo no caso de grandes bases)
  • agregate() # agregar dados segunda variavel de grupo
  • subset() # selecionar partes do data frame
  • merge() # juntar dois dataframes por meio de controle de codigos ou nomes de colunas ou linhas
In [1]:
df <- data.frame(casa = c(1:100),
                 festa = seq(0,1,l = 100),
                 util = rnorm(100),
                 dy = round(seq(0,1,l = 100),0)
                )
tail(df)

# dividir data frame
a <- split(df$util,df$dy)
summary(a)

#Aplicar e combinar
lapply(a,mean)

#Aplicando e simplificando
sapply(a, mean)
vapply(a, mean, numeric(1))

# Dividir, Aplicar e Combinar junto
tapply(df$util, df$dy, mean)

aggregate(df$util, by=list(df$dy), mean)

aggregate(util~dy,df, mean)
A data.frame: 6 × 4
casafestautildy
<int><dbl><dbl><dbl>
95 950.9494949 0.077954941
96 960.9595960 0.197616181
97 970.9696970 2.246556261
98 980.9797980-0.428062421
99 990.9898990 0.233006551
1001001.0000000 0.716098821
  Length Class  Mode   
0 50     -none- numeric
1 50     -none- numeric
$`0`
-0.141514710431814
$`1`
-0.0476781146322781
0
-0.141514710431814
1
-0.0476781146322781
0
-0.141514710431814
1
-0.0476781146322781
0
-0.141514710431814
1
-0.0476781146322781
A data.frame: 2 × 2
Group.1x
<dbl><dbl>
0-0.14151471
1-0.04767811
A data.frame: 2 × 2
dyutil
<dbl><dbl>
0-0.14151471
1-0.04767811
In [3]:
e <- 5e3
x <- matrix(rnorm(e*e),e*e,1)
b <-data.frame(x)
hypot <- function(x) sqrt(x^2+x^2)
system.time({a1 <- apply(x, 2, var)})
system.time({a1 <- with(b, var(x))})
system.time({a1 <- Rfast::colVars(x)})
   user  system elapsed 
  0.263   0.033   0.295 
   user  system elapsed 
  0.057   0.013   0.070 
   user  system elapsed 
  0.129   0.000   0.129 

«

4 Importação de dados

Se os dados estiverem salvos em arquivos, sob forma de planilhas, tabelas, etc., deve- se fazer com que o R leia estes arquivos, transformando-os em um objeto. Para que o R reconheça o conjunto de dados do arquivo é necessário que as colunas sejam separadas. Caso isso não ocorra o R não conseguirá separar as colunas e emitirá uma mensagem de erro. Um modo fácil de resolver este problema é salvar a planilha de dados com o formato (.csv) que utiliza virgula (,) como elemento separador das colunas. Porém, antes de iniciar a entrada de dados no R deve-se alterar a pasta de trabalho padrão em que o arquivo de dados .csv será salvo. Para isso basta ir em :Arquivo/Mudar dir... e alterar o diretório em que será salvo o arquivo. Ao abrir a página de alteração do diretório, escolha o diretório em que será salvo o arquivo. Depois de salvar o arquivo no diretório especificado, carregue o arquivo no console do R.

Outra maneira de alterar o diretório é utilizar o seguinte comando, especificando, como argumento, o diretório requerido:

setwd('C:/Rdados') # copie o endereço do diretório, # mas não esquece de trocar as barras \ -> /

Conferindo o diretório atualizado através do comando:

getwd ()

«

4.1 Importando arquivos .csv

De posse da pasta de trabalho e do arquivo no formato .csv na pasta Rdados, procederemos com o seguinte comando:

dir ()

Com este comando o R irá verificar se há algum arquivo na pasta de trabalho. Como previamente havíamos salvo um arquivo .csv, sabemos que o R irá encontrar este arquivo no diretório especificado anteriormente.

O primeiro consiste no arquivo "exemplo1.csv". Importaremos o exemplo1.csv, disponível na página do curso. Observe o conteúdo do arquivo e veja que ele est´a separado por vírgulas, como e típico em arquivos desse tipo. Para fazer a importação, usaremos a função read.csv2. Em seguida, devemos dar o comando para que o R carregue o arquivo .csv no console de trabalho. Para isso digite o seguinte comando:

In [79]:
datacsv <- read.csv2("Exemplo/Exemplo1_ipca.csv",header =T, sep=";", dec=".")
#
#datacsv <- read.table("~/Jupyter/Rcurso/Exemplo/Exemplo1_ipca.csv",header =T, sep=";" ,dec=",")
In [80]:
datacsv[1:5,]
datainflação_ipca.
1980.016.62
1980.024.62
1980.036.04
1980.045.29
1980.055.70

Sendo:

  • datacsv: é o objeto no qual os dados lidos serão reconhecidos pelo R;
  • read.csv2 : função que lê o arquivo do tipo.csv.
  • read.table: função que também lê arquivos do tipo.csv, mas organiza os dados em formato de tabela.

O parâmetro "header" nos permite indicar se o arquivo de dados (data.frame) tem ou não o nome nas colunas (título) na primeira linha de dados. O segundo parâmetro "sep" permite indicar o tipo de separador dos dados presentes no arquivo. Neste caso, o separador "," indica que a delimitação do campo de cada dado será feita por vírgulas. Finalmente o parâmetro "dec" permite indicar o caractere usado como separador de casas decimais dos números reais.

Observação:

existem outras sintaxes para carregar dados no console do R (verifique isso utilizando o comando “help(read.table)”), porém os argumentos permanecem idênticos aos apresentados anteriormente.

Caso o arquivo tenha título, podemos verificar o nome destes títulos através do comando:

names() # no argumento vai sempre o nome do objeto desejado

Podemos ver a dimensão do arquivo carregado por meio do seguinte comando:

dim()

`head () # retorna a primeira parte de um vetor , matriz , tabela , data frame ou funcao.'

In [145]:
names(datacsv);
dim(datacsv);
head( datacsv , 5) # igual datacsv[1:5 ,]
  1. 'data'
  2. 'inflação_ipca.'
  1. 458
  2. 2
datainflação_ipca.
1980.016.62
1980.024.62
1980.036.04
1980.045.29
1980.055.70

Isto porque o R, agora, considera o arquivo carregado como uma matriz ou data.frame. Desta forma, podemos localizar linhas, colunas e elementos desta matriz. Para isso, utilize os comandos abaixo: datacsv[1:5,] , datacsv[1,1].

Para desenvolver um exemplo com um arquivo .txt seguimos os seguintes passos:

dir() # verifica a presenca de arquivos no diretorio de trabalho

In [81]:
datatxt <- read.table('Exemplo/arquivoteste.txt',header=T, sep = ",", dec=".")
 datatxt[1:3,]
DATAInflação_IPCASELICDESEMPREGO
1980.01 6.6156491.46 159.1473
1980.02 4.6169191.15 158.0703
1980.03 6.0383891.16 156.1412

Podemos ainda carregar um arquivo de qualquer diretório basta apenas informar este diretório no comando. Para isso, basta utilizar a sintaxe abaixo:

datatxt <- read.table('/mnt/Disco1/Jupyter/Rcurso/Exemplo/arquivoteste.txt',header=T, sep = ",", dec=".")

Vamos agora realizar um recorte no conjunto de dados. Para isso vamos usar a função subset e selecionar somente as taxas entre 2000 e 2001 para fins de comparação mais adiante.

In [82]:
ipca <- read.csv2("/mnt/Disco1/Jupyter/Rcurso/Exemplo/Exemplo1_ipca.csv", header = T, sep = ";", dec = ".")
In [86]:
ipca <- subset(ipca, data >= 2000 & data <=2015   )
colnames(ipca) <- c("data", "ipca")
data.frame(c(ipca[1:5,],datacsv[1:5,]   ))
dataipcadata.1inflação_ipca.
2000.010.62 1980.016.62
2000.020.13 1980.024.62
2000.030.22 1980.036.04
2000.040.42 1980.045.29
2000.050.01 1980.055.70
In [85]:
selic <- read.csv2 ("Exemplo/Exemplo2_selic.csv", header = T, sep = ",", dec = ".")
selic<- subset(selic, data >=2000 & data <=2015 )
nivel_emprego <- read.csv2 ("Exemplo/Exemplo3_nivelemprego.csv", header = T, sep = ";", dec = ".")
nivel_emprego <- subset(nivel_emprego, data >=2000 & data <=2015 )
dados <- data.frame (selic , ipca , nivel_emprego)

«

4.2 salvando e abrindo data frame

Salvando os dados em um arquivo.txt via write.table() e arquivo csv via a função write.csv(). contudo é possivel salvar um arquivo csv usando write.table() ou o contrário.

In [1]:
write.table(dados, "Exemplo/dados.csv", sep = ";")
write.csv(dados, "Exemplo/dados.txt")
Error in is.data.frame(x): objeto 'dados' não encontrado
Traceback:

1. write.table(dados, "Exemplo/dados.csv", sep = ";")
2. is.data.frame(x)
In [88]:
x <- runif(1000000)
x[sample(1000000, 900000)] <- NA # 10% NAs
df3 <- as.data.frame(replicate(100, x))
a <- dim(df3)
In [ ]:
save(df3, file = "Exemplo/EXEsave.Rdata") # save.image() salva todo espaço de trabalho
 saveRDS(df3, "Exemplo/EXEsave.RDS")
 write.csv(df3, 'Exemplo/EXEsave.csv') # write.csv2 write.table
 feather::write_feather(df3, 'Exemplo/EXEsave.feather') # eficente python-R data
 foreign::write.dta(df3, 'Exemplo/EXEsave.dta') # Stata V<=13
 haven::write_dta(df3, 'Exemplo/EXEsave2.dta') # Stata V>=14 (le versões anteriores com erro em acentos)
In [ ]:
load("Exemplo/EXEsave.Rdata")
 readRDS("Exemplo/EXEsave.RDS")
 read.csv('Exemplo/EXEsave.csv') # read.csv2 read.table
 feather::read_feather('Exemplo/EXEsave.feather')
 foreign::read.dta('Exemplo/EXEsave.dta')
 haven::read.dta('Exemplo/EXEsave.dta')
formato user system elapsed size N K
Feather 0.736 0.932 5.630 774.86774 1e+06 100
Stata13 4.888 1.011 10.967 762.95501 1e+06 100
Stata14 11.385 1.279 18.160 763.00102 1e+06 100
RDS 12.107 0.113 12.700 74.03126 1e+06 100
Rdata 12.288 0.111 12.907 74.03125 1e+06 100
CSV 36.440 0.734 42.128 437.62616 1e+06 100
formato user system elapsed size N K
Feather 0.878 0.218 1.122 774.86774 1e+06 100
RDS 2.073 0.024 2.097 74.03126 1e+06 100
Rdata 2.124 0.186 2.311 74.03125 1e+06 100
Stata13 3.163 0.310 3.473 762.95501 1e+06 100
Stata14 12.713 0.397 13.238 763.00102 1e+06 100
CSV 17.664 0.397 18.060 437.62616 1e+06 100

«

5 Tabelas e estatísticas

5.1 Estatísticas descritivas

  • Média: A média aritmética é igual ao quociente entre a soma dos valores do conjunto e o número total dos valores.
  • Mediana e quartil: A mediana e quartil são medidas de posição segundo uma ordem (geralmente crescente).
  • Moda: É o valor que ocorre com maior frequência no conjunto de dados
  • Máximo e Minimo: Para calcular amplitudes, máxima e mínima é preciso usar as funções max() e min().
  • Variância e desvio padrão:medidas de dispersão calculadas a partir do desvio da média.
In [19]:
v <-c(1 ,2 ,1 ,2 ,2 ,3 ,2)     # cria objeto
x <- c (8 ,16 ,15 ,2 ,19 ,28 ,89 ,50 ,91)
y <- c (2 ,8 ,19 ,15 ,15 ,15 ,89 ,91)
z <- c(5 ,3 ,15 ,0 ,3 ,8 ,1 ,19 ,50)
In [20]:
mean(x) # retorna a media 
median(z) # retorna a mediada
35.3333333333333
5
In [21]:
quantile(x)
0%
2
25%
15
50%
19
75%
50
100%
91
In [39]:
max(y) # retorna  o maior valor do conjunto
min(y) # retona o menor valor do conjunto
range(z)
91
2
  1. 0
  2. 50
In [40]:
max(y)-min(y)
diff(range(z))
89
50
In [14]:
var(v)    # variancia
sd(v)     # desvio-padrão
0.476190476190476
0.690065559342354
In [43]:
summary(z)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   0.00    3.00    5.00   11.56   15.00   50.00 

«

5.2 Tabelas

Tabelas são uma forma resumida de apresentar estatisticas ou caracteristicas dos dados. O objetivo é apresentar os dados e podem ser muito úteis em análises econômicas.

As tabelas são feitas de acordo com a natureza da variável. Para variáveis discretas são comuns tabelas de frequencia e percentagem. Para variáveis contínuas são mais comuns tabelas de estatísticas com medidas de tendência central ou de disperção dos dados.

Tabelas de variáveis discretas

In [2]:
#library("haven") # read_dta() stata <=13
library("foreign") # read.dta() stata>=14
  pnad <-  read.dta('Exemplo/pnad_mod.dta')
table(pnad$raca)
Ind\xedgena      Branca       Preta     Amarela       Parda         n/d 
          0        1747         313           0        1824           0 
In [154]:
table(pnad$sexo)
table(pnad$sexo, pnad$raca)
 Homem Mulher 
  1897   1987 
        
         Ind\xedgena Branca Preta Amarela Parda n/d
  Homem            0    824   163       0   910   0
  Mulher           0    923   150       0   914   0
In [155]:
table(pnad$sexo, pnad$raca, exclude=c("Amarela", "n/d", "Ind\xedgena"))
        
         Branca Preta Parda
  Homem     824   163   910
  Mulher    923   150   914
In [156]:
pnad$raca <- droplevels(pnad$raca) # deletar levels em que não exite informação
In [162]:
attach(pnad) # comando para referenciar variaveis do dataframe diretamente
#detach(pnad, pos = 1) # retirar data frame de referencia pode ter mais de um data.frame em referencia a pos a ordem deles
In [163]:
prop.table(table(sexo, raca),1)
        raca
sexo         Branca      Preta      Parda
  Homem  0.43437006 0.08592514 0.47970480
  Mulher 0.46451938 0.07549069 0.45998993
In [164]:
prop.table(table(sexo, raca),2)
prop.table(table(sexo, raca),1)
prop.table(table(sexo, raca))
        raca
sexo        Branca     Preta     Parda
  Homem  0.4716657 0.5207668 0.4989035
  Mulher 0.5283343 0.4792332 0.5010965
        raca
sexo         Branca      Preta      Parda
  Homem  0.43437006 0.08592514 0.47970480
  Mulher 0.46451938 0.07549069 0.45998993
        raca
sexo         Branca      Preta      Parda
  Homem  0.21215242 0.04196704 0.23429454
  Mulher 0.23764161 0.03861998 0.23532441

Tabela de variáveis contínuas

In [165]:
tapply(idade,sexo,mean)
Homem
30.5260938323669
Mulher
31.8394564670357
In [166]:
d <- data.frame(tapply(idade,raca,  mean)) # tapply não funciona se existir label factor sem valores
d[2] <- data.frame(tapply(idade,raca,  median))
d[3] <- data.frame(tapply(idade,raca,  sd)) 
d[4] <- data.frame(tapply(idade,raca,  min)) 
d[5] <- data.frame(tapply(idade,raca,  max))

    colnames(d) <-c("Idade", "mediana", "sd",  "minimo", "maximo") 
d
Idademedianasdminimomaximo
Branca32.3091030 20.997340 95
Preta35.6613434 19.807740 91
Parda29.3678727 19.609830 94
In [167]:
d <- data.frame(tapply(renda,raca,  mean, na.rm = TRUE)) # tapply não funciona se existir label factor sem valores
d[2] <- data.frame(tapply(renda,raca,  sd, na.rm = TRUE))  
d[3] <- data.frame(tapply(renda,raca,  quantile, na.rm = TRUE))
     colnames(d) <-c("Renda",  "desvio",  "Quartis")
d
RendadesvioQuartis
Branca1223.5908 2162.5529 0, 415, 660, 1245, 30000
Preta 592.5935 445.0536 0, 335, 500, 700, 2500
Parda 723.2434 1212.2407 0.00, 201.75, 415.00, 700.00, 13500.00
In [201]:
pnad$ren_fam[pnad$ren_fam>=999999] <-0 # missings do ibge são referenciados com digitos nove 
pnad2 <-subset(pnad, idade>=20)
pnad2$sexo<-as.numeric(pnad2$sexo)
pnad2$raca<-as.numeric(pnad2$raca)
tabpnad <- dplyr::select_if(pnad2, is.numeric)
tabpnad <- na.omit(tabpnad)
tabpnad[1:2,]
ufsexoidaderacaeducrendaren_famcomponentespesoV4617V4618ida2lnrendaper_capitabranconegropardomascmigrante
29 2 23 1 12 450 3250 3 249 290012 136 529 6.1092481083.3331 0 0 0 0
52 2 36 3 8 700 700 2 353 520003 36 1296 6.551080 350.0000 0 1 0 1
In [187]:
tabpnad<- aggregate(tabpnad[,2:11],
           by = list(tabpnad$sexo, tabpnad$raca),
           FUN = mean)
tabpnad$Group.1 <- factor(tabpnad$Group.1,
                        levels = c(1,2),
                        labels = c("Mulher", "Homem"))
tabpnad$Group.2 <- factor(tabpnad$Group.2,
                        levels = c(1,2,3),
                        labels = c("Branco", "negro", "pardo"))

tabpnad[1:6,]
Group.1Group.2sexoidaderacaeducrendaren_famcomponentespesoV4617V4618
Mulher Branco 1 39.31941 1 8.914005 1697.98283253.418 3.314496 509.5209 350152.0 293.5627
Homem Branco 2 37.64570 1 9.884106 977.31462841.321 3.228477 514.7649 349729.5 263.8609
Mulher negro 1 37.40000 2 6.317647 746.01181255.424 3.717647 454.9412 304729.4 262.1647
Homem negro 2 38.18182 2 7.618182 478.47271610.873 3.763636 478.4000 313486.0 316.9636
Mulher pardo 1 38.45682 3 6.475000 958.05451810.555 3.790909 451.6705 287315.3 220.7068
Homem pardo 2 37.90456 3 8.132780 676.18261907.025 3.531120 464.4606 305706.6 234.2448

«

5.3 Estatística multivariada

Esta subseção tem apenas o perfil introdutório Fellipe Gomes e Ralph Silva tem trabalhos mais aprofundatos para quem quer ingressar mais intensamente em multivariada.

É fundamental conhecer o pacote MVar.pt que lista todos os principais modelos em multivariada.

Base para maioria dos modelos de BIGDATA e aprendizado de máquina por meio de algortimos, seu uso permita extrair informações de grandes dados computacionais.

Os modelos básicos são a Análise Fatorial e Análise de Componentes Principais, por serem básicos não é necessário pacotes adcionais para estes dois modelos, entre as vantagens:

  • Permite analisar fatores que não são diretamente observáveis (variáveis latentes), com base em um conjunto de variáveis observáveis.
  • Reduzir a dimensão dos dados quando existem um número elevados variáveis (correlacionadas) observadas a um conjunto reduzindo de fatores (não correlacionados).
  • Além das possibildiades analíticas, seus resultados podem ser empregados em outros modelos como regressões, atravéz dos escores das variáveis, cargas fatoriais ou dos fatores para aumentar eficiência do modelo.

    Bibliotecas:

In [22]:
#library(ggfortify) # Data Visualization Tools for Statistical Analysis Results
# library(MVar.pt) # similar a MVar, com saídas em português
# https://cran.r-project.org/web/packages/MVar.pt/MVar.pt.pdf
# library(MASS) # Support Functions and Datasets for Venables and Ripley's MASS
library("haven") # ignore labels pull numbers
In [23]:
pnad <-  read_dta('Exemplo/pnad_mod.dta')
  summary(pnad)
       uf             sexo           idade           raca           migra      
 Min.   :11.00   Min.   :2.000   Min.   : 0.0   Min.   :2.000   Min.   :1.000  
 1st Qu.:24.00   1st Qu.:2.000   1st Qu.:15.0   1st Qu.:2.000   1st Qu.:1.000  
 Median :31.00   Median :4.000   Median :29.0   Median :4.000   Median :1.000  
 Mean   :31.56   Mean   :3.023   Mean   :31.2   Mean   :4.979   Mean   :1.818  
 3rd Qu.:41.00   3rd Qu.:4.000   3rd Qu.:45.0   3rd Qu.:8.000   3rd Qu.:3.000  
 Max.   :53.00   Max.   :4.000   Max.   :95.0   Max.   :8.000   Max.   :3.000  
                                                                               
   analfabeto       infantil          educ             ativ      
 Min.   :1.000   Min.   :1.000   Min.   : 0.000   Min.   :1.000  
 1st Qu.:1.000   1st Qu.:3.000   1st Qu.: 1.000   1st Qu.:1.000  
 Median :1.000   Median :3.000   Median : 5.000   Median :1.000  
 Mean   :1.359   Mean   :2.988   Mean   : 5.923   Mean   :1.397  
 3rd Qu.:1.000   3rd Qu.:3.000   3rd Qu.:11.000   3rd Qu.:2.000  
 Max.   :3.000   Max.   :3.000   Max.   :15.000   Max.   :2.000  
                 NA's   :3563    NA's   :9        NA's   :595    
      ocup           renda            ren_fam           componentes    
 Min.   :1.000   Min.   :    0.0   Min.   :0.000e+00   Min.   : 1.000  
 1st Qu.:1.000   1st Qu.:  320.0   1st Qu.:6.220e+02   1st Qu.: 3.000  
 Median :1.000   Median :  500.0   Median :1.182e+03   Median : 4.000  
 Mean   :1.072   Mean   :  940.3   Mean   :2.530e+10   Mean   : 3.795  
 3rd Qu.:1.000   3rd Qu.:  930.0   3rd Qu.:2.200e+03   3rd Qu.: 5.000  
 Max.   :2.000   Max.   :30000.0   Max.   :1.000e+12   Max.   :16.000  
 NA's   :1899    NA's   :2073      NA's   :11          NA's   :11      
      peso            V4617            V4618             ida2     
 Min.   :  18.0   Min.   :110001   Min.   :   1.0   Min.   :   0  
 1st Qu.: 249.0   1st Qu.:240014   1st Qu.:  70.0   1st Qu.: 225  
 Median : 488.0   Median :310049   Median : 161.5   Median : 841  
 Mean   : 483.8   Mean   :315668   Mean   : 258.1   Mean   :1387  
 3rd Qu.: 621.0   3rd Qu.:410007   3rd Qu.: 414.0   3rd Qu.:2025  
 Max.   :1159.0   Max.   :530002   Max.   :1009.0   Max.   :9025  
                                                                  
    lnrenda         per_capita            branco           negro        
 Min.   : 2.303   Min.   :0.000e+00   Min.   :0.0000   Min.   :0.00000  
 1st Qu.: 6.028   1st Qu.:1.710e+02   1st Qu.:0.0000   1st Qu.:0.00000  
 Median : 6.397   Median :3.370e+02   Median :0.0000   Median :0.00000  
 Mean   : 6.419   Mean   :7.836e+09   Mean   :0.4498   Mean   :0.08059  
 3rd Qu.: 6.908   3rd Qu.:6.500e+02   3rd Qu.:1.0000   3rd Qu.:0.00000  
 Max.   :10.309   Max.   :1.000e+12   Max.   :1.0000   Max.   :1.00000  
 NA's   :2244     NA's   :11                                            
     pardo             masc           migrante     
 Min.   :0.0000   Min.   :0.0000   Min.   :0.0000  
 1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:0.0000  
 Median :0.0000   Median :0.0000   Median :0.0000  
 Mean   :0.4696   Mean   :0.4884   Mean   :0.4089  
 3rd Qu.:1.0000   3rd Qu.:1.0000   3rd Qu.:1.0000  
 Max.   :1.0000   Max.   :1.0000   Max.   :1.0000  
                                                   
In [24]:
# correções
pnad$V4617   <- NULL
pnad$V4618   <- NULL
pnad$migra   <- NULL
pnad$uf      <- NULL
pnad$infantil<- NULL
pnad$ocup    <- NULL
pnad$renda   <- NULL
pnad$lnrenda <- NULL
pnad$masc    <- NULL
pnad$branco  <- NULL
pnad$raca    <- NULL
pnad$ren_fam <- ifelse(pnad$ren_fam>=999999,0,pnad$ren_fam)
pnad$per_capita <- ifelse(pnad$per_capita>=999999,0,pnad$per_capita)
In [25]:
pnad<- na.omit(pnad)
summary(pnad)
      sexo           idade         analfabeto         educ       
 Min.   :2.000   Min.   :10.00   Min.   :1.000   Min.   : 0.000  
 1st Qu.:2.000   1st Qu.:21.00   1st Qu.:1.000   1st Qu.: 4.000  
 Median :4.000   Median :33.00   Median :1.000   Median : 7.000  
 Mean   :3.022   Mean   :35.97   Mean   :1.183   Mean   : 6.953  
 3rd Qu.:4.000   3rd Qu.:48.00   3rd Qu.:1.000   3rd Qu.:11.000  
 Max.   :4.000   Max.   :95.00   Max.   :3.000   Max.   :15.000  
      ativ          ren_fam       componentes          peso       
 Min.   :1.000   Min.   :    0   Min.   : 1.000   Min.   :  18.0  
 1st Qu.:1.000   1st Qu.:  622   1st Qu.: 3.000   1st Qu.: 249.0  
 Median :1.000   Median : 1180   Median : 4.000   Median : 488.0  
 Mean   :1.397   Mean   : 1934   Mean   : 3.675   Mean   : 485.6  
 3rd Qu.:2.000   3rd Qu.: 2100   3rd Qu.: 4.000   3rd Qu.: 621.0  
 Max.   :2.000   Max.   :39000   Max.   :16.000   Max.   :1159.0  
      ida2        per_capita          negro             pardo       
 Min.   : 100   Min.   :    0.0   Min.   :0.00000   Min.   :0.0000  
 1st Qu.: 441   1st Qu.:  178.1   1st Qu.:0.00000   1st Qu.:0.0000  
 Median :1089   Median :  350.0   Median :0.00000   Median :0.0000  
 Mean   :1630   Mean   :  624.7   Mean   :0.08652   Mean   :0.4616  
 3rd Qu.:2304   3rd Qu.:  634.4   3rd Qu.:0.00000   3rd Qu.:1.0000  
 Max.   :9025   Max.   :33000.0   Max.   :1.00000   Max.   :1.0000  
    migrante     
 Min.   :0.0000  
 1st Qu.:0.0000  
 Median :0.0000  
 Mean   :0.4558  
 3rd Qu.:1.0000  
 Max.   :1.0000  
In [37]:
corPNAD <- round(cor(pnad),4)    # 4 casas decimais
corPNAD
A matrix: 13 × 13 of type dbl
sexoidadeanalfabetoeducativren_famcomponentespesoida2per_capitanegropardomigrante
sexo 1.0000 0.0460 0.0048 0.0355 0.2448-0.0516-0.0515 0.0328 0.0550-0.0392-0.0165-0.0287 0.0151
idade 0.0460 1.0000 0.2771-0.1459-0.0152 0.0924-0.2691 0.0385 0.9700 0.1393 0.0384-0.0824 0.3128
analfabeto 0.0048 0.2771 1.0000-0.4890 0.0806-0.1100-0.0266 0.0098 0.2886-0.0860 0.0609 0.0893 0.0718
educ 0.0355-0.1459-0.4890 1.0000-0.2554 0.3756-0.0985-0.0220-0.2041 0.3356-0.0780-0.1609-0.0109
ativ 0.2448-0.0152 0.0806-0.2554 1.0000-0.0735 0.0492 0.0049 0.1037-0.0772 0.0078 0.0099-0.0722
ren_fam-0.0516 0.0924-0.1100 0.3756-0.0735 1.0000 0.0000-0.0259 0.0795 0.8431-0.0668-0.1488 0.0742
componentes-0.0515-0.2691-0.0266-0.0985 0.0492 0.0000 1.0000-0.0455-0.2561-0.1957 0.0161 0.1113-0.1307
peso 0.0328 0.0385 0.0098-0.0220 0.0049-0.0259-0.0455 1.0000 0.0368-0.0051-0.0099-0.1198-0.0054
ida2 0.0550 0.9700 0.2886-0.2041 0.1037 0.0795-0.2561 0.0368 1.0000 0.1285 0.0308-0.0809 0.2791
per_capita-0.0392 0.1393-0.0860 0.3356-0.0772 0.8431-0.1957-0.0051 0.1285 1.0000-0.0574-0.1421 0.0879
negro-0.0165 0.0384 0.0609-0.0780 0.0078-0.0668 0.0161-0.0099 0.0308-0.0574 1.0000-0.2850-0.0022
pardo-0.0287-0.0824 0.0893-0.1609 0.0099-0.1488 0.1113-0.1198-0.0809-0.1421-0.2850 1.0000-0.0484
migrante 0.0151 0.3128 0.0718-0.0109-0.0722 0.0742-0.1307-0.0054 0.2791 0.0879-0.0022-0.0484 1.0000
In [38]:
library(ggplot2)
library(ggcorrplot)
ggcorrplot(corPNAD, hc.order = TRUE, type = "lower", lab = TRUE, lab_size = 2, method="circle",  colors = c("red", "white", "green"),  title="Correlação PNAD")

Análise fatorial

factanal(x, factors, data = NULL, covmat = NULL, n.obs = NA,
         subset, na.action, start = NULL,
         scores = c("none", "regression", "Bartlett"),
         rotation = "varimax", control = NULL, ...)
In [6]:
##### Analise fatorial (maxima verossimilhanca)
AF <-factanal(pnad, factors = 5) # 3 exige um numero de vetores independentes >=3
AF
table(pnad$sexo)
Call:
factanal(x = pnad, factors = 5)

Uniquenesses:
       sexo       idade  analfabeto        educ        ativ     ren_fam 
      0.917       0.005       0.712       0.005       0.005       0.005 
componentes        peso        ida2  per_capita       negro       pardo 
      0.895       0.982       0.039       0.281       0.897       0.005 
   migrante 
      0.896 

Loadings:
            Factor1 Factor2 Factor3 Factor4 Factor5
sexo                                         0.273 
idade        0.973           0.197                 
analfabeto   0.187           0.500                 
educ                 0.238  -0.965                 
ativ        -0.109           0.223           0.966 
ren_fam              0.983  -0.139                 
componentes -0.296           0.103                 
peso                                -0.128         
ida2         0.931           0.252           0.152 
per_capita   0.116   0.827  -0.135                 
negro                               -0.313         
pardo               -0.175   0.182   0.963         
migrante     0.309                                 

               Factor1 Factor2 Factor3 Factor4 Factor5
SS loadings      2.067   1.759   1.423   1.062   1.045
Proportion Var   0.159   0.135   0.109   0.082   0.080
Cumulative Var   0.159   0.294   0.404   0.485   0.566

Test of the hypothesis that 5 factors are sufficient.
The chi square statistic is 524.32 on 23 degrees of freedom.
The p-value is 3.03e-96 
   2    4 
1600 1671 
In [7]:
# cargas fatorias
L1    <- AF$loadings[,1]
L2    <- AF$loadings[,2]
U     <- AF$uniquenesses
In [8]:
# Rotacao de fatores
AFmax <- factanal(pnad,factors=2,rotation="varimax")
AFmax
Call:
factanal(x = pnad, factors = 2, rotation = "varimax")

Uniquenesses:
       sexo       idade  analfabeto        educ        ativ     ren_fam 
      0.994       0.054       0.890       0.778       0.979       0.154 
componentes        peso        ida2  per_capita       negro       pardo 
      0.926       0.998       0.005       0.162       0.994       0.969 
   migrante 
      0.916 

Loadings:
            Factor1 Factor2
sexo                       
idade        0.970         
analfabeto   0.273  -0.189 
educ        -0.160   0.443 
ativ                -0.118 
ren_fam      0.166   0.905 
componentes -0.265         
peso                       
ida2         0.993         
per_capita   0.214   0.890 
negro                      
pardo               -0.148 
migrante     0.288         

               Factor1 Factor2
SS loadings      2.274   1.906
Proportion Var   0.175   0.147
Cumulative Var   0.175   0.322

Test of the hypothesis that 2 factors are sufficient.
The chi square statistic is 3217.31 on 53 degrees of freedom.
The p-value is 0 
In [9]:
# Escores fatoriais
AFReg <- factanal(pnad,factors=2, rotation = "varimax",scores="regression")
AFBar <- factanal(pnad,factors=2, rotation = "varimax",scores="Bartlett")
par(mfrow=c(2,1))
plot(AFReg$scores[,1],AFBar$scores[,1])
plot(AFReg$scores[,2],AFBar$scores[,2])

Análise de Componentes Principais

## Formúla
prcomp(formula, data = NULL, subset, na.action, ...)

## Padrão
prcomp(x, retx = TRUE, center = TRUE, scale. = FALSE,
       tol = NULL, rank. = NULL, ...)
In [10]:
# Análise de componentes principais:
ACP=prcomp(pnad, scale = TRUE)
summary(ACP)
Importance of components:
                          PC1    PC2    PC3    PC4     PC5     PC6    PC7
Standard deviation     1.5788 1.5228 1.1403 1.1061 1.06198 0.99738 0.9284
Proportion of Variance 0.1917 0.1784 0.1000 0.0941 0.08675 0.07652 0.0663
Cumulative Proportion  0.1917 0.3701 0.4702 0.5643 0.65101 0.72753 0.7938
                           PC8     PC9    PC10    PC11    PC12    PC13
Standard deviation     0.88185 0.85242 0.78638 0.63617 0.36222 0.14710
Proportion of Variance 0.05982 0.05589 0.04757 0.03113 0.01009 0.00166
Cumulative Proportion  0.85365 0.90954 0.95711 0.98824 0.99834 1.00000
In [11]:
ACP
Standard deviations (1, .., p=13):
 [1] 1.5787765 1.5228432 1.1403366 1.1060573 1.0619775 0.9973766 0.9283941
 [8] 0.8818456 0.8524228 0.7863751 0.6361681 0.3622155 0.1471017

Rotation (n x k) = (13 x 13):
                    PC1         PC2         PC3          PC4         PC5
sexo        -0.04593924  0.05993525 -0.20973958 -0.630753835  0.30585945
idade       -0.58263016  0.07946650  0.03973905  0.067235245  0.08438757
analfabeto  -0.24502860  0.32648567  0.14448262  0.014505285 -0.37573760
educ         0.10395001 -0.49660023 -0.08153644  0.023469122  0.30824010
ativ        -0.03006519  0.20088435 -0.11901348 -0.666660275 -0.16757192
ren_fam     -0.16733289 -0.52372745  0.14763010 -0.182016834 -0.35617512
componentes  0.26670781  0.09237708  0.10609681 -0.051221359 -0.44048466
peso        -0.04613456  0.01073409 -0.27785721 -0.036987233  0.19094905
ida2        -0.58037183  0.11058106  0.03372873 -0.008401525  0.04605542
per_capita  -0.21997916 -0.51430272  0.13114625 -0.172598555 -0.27423160
negro       -0.04497607  0.06080822 -0.59532281  0.220373107 -0.37879600
pardo        0.11769701  0.18026480  0.65268532 -0.075314763  0.10486823
migrante    -0.29038539 -0.02580620  0.06117462  0.176670932  0.21424483
                     PC6         PC7         PC8          PC9        PC10
sexo         0.200004183 -0.14066131  0.15971274 -0.582076615 -0.02279057
idade        0.039665522 -0.00831309 -0.36509178 -0.095636861  0.03686794
analfabeto  -0.166445476  0.12245570  0.43992010 -0.328619483 -0.26441601
educ         0.130902870 -0.02244384 -0.17145282 -0.131219945  0.04446228
ativ         0.053071739  0.01455753 -0.05234492  0.601741616  0.10906040
ren_fam     -0.079249555 -0.07553936  0.04699968 -0.046003108  0.03568831
componentes -0.012618583 -0.65651878 -0.44072870 -0.207879853 -0.10718268
peso        -0.885053926 -0.21109230  0.01781865 -0.024641778  0.22830853
ida2         0.032231996  0.01343741 -0.38501792 -0.009963514  0.03482717
per_capita  -0.096083481  0.09092322  0.17242155 -0.002681072  0.10318744
negro        0.255284459  0.02020779  0.08157072 -0.145496064  0.59330361
pardo       -0.001589409  0.02596046  0.02817910 -0.139295326  0.69542545
migrante     0.213459398 -0.68820148  0.48306312  0.279502604  0.04428964
                   PC11         PC12         PC13
sexo         0.18450104 -0.009252684  0.012327910
idade       -0.01904360  0.002943789 -0.703700707
analfabeto  -0.50641282  0.020463433  0.009759104
educ        -0.75373423  0.071628308  0.029913575
ativ        -0.29250924  0.013199420 -0.081052693
ren_fam      0.07601165 -0.701820873  0.002804424
componentes -0.05357041  0.171563571 -0.001608729
peso        -0.04100947 -0.010124182  0.002821990
ida2        -0.01203374  0.014823179  0.704610568
per_capita   0.18954982  0.686287072 -0.010350444
negro       -0.04548459 -0.015514520  0.009971026
pardo       -0.07672215 -0.023490335  0.007474513
migrante    -0.03327763  0.009532436  0.018353369
In [12]:
# rotação
k <- 3
PCA =ACP$rotation[, 1:k] %*% diag(ACP$sdev[1:k])
CPA= varimax(PCA)
In [13]:
CPA
$loadings

Loadings:
            [,1]   [,2]   [,3]  
sexo                      -0.244
idade       -0.923              
analfabeto  -0.431  0.471  0.126
educ         0.215 -0.743       
ativ                0.308 -0.131
ren_fam     -0.242 -0.815  0.104
componentes  0.393  0.156  0.182
peso                      -0.323
ida2        -0.921  0.123       
per_capita  -0.323 -0.804       
negro               0.116 -0.679
pardo               0.253  0.771
migrante    -0.461              

               [,1]  [,2]  [,3]
SS loadings    2.47 2.318 1.324
Proportion Var 0.19 0.178 0.102
Cumulative Var 0.19 0.368 0.470

$rotmat
            [,1]        [,2]       [,3]
[1,]  0.98940657  0.04778879 0.13707977
[2,] -0.05275905  0.99806665 0.03285497
[3,] -0.13524465 -0.03973912 0.99001499

Análise gráfica

In [14]:
biplot(ACP)
In [15]:
library(ggfortify)
autoplot(ACP, label = TRUE, label.size = 3,
         loadings = TRUE, loadings.label = TRUE, loadings.label.size  = 3)
Loading required package: ggplot2
In [16]:
autoplot(AFReg, label = TRUE, label.size = 3,
         loadings = TRUE, loadings.label = TRUE, loadings.label.size  = 3)

Análise de cluster

Outra ferramenta importante em multivariada é a análise de cluster. Para este é necessário uma biblioteca adcional a MVar.pt...

Cluster(Data, Titles = NA, Hierarquico = TRUE, Analise = "Obs",  
        CorAbs = FALSE, Normaliza = FALSE, Distance = "euclidean",  
        Method = "complete", Horizontal = FALSE, NumGrupos = 0,
        Casc = TRUE)
  • Distance: Metrica das distancias caso agrupamentos hierarquicos: "euclidean" (default), "maximum", "manhattan", "canberra", "binary" ou "minkowski". Caso Analise = "Var" a metrica sera a matriz de correlacao, conforme CorAbs.

  • Method: Metodo para analises caso agrupamentos hierarquicos: "complete" (default), "ward.D", "ward.D2", "single", "average", "mcquitty", "median" ou "centroid".

In [40]:
library(MVar.pt)

pnad2<-pnad[1:600,c(1,2,4,7,10)]
Res <- Cluster( pnad2, Analise = "Obs", CorAbs = TRUE, 
       Normaliza = TRUE,  Horizontal = FALSE, NumGrupos = 3, Hierarquico = TRUE,
       Distance = "manhattan",  Method = "ward.D")

In [40]:
print("Tabela com as similaridades e distancias:"); Res$TabRes
print("Grupos formados:");table(Res$Groups$Grupos)
print("Tabela com os resultados dos grupos:"); Res$ResGroups
print("Soma do quadrado total:"); Res$SQT
#print("Matriz de distancias:"); Res$MatrixD 

#write.table(file="Exemplo/TabelaSimilaridade.csv", Res$TabRes, sep=";",dec=",",row.names = FALSE)
[1] "Tabela com as similaridades e distancias:"
A matrix: 4 × 4 of type dbl
PassosGruposSimilaridadeDistancia
14 -477.463125.79
23 -762.545187.89
32 -932.536224.92
41-2541.500575.39
[1] "Grupos formados:"
  1   2   3 
286 207 107 
[1] "Tabela com os resultados dos grupos:"
A matrix: 3 × 8 of type dbl
GruposQtd.ElementosSoma QuadradosMedia sexoMedia idadeMedia educMedia componentesMedia per_capita
1286883.1906 1.0159602-0.03490805 0.06117809-0.0472778-0.1615823
2207587.0063-0.9826500-0.06240404-0.66111201 0.2496948-0.2360269
3107597.3691-0.8145426 0.21403120 1.11545096-0.3566858 0.8885057
[1] "Soma do quadrado total:"
2995

«

5.4 Funções e estruturas de controle e repetição

5.4.1 Funções

Não é raro a necessidade de escrever funções simples a fim de simplificar rotinas de trabalho. Apesar do R ter um número elevado de pacotes e funções, instalar pacotes para rotinas relativamente simples pode ser desnecessário. Podendo o próprio usuário construir a sua função. A estrutura básica:

personalfunction<-function(argumentos){

`expressão'

saída

}

Exemplos

In [190]:
estattabble<-function(x) {
    a1 <- mean(x)
    a2 <- median(x)
    a3 <- sd(x) 
    a5 <- max(x)
    a4 <- min(x)
    d <- data.frame(c(a1,a2,a3,a4,a5))
    rownames(d) <-c("Média", "mediana", "sd",  "minimo", "maximo") 
    colnames(d) <-c("estatisticas da variável")
 d 
 }
estattabble(ipca$ipca)
estatisticas da variável
Média 0.5233889
mediana 0.4700000
sd 0.3862875
minimo-0.2100000
maximo 3.0200000
In [191]:
esfera<-function(raio) {
    V = (4/3)*pi*raio^3
    A = (4)*pi*raio^2
   d <- data.frame( c(V,A))
    rownames(d) <-c("Volume", "Área") 
    colnames(d) <-c(paste("Para esfera de raio ",raio,":"))
 d  
 }

circulo<-function(raio) {
    C = 2*pi*raio
    A = pi*raio^2
    d <- data.frame( c(C,A))
    rownames(d) <-c("Circunferência", "Área") 
    colnames(d) <-c(paste("Para o circulo de raio ",raio,":"))
 d  
 }

esfera(2)
circulo(2)
Para esfera de raio 2 :
Volume33.51032
Área50.26548
Para o circulo de raio 2 :
Circunferência12.56637
Área12.56637

Equação Black-Scholes

A equação de Black-Scholes descreve o preço de uma opção ao longo do tempo. Por exemplificação, usaremos a fórmula final definida por:

\begin{equation} \mathrm C(\mathrm S,\mathrm t)= \mathrm N(\mathrm d_1)\mathrm S - \mathrm N(\mathrm d_2) \mathrm K \mathrm e^{-rt} \label{eq:2} \end{equation}\begin{equation} \mathrm d_1= \frac{1}{\sigma \sqrt{\mathrm t}} \left[\ln{\left(\frac{S}{K}\right)} + t\left(r + \frac{\sigma^2}{2} \right) \right] \end{equation}\begin{equation} \mathrm d_2= d_1 - {\sigma \sqrt{\mathrm t}} \end{equation}\begin{equation} N(x)=\frac{1}{\sqrt{2\pi}} \int_{-\infty}^{x} \mathrm e^{-\frac{1}{2}z^2} dz \label{eq:5} \end{equation}

Notação:

  • C = Preço da opção de compra (call.price)
  • S = Preço atual da opção (stock.price)
  • K = Preço de exercício da opção (strike.price)
  • t = tempo para a maturidade da opção em anos (years.maturity > 0)
  • r = taxa de juros livre de risco (risk.free [0,1])
  • $\sigma$ = volatilidade do retorno das ações (volatility )
  • N = função de distribuição acumulada normal
In [13]:
# Black sholes
#S= stock.price
#K= strike.price
#t= years.maturity
#r= risk.free rate
#v= Volatility (desvio padrão)

Black.Scholes <- function(S,K,t,r,v) {
    d1 <- (log(S/K)+t*(r+(v^2)/2))/(v*sqrt(t))
    d2 <- d1-v*sqrt(t)

    cp = S*pnorm(d1)-pnorm(d2)*K*exp(-r*t)
    pp = K*exp(-r*t)*pnorm(-d2)-S*pnorm(-d1)

    tb <-  data.frame(c( cp,pp,d1,d2))
    rownames(tb) <- c("call.price", "put.price", "d1", "d2")
    tb
}
In [193]:
Black.Scholes(10,12, 1, .06, 2)
c.cp..pp..d1..d2.
call.price 6.6300789
put.price 7.9312533
d1 0.9388392
d2-1.0611608

5.4.2 Estruturas de controle

Em programação, controles são estruturas que permitem controlar o fluxo de um programa, as estruturas básicas são:

  • if e else: para testar condições lógicas;

    if(x > 3) {y <- 10 } else { y <- 0 }
    y <- if(x > 3) { 10 } else { 0 }
  • ifelse() : para testar condições lógicas;

    ifelse(x > 3, TRUE, FALSE)
    ifelse(x > 3, X<- 3, x <- 0)
In [23]:
x <-5
  if(x > 3) {
      y <- 10
      cat(y)
  } else { 
      y <- 0
      cat(y)
  }
10
In [24]:
y <- ifelse(x > 3,10,0)
cat(y)
10
In [25]:
y1 <- if(x > 3) { 10 } else { 0 }
 y2 <- ifelse(x > 3,  10 , 0 )
 y1==y2
TRUE

5.4.3 Estruturas de repetição

Por vezes serão necessários repetir comandos, linhas de comandas ou mesmo funções.

Na maioria das vezes será muito melhor que esta repetição seja feita por estruturas de repetição ao invez de escrever o mesmo comando repetidamente.

  • for: quando o loop tem um número fixo de repetições:
      for(i in 1:10) { print(i)}`
      x <- c("a", "b", "c", "d");  for( y in x) {print(y)}
  • while: quando não se sabe a dimenssão do loop:
      x <- 1000; 
      while(x < 10000) {
      print(x)
      x <- x + 1000
      }
  • repeat: similar a while, repete de forma infinita até que a função break seja executada;
  • break: permite sair de qualquer tipo de loop;

      x<- 1 
      y<- 2
    
      repeat {
          xi<- rnorm(1)
          if(abs(xi - x) >y) {
              break
          }else {
          x<- xi
          }
      }
  • next: ignora a interação de um loop;
      for(i in 1:100) {
            if(i > 2 & i< 10 ) {
              ## não executa ações no loop 3 a 9
              next
          }
          ## execução
      }

Estas estruturas são utilizadas com frenquência em rotinas de programação, mas não são as únicas, apenas as mais relevantes neste curso.

In [ ]:
boletim <- function(){
  cat("precione enter uma vez para o próximo nome ou duas vezes para finalizar")
     nomes <- scan(what = "character")
  cat("precione enter uma vez para a próxima nota ou duas vezes para finalizar")
      notas <- scan()
      
  a<- length(notas)
  
  notas <- data.frame(nomes, notas)
  for  (i in c(1:a)) {
    notas[i,3] <- ifelse(notas[i,2]>= 70, "Aprovado", "Reprovado")
    notas[i,4] <- ifelse(notas[i,2]>= 70, "C","R")
    notas[i,4] <- ifelse(notas[i,2]>= 80, "B", notas[i,4])
    notas[i,4] <- ifelse(notas[i,2]>= 90, "A", notas[i,4])
  }
  names(notas) <- c("Aluno", "Nota", "Status", "Conceito")
  print(notas)
        
}

Exercício.

Reescreva a função boletim() trocando a estrtura de repetição "for" por "while" e depois por "repeat".

5.4.4 Transformando, aplicando, replicando tabelas e matrizes

A família de funções "apply" tem como objetivo replicar, de maneira eficiente, ações em diferentes objetos. É quase sempre uma alternativa mais rápida e eficiente ao clássico loop quando estamos trabalhando com matrizes, tabelas e listas.


  • Funções da família apply:

    • apply()
    • mapply()
    • tapply()

    • lapply()

    • sapply()
    • vapply()
    • rapply()
  • funções relacionadas

    • rep()
    • aggregate()

    • Sweep()

  • apply

Replica determinada função por linha ou coluna de uma array.

In [15]:
A1 <- matrix(round(runif(25)*10,0), nrow=5, ncol =5 )
A1
A matrix: 5 × 5 of type dbl
407101
1081 81
849 59
777 74
357 31
In [20]:
apply(X = A1,MARGIN = 1, FUN = mean)
mean(A1[2,])

apply(A1,2, mean)
mean(A1[,3])
  1. 4.4
  2. 5.6
  3. 7
  4. 6.4
  5. 3.8
5.6
  1. 6.4
  2. 4.8
  3. 6.2
  4. 6.6
  5. 3.2
6.2
  • rep

Replica um objeto (básico) determinadas vezes.

In [33]:
rep(1,5)
rep("casa",5)
rep(1:5,2)
  1. 1
  2. 1
  3. 1
  4. 1
  5. 1
  1. 'casa'
  2. 'casa'
  3. 'casa'
  4. 'casa'
  5. 'casa'
  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 1
  7. 2
  8. 3
  9. 4
  10. 5
In [63]:
6*4*2+5*4+10
78
  • mapply

Aplica derterminada a função a todos os elementes de um ou mais objetos do tipo matriz ou tabela.

In [39]:
mapply(sqrt,A1)
  1. 2
  2. 3.16227766016838
  3. 2.82842712474619
  4. 2.64575131106459
  5. 1.73205080756888
  6. 0
  7. 2.82842712474619
  8. 2
  9. 2.64575131106459
  10. 2.23606797749979
  11. 2.64575131106459
  12. 1
  13. 3
  14. 2.64575131106459
  15. 2.64575131106459
  16. 3.16227766016838
  17. 2.82842712474619
  18. 2.23606797749979
  19. 2.64575131106459
  20. 1.73205080756888
  21. 1
  22. 1
  23. 3
  24. 2
  25. 1
In [34]:
mapply(rep,1:5,5)
A matrix: 5 × 5 of type int
12345
12345
12345
12345
12345
In [43]:
mapply(function(x, y) x^2+y,
       c(1, 2, 3),  
       c(4, 5, 6))
mapply(function(x, y) c(x^3, y^2),
       c(1, 2, 3),  
       c(4, 5, 6))
  1. 5
  2. 9
  3. 15
A matrix: 2 × 3 of type dbl
1 827
162536
  • tapply

Aplica determinada função a um conjunto de dados (matrix, data.frame) condicionados a outra variável.

In [57]:
n<- 20
fac <- data.frame(sexo = factor(rep_len(1:2, n), levels = 1:2, labels =  c("Homem", "Mulher")),
                  renda = round(rnorm(20,2000,50),2)
                 )
table(fac$sexo)
tapply(fac$renda, fac$sexo, sum)
 Homem Mulher 
    10     10 
Homem
20065.76
Mulher
20362.73

«

5.5 Regressão simples

Estimando um modelo semples de MQO com base nos dados da PNAD.

In [1]:
library(foreign)
pnad <-  read.dta('Exemplo/pnad_mod.dta')
pnad2 <- pnad[,c(18,3,8,13,21)]
pnad2 <- na.omit(pnad2)
pnad2[1:5,]
A data.frame: 5 × 5
lnrendaidadeeduccomponentesnegro
<dbl><int><int><int><int>
16.109248231230
26.55108036 820
66.55108048 530
88.006368241540
96.095825311440
In [2]:
pnad2 <- na.omit(pnad2)
result <- lm(pnad2, lnrenda =~ idade+educ+componentes+negro)
# estraindo estaísticas dos resultados
 summary(result)
 DegreesOfFreedom <- result$df
 Yhat <- result$fitted.values
 Coef <- result$coefficients
 Resid <- result$residuals
 RSquared <- result$r.squared
 aic <- AIC(result)
 bic <- BIC(result)
Warning message:
“In lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) :
 extra argument ‘lnrenda’ will be disregarded”
Call:
lm(formula = pnad2, lnrenda = ~idade + educ + componentes + negro)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.4756 -0.4307  0.0232  0.4814  3.3565 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  4.85260    0.09870  49.167   <2e-16 ***
idade        0.01921    0.00161  11.928   <2e-16 ***
educ         0.12215    0.00469  26.048   <2e-16 ***
componentes -0.03496    0.01375  -2.544   0.0111 *  
negro       -0.06712    0.07094  -0.946   0.3442    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.809 on 1623 degrees of freedom
Multiple R-squared:  0.3229,	Adjusted R-squared:  0.3213 
F-statistic: 193.5 on 4 and 1623 DF,  p-value: < 2.2e-16

Outros modelos em Cross Sectional data podem ser estimados pelo comando glm(). Como segue na tabela abaixo.

GLM Family link

Family identity logit probit cloglog sqrt inverse log 1/mu² cauchit
gaussian sim* - - - - sim sim - -
binomial - sim* sim sim - - sim - sim
poisson sim - - - sim - sim* - -
Gamma sim - - - - sim* sim - -
inverse.gaussian sim - - - sim sim sim sim* -
quasi sim sim sim sim sim sim sim sim -

variance link option: "constant", "mu(1-mu)", "mu", "mu^2", "mu^3", "Binomial()", "binary", "NegativeBinomial()", nbinom

Para mais opções ver glmer e brms.

In [3]:
pnad2$dr<-pnad2$lnrenda>mean(pnad2$lnrenda)
table(pnad2$dr)
FALSE  TRUE 
  892   736 
In [4]:
h <- glm(dr~idade+educ+componentes+negro, data = pnad2, family=binomial(link="logit"))
summary(h)
Call:
glm(formula = dr ~ idade + educ + componentes + negro, family = binomial(link = "logit"), 
    data = pnad2)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.3817  -0.9262  -0.4950   0.9618   2.4103  

Coefficients:
             Estimate Std. Error z value Pr(>|z|)    
(Intercept) -3.544731   0.304081 -11.657   <2e-16 ***
idade        0.043161   0.004802   8.989   <2e-16 ***
educ         0.248164   0.015334  16.184   <2e-16 ***
componentes -0.083489   0.039808  -2.097    0.036 *  
negro       -0.021398   0.197521  -0.108    0.914    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 2241.9  on 1627  degrees of freedom
Residual deviance: 1856.2  on 1623  degrees of freedom
AIC: 1866.2

Number of Fisher Scoring iterations: 4

Podemos montar nossa própria regressão manualmente

In [5]:
MQO = function(T) {
# Curso introdução ao R Econs
# Por: ANDRE SURIANE
#                  UFJF
#                  Faculdade de Economia
#                  laboratório de estudos econômicos Econs
# estimar uma regressão linear simples passo a passo
# T é um data frame em que a primeira coluna é a variável a dependente e todas
# as demais são explicativas <<não deve conter a constante>>
     T <- na.omit(T)
     N <- nrow(T)  # numero de linas
     K <- ncol(T)  #  numero de variaveis
     DEP <- as.matrix(T[1])  # variavel dependente 
     intercept <- matrix(1, nrow = N) # constante
     X <- data.frame(intercept, T[,2:K])
     X <- as.matrix(X)
     b <- solve(t(X)%*%X)%*%(t(X)%*%DEP) # estimativas para b do MQO
     N <- nrow(T)
     k <-length(b)  
     df <- N-K
     DEPc <- X%*%b # DEPUEL calculado
     er <- DEP-DEPc # erro
     sigma2 <- (t(er)%*%er)/N # variancia
     varR <- (t(er)%*%er)/df # variancia residual
     varR <- varR[1,1]
     MVC <- varR*(solve(t(X)%*%X)) # Matriz de variancia-convariancia
     media <- sum(DEP)/N # media da variavel dependente
     desvioT <- DEP-media # desvio total
     desvioE <- DEPc-media # desvio explicado
     R2 <- (t(desvioE)%*%desvioE)/(t(desvioT)%*%desvioT) # R2
     erm <-  (t(er)%*%er)*(N-1) # numerador dos R2 ajustado
     ern <- (t(desvioT)%*%desvioT)*df # denominador do R2 ajustado
     R2ajus <- 1-(erm/ern) # R2 ajustado
     
     ## critérios de ajustamento
     AIC <- N*(log(2*pi)+1+log((sum(er^2)/N)))+((K+1)*2) # criterio Akaike by residuls
     BIC <- AIC + K*(log(N)-2)
     ll <-0.5*(sum(log(intercept))-N*(log(2*pi)+1-log(N)+log(sum(intercept*er^2)))) #  likelihood function
     AKI <- 2*K-2*ll # AIC by  likelihood function
     AICc1 <- AKI +K*(K+1)/(N-K-1)
     AICc2 <- AIC +K*(K+1)/(N-K-1)
     SC <- log(N)*K-2*ll # SBC by  likelihood function
     
     
     dp <- sqrt(diag(MVC)) # desvio padrao
     et <- b/dp  # estatistica T
     I <- (t(desvioE)%*%desvioE)/(K-1) # numerador da estatistica F
     O <- (t(er)%*%er)/(N-K) # denomindaor da estatistica F
     ef <- I/O # estatistica F
     pval <- 1-pf(ef,K, N) # Pvalor estatistica F
        
     res <- data.frame(b, dp, et )
     for (i in 1:K) {
     res[i,4]<- 2*(min(1-pt(q=res[i,3], df=N-K), pt(q=res[i,3], df=N-K))) # Pvalor  estatistica t
                 }
     res <- round(res, 4)
     colnames(res) <- c("Betas", "Des.Pad.", "Estat-t"  , "P-valor")
     res$signif <-  ifelse(res[4]<0.001,"***", ifelse(res[4]<0.01, "**", ifelse(res[4]<0.05,"*","_")))
     
     res2 <- data.frame(R2, R2ajus, AIC, BIC, ef, pval)
     res2 <- round(res2, 4)
     res3 <- data.frame(AIC, AKI, AICc1, AICc2, BIC, SC)
     
     colnames(res2) <- c("R2", "R2ajus", "AIC", "BIC", "Esta_F", "Pvalor")
     rownames(res2) <- c("Estatisticas")
     
     return(list(res,res2,res3))
     
}
In [6]:
pnad2$dr<- NULL 
MQO(pnad2)
  1. A data.frame: 5 × 5
    BetasDes.Pad.Estat-tP-valorsignif
    <dbl><dbl><dbl><dbl><chr[,1]>
    intercept 4.85260.098749.16750.0000***
    idade 0.01920.001611.92840.0000***
    educ 0.12220.004726.04780.0000***
    componentes-0.03500.0137-2.54380.0111*
    negro-0.06710.0709-0.94620.3442_
  2. A data.frame: 1 × 6
    R2R2ajusAICBICEsta_FPvalor
    <dbl><dbl><dbl><dbl><dbl><dbl>
    Estatisticas0.32290.32133936.9813963.956193.52080
  3. A data.frame: 1 × 6
    AICAKIAICc1AICc2BICSC
    <dbl><dbl><dbl><dbl><dbl><dbl>
    3936.983934.983934.9993936.9993963.9563961.956
In [7]:
AIC(result)
BIC(result)
3936.98045272556
3969.35109800494

«

6 Gráficos

A próxima etapa no nosso aprendizado é criar gráficos. Já vimos uma série de objetos dentro do R, mas ainda não colocamos os mesmos de forma gráfica.

Para verificar as opções de gráficos no R, acesse o link R Graph Gallery

6.1 Linhas e pontos

O comando básico para a geração de um gráfico é o plot(). Segue abaixo o exemplo de um gráfico simples.

Exemplo:

In [220]:
a <- 1:30
 b <- a^2
 plot(a,b)

Exemplo de gráfico simples com atribuição de pontos em coordenadas cartesianas

In [118]:
datacsv <- read.csv2("Exemplo/Exemplo1_ipca.csv",header =T, sep=";", dec=".")
ipca <- datacsv
colnames(ipca)<- c("data", "ipca12")
ipca$ano <- floor(ipca[,1])
ipca$min <- ave(ipca$ipca12, ipca$ano, FUN = min)
ipca$max <- ave(ipca$ipca12, ipca$ano, FUN = max)
ipca$mean <- ave(ipca$ipca12, ipca$ano, FUN = mean)

ipca2 <- aggregate(x = ipca,
              by = list(ipca$ano),
              FUN = mean)

plot(ipca2$ano, ipca2$mean, xlab='', ylab='(%)', type='l', col='blue', main='IPCA', lwd=2, lty=1) + # l define tipo linha
lines(ipca2$ano, ipca2$min, col="darkgreen")+
lines(ipca2$ano, ipca2$max, col="red")
#Exemplo de gráfico simples para a variável IPCA.
In [120]:
ipca2<- subset(ipca2, ipca2$ano>1994)
plot(ipca2$ano, ipca2$mean, type="l", col ="black")+
abline(h = mean(ipca2$mean), col="purple3")
abline(h = median(ipca2$mean), col="blue")
abline(v =ipca2$ano[ipca2$mean==max(ipca2$mean)], col="darkblue")
abline(v =ipca2$ano[ipca2$mean==min(ipca2$mean)], col="blue")

Os gráficos gerados podem ser salvos imediatamente a sua criação. Existem vários formatos em que o R pode salvar essas imagens. Alguns deles são: JPEG, BMP, PDF, TIFF, PNG. No exemplo a seguir será utilizando o formato PNG, contudo a sintaxe para qualquer formato é a mesma.

In [260]:
png(file="Imagens/plot.png",  width = 1200, height = 720, units = "px",bg = "white") # plot refere o nome da imagem
# alem de png() é possivel salvar em bmp() jpeg() tiff(), sem usar pacotes adcionais.
plot(a,b)   #grafico que estamos salvando
dev.off() #fecha a janela automaticamente
png: 2

Scatter plot

In [262]:
#attach(Z)
png(file = "Imagens/sc1.png",  width = 1200, height = 720, units = "px",bg = "white") 
plot( cos(x) ,cos(2*x) , cex = .5, col = "blue") +
points(sin(y),cos(2*y) , cex = .5, col = "red") +
points(x,y , cex = .5,  col = "darkgreen") 
dev.off()
png: 2

Linhas

In [23]:
# Gráfico de distribuição normal com 5% de significância 
# definir x e fx
 x <- seq(-5, 5, l=100)  
 fx <- function(x) (1/sqrt(2*pi))*exp((-1/2)*(x)^2)
 # plotar fx 
 plot(x, (1/sqrt(2*pi))*exp((-1/2)*(x)^2), ty='l')  

 # calcular integral 
 ie1 <- integrate(fx, 1.96, 5)
 ie2 <- integrate(fx, -5, -1.96)
 pt <- as.numeric(ie1[1])+as.numeric(ie2[1])

 # definir intevalo de integração em x e valores de fx
 x <- seq(1.96, 5, l=100)
 fx1 <- (1/sqrt(2*pi))*exp((-1/2)*(x)^2)

 # plotar integral definida de fx
 polygon(rbind(cbind(rev(x),0),cbind(x,fx1)), col=adjustcolor('blue4', alpha = .6))

 x <- seq(-5, -1.96, l=100)
 fx2 <- (1/sqrt(2*pi))*exp((-1/2)*(x)^2)

 polygon(rbind(cbind(rev(x),0),cbind(x,fx2)), col=adjustcolor('blue4', alpha = .6))
# textos
 text(3, 0.05, expression(paste(integral(1/sqrt(2*pi)*e^{-(x^{2}/2)}*dx,1.96,5))),  adj = 0, cex = .6)
 text(-4.5, 0.05, expression(paste(integral(1/sqrt(2*pi)*e^{-(x^{2}/2)}*dx,-5,-1.96))),  adj = 0, cex = .6)
#https://stat.ethz.ch/R-manual/R-devel/library/grDevices/html/plotmath.html
text(3, 0.1, paste("pv = ",round(pt,2)), adj = 0, col = "black", cex = 1)
lines(c(2.9, 2.2), c(0.1, 0.01), col = 'blue4', lwd = 2)
lines(c(2.9, -2.2), c(0.1, 0.01), col = 'blue4', lwd = 2)
In [12]:
exp(1)
2.71828182845905
In [110]:
t = 10:1000
x = sin(t/10)/(t/10)
y = cos(t/10)/(t/10)
plot(x,y,type = "l", col = "darkred") +
lines(y+.3,-x+.3, col = "darkgreen")
In [123]:
esferaV<-function(raio) {
     (4/3)*pi*raio^3
 }
esferaA<-function(raio) {
    (4)*pi*raio^2
 }

circuloC<-function(raio) {
    2*pi*raio
 }

circuloA<-function(raio) {
   pi*raio^2
 }

esferaA(2)
circuloA(2)
50.2654824574367
12.5663706143592
In [124]:
pl <- data.frame(c(1:100)/10)
pl[,2]<- circuloA(1:100/10) 
pl[,3]<- circuloC(1:100/10)
pl[,4]<- esferaA(1:100/10) 
pl[,5]<- esferaV(1:100/10)
colnames(pl) <- c("raio","Área círculo", "circunferência", "Área esfera", "Volume")

plot(pl[,1:2], type="l", main="esfera circulo", ylab="Volume area circunferencia")+
lines(pl[,c(1,3)], col="gray")+
lines(pl[,c(1,4)], col="blue")+
lines(pl[,c(1,5)], col="lightblue")
In [12]:
pl <- data.frame(c(1:100)/100)
for (i in 1:100) paste(pl[i,2]<- Black.Scholes(10,12, pl[i,1], .06, .1)[1,1])

plot(pl[,1:2], type="l", main="Black-Scholes", xlab="Tempo", ylab="Preço")
In [269]:
x1 <- 0:64
plot(x1, x1, type= "n")
legend("center",      "(x,y)", pch = 1, title = "center")
legend("top",         "(x,y)", pch = 2, title = "top, inset = .01",       inset = .01, col="green")
legend("topright",    "(x,y)", pch = 3, title = "topright, inset = .02",  inset = .02, col="blue")
legend("right",       "(x,y)", pch = 4, title = "right, inset = .04",     inset = .04, col='orange')
legend("bottomright", "(x,y)", pch = 5, title = "bottomright, inset=.06", inset = .06, col='red')
legend("bottom",      "(x,y)", pch = 6, title = "bottom, inset = .08",    inset = .08, col="cyan")
legend("bottomleft",  "(x,y)", pch = 7, title = "bottomleft, inset = .1", inset = .1,  col="magenta")
legend("left",        "(x,y)", pch = 8, title = "left, inset = .12",      inset = .12, col="#FF004D")
legend("topleft",     "(x,y)", pch = 9, title = "topleft, inset = .14",   inset = .014, col="dark red")
#legend(posição, legenda, pch = "tipo de marcação [1,9]", title= "titulo", inset="deslocamento em direção ao centro, col = "cor")

«

6.2 Barras e histogramas

Um histograma divide uma série de dados em diferentes classes igualmente espaçadas e mostra a frequência de valores em cada classe. Em um gráfico, o histograma mostra diferentes barras, com bases iguais e amplitudes relativas às frequências dos dados em cada classe. O eixo das ordenadas, portanto, mostra a frequência relativa de cada classe e o eixo das abcissas os valores e intervalos das classes.

In [270]:
x <- rnorm(1:10000)

par(mfrow=c(2,1))
hist (x, nclass = 20) # histograma com 20 classes
hist (x, nclass = 100) # histograma com 100 classes
In [271]:
par(mfrow=c(2,3))
hist(idade[raca=="Branca" & sexo == "Mulher"], main = "Mulher branca")
hist(idade[raca=="Preta"  & sexo == "Mulher"], main = "Mulher negra")
hist(idade[raca=="Parda"  & sexo == "Mulher"], main = "Mulher parda")
hist(idade[raca=="Branca" & sexo == "Homem"], main = "Homem branco")
hist(idade[raca=="Preta" & sexo == "Homem"], main = "Homem negro")
hist(idade[raca=="Parda" & sexo == "Homem"], main = "Homem pardo")

Barras

A função barplot() gera gráfico de barras, onde cada barra representa a medida de cada elemento de um vetor, ou seja, as barras são proporcionais com a “dimensão” do elemento.

In [130]:
# barplot(x, col=" ", legend.text=" ", xlab=" ",ylab=" ") 
x <- rnorm(1:20)
ipca3 <-c (6.62 ,4.61 ,6.03 ,5.28 , 5.70)
par(mfrow=c(2,1))

barplot(x, xlab="normal(10000)")
barplot(ipca3,xlab="IPCA variacao",col="blue") + title("IPCA")
In [143]:
barplot(ipca2$mean )
In [159]:
barplot(c(mean(pnad2$educ), mean(pnad2$componentes), mean(pnad2$lnrenda)),col="red")
In [158]:
barplot(c(mean(pnad$branco),mean(pnad$negro),mean(pnad$pardo),mean(pnad$masc),mean(pnad$migrante)),col="blue")

«

6.3 Gráficos para matrizes 2D e 3D

In [14]:
input <- matrix(c(1:100)/10, 100,1)
pl = diag(100)
for (i in 1:100) {
    for (j in 1:100)  {
        pl[i,j]<- Black.Scholes(input[j,1], 12, input[i,1], .06, .1)[1,1]
        }
    }
In [20]:
persp(z = t(pl), xlab ="Preço das ações", ylab = "Tempo", zlab = "Preço de compra da opção", col = "red",
     phi= 45,
     theta = -45)
In [73]:
tcol <- rev(rainbow(23)[1:18])
filled.contour(t(pl),nlevel=18, col =tcol, axes = FALSE )

Para mais opções de cores clique na paleta

In [9]:
si = 40
data=matrix(2*rnorm(si*si)+10, si,si)
In [13]:
tcol <-  rainbow(20)
contour(z = data, nlevel=40, col =tcol,labcex = 0.001, axes = FALSE )
In [ ]:


«