métodos computacionais em estatística

69
Curso: Métodos Computacionais em Estatísica Luís Carlos 9 de fevereiro de 2016 Métodos computacionais com o uso do software R Conhecendo o software R O software R é uma linguagem para manipulação de dados, análises estatísticas e construção de gráficos. O mesmo é derivado do software S, desenvolvido pela AT&T. Plataformas: Windows, MacOS, Unix e derivados. O R é um software livre, código aberto e um projeto colaborativo. Software R: [Baixar e instalar o R:] (https://cran.r-project.org/) Conhecendo o software RStudio Software RStudio: [Baixar e instalar o RStudio:] (https://www.rstudio.com/products/rstudio-desktop/) O ambiente do RStudio Instalando e habilitando pacotes no R Comandos úteis setwd(“c:/Users/lsr10/ArqR”) muda o diretório do trabalho getwd() mostra o diretório do trabalho ls() e objects() lista o nome dos objetos criados na sessão atual dir() lista todos os arquivos na pasta de trabalho atual search() lista todos os pacotes carregados rm() remove o objeto entre parênteses rm(list=ls(all=TRUE)) remove todos os objetos, limpando a memória attach() reconhece os objetos dentro de um data frame detach() função para desfazer a função attach() Operações básicas com o R Adição usa o operador “+”: 2 + 2 = 4 Subtração usa o operador “-”: 1-5 = -4 Multiplicaçãon usa o operador “*“: 2*6 = 12 Divisão de ponto flutuante usa o operador “/”: 6/5 = 1.2 1

Upload: cassio-setubal

Post on 09-Jul-2016

12 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Métodos Computacionais Em Estatística

Curso: Métodos Computacionais em EstatísicaLuís Carlos

9 de fevereiro de 2016

Métodos computacionais com o uso do software R

Conhecendo o software R

O software R é uma linguagem para manipulação de dados, análises estatísticas e construção de gráficos.

O mesmo é derivado do software S, desenvolvido pela AT&T.

Plataformas: Windows, MacOS, Unix e derivados.

O R é um software livre, código aberto e um projeto colaborativo.

Software R:

[Baixar e instalar o R:] (https://cran.r-project.org/)

Conhecendo o software RStudio

Software RStudio:

[Baixar e instalar o RStudio:] (https://www.rstudio.com/products/rstudio-desktop/)

O ambiente do RStudio

Instalando e habilitando pacotes no R

Comandos úteis

setwd(“c:/Users/lsr10/ArqR”) muda o diretório do trabalho

getwd() mostra o diretório do trabalho

ls() e objects() lista o nome dos objetos criados na sessão atual

dir() lista todos os arquivos na pasta de trabalho atual

search() lista todos os pacotes carregados

rm() remove o objeto entre parênteses

rm(list=ls(all=TRUE)) remove todos os objetos, limpando a memória

attach() reconhece os objetos dentro de um data frame

detach() função para desfazer a função attach()

Operações básicas com o R

Adição usa o operador “+”: 2 + 2 = 4

Subtração usa o operador “-”: 1-5 = -4

Multiplicaçãon usa o operador “*“: 2*6 = 12

Divisão de ponto flutuante usa o operador “/”: 6/5 = 1.2

1

Page 2: Métodos Computacionais Em Estatística

Divisão inteira usa o operador “%/%”: 6%/%5 = 1 e e 5%/%2 = 2

Resto da divisão usa o operador “%%” : 6%%3 = 0 e 5%%2 = 1

Potenciação usa os operadores “ˆ” e “**“: 2ˆ3 = 8 ou 2**3 = 8

Raíz quadrada usa a função sqrt():√

(9), sqrt(9) = 3

Cálculo de uma raíz qualquer: 27ˆ(1/3) = 3

Exponencial usa a função exp(): exp(2) = 7.3890561

Exponencial de “exp(x)-1” usa a função expm1(): expm1(2) = 6.3890561

Logaritmo na base e usa a função log(): log(2) = 0.6931472

logaritmo na base 10 usa a função log10(): log10(5) = 0.69897

logaritmo na base 2 usa a função log2(): log2(5) = 2.3219281

Logaritmo na base e de “x+1” usa a função log1p(): se x=1, logp1(x) = 0.6931472

Logaritmo em qualquer base usa a função log(x, base): se x=27, log(x,3)= 3

Cálculo de fatorial de um número (n>=0), usa a função factorial(). factorial(5) = 120

Funções trigonométricas (valores em radianos): sin(), cos(), tan()

Funções trigonométricas inversas: asin(), acos(), atan()

Funções hiperbólicas: sinh(), cosh(), tanh()

Funções hiperbólicas inversas: asinh(), acosh(), atanh()

Função Gamma de Euler: gamma()

Número de combinações: choose(): n!x!(n−x!)

Conjunto gerados pela combinação de determinados números de elementos: combn()

xc=c(“a”,“b”,“c”), combn(xc,2) = a, b, a, c, b, c

Valor absoluto usa a função abs(): abs(-5) = 5

Valor de π usa “pi”" : 3.1415927

Atribuição de valores no R: " <- “,”->“,”="

x <- 5

y = 6

x+y -> z

x; y; z # comandos separados por “;”

Em comentários usar “#”

z*x # produto de z por x

“+” aparecerá como prompt de comando indicando a continuação do comando da linha anterior

A opção options(digits = n), 1<=n<=22, define a quantidade de digitos decimal.

Palavras reservadas do R

Nomes de variáveis no R pode conter letras, números, “.” e “_“, não devendo iniciar com um número ouponto seguido por um número.

2

Page 3: Métodos Computacionais Em Estatística

x9l=3.x4=5#9xc=3#.9rg=4#make.names

Números especiais (Inf,-Inf, NaN-not a number, NA-not available)

c(0, Inf, -Inf, NaN, NA)

## [1] 0 Inf -Inf NaN NA

c(Inf+1, Inf-1, Inf-Inf)

## [1] Inf Inf NaN

c(1/Inf, Inf/1, Inf/Inf)

## [1] 0 Inf NaN

c(sqrt(Inf), sin(Inf))

## Warning in sin(Inf): NaNs produzidos

## [1] Inf NaN

c(log(Inf), log(Inf, base=Inf))

## Warning: NaNs produzidos

## [1] Inf NaN

c(1+NA, NaN+NaN, NaN+Inf, NaN+NA)

## [1] NA NaN NaN NaN

is.finite(c(0, Inf, -Inf, NaN, NA))

## [1] TRUE FALSE FALSE FALSE FALSE

is.nan(c(0, Inf, -Inf, NaN, NA))

## [1] FALSE FALSE FALSE TRUE FALSE

3

Page 4: Métodos Computacionais Em Estatística

is.na(c(0, Inf, -Inf, NaN, NA))

## [1] FALSE FALSE FALSE TRUE TRUE

Tipos de dados do R

• vetores, matrizes e arrays, data-frames, listas e funções.

Usaremos as funções do tipo is.*() para testar se um objeto é de determinado tipo.

is.vector(), is.matrix(), is.array(), is.data.frame(), is.list() e is.function().

Vetores - dados do mesmo tipo (numérico, complexo, lógico, caracter, nulo) - logical, integer, double, complex,character, or raw

1:10 + 1

## [1] 2 3 4 5 6 7 8 9 10 11

1:10 + 1:3

## Warning in 1:10 + 1:3: comprimento do objeto maior não é múltiplo do## comprimento do objeto menor

## [1] 2 4 6 5 7 9 8 10 12 11

1:10 + 11:20

## [1] 12 14 16 18 20 22 24 26 28 30

1:5 + 1:10

## [1] 2 4 6 8 10 7 9 11 13 15

c(1,2,3,4,5)+c(6,7,8,9,10)

## [1] 7 9 11 13 15

sum(1:10); mean(1,2,3,4,5)

## [1] 55

## [1] 1

median(1:10)

## [1] 5.5

4

Page 5: Métodos Computacionais Em Estatística

median(c(1,2,3,4,5))

## [1] 3

Opeadores lógicos (“!”- not, “&”- and e “|”- or)

(vl <- 1:20 >=10)

## [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE## [12] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE

!vl

## [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE## [12] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

(vl1 <- 1:10 %% 2 == 0)

## [1] FALSE TRUE FALSE TRUE FALSE TRUE FALSE TRUE FALSE TRUE

vl & vl1

## [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE## [12] TRUE FALSE TRUE FALSE TRUE FALSE TRUE FALSE TRUE

vl | vl1

## [1] FALSE TRUE FALSE TRUE FALSE TRUE FALSE TRUE FALSE TRUE TRUE## [12] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE

Classes de números

class(c(FALSE, TRUE))

## [1] "logical"

class(2)

## [1] "numeric"

class(sqrt(5))

## [1] "numeric"

class(2 + 2i)

## [1] "complex"

5

Page 6: Métodos Computacionais Em Estatística

class(2L)

## [1] "integer"

class(0.3:1.5)

## [1] "numeric"

class(10:20)

## [1] "integer"

class(c("Abricó", "Sapoti", "Juá"))

## [1] "character"

class(factor(c("masc", "fem"))) # fator são inteiros como rótulo, não precisamos usar "0" e "1"

## [1] "factor"

levels(factor(c("masc", "fem")))

## [1] "fem" "masc"

nlevels(factor(c("masc", "fem")))

## [1] 2

as.integer(factor(c("masc", "fem")))

## [1] 2 1

as.raw(1:20) # vetor de bytes, cada byte representado por 2 digitos hexadecimal(0 a 255).

## [1] 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14

as.raw(c(pi, 2+2i, 256)) # a parte imaginária é descartada.

## Warning: partes imaginárias descartadas na coerção

## Warning: valores fora do limite considerados como 0 na coerção para tipo## raw

## [1] 03 02 00

6

Page 7: Métodos Computacionais Em Estatística

as.raw(c(pi, 2+2i, 25))

## Warning: partes imaginárias descartadas na coerção

## [1] 03 02 19

ct <- "234.256"; as(ct, "numeric"); as.numeric(ct)

## [1] 234.256

## [1] 234.256

# a maioria das funções "is*" tem uma função correspondente "as*"ct1=c(5,7,9,11)# as(ct1, "data.frame"); as.data.frame(ct1) # usar sempre a classe específica sobre o padrão "as"..Machine

## $double.eps## [1] 2.220446e-16#### $double.neg.eps## [1] 1.110223e-16#### $double.xmin## [1] 2.225074e-308#### $double.xmax## [1] 1.797693e+308#### $double.base## [1] 2#### $double.digits## [1] 53#### $double.rounding## [1] 5#### $double.guard## [1] 0#### $double.ulp.digits## [1] -52#### $double.neg.ulp.digits## [1] -53#### $double.exponent## [1] 11#### $double.min.exp

7

Page 8: Métodos Computacionais Em Estatística

## [1] -1022#### $double.max.exp## [1] 1024#### $integer.max## [1] 2147483647#### $sizeof.long## [1] 4#### $sizeof.longlong## [1] 8#### $sizeof.longdouble## [1] 16#### $sizeof.pointer## [1] 8

xi=vector() # declaração de um vetorxi; xi[2]=3; xi; xi[1]=5; xi

## logical(0)

## [1] NA 3

## [1] 5 3

x1 <- c(1,2,3,4,5) # usando a função c()-combine ou assign("x1", c(1,2,3,4,5))vector("numeric", 3); numeric(5)

## [1] 0 0 0

## [1] 0 0 0 0 0

vector("complex", 3); complex(5)

## [1] 0+0i 0+0i 0+0i

## [1] 0+0i 0+0i 0+0i 0+0i 0+0i

vector("logical", 3); logical(5)

## [1] FALSE FALSE FALSE

## [1] FALSE FALSE FALSE FALSE FALSE

8

Page 9: Métodos Computacionais Em Estatística

vector("character", 3); character(5)

## [1] "" "" ""

## [1] "" "" "" "" ""

vector("list",3); vector("raw",3)

## [[1]]## NULL#### [[2]]## NULL#### [[3]]## NULL

## [1] 00 00 00

xl <- c(TRUE,TRUE,FALSE,FALSE); xl

## [1] TRUE TRUE FALSE FALSE

xc <- c("São", "Luís", "Ilha", "do", "Maranhão"); xc

## [1] "São" "Luís" "Ilha" "do" "Maranhão"

Os “[]” são usados para seleção de elementos. As funções rep(), seq() e os “:” são usados para criar vetoressegundo uma lei de formação.

x3 <- seq(1:20); x3; x3[5]; x3[2:8]

## [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

## [1] 5

## [1] 2 3 4 5 6 7 8

x4 <- seq(0,1, by=0.5); x4; is.vector(x4); is.matrix(x4)

## [1] 0.0 0.5 1.0

## [1] TRUE

## [1] FALSE

9

Page 10: Métodos Computacionais Em Estatística

x5 <- rep(2.5, 10); x5;

## [1] 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5 2.5

x51 <- rep(1:3, 4); x51 # ou rep.int(1:3, 4).

## [1] 1 2 3 1 2 3 1 2 3 1 2 3

x52 <- rep(1:3, each=2); x52

## [1] 1 1 2 2 3 3

x53 <- rep(1:3, times=1:3); x53

## [1] 1 2 2 3 3 3

x54 <- rep(1:3, length.out=10); x54

## [1] 1 2 3 1 2 3 1 2 3 1

x55 <- rep_len(1:3, 10); x55 # a partir da versão 3.0 de R.

## [1] 1 2 3 1 2 3 1 2 3 1

x6 <- rep(c("Fruta pão", "Juá", "Bacuparí"), c(1,2,3)); x6; x6[3:4] # repetição de um valor.

## [1] "Fruta pão" "Juá" "Juá" "Bacuparí" "Bacuparí" "Bacuparí"

## [1] "Juá" "Bacuparí"

seq.int(10, 5) # 10:5;

## [1] 10 9 8 7 6 5

seq.int(5,15,2)

## [1] 5 7 9 11 13 15

n <- 5; 0:n; seq_len(n) #seq_len(), cria uma sequência de 1 até n

## [1] 0 1 2 3 4 5

## [1] 1 2 3 4 5

10

Page 11: Métodos Computacionais Em Estatística

n <- 0; 1:n; seq_len(n)

## [1] 1 0

## integer(0)

for (i in seq_along(x6)) {print(x6[i])}

## [1] "Fruta pão"## [1] "Juá"## [1] "Juá"## [1] "Bacuparí"## [1] "Bacuparí"## [1] "Bacuparí"

# cria uma sequencia de 1 até o tamanho da entradafor (i in x6) {print(x6[i])}

## [1] NA## [1] NA## [1] NA## [1] NA## [1] NA## [1] NA

(v1 <- 2*sqrt(x1^3))

## [1] 2.000000 5.656854 10.392305 16.000000 22.360680

length(v1); length(1:10); length(c(FALSE, NA, TRUE, NaN, TRUE, FALSE)) #tamanho do vetor

## [1] 5

## [1] 10

## [1] 6

c(Frutapao = 3, Jua = 2, Bacupari = 1) # adiciona nomes aos elementos do vetor com a função names()

## Frutapao Jua Bacupari## 3 2 1

# c(Frutapão = 3, Juá = 2, Bacuparí = 1)nv <- 1:3; names(nv) <- c("Banana", "Goiaba","Melancia"); nv; names(nv); names(v1)

## Banana Goiaba Melancia## 1 2 3

11

Page 12: Métodos Computacionais Em Estatística

## [1] "Banana" "Goiaba" "Melancia"

## NULL

Devemos usar “==” para igualdade de números inteiros, “>” para maior que, “<” para menor que, “<=”para menor ou igual, “>=” para maior ou igual e “!=” para diferente.

x3 != 6

## [1] TRUE TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE## [12] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE

x3 >= 10

## [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE## [12] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE

x4 == 1

## [1] FALSE FALSE TRUE

sqrt(2)^2==2

## [1] FALSE

sqrt(2)^2-2

## [1] 4.440892e-16

all.equal(sqrt(2)^2,2) # nivel de tolerância default=1.5e-8

## [1] TRUE

isTRUE(all.equal(sqrt(2)^2, 3))

## [1] FALSE

Testar se vetor é numérico

x1; is.numeric(x1)

## [1] 1 2 3 4 5

## [1] TRUE

12

Page 13: Métodos Computacionais Em Estatística

x1[6] <- "a"; x1; is.numeric(x1)

## [1] "1" "2" "3" "4" "5" "a"

## [1] FALSE

v2 <- rep(1:5, each=5); v2

## [1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4 5 5 5 5 5

v3=c(10,15,20,25,30)v3; v3[2:5]

## [1] 10 15 20 25 30

## [1] 15 20 25 30

v4=2:10; v4

## [1] 2 3 4 5 6 7 8 9 10

v41<- array(3:9); v41; is.vector(v41); is.array(v41)

## [1] 3 4 5 6 7 8 9

## [1] FALSE

## [1] TRUE

v5=seq(2,10,0.25); v5

## [1] 2.00 2.25 2.50 2.75 3.00 3.25 3.50 3.75 4.00 4.25 4.50## [12] 4.75 5.00 5.25 5.50 5.75 6.00 6.25 6.50 6.75 7.00 7.25## [23] 7.50 7.75 8.00 8.25 8.50 8.75 9.00 9.25 9.50 9.75 10.00

v6=rep(1,30); v6

## [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

length(v6) # tamanho do vetor

## [1] 30

Indexação de vetores # usa o “[]”

13

Page 14: Métodos Computacionais Em Estatística

vi <- 1:10*1/2; vi

## [1] 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0

vi[c(2,5,8,10)]

## [1] 1.0 2.5 4.0 5.0

vi[c(-1, -3, -4, -6, -7, -9)]

## [1] 1.0 2.5 4.0 5.0

vi[c(FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, FALSE, TRUE)]

## [1] 1.0 2.5 4.0 5.0

vi[2:6]

## [1] 1.0 1.5 2.0 2.5 3.0

vi[]

## [1] 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0

which(vi>2)

## [1] 5 6 7 8 9 10

vi1 <- 1:5names(vi1) <- c("um", "dois","três", "quatro","cinco")vi1[c("dois", "três")]

## dois três## 2 3

vi1[c(3, NA, 5)]

## três <NA> cinco## 3 NA 5

vi1[c(-3.5, -5.9)]

## um dois quatro cinco## 1 2 4 5

14

Page 15: Métodos Computacionais Em Estatística

which.min(vi1); which.max(vi1) # atalho para which(min(vi1)) e which(max(vi1))

## um## 1

## cinco## 5

Operações com vetores

v7=c(1,2,3,4,5,6)va=c(1,1,1,1,1,1)v8=c(20,21,22,23,24,25,26,27,28,29,30) # vetores com diferentes tamanhos #v9=c(10,11,12,13,14,15,16)v10=c(10,10,10,10,10,10,10,10)v7; va; v8; v9; v10

## [1] 1 2 3 4 5 6

## [1] 1 1 1 1 1 1

## [1] 20 21 22 23 24 25 26 27 28 29 30

## [1] 10 11 12 13 14 15 16

## [1] 10 10 10 10 10 10 10 10

Vetores do mesmo tamanho

v7+va # vetores do mesmo tamanho #

## [1] 2 3 4 5 6 7

v7-va

## [1] 0 1 2 3 4 5

v7*va # multiplicação indice a indice, nao como em Algebra Linear #

## [1] 1 2 3 4 5 6

Vetores de tamanhos diferentes

v7+v8

## Warning in v7 + v8: comprimento do objeto maior não é múltiplo do## comprimento do objeto menor

## [1] 21 23 25 27 29 31 27 29 31 33 35

15

Page 16: Métodos Computacionais Em Estatística

v8+v7

## Warning in v8 + v7: comprimento do objeto maior não é múltiplo do## comprimento do objeto menor

## [1] 21 23 25 27 29 31 27 29 31 33 35

v7*v8

## Warning in v7 * v8: comprimento do objeto maior não é múltiplo do## comprimento do objeto menor

## [1] 20 42 66 92 120 150 26 54 84 116 150

Produto escalar com o uso de “%*%"

v7%*%va # produto escalar '1*1+2*1+3*1+4*1+5*1+6*1'

## [,1]## [1,] 21

#v7%*%v9 # produto escalar incompativel

Outras aplicações

vidade=c(20:40); vidade

## [1] 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40

vpeso=c(50:70); vpeso

## [1] 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70

max(vidade); min(vidade)

## [1] 40

## [1] 20

max(vpeso); min(vpeso)

## [1] 70

## [1] 50

16

Page 17: Métodos Computacionais Em Estatística

vidade[vidade>32]; vpeso[vpeso<65]

## [1] 33 34 35 36 37 38 39 40

## [1] 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64

Classificação de vetores

sort(vidade)

## [1] 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40

sort(vpeso)

## [1] 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70

sort(vidade, decreasing = TRUE) # classificação em ordem decrescente #

## [1] 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20

Mais aplicações

sum(vidade) # soma dos valores de um vetor #

## [1] 630

sum(vpeso)

## [1] 1260

length(vidade) # tamanho do vetor

## [1] 21

length(vpeso)

## [1] 21

sum(vidade)/length(vidade) # média #

## [1] 30

sum(vpeso)/length(vpeso)

## [1] 60

Algumas funções de estatísitica

17

Page 18: Métodos Computacionais Em Estatística

mean(vidade)

## [1] 30

mean(vpeso)

## [1] 60

median(vidade) # mediana #

## [1] 30

median(vpeso)

## [1] 60

var(vidade) # variancia amostral (n-1) #

## [1] 38.5

var(vpeso)

## [1] 38.5

sqrt(var(vidade)) # desvio padrão #

## [1] 6.204837

sqrt(var(vpeso))

## [1] 6.204837

sd(vidade)

## [1] 6.204837

sd(vpeso)

## [1] 6.204837

Estatísitcas básicas

summary(vidade)

## Min. 1st Qu. Median Mean 3rd Qu. Max.## 20 25 30 30 35 40

18

Page 19: Métodos Computacionais Em Estatística

summary(vpeso)

## Min. 1st Qu. Median Mean 3rd Qu. Max.## 50 55 60 60 65 70

Dados strings

frutas =c("Abacate","caju","abacate","Laranja","Melancia","Melão","Caju", "Abricó","Caju","Melão","Melancia"); frutas

## [1] "Abacate" "caju" "abacate" "Laranja" "Melancia" "Melão"## [7] "Caju" "Abricó" "Caju" "Melão" "Melancia"

frutas1 =c("Abacate",'Caju',"Pitomba","Tangerina","Melancia","Melão",'Caju','Abricó',"Caju",'Melão','Melancia'); frutas1

## [1] "Abacate" "Caju" "Pitomba" "Tangerina" "Melancia"## [6] "Melão" "Caju" "Abricó" "Caju" "Melão"## [11] "Melancia"

c("A","B","C","D","E") == "B"

## [1] FALSE TRUE FALSE FALSE FALSE

c("A","B","C","D","E") < "C"

## [1] TRUE TRUE FALSE FALSE FALSE

frutas == "Abacate"

## [1] TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

Tabela de frequencias

table(frutas)

## frutas## abacate Abacate Abricó caju Caju Laranja Melancia Melão## 1 1 1 1 2 1 2 2

table(frutas1)

## frutas1## Abacate Abricó Caju Melancia Melão Pitomba Tangerina## 1 1 3 2 2 1 1

19

Page 20: Métodos Computacionais Em Estatística

tabela.frutas1=table(frutas1)tabela.frutas1

## frutas1## Abacate Abricó Caju Melancia Melão Pitomba Tangerina## 1 1 3 2 2 1 1

Alguns gráficos

plot(vidade, vpeso)

20 25 30 35 40

5055

6065

70

vidade

vpes

o

barplot(tabela.frutas1)

20

Page 21: Métodos Computacionais Em Estatística

Abacate Abricó Caju Melancia Melão Pitomba

0.0

0.5

1.0

1.5

2.0

2.5

3.0

barplot(tabela.frutas1,col= c("black", "red", "green", "tomato", "royalblue","royalblue"), main = "Frutas do Maranhão")

21

Page 22: Métodos Computacionais Em Estatística

Abacate Abricó Caju Melancia Melão Pitomba

Frutas do Maranhão0.

00.

51.

01.

52.

02.

53.

0

pie(tabela.frutas1)

22

Page 23: Métodos Computacionais Em Estatística

Abacate

AbricóCaju

Melancia

Melão

Pitomba

Tangerina

Conversão de tipos

as.integer(3.2)

## [1] 3

as.character(3.2)

## [1] "3.2"

as.double(3.2)

## [1] 3.2

as.complex(3.2)

## [1] 3.2+0i

as.logical(3.2)

## [1] TRUE

23

Page 24: Métodos Computacionais Em Estatística

as.raw(3.2)

## [1] 03

Matrizes e Arrays

Array é qualquer conjunto de dados retangular multidimensional.

Matriz é um Array bidimensional.

Array com três dimensões

tres_d_array <- array(1:24, dim = c(4,3,2), dimnames = list(c("um","dois","três","quatro"),c("one","two","three"),c("un","deux")))

tres_d_array

## , , un#### one two three## um 1 5 9## dois 2 6 10## três 3 7 11## quatro 4 8 12#### , , deux#### one two three## um 13 17 21## dois 14 18 22## três 15 19 23## quatro 16 20 24

class(tres_d_array)

## [1] "array"

dim(tres_d_array)

## [1] 4 3 2

dimnames(tres_d_array)

## [[1]]## [1] "um" "dois" "três" "quatro"#### [[2]]## [1] "one" "two" "three"#### [[3]]## [1] "un" "deux"

24

Page 25: Métodos Computacionais Em Estatística

rownames(tres_d_array)

## [1] "um" "dois" "três" "quatro"

colnames(tres_d_array)

## [1] "one" "two" "three"

Matriz - preenchimento por colunas

m_matrix <- matrix(1:12, nrow = 4, dimnames = list(c("um","dois","três","quatro"),c("one","two","three")))

m_matrix

## one two three## um 1 5 9## dois 2 6 10## três 3 7 11## quatro 4 8 12

str(m_matrix) # mostra a estrutura do objeto

## int [1:4, 1:3] 1 2 3 4 5 6 7 8 9 10 ...## - attr(*, "dimnames")=List of 2## ..$ : chr [1:4] "um" "dois" "três" "quatro"## ..$ : chr [1:3] "one" "two" "three"

class(m_matrix)

## [1] "matrix"

dois_d_matrix <- array(1:12, dim=c(4,3), dimnames = list(c("um","dois","três","quatro"),c("one","two","three")))

dois_d_matrix

## one two three## um 1 5 9## dois 2 6 10## três 3 7 11## quatro 4 8 12

summary(dois_d_matrix) # atua em cada coluna

## one two three## Min. :1.00 Min. :5.00 Min. : 9.00## 1st Qu.:1.75 1st Qu.:5.75 1st Qu.: 9.75## Median :2.50 Median :6.50 Median :10.50## Mean :2.50 Mean :6.50 Mean :10.50## 3rd Qu.:3.25 3rd Qu.:7.25 3rd Qu.:11.25## Max. :4.00 Max. :8.00 Max. :12.00

25

Page 26: Métodos Computacionais Em Estatística

class(dois_d_matrix)

## [1] "matrix"

dim(dois_d_matrix) # retorna um vetor de inteiros da dimensão da variável

## [1] 4 3

dimnames(dois_d_matrix)

## [[1]]## [1] "um" "dois" "três" "quatro"#### [[2]]## [1] "one" "two" "three"

rownames(dois_d_matrix)

## [1] "um" "dois" "três" "quatro"

colnames(dois_d_matrix)

## [1] "one" "two" "three"

Matriz - preenchimento por linhas

m_matrix <- matrix(1:12, nrow = 4, byrow= TRUE, dimnames = list(c("um","dois","três","quatro"),c("one","two","three")))

m_matrix

## one two three## um 1 2 3## dois 4 5 6## três 7 8 9## quatro 10 11 12

dim(m_matrix)

## [1] 4 3

As funções nrow() e ncol() retornam o número de linhas e colunas de uma matriz e primeira e segundadimensão de um array - aplicadas sobre vetores retorna NULL.

nrow(m_matrix)

## [1] 4

26

Page 27: Métodos Computacionais Em Estatística

ncol(m_matrix)

## [1] 3

nrow(tres_d_array)

## [1] 4

ncol(tres_d_array)

## [1] 3

dim(tres_d_array)

## [1] 4 3 2

NROW(tres_d_array)

## [1] 4

NCOL(tres_d_array)

## [1] 3

ntv1 <- 0:10; ntv1

## [1] 0 1 2 3 4 5 6 7 8 9 10

nrow(ntv1)

## NULL

NROW(ntv1)

## [1] 11

ncol(ntv1)

## NULL

NCOL(ntv1)

## [1] 1

A função length() retorna o produto das dimensões

27

Page 28: Métodos Computacionais Em Estatística

length(m_matrix)

## [1] 12

length(tres_d_array)

## [1] 24

Redimensionamento de Matrizes e Arrays

#dim(m_matrix) <- c(6,2); m_matrix#dim(tres_d_array) <- c(4,6); tres_d_array

Indexação de arrays

m_matrix[1,1]; m_matrix[,2]

## [1] 1

## um dois três quatro## 2 5 8 11

m_matrix[, c("one","two")]

## one two## um 1 2## dois 4 5## três 7 8## quatro 10 11

m_matrix[-1,3]; m_matrix[1:3,-2]

## dois três quatro## 6 9 12

## one three## um 1 3## dois 4 6## três 7 9

Combinando matrizes

m1_matrix <-matrix(seq.int(2,24,2),nrow = 4,dimnames=list(c("um","dois","três","quatro"),c("one","two","three")))m1_matrix

28

Page 29: Métodos Computacionais Em Estatística

## one two three## um 2 10 18## dois 4 12 20## três 6 14 22## quatro 8 16 24

c(m_matrix, m1_matrix)

## [1] 1 4 7 10 2 5 8 11 3 6 9 12 2 4 6 8 10 12 14 16 18 20 22## [24] 24

cbind(m_matrix, m1_matrix)

## one two three one two three## um 1 2 3 2 10 18## dois 4 5 6 4 12 20## três 7 8 9 6 14 22## quatro 10 11 12 8 16 24

rbind(m_matrix, m1_matrix)

## one two three## um 1 2 3## dois 4 5 6## três 7 8 9## quatro 10 11 12## um 2 10 18## dois 4 12 20## três 6 14 22## quatro 8 16 24

Operações aritméticas com arraysOs operadores (“+”, “-”, “/”, “ˆ”) trabalham de elemento em elemento em matrizes e arrays e os mesmosdevem ter conformidade.

m_matrix+m1_matrix

## one two three## um 3 12 21## dois 8 17 26## três 13 22 31## quatro 18 27 36

m_matrix-m1_matrix

## one two three## um -1 -8 -15## dois 0 -7 -14## três 1 -6 -13## quatro 2 -5 -12

29

Page 30: Métodos Computacionais Em Estatística

m_matrix*m1_matrix

## one two three## um 2 20 54## dois 16 60 120## três 42 112 198## quatro 80 176 288

m_matrix/m1_matrix

## one two three## um 0.500000 0.2000000 0.1666667## dois 1.000000 0.4166667 0.3000000## três 1.166667 0.5714286 0.4090909## quatro 1.250000 0.6875000 0.5000000

m_matrix^2

## one two three## um 1 4 9## dois 16 25 36## três 49 64 81## quatro 100 121 144

m_matrix^-1

## one two three## um 1.0000000 0.50000000 0.33333333## dois 0.2500000 0.20000000 0.16666667## três 0.1428571 0.12500000 0.11111111## quatro 0.1000000 0.09090909 0.08333333

Outras operações com matrizes

t(m_matrix) # matriz transposta

## um dois três quatro## one 1 4 7 10## two 2 5 8 11## three 3 6 9 12

m_matrix %*% t(m_matrix)

## um dois três quatro## um 14 32 50 68## dois 32 77 122 167## três 50 122 194 266## quatro 68 167 266 365

30

Page 31: Métodos Computacionais Em Estatística

# multiplicação de matrizes, número de linhas de m_matrix igual ao número de colunas t(m_matrix)#m_matrix %*% m_matrix1:3 %o% 4:6; outer(1:3, 4:6)

## [,1] [,2] [,3]## [1,] 4 5 6## [2,] 8 10 12## [3,] 12 15 18

## [,1] [,2] [,3]## [1,] 4 5 6## [2,] 8 10 12## [3,] 12 15 18

m_matrix %o% m_matrix

## , , um, one#### one two three## um 1 2 3## dois 4 5 6## três 7 8 9## quatro 10 11 12#### , , dois, one#### one two three## um 4 8 12## dois 16 20 24## três 28 32 36## quatro 40 44 48#### , , três, one#### one two three## um 7 14 21## dois 28 35 42## três 49 56 63## quatro 70 77 84#### , , quatro, one#### one two three## um 10 20 30## dois 40 50 60## três 70 80 90## quatro 100 110 120#### , , um, two#### one two three## um 2 4 6

31

Page 32: Métodos Computacionais Em Estatística

## dois 8 10 12## três 14 16 18## quatro 20 22 24#### , , dois, two#### one two three## um 5 10 15## dois 20 25 30## três 35 40 45## quatro 50 55 60#### , , três, two#### one two three## um 8 16 24## dois 32 40 48## três 56 64 72## quatro 80 88 96#### , , quatro, two#### one two three## um 11 22 33## dois 44 55 66## três 77 88 99## quatro 110 121 132#### , , um, three#### one two three## um 3 6 9## dois 12 15 18## três 21 24 27## quatro 30 33 36#### , , dois, three#### one two three## um 6 12 18## dois 24 30 36## três 42 48 54## quatro 60 66 72#### , , três, three#### one two three## um 9 18 27## dois 36 45 54## três 63 72 81## quatro 90 99 108#### , , quatro, three##

32

Page 33: Métodos Computacionais Em Estatística

## one two three## um 12 24 36## dois 48 60 72## três 84 96 108## quatro 120 132 144

m2_matrix <- matrix(c(1,0,1,5,-3,1,2,4,7), nrow=3); m2_matrix

## [,1] [,2] [,3]## [1,] 1 5 2## [2,] 0 -3 4## [3,] 1 1 7

m2_matrix^-1

## [,1] [,2] [,3]## [1,] 1 0.2000000 0.5000000## [2,] Inf -0.3333333 0.2500000## [3,] 1 1.0000000 0.1428571

solve(m2_matrix) # inversão de matriz

## [,1] [,2] [,3]## [1,] -25 -33 26## [2,] 4 5 -4## [3,] 3 4 -3

inversa_m2_matrix <- solve(m2_matrix); inversa_m2_matrix

## [,1] [,2] [,3]## [1,] -25 -33 26## [2,] 4 5 -4## [3,] 3 4 -3

m2_matrix %*% inversa_m2_matrix

## [,1] [,2] [,3]## [1,] 1 0 0## [2,] 0 1 0## [3,] 0 0 1

Listas e Data Frames

Listas são como vetores onde cada elemnto pode ser de um tipo.

Listas são criadas com a função list().

l_list <- list(c(1,2,3,4), matrix(1:10, nrow = 5), (seq.int(1,10,2))); l_list

33

Page 34: Métodos Computacionais Em Estatística

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

l1_list <- list(c(1,1,2,5,14,42), month.abb, matrix(c(3,-8,1,3), nrow = 2), asin ); l1_list

## [[1]]## [1] 1 1 2 5 14 42#### [[2]]## [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov"## [12] "Dec"#### [[3]]## [,1] [,2]## [1,] 3 1## [2,] -8 3#### [[4]]## function (x) .Primitive("asin")

str(l_list) # mostra a estrutura do objeto

## List of 3## $ : num [1:4] 1 2 3 4## $ : int [1:5, 1:2] 1 2 3 4 5 6 7 8 9 10## $ : num [1:5] 1 3 5 7 9

summary(l_list)

## Length Class Mode## [1,] 4 -none- numeric## [2,] 10 -none- numeric## [3,] 5 -none- numeric

summary(l1_list)

## Length Class Mode## [1,] 6 -none- numeric## [2,] 12 -none- character## [3,] 4 -none- numeric## [4,] 1 -none- function

34

Page 35: Métodos Computacionais Em Estatística

names(l_list)

## NULL

names(l_list) <- c("el1", "el2", "el3")names(l_list)

## [1] "el1" "el2" "el3"

l_list

## $el1## [1] 1 2 3 4#### $el2## [,1] [,2]## [1,] 1 6## [2,] 2 7## [3,] 3 8## [4,] 4 9## [5,] 5 10#### $el3## [1] 1 3 5 7 9

l_list$el2; l_list["el2"]; l_list[["el2"]]; l_list[2]; l_list[[2]] # acesso aos itens da lista

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

## $el2## [,1] [,2]## [1,] 1 6## [2,] 2 7## [3,] 3 8## [4,] 4 9## [5,] 5 10

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

35

Page 36: Métodos Computacionais Em Estatística

## $el2## [,1] [,2]## [1,] 1 6## [2,] 2 7## [3,] 3 8## [4,] 4 9## [5,] 5 10

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

# o uso de "$" e "[[]]" retorna o elemento componentes da lista# o uso de "[]" retorna uma lista com os elementos selecionadosc(class(l_list$el1), class(l_list[["el1"]]), class(l_list["el1"]))

## [1] "numeric" "numeric" "list"

l1_list <- list(el1=c(1,2,3,4), el2=matrix(1:10, nrow = 5), el3=(seq.int(1,10,2))); l_list

## $el1## [1] 1 2 3 4#### $el2## [,1] [,2]## [1,] 1 6## [2,] 2 7## [3,] 3 8## [4,] 4 9## [5,] 5 10#### $el3## [1] 1 3 5 7 9

is.atomic(l_list)

## [1] FALSE

is.recursive(l_list)

## [1] TRUE

is.atomic("numeric")

## [1] TRUE

36

Page 37: Métodos Computacionais Em Estatística

is.recursive("numeric")

## [1] FALSE

Dimensões e operações aritméticas em listas

length(l_list)

## [1] 3

length(l1_list)

## [1] 3

dim(l_list)

## NULL

nrow(l_list)

## NULL

ncol(l_list)

## NULL

NROW(l_list)

## [1] 3

NCOL(l_list)

## [1] 1

NROW(l1_list)

## [1] 3

NCOL(l1_list)

## [1] 1

l1 <- list(1:10); l2 <- list(11:20); l1;l2

## [[1]]## [1] 1 2 3 4 5 6 7 8 9 10

## [[1]]## [1] 11 12 13 14 15 16 17 18 19 20

37

Page 38: Métodos Computacionais Em Estatística

#l1 + l2l1[[1]]+l2[[1]]

## [1] 12 14 16 18 20 22 24 26 28 30

l1[[1]]-l2[[1]]

## [1] -10 -10 -10 -10 -10 -10 -10 -10 -10 -10

l1[[1]]*l2[[1]]

## [1] 11 24 39 56 75 96 119 144 171 200

l1[[1]]/l2[[1]]

## [1] 0.09090909 0.16666667 0.23076923 0.28571429 0.33333333 0.37500000## [7] 0.41176471 0.44444444 0.47368421 0.50000000

Indexando Listas

l1[1:2]

## [[1]]## [1] 1 2 3 4 5 6 7 8 9 10#### [[2]]## NULL

l1_list[1:2]

## $el1## [1] 1 2 3 4#### $el2## [,1] [,2]## [1,] 1 6## [2,] 2 7## [3,] 3 8## [4,] 4 9## [5,] 5 10

l1_list[-2]

## $el1## [1] 1 2 3 4#### $el3## [1] 1 3 5 7 9

38

Page 39: Métodos Computacionais Em Estatística

l1_list[-3]

## $el1## [1] 1 2 3 4#### $el2## [,1] [,2]## [1,] 1 6## [2,] 2 7## [3,] 3 8## [4,] 4 9## [5,] 5 10

l1_list[2:3]

## $el2## [,1] [,2]## [1,] 1 6## [2,] 2 7## [3,] 3 8## [4,] 4 9## [5,] 5 10#### $el3## [1] 1 3 5 7 9

l1_list["el1"]

## $el1## [1] 1 2 3 4

l1_list[c(TRUE, FALSE, TRUE)]

## $el1## [1] 1 2 3 4#### $el3## [1] 1 3 5 7 9

l1[1]

## [[1]]## [1] 1 2 3 4 5 6 7 8 9 10

l1[[1]]

## [1] 1 2 3 4 5 6 7 8 9 10

39

Page 40: Métodos Computacionais Em Estatística

is.list(l1[1])

## [1] TRUE

is.list(l1[[1]])

## [1] FALSE

l1_list[["el1"]]

## [1] 1 2 3 4

l1_list[["el1"]][[3]]

## [1] 3

l1_list[["el2"]][[3,2]]

## [1] 8

#l1_list[["el2"]][[3,3]]

Conversão entre vetores e listas

l2 <- c(1,3,5,6,7,9); l2

## [1] 1 3 5 6 7 9

l21 <- as.list(l2); l21 # convertendo vetor em uma lista.

## [[1]]## [1] 1#### [[2]]## [1] 3#### [[3]]## [1] 5#### [[4]]## [1] 6#### [[5]]## [1] 7#### [[6]]## [1] 9

40

Page 41: Métodos Computacionais Em Estatística

#l22 <- as.numeric(l21)# convertendo uma lista em um vetor (cada elemento da lista deve possuir um valor escalar).l3 <- list(a=2, b=5, d=c(2,4), e=c(3,5,7), f=c(1,2,3,4)); l3

## $a## [1] 2#### $b## [1] 5#### $d## [1] 2 4#### $e## [1] 3 5 7#### $f## [1] 1 2 3 4

#as.numeric(l3)#as.character(l3)#l31 <- unlist(l3); l31

Combinando listas

c(l2,l3)

## [[1]]## [1] 1#### [[2]]## [1] 3#### [[3]]## [1] 5#### [[4]]## [1] 6#### [[5]]## [1] 7#### [[6]]## [1] 9#### $a## [1] 2#### $b## [1] 5#### $d

41

Page 42: Métodos Computacionais Em Estatística

## [1] 2 4#### $e## [1] 3 5 7#### $f## [1] 1 2 3 4

cbind(l2,l3)

## Warning in cbind(l2, l3): number of rows of result is not a multiple of## vector length (arg 2)

## l2 l3## [1,] 1 2## [2,] 3 5## [3,] 5 Numeric,2## [4,] 6 Numeric,3## [5,] 7 Numeric,4## [6,] 9 2

rbind(l2,l3)

## Warning in rbind(l2, l3): number of columns of result is not a multiple of## vector length (arg 2)

## [,1] [,2] [,3] [,4] [,5] [,6]## l2 1 3 5 6 7 9## l3 2 5 Numeric,2 Numeric,3 Numeric,4 2

str(rbind(l2,l3))

## Warning in rbind(l2, l3): number of columns of result is not a multiple of## vector length (arg 2)

## List of 12## $ : num 1## $ : num 2## $ : num 3## $ : num 5## $ : num 5## $ : num [1:2] 2 4## $ : num 6## $ : num [1:3] 3 5 7## $ : num 7## $ : num [1:4] 1 2 3 4## $ : num 9## $ : num 2## - attr(*, "dim")= int [1:2] 2 6## - attr(*, "dimnames")=List of 2## ..$ : chr [1:2] "l2" "l3"## ..$ : NULL

42

Page 43: Métodos Computacionais Em Estatística

eventos1t2015 <-list(jan="Confraternização universal", fev="Carnaval", mar="Tiradentes", abr="NULL", mai="Festa das mães"); eventos1t2015

## $jan## [1] "Confraternização universal"#### $fev## [1] "Carnaval"#### $mar## [1] "Tiradentes"#### $abr## [1] "NULL"#### $mai## [1] "Festa das mães"

#NULL valor especial que representa uma varável vazia.#length(NULL)#length(NA) # NA é um valor escalar.#is.null(NULL)#is.null(NA)#l21; l21[[2]] <- NULL # Podemos usar NULL para remover elementos de uma lista.#l21[[2]] <- NULL; l21#l21[[2]] <- list(NULL); l21

Data frames são usados para armazenar dados como em planilhas.A função data.frame() será utilizada para a criação dos mesmos.

df1 <- data.frame(LETTERS[1:5], month.name[1:5], seq(1,5), rnorm(5)); df1

## LETTERS.1.5. month.name.1.5. seq.1..5. rnorm.5.## 1 A January 1 -0.4335094## 2 B February 2 1.4059110## 3 C March 3 2.2192786## 4 D April 4 0.5448906## 5 E May 5 -0.6440232

class(df1)

## [1] "data.frame"

str(df1) # mostra a estrutura do objeto

## 'data.frame': 5 obs. of 4 variables:## $ LETTERS.1.5. : Factor w/ 5 levels "A","B","C","D",..: 1 2 3 4 5## $ month.name.1.5.: Factor w/ 5 levels "April","February",..: 3 2 4 1 5## $ seq.1..5. : int 1 2 3 4 5## $ rnorm.5. : num -0.434 1.406 2.219 0.545 -0.644

43

Page 44: Métodos Computacionais Em Estatística

head(df1)

## LETTERS.1.5. month.name.1.5. seq.1..5. rnorm.5.## 1 A January 1 -0.4335094## 2 B February 2 1.4059110## 3 C March 3 2.2192786## 4 D April 4 0.5448906## 5 E May 5 -0.6440232

names(df1) <- c("col1", "col2", "col3", "col4");df1

## col1 col2 col3 col4## 1 A January 1 -0.4335094## 2 B February 2 1.4059110## 3 C March 3 2.2192786## 4 D April 4 0.5448906## 5 E May 5 -0.6440232

row.names(df1) <- c("l1","l2","l3","l4","l5");df1 # nome para as linhas

## col1 col2 col3 col4## l1 A January 1 -0.4335094## l2 B February 2 1.4059110## l3 C March 3 2.2192786## l4 D April 4 0.5448906## l5 E May 5 -0.6440232

rownames(df1)

## [1] "l1" "l2" "l3" "l4" "l5"

colnames(df1)

## [1] "col1" "col2" "col3" "col4"

dimnames(df1)

## [[1]]## [1] "l1" "l2" "l3" "l4" "l5"#### [[2]]## [1] "col1" "col2" "col3" "col4"

nrow(df1)

## [1] 5

44

Page 45: Métodos Computacionais Em Estatística

ncol(df1)

## [1] 4

dim(df1)

## [1] 5 4

length(df1)

## [1] 4

names(df1)

## [1] "col1" "col2" "col3" "col4"

data.frame(x=1, y=2:3, z=4:7) # data frames com vetores de tamanhos diferentes

## x y z## 1 1 2 4## 2 1 3 5## 3 1 2 6## 4 1 3 7

#data.frame(x=1, y=2:3, z=4:6); data.frame(x=1, y=2:3, z=4:13)fac1 <- factor(sample(letters[1:3], 10, replace=TRUE)); fac1

## [1] a c c a a b b a a a## Levels: a b c

lo1 <- sample(c(TRUE, FALSE, NA), 10, replace=TRUE); lo1

## [1] TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE TRUE NA

ndf <- rnorm(10); ndf

## [1] 2.4685558 -1.0239590 0.2345870 1.3815710 -0.3977395 -0.9677525## [7] 0.4626182 -1.4753410 0.8281403 0.3575973

df2 <- data.frame(fac1, ndf, ndf); df2; head(df2)

## fac1 ndf ndf.1## 1 a 2.4685558 2.4685558## 2 c -1.0239590 -1.0239590## 3 c 0.2345870 0.2345870## 4 a 1.3815710 1.3815710## 5 a -0.3977395 -0.3977395## 6 b -0.9677525 -0.9677525## 7 b 0.4626182 0.4626182## 8 a -1.4753410 -1.4753410## 9 a 0.8281403 0.8281403## 10 a 0.3575973 0.3575973

45

Page 46: Métodos Computacionais Em Estatística

## fac1 ndf ndf.1## 1 a 2.4685558 2.4685558## 2 c -1.0239590 -1.0239590## 3 c 0.2345870 0.2345870## 4 a 1.3815710 1.3815710## 5 a -0.3977395 -0.3977395## 6 b -0.9677525 -0.9677525

summary(fac1)

## a b c## 6 2 2

summary(lo1)

## Mode FALSE TRUE NA's## logical 4 5 1

summary(ndf)

## Min. 1st Qu. Median Mean 3rd Qu. Max.## -1.4750 -0.8252 0.2961 0.1868 0.7368 2.4690

summary(df2)

## fac1 ndf ndf.1## a:6 Min. :-1.4753 Min. :-1.4753## b:2 1st Qu.:-0.8252 1st Qu.:-0.8252## c:2 Median : 0.2961 Median : 0.2961## Mean : 0.1868 Mean : 0.1868## 3rd Qu.: 0.7368 3rd Qu.: 0.7368## Max. : 2.4686 Max. : 2.4686

View(df2) # não permite trocas de valoresView(fac1)View(lo1)View(ndf)df21 <- edit(df2) # permite troca de valores e salva em df21df21

## fac1 ndf ndf.1## 1 a 2.4685558 2.4685558## 2 c -1.0239590 -1.0239590## 3 c 0.2345870 0.2345870## 4 a 1.3815710 1.3815710## 5 a -0.3977395 -0.3977395## 6 b -0.9677525 -0.9677525## 7 b 0.4626182 0.4626182## 8 a -1.4753410 -1.4753410## 9 a 0.8281403 0.8281403## 10 a 0.3575973 0.3575973

46

Page 47: Métodos Computacionais Em Estatística

fix(df2);df2 # permite a troca de valores e salva em df2

## fac1 ndf ndf.1## 1 a 2.4685558 2.4685558## 2 c -1.0239590 -1.0239590## 3 c 0.2345870 0.2345870## 4 a 1.3815710 1.3815710## 5 a -0.3977395 -0.3977395## 6 b -0.9677525 -0.9677525## 7 b 0.4626182 0.4626182## 8 a -1.4753410 -1.4753410## 9 a 0.8281403 0.8281403## 10 a 0.3575973 0.3575973

length(df1) # retorna o número de colunas do data frame, o mesmo que ncol()

## [1] 4

ncol(df1)

## [1] 4

names(df1) # retorna o mesmo de colnames()

## [1] "col1" "col2" "col3" "col4"

df3 <- data.frame(".99a"=1, "#@-$"=2:3, "()*&"=4:7, check.names = FALSE); df3

## .99a #@-$ ()*&## 1 1 2 4## 2 1 3 5## 3 1 2 6## 4 1 3 7

# check.names=FALSE foi usado para o uso de nomes de variáveis não válidos

Indexação de Data Frames

Podemos usar como índices (inteiros positivos e negativos, valores lógicos e cacteres)

df1[1:3, -2]; df1[, 4]

## col1 col3 col4## l1 A 1 -0.4335094## l2 B 2 1.4059110## l3 C 3 2.2192786

## [1] -0.4335094 1.4059110 2.2192786 0.5448906 -0.6440232

47

Page 48: Métodos Computacionais Em Estatística

df2[3,3]; df2[3,3]

## [1] 0.234587

## [1] 0.234587

df2[c(TRUE, FALSE, TRUE, TRUE,TRUE, FALSE,FALSE,FALSE,TRUE, TRUE), c("ndf", "ndf.1")]

## ndf ndf.1## 1 2.4685558 2.4685558## 3 0.2345870 0.2345870## 4 1.3815710 1.3815710## 5 -0.3977395 -0.3977395## 9 0.8281403 0.8281403## 10 0.3575973 0.3575973

class(df1[1:3,-2]); class(df1[1:3,2]); class(df2[1:5,3])

## [1] "data.frame"

## [1] "factor"

## [1] "numeric"

df2$ndf[3:7]; df2[[2]][3:7]; df2[["ndf"]][3:7]

## [1] 0.2345870 1.3815710 -0.3977395 -0.9677525 0.4626182

## [1] 0.2345870 1.3815710 -0.3977395 -0.9677525 0.4626182

## [1] 0.2345870 1.3815710 -0.3977395 -0.9677525 0.4626182

df1[df1$col4>0 | df1$col3<3, "col2"]; subset(df1, col4>00 | col3<3, col2)

## [1] January February March April## Levels: April February January March May

## col2## l1 January## l2 February## l3 March## l4 April

Manipulação básica de Data Frames

t(df1) # na transposição todas as colunas são convertidas para o mesmo tipo, vira uma matriz.

## l1 l2 l3 l4 l5## col1 "A" "B" "C" "D" "E"## col2 "January" "February" "March" "April" "May"## col3 "1" "2" "3" "4" "5"## col4 "-0.4335094" " 1.4059110" " 2.2192786" " 0.5448906" "-0.6440232"

48

Page 49: Métodos Computacionais Em Estatística

is.matrix(t(df1))

## [1] TRUE

dfn <- data.frame(am=sample(c(TRUE, FALSE), size = 5, replace=TRUE), logf=seq(6:10) ); dfn

## am logf## 1 TRUE 1## 2 FALSE 2## 3 FALSE 3## 4 TRUE 4## 5 TRUE 5

cbind(df1,dfn)

## col1 col2 col3 col4 am logf## l1 A January 1 -0.4335094 TRUE 1## l2 B February 2 1.4059110 FALSE 2## l3 C March 3 2.2192786 FALSE 3## l4 D April 4 0.5448906 TRUE 4## l5 E May 5 -0.6440232 TRUE 5

#rbind(df1,dfn)dfn <- cbind(dfn,logfd=c(3,17,23,5,6), logfe=c(NA,NA,NaN,Inf,NA))#rbind(df1,dfn) # número de colunas devem ser iguais.names(dfn) <- c("col1", "col2", "col3", "col4"); dfn

## col1 col2 col3 col4## 1 TRUE 1 3 NA## 2 FALSE 2 17 NA## 3 FALSE 3 23 NaN## 4 TRUE 4 5 Inf## 5 TRUE 5 6 NA

#rbind(df1,dfn)dfn <- data.frame(col1=letters[6:10], col2=month.abb[6:10], col3=rnorm(5)<0.05, col4=rnorm(5)); dfn

## col1 col2 col3 col4## 1 f Jun TRUE 0.0399669## 2 g Jul FALSE -1.1425487## 3 h Aug FALSE -0.3823524## 4 i Sep FALSE -0.4216101## 5 j Oct FALSE 0.8572720

rbind(df1,dfn)

## col1 col2 col3 col4## l1 A January 1 -0.4335094## l2 B February 2 1.4059110

49

Page 50: Métodos Computacionais Em Estatística

## l3 C March 3 2.2192786## l4 D April 4 0.5448906## l5 E May 5 -0.6440232## 6 f Jun 1 0.0399669## 7 g Jul 0 -1.1425487## 8 h Aug 0 -0.3823524## 9 i Sep 0 -0.4216101## 10 j Oct 0 0.8572720

cbind(df1,dfn)

## col1 col2 col3 col4 col1 col2 col3 col4## l1 A January 1 -0.4335094 f Jun TRUE 0.0399669## l2 B February 2 1.4059110 g Jul FALSE -1.1425487## l3 C March 3 2.2192786 h Aug FALSE -0.3823524## l4 D April 4 0.5448906 i Sep FALSE -0.4216101## l5 E May 5 -0.6440232 j Oct FALSE 0.8572720

merge(df1,dfn, by="col3")

## col3 col1.x col2.x col4.x col1.y col2.y col4.y## 1 1 A January -0.4335094 f Jun 0.0399669

merge(df1,dfn, by="col3", all=TRUE)

## col3 col1.x col2.x col4.x col1.y col2.y col4.y## 1 0 <NA> <NA> NA g Jul -1.1425487## 2 0 <NA> <NA> NA h Aug -0.3823524## 3 0 <NA> <NA> NA i Sep -0.4216101## 4 0 <NA> <NA> NA j Oct 0.8572720## 5 1 A January -0.4335094 f Jun 0.0399669## 6 2 B February 1.4059110 <NA> <NA> NA## 7 3 C March 2.2192786 <NA> <NA> NA## 8 4 D April 0.5448906 <NA> <NA> NA## 9 5 E May -0.6440232 <NA> <NA> NA

colSums(dfn[,3:4]) # rowSums - para data frames com valores numéricos

## col3 col4## 1.000000 -1.049272

colMeans(dfn[,3:4]) # rowMeans

## col3 col4## 0.2000000 -0.2098545

Mais manipulação de Data Frames

50

Page 51: Métodos Computacionais Em Estatística

dados1<-data.frame(Frutas=c("Manga","Abacate","Banana"), Quantidade=c(10,15,25))dados1

## Frutas Quantidade## 1 Manga 10## 2 Abacate 15## 3 Banana 25

dados1$Frutas # ou dados1[1]

## [1] Manga Abacate Banana## Levels: Abacate Banana Manga

dados1$Quantidade # ou dados1[2]

## [1] 10 15 25

dados1$preco <- c(2.10, 3.25, 2.59)dados1

## Frutas Quantidade preco## 1 Manga 10 2.10## 2 Abacate 15 3.25## 3 Banana 25 2.59

dados1$total <-dados1$Quantidade*dados1$precodados1

## Frutas Quantidade preco total## 1 Manga 10 2.10 21.00## 2 Abacate 15 3.25 48.75## 3 Banana 25 2.59 64.75

dados<-cbind(dados1, data.frame(Calorias=c(100,150,80)) ) # cria uma colunadados

## Frutas Quantidade preco total Calorias## 1 Manga 10 2.10 21.00 100## 2 Abacate 15 3.25 48.75 150## 3 Banana 25 2.59 64.75 80

dados<-rbind(dados1, data.frame(Frutas="Abacaxi", Quantidade=5, preco=4.0, total=dados$Quantidade*dados$preco))dados

## Frutas Quantidade preco total## 1 Manga 10 2.10 21.00## 2 Abacate 15 3.25 48.75## 3 Banana 25 2.59 64.75## 4 Abacaxi 5 4.00 21.00## 5 Abacaxi 5 4.00 48.75## 6 Abacaxi 5 4.00 64.75

51

Page 52: Métodos Computacionais Em Estatística

dados$situpreco <-0dados

## Frutas Quantidade preco total situpreco## 1 Manga 10 2.10 21.00 0## 2 Abacate 15 3.25 48.75 0## 3 Banana 25 2.59 64.75 0## 4 Abacaxi 5 4.00 21.00 0## 5 Abacaxi 5 4.00 48.75 0## 6 Abacaxi 5 4.00 64.75 0

for (i in 1:6){ifelse(dados[i,3]<=2.5, dados[i,5]<-"Baixo",

ifelse(dados[i,3]<=3.9, dados[i,5]<-"Médio",dados[i,5]<-"Alto"))

}dados

## Frutas Quantidade preco total situpreco## 1 Manga 10 2.10 21.00 Baixo## 2 Abacate 15 3.25 48.75 Médio## 3 Banana 25 2.59 64.75 Médio## 4 Abacaxi 5 4.00 21.00 Alto## 5 Abacaxi 5 4.00 48.75 Alto## 6 Abacaxi 5 4.00 64.75 Alto

Importação de dados para dentro de um DataFrame

read.table(file, header=True, sep=“”, dec=“.”)

read.csv(file, header=True, sep=“,”, dec=“.”)

read.csv2(file, header=True, sep=“;”, dec=“.”)

read.delim(file, header=True, sep=“�’’, dec=“.”)

read.delim2(file, header=True, sep=“�’’, dec=“,”)

read.xlsx(file=“arquivo.xlsx”, header=True, sheeteIndex=“?”, sheeteName=“?”) # deve importar o pacotexlsx e sheeteIndex=1 ou sheeteName=“plan1”

arquivo1 =read.csv(“C:/Users/lsr10/Documents/DoubsEnv.csv”, sep=‘,’, header=T)

arquivo2=read.csv(“clipboard”, sep=‘,’) # utilisar em base pequena - apanhar os dados da memória docomputador #

arquivo3=read.csv(file.choose()) # abre janela para escolha do arquivo "

head(arquivo1); head(arquivo2); head(arquivo3) # mostra os registros iniciais do arquivo

arquivo4=read.csv(file.choose(), sep=‘;’) # arquivo modificado troca de ‘,’ por ‘;’ e ‘.’ por ‘,’; head(arquivo4)

mean(arquivo4$oxy)

arquivo4=read.csv(file.choose(), sep=‘;’, dec=‘,’)

head(arquivo4)

mean(arquivo4$oxy

Exportação de dados no R

52

Page 53: Métodos Computacionais Em Estatística

write.table(x, file, sep=" “, dec=”.“, row.names=T, col.names=T)

write.csv()

write.csv2()

write.xlsx()

Estrutura condicional no R (if e ifelse)

x == y - “x é igual a y”

x != y - “x não é igual a y”

x > y - “x é maior que y”

x < y - “x é menor que y”

x >= y - “x é maior ou igual a y”

x <= y - “x é menor ou igual a y”

“& ou &&” - para E (AND)

“|” ou “||” - para OU (OR)

if (expr_1) { expr_2 . . . expr_n} else {exp_1n . . . . exp_nn }

if(FALSE) message("Good lack")if(TRUE) message("Bom dia!")

## Bom dia!

ec1 <- 5; if (ec1<10) {print(ec1)} else {print(sqrt(ec1))}

## [1] 5

if(ec1>2) {eca <- 3*ec1} else if(ec1<10) {ecb <- ec1*sqrt(5)}x1=5; x2=8; x3=21if (x2<x3) {cat(x2)}

## 8

if(x2>x1) {cat(x2)}

## 8

if(x3>x2 & x3<=x2*x1&x1!=x2) {cat("Teste do if")}

## Teste do if

if(x3>x2 & x3>=x2*x1&x1!=x2) {cat("Teste do if")} else { cat("testando o senão")}

## testando o senão

53

Page 54: Métodos Computacionais Em Estatística

#ifelse(exp_1, se verdade, se falso)ifelse(x3>x1, x1**3, x3*10)

## [1] 125

ifelse(x3%%2==0, "número par", "número impar")

## [1] "número impar"

ifelse(exp_1, se verdade, se falso)

ifelse(x3>x1, x1**3, x3*10)

## [1] 125

ifelse(x3%%2==0, "número par", "número impar")

## [1] "número impar"

Estruturas de repetição for while e repeat

Laço com a estrutura for

for (i in n_objeto) { expr_1 . . . expn} # onde n_objeto pode ser: vetor, matriz e data frames i é umavariavel (pode ser qualquer letra)

for (i in 1:10){print(sqrt(i))}

## [1] 1## [1] 1.414214## [1] 1.732051## [1] 2## [1] 2.236068## [1] 2.44949## [1] 2.645751## [1] 2.828427## [1] 3## [1] 3.162278

testefor=0for (i in 1:10) {testefor[i]<-i**2}; testefor

## [1] 1 4 9 16 25 36 49 64 81 100

soma=0; testefor1=c(10,15,20,25,35,45,50,55,60); n=length(testefor1)for (i in 1:n){soma=soma+testefor1[i]}media=soma/n; media; mean(testefor1)

## [1] 35

54

Page 55: Métodos Computacionais Em Estatística

## [1] 35

Laço com a estrutura while

while (condicao) expr

while(condicao){ # corpo do laço # }

#i=1#while(TRUE){ #laço infinito <Esc> para sair## i=i+1#}i

## [1] 9

i=1; while(TRUE){ i=i+1if(i == 20) break}

print(i)

## [1] 20

i=1; while(i<20){i=i+1}; print(i)

## [1] 20

vteste=vector(); i=1; while(i<20){vteste[i]=i^2i=i+1}; print(vteste)

## [1] 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289## [18] 324 361

Laço com estrutura repeat

repeat expr

repeat { g <- rnorm(1) #gera números aleatórios de uma distribuição normalif (g > 1.0) breakcat(g,"\n")}

## 0.8388917## 0.534484## -0.4380874## -0.2955774## -0.5412241## -1.01756

O comando wich

55

Page 56: Métodos Computacionais Em Estatística

which(LETTERS == "R")

## [1] 18

which(ll <- c(TRUE, FALSE, TRUE, NA, FALSE, FALSE, TRUE)) #> 1 3 7

## [1] 1 3 7

names(ll) <- letters[seq(ll)]which(ll)

## a c g## 1 3 7

which((1:12)%%2 == 0)

## [1] 2 4 6 8 10 12

which(1:10 > 3, arr.ind = TRUE)

## [1] 4 5 6 7 8 9 10

( m <- matrix(1:12, 3, 4) )

## [,1] [,2] [,3] [,4]## [1,] 1 4 7 10## [2,] 2 5 8 11## [3,] 3 6 9 12

div.3 <- m %% 3 == 0which(div.3)

## [1] 3 6 9 12

which(div.3, arr.ind = TRUE)

## row col## [1,] 3 1## [2,] 3 2## [3,] 3 3## [4,] 3 4

rownames(m) <- paste("Case", 1:3, sep = "_")which(m %% 5 == 0, arr.ind = TRUE)

## row col## Case_2 2 2## Case_1 1 4

56

Page 57: Métodos Computacionais Em Estatística

dim(m) <- c(2, 2, 3); m

## , , 1#### [,1] [,2]## [1,] 1 3## [2,] 2 4#### , , 2#### [,1] [,2]## [1,] 5 7## [2,] 6 8#### , , 3#### [,1] [,2]## [1,] 9 11## [2,] 10 12

which(div.3, arr.ind = FALSE)

## [1] 3 6 9 12

which(div.3, arr.ind = TRUE)

## row col## [1,] 3 1## [2,] 3 2## [3,] 3 3## [4,] 3 4

vm <- c(m)dim(vm) <- length(vm)which(div.3, arr.ind = TRUE)

## row col## [1,] 3 1## [2,] 3 2## [3,] 3 3## [4,] 3 4

Atribuições múltiplas

a<-b<-c<-1:10 # atribuições múltiplasa; b; c

## [1] 1 2 3 4 5 6 7 8 9 10

## [1] 1 2 3 4 5 6 7 8 9 10

57

Page 58: Métodos Computacionais Em Estatística

## [1] 1 2 3 4 5 6 7 8 9 10

Criando e chamando funções

Com o uso de funções evitamos a repetição de códigos.

A função function() será utilizada na sua criação.

function ( arglist ) body

funcaoteste<-function(arg1,. . . ,argn){rotina da funcao}

Cálculo de uma soma

cq <- function(x, y) {sqrt(x)+y^2}; cq

## function(x, y) {sqrt(x)+y^2}

cq(1,7); cq(seq.int(1:10), 2)

## [1] 50

## [1] 5.000000 5.414214 5.732051 6.000000 6.236068 6.449490 6.645751## [8] 6.828427 7.000000 7.162278

Cálculo da mediana

mediana=function(dado){n=length(dado)dado=sort(dado)if (n%%2==0){

med1=(dado[n/2]+dado[n/2+1])/2}else{

med1=dado[(n+1)/2]}return(med1)}

mediana(seq.int(1:10))

## [1] 5.5

mediana(seq.int(1:11))

## [1] 6

Cálculo da hipotenusa de um triângulo retângulo

funcalhipo<-function(b,c){a=sqrt(b^2+c^2)return(a)}

funcalhipo(2,5)

58

Page 59: Métodos Computacionais Em Estatística

## [1] 5.385165

Criação de Gráficos

No R é possível criar inúmeros tipos de gráficos. Nesta etapa apresentaremos uma pequena amostra daspossibilidades.

Histograma

hist(dado, . . . ) # main, xlab, ylab, xlim, ylim, col, border

md=c(1,2,3,4,5); me=c(6,7,8,9,10,12)hist(me, main="Teste de Histograma", xlab="xxx", ylab="yyy")

Teste de Histograma

xxx

yyy

6 7 8 9 10 11 12

0.0

0.5

1.0

1.5

2.0

2.5

3.0

Gráfico Boxplot

boxplot(dado, . . . ) # main, xlab, ylab, xlim, ylim, border, horizontal

boxplot(me, main="Teste Boxplot", col=2, horizontal=TRUE)

59

Page 60: Métodos Computacionais Em Estatística

6 7 8 9 10 11 12

Teste Boxplot

boxplot(me, main="Teste Boxplot", col=2) #testar col=3

60

Page 61: Métodos Computacionais Em Estatística

67

89

1011

12Teste Boxplot

Gráfico Pizza

pie(dado, . . . ) # main, labels, col

pie(me, main="Teste gráfico de Pizza")

61

Page 62: Métodos Computacionais Em Estatística

1

23

4

56

Teste gráfico de Pizza

legeng(dado, ) - vetor de texto para cada fatia

x - posição da legenda no gráfico =“bottomright”, “bottom”, “bottomleft”,“left”, “top”, “topright”, “right”,“center”

fiil - vetor de cores de cada fatia

cex - tamanho da legenda

me

## [1] 6 7 8 9 10 12

mep<-0tam=length(me)for (i in 1:tam){

mep[i]<-(me[i]/sum(me))}

pie(me, main="Teste gráfico de Pizza", labels=c("0.1153846","0.1346154","0.1538462","0.1730769","0.1923077","0.2307692"))

62

Page 63: Métodos Computacionais Em Estatística

0.1153846

0.13461540.1538462

0.1730769

0.19230770.2307692

Teste gráfico de Pizza

pie(me, main="Teste gráfico de Pizza", labels=mep)legend("topright",fill=c(1,2,3,4,5,6), legend=c("um","dois","três","quatro","cingo","seis"))

63

Page 64: Métodos Computacionais Em Estatística

0.115384615384615

0.1346153846153850.153846153846154

0.173076923076923

0.1923076923076920.230769230769231

Teste gráfico de Pizza

umdoistrêsquatrocingoseis

Gráfico de Barra

barplot(x,. . . ) # names, main, col

par(mfrow=c(1,1))barplot(me, main=("vetor me"), col=topo.colors(6))

64

Page 65: Métodos Computacionais Em Estatística

vetor me0

24

68

1012

barplot(md, main=("vetor md"), col=topo.colors(6))

65

Page 66: Métodos Computacionais Em Estatística

vetor md0

12

34

5

Gráfico com a função plot()

plot(cars)

66

Page 67: Métodos Computacionais Em Estatística

5 10 15 20 25

020

4060

8010

012

0

speed

dist

plot(1:5,6:10)

67

Page 68: Métodos Computacionais Em Estatística

1 2 3 4 5

67

89

10

1:5

6:10

set.seed(99)x=1+rnorm(200,3,2)mean(x); var(x)

## [1] 3.80829

## [1] 3.876801

plot(x, main="Retorno diáros de ativos", ylab= "retorno", xlab="dias")abline(lm(x~seq(1,200,1)))

68

Page 69: Métodos Computacionais Em Estatística

0 50 100 150 200

−2

02

46

8Retorno diáros de ativos

dias

reto

rno

Atividades

1- Qual o tamanho desta lista: list(A=“Tucum”, B=“Araça”, list(C=“Pitomba”, D=“Inharé”, E=“Abricó”),F=“Oití”, G=NULL)?

2- Criar uma lista de variáveis que contenha todos os números quadrados na faixa de 100 a 109 como primeiroelemento, de 110 a 119 no segundo elemento, de 120 a 129 no terceiro elemento, de 130 a 139 no quartoelemento, de 140 a 149 no quinto elemento.

69