TOPICOS FUNDAMENTAIS O R é uma linguagem de programação que permite manipular dados, fazer calculos e gráficos estatı́sticos. O programa está disponivel gratuitamente em: http://www.r-project.org/ Há lista de discussão para troca de informações, perguntas e respostas sobre o uso da linguagem R em: http://br.groups.yahoo.com/group/R STAT/ Referências e/ou apostilas (português e inglês) podem ser obtidas no seguinte site: http://cran.r-project.org/doc/contrib/ Funcionalidades Pode-se designar nomes a objetos R usando a combinação A <- b(A recebe b), b -> A (b vai em A) ou A = b (A recebe b) > > > > A <- 2 B <- 3 C = A + B C [1] 5 Comandos colocados entre parenteses mostram o seu resultado na tela. > (C = A + B) [1] 5 O R usa o ponto (.) como separador decimal, assim, se for importar dados que usam virgulas como separadores decimais, troque-as por pontos (.) usando comandos de localizar e substituir diretamente no arquivo fonte ou observe os parametros de conversão no processo de leitura no R. O R oferece comandos de ajuda. help.start() ## inicia documentação na forma de arquivos html visualizados no seu browser (Inglês) help (topico) ## inicia uma janela de ajuda sobre topico Ou apenas com o ponto de interrogação (?) seguido do topico ?(topico) Para sair com segurança do R (encerrar) use o comando q(). Um dialogo aparecera perguntando se quer ”salvar” o espaço de trabalho. Save workspace image? [y/n/c]: Usualmente se utiliza responder n (não) Palavras Reservadas NA ## valores faltantes NaN ## valor não representavel por número Inf ## valor indeterminado c q s t C D F I T diff exp log mean pi range rank var FALSE Inf NA NaN NULL TRUE break else for function if in next repeat while Operadores Aritmeticos (reservado) + - * / soma, subtração, produto e divisão sqrt() raiz quadrada abs() valor absoluto (positivo) sin() cos() tan() funções trigonometricas asin() acos() atan() funções trigonometricas inversas sinh() cosh() tanh() funções hiperbolicas asinh() acosh() atanh() funções hiperbolicas inversas exp() log() exponencial e logaritmo neperiano log10() logaritimo na base-10 Operadores lógicos Os operadores lógicos são < : menor do que, <= : menor ou igual > : maior do que, >= : maior ou igual != : não igual (diferente) Manipulação de objetos na Workspace objects() mostra os objetos atualmente presentes na WS rm() remove um objeto da WS rm(list = ls()) remove todos os objetos da WS <- ou -> direciona um conteúdo para um objeto = equivale a <- O R como uma calculadora cientı́fica > 3 + 5 [1] 8 > sin(20) + cos(17) - pi * 10 [1] -30.77814 Objetos (armazenados na memoria ou WS (workspace)) vetores; fatores; matrizes e arrays; listas; data-frames (tabelas); funções; etc. VETORES > v2 <- c(1, 2, 4.6) > v2 [1] 1.0 2.0 4.6 > v2[2] [1] 2 ## mostra o valor da segunda posição do vetor > v2[2] <- 1.34 > v2 [1] 1.00 1.34 4.60 ## coloca o valor 1,34 na segunda posição do vetor Removendo elementos do vetor > v3 <- c(2, 3, 10, 6, 13, 12) > (v3[5]) [1] 13 ## perceba que o comando (v3[5]) mostra o valor da quinta posição. > (v3[-5]) [1] 2 3 10 6 12 ## com o comando (v3[-5]) remove o valor da quinta posição. > (v3[-(2:4)]) [1] 2 13 12 ## com o comando (v3[-(2:4)]) remove os valores entre a segunda e a quarta posição (inclusive a segunda e quarta posição). Divisões em um vetor > c(2.35, 1.45, 7.11)/5 [1] 0.470 0.290 1.422 ## Divisão simples dos elementos do vetor. > c(2.35, 1.45, 7.11)%/%5 [1] 0 0 1 ## Retorna apenas a parte inteira. > c(2.35, 1.45, 7.11)%%2 [1] 0.35 1.45 1.11 ## Aparece apenas o resto da divisão (1.45 não é divisivel por 2). Escrevendo uma equação com comandos aninhados > (v2.calc <- sin(n <- 1:6) + cos(v2) - pi * (v2/n)) [1] -1.7598194 -0.9668168 -4.7881413 -1.0018984 -1.5721183 [6] -2.8001224 Controlando sequências em vetores numéricos INTEIROS Criando uma sequência 0, 1, 2, ... ,10. Quando dois números são separados por dois pontos o R entente como origem o número do lado esquerdo e como final o número do lado direito > a = 0 > b = 10 > a:b [1] 0 1 2 3 4 5 6 7 8 9 10 [1] 10 9 8 7 6 5 4 3 2 1 3 4 5 6 7 8 9 10 > b:a 0 > v2 <- 0:10 > v2 [1] 0 1 2 Vetores De Caracteres O R também constrói vetores com objetos. Como por exemplo: > nomes <- c("Marta", "Regina", "Mario", "Pedro", + "Mauricio", "Marcelo", "Patricia", "Cintia", + "Abigail", "Renato") > nomes [1] "Marta" [6] "Marcelo" "Regina" "Mario" "Patricia" "Cintia" "Pedro" "Abigail" "Mauricio" "Renato" E também vetores com os meses. > format(ISOdate(2000, 1:12, 1), "%B") [1] "janeiro" [5] "maio" [9] "setembro" "fevereiro" "março" "junho" "julho" "outubro" "novembro" "abril" "agosto" "dezembro" Juntando elementos de vetores paste(a,b): junta os dados do vetor ’a’ com dados do vetor ’b’, caso a caso (com possibilidade de reciclagem). > nomes [1] "Marta" [6] "Marcelo" "Regina" "Mario" "Patricia" "Cintia" "Pedro" "Abigail" "Mauricio" "Renato" > paste(nomes, 10:1) [1] "Marta 10" "Regina 9" [5] "Mauricio 6" "Marcelo 5" [9] "Abigail 2" "Renato 1" "Mario 8" "Pedro 7" "Patricia 4" "Cintia 3" > paste(letters[1:6], 1:9, sep = "") [1] "a1" "b2" "c3" "d4" "e5" "f6" "a7" "b8" "c9" ## Observe a reciclagem > rep(paste("T", 1:3, sep = ""), c(4, 4, 3)) [1] "T1" "T1" "T1" "T1" "T2" "T2" "T2" "T2" "T3" "T3" "T3" ## Note que no comando o vetor orientou a repetição de cada número. M A T R I Z E S (bidimensionais) > args(matrix) function (data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL) NULL Queremos a matriz 4x3 a partir do vetor (1 2 3 4 5 6 7 8 9 10 11 12) 1 2 3 4 5 6 m1 = 7 8 9 10 11 12 com entrada dos valores por linhas > (m1 <- matrix(1:12, nc = 3, by = T)) [1,] [2,] [3,] [4,] [,1] [,2] [,3] 1 2 3 4 5 6 7 8 9 10 11 12 ## Note que não foi necessário dizer o número de linhas. Queremos, agora, uma matriz m2 4x3 a partir do mesmo vetor (1 2 3 4 5 6 7 8 9 10 11 12),com entrada dos valores por colunas: 1 5 9 2 6 10 m2 = 3 7 11 4 8 12 > (m2 <- matrix(1:12, ncol = 3)) [1,] [2,] [3,] [4,] [,1] [,2] [,3] 1 5 9 2 6 10 3 7 11 4 8 12 Nomeando linhas e colunas da matriz > dimnames(m1) <- list(c("L1", "L2", "L3", "L4"), + c("C1", "C2", "C3")) > m1 C1 C2 C3 L1 1 2 3 L2 4 5 6 L3 7 8 9 L4 10 11 12 ... ou > m1.a <- matrix(1:12, ncol = 3, byrow = F, dimnames = list(c("L1", + "L2", "L3", "L4"), c("C1", "C2", "C3"))) > m1.a L1 L2 L3 L4 C1 C2 C3 1 5 9 2 6 10 3 7 11 4 8 12 Inspecionando a matriz > m2 [1,] [2,] [3,] [4,] [,1] [,2] [,3] 1 5 9 2 6 10 3 7 11 4 8 12 > length(m2) [1] 12 ## números de elementos da matriz > dim(m2) [1] 4 3 ## dimensão da matriz (linhas x colunas) > nrow(m2) [1] 4 ## número de linhas da matriz > ncol(m2) [1] 3 ## número de colunas da matriz > m2[1, 2] [1] 5 ## elemento da primeira linha e segunda coluna > m2[, 1] [1] 1 2 3 4 ## todos elementos da primeira coluna > m2[1, ] [1] 1 5 9 ## todos elementos da primeira linha > m2[c(1, 3), c(1, 3)] [1,] [2,] [,1] [,2] 1 9 3 11 ## submatriz com linhas 1 e 3 e colunas 1 e 3 > m2[1:2, 2:3] [1,] [2,] [,1] [,2] 5 9 6 10 ## submatriz com linhas 1 e 2 e colunas 2 e 3 Gerando uma matriz identidade > diag(3) [1,] [2,] [3,] [,1] [,2] [,3] 1 0 0 0 1 0 0 0 1 > diag(5) [1,] [2,] [3,] [4,] [5,] [,1] [,2] [,3] [,4] [,5] 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 Operações basicas com matrizes t() transposta %*% produto interno det() determinante solve() inversa de uma matriz ou resolver sistema de equações lineares > (m4 <- matrix(1:6, nc = 3)) [1,] [2,] [,1] [,2] [,3] 1 3 5 2 4 6 > (m5 <- matrix(10 * (1:6), nc = 3)) [1,] [2,] [,1] [,2] [,3] 10 30 50 20 40 60 > m4 + m5 [1,] [2,] [,1] [,2] [,3] 11 33 55 22 44 66 ## membro à membro > m5 - m4 [1,] [2,] [,1] [,2] [,3] 9 27 45 18 36 54 ## membro à membro > dim(t(m4)) [1] 3 2 > dim(m5) [1] 2 3 > (m6 <- t(m4) %*% m5) [1,] [2,] [3,] [,1] [,2] [,3] 50 110 170 110 250 390 170 390 610 > det(m6) [1] -4.054396e-12 ## perceba que aqui há um erro de arredondamento. Para contornar isso basta utilizar o seguinte comando: > round(det(m6), digits = 1) [1] 0 ## Aqui obtemos o resultado esperado. Sistema de equacoes lineares (Ax=b) x + 3y - z = 10 5x - 2y + z = 15 2x + y - z = 7 > mat <- matrix(c(1, 5, 2, 3, -2, 1, -1, 1, -1), + nc = 3) > mat [1,] [2,] [3,] [,1] [,2] [,3] 1 3 -1 5 -2 1 2 1 -1 > solve(mat) [,1] [,2] [,3] [1,] 0.07692308 0.15384615 0.07692308 [2,] 0.53846154 0.07692308 -0.46153846 [3,] 0.69230769 0.38461538 -1.30769231 ## inversa da matriz > vec <- c(10, 15, 7) > vec [1] 10 15 7 > solve(mat, vec) [1] 3.615385 3.307692 3.538462 ## Solução do sistema Ax=b Resolva os seguintes exercı́cios: 1) Dadas as matrizes: −3 4 −3 −1 B= 1 −1 3 5 −3 −5 3 5 −2 −4 3 4 −2 −3 2 A = −1 1 2 C = −1 1 −5 5 −4 mostre que AB=BA = matriz nula , AC=A e CA=C 2) Um construtor tem contratos para construir 3 estilos de casa: moderno, mediterraneo e colonial. A quantidade de material empregada em cada tipo de casa é dada pela tabela: Estilo de casa Moderno Mediterrâneo Colonial Tabela 1: Estilos de casas Ferro Madeira Vidro Tinta 5 20 16 7 7 18 12 9 6 25 8 5 Tijolo 17 21 13 a) Se ele vai contruir 5, 7 e 12 casas dos tipos moderno, mediterraneo e colonial, respectivamente, quantas unidades de cada material serão empregadas? b) Suponha agora que os preços por unidade de ferro, madeira, vidro, tinta e tijolo sejam, respectivamente, 15, 8, 5, 1 e 10 u.c.p. Qual é o preço unitário de cada tipo de casa? c) Qual o custo total do material empregado? 3) Suponha que um corretor da Bolsa de valores faça um pedido para comprar ações na segunda-feira, como segue: 400 quotas de ação A, 500 quotas da ação B e 600 quotas da ação C. As ações A, B e C custam por quota R$ 500,00, R$ 400,00 e R$ 250,00, respectivamente. a) Encontre o custo total de acoes, usando multipicacao de matrizes. b) Qual serah o ganho ou a perda quando as acoes forem vendidas seis meses mais tarde se as acoes A, B e C custam R$ 600,00, R$ 350,00 e R$ 300,00 por quota, respectivamente? 4) Encontre as soluções para o sistema de equações. a) 3x + 5y =2 2x +z=3 5x + y - z = 0 b) 2x - y +3z = 11 4x - 3y +2z = 0 x+y+z=6 3x + y + z = 4 c) 3x + 5y + 12z - t = -3 1x + 1y + 4z - t = -6 0x + 2y + 2z + t = 6 5) Calcule a determinante de: 2 A= 3 4 0 −1 0 2 −3 7 6) Dadas as matrizes A= B= 1 1 3 0 2 0 −1 1 Calcule: a) det(A) + det(B) b) det(A + B) 7) Dada a matriz calcule 2 1 A= 0 2 5 1 a) det(A) b) inversa de A −3 1 4 8) Considere −1 C = −1 0 1 1 1 0 3 1 a) Determine a inversa de C b) Uma maneira de decodificar mensagens é por meio de multiplicação de matrizes. Associamos as letras do alfabeto aos números, segundo a correspondencia abaixo 0 a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 l 11 m 12 n 13 o 14 p 15 q 16 r 17 s 18 t 19 u 20 v 21 x 22 z 23 Se desejamos enviar a mensagem ”eles”, por exemplo, utilizamos a correspondência numérica, montamos a matriz 5 5 11 18 1 3 2 4 15 35 47 105 M= Fazemos CM, onde C é uma inversı́vel, por exemplo, C= e enviamos CM = . Quem recebe a mensagem codificada, decodifica-a utilizando multiplicacao pela inversa de C(matriz chave). Voce recebe a mensagem codificada 16 CM = 12 14 Decodifique-a utilizando a matriz C do intem a). 35 52 36 2 51 18