Upload
kitra
View
77
Download
1
Embed Size (px)
DESCRIPTION
Introdução à Programação Linguagem R. Introdução. A aprendizagem de uma linguagem de programação desenvolve a capacidade de raciocínio e análise do aluno e é uma vantagem comparativa na luta pelos empregos melhor remunerados. - PowerPoint PPT Presentation
Citation preview
1
Introdução à Programação Linguagem R
2
Introdução
• A aprendizagem de uma linguagem de programação desenvolve a capacidade de raciocínio e análise do aluno e é uma vantagem comparativa na luta pelos empregos melhor remunerados.
• O R é uma linguagem simples mas que permite escrever programas para realizar tarefas computacionalmente complexas.
• É de distribuição gratuita (procurar R-project).
3
4
Introdução
• O que escrevermos na linha de comando, depois de fazermos “Enter” – assumiremos a partir de agora, que se faz
sempre Enter no fim de escrever os comandos
• Vai ser processado pelo R.
5
Introdução
• Por exemplo, se escrever (2+7+5)/5 • aparece o resultado [1] 2.8• O número [1] não tem, para já,
significado.
6
Introdução
• Se executarmos o comando q()• saímos do R. (faz uma pergunta a que
dizemos sim).
7
Objectos
8
Objectos
• Um objecto pode ser – uma variável, – uma constante, – um vector, – uma matriz, – uma tabela de dados, – uma função, etc.
9
Objectos• Cada objecto tem um nome formado por
letras (as maiúsculas são diferentes das minúsculas), por números e pelo carácter ponto, “.”, não podendo ter espaços.
10
Objectos• Constantes. Eu posso criar a constante X
executando X <- 45 (que é diferente do objecto x).• Para ver o conteúdo de um objecto,
executo o seu nome. Se executar X• aparece [1] 45
11
Objectos• Se atribuir outra vez outro valor a X, o
valor anterior será destruído e substituído.• Também poderia fazer a atribuição
usando = em vez de <-X = 45
12
Objectos• Expressões. Posso executar expressões
algébricas e ver o resultado ou colocar o resultado numa constante.
• Nas expressões posso ter números, operadores algébricos (+, –, /, *) e potenciação (^). Posso ainda usar outros objectos e funções.
13
Objectos• Se executar i <- ((X*2 + 5^2)^2) / log(1.05) • e depois i• aparece [1] 271058.7
14
Exercício• Ex.3.1. Emprestei 1000€ a uma taxa anual
de 5%/ano. Quanto dinheiro receberei ao fim de 10 anos (capitalização composta)?
15
ExercícioTx.de.jr.an<-0.05Cap.inic<-1000Prazo<-10Cap.final<-Cap.inic*(1+Tx.de.jr.an)^PrazoCap.final[1] 1628.895
16
Objectos• Vectores. Um vector é uma “constante” multi-
dimensional. • Para dar a indicação de que vou criar um vector,
usa o “comando” c(valor1, valor2). • Os vectores têm um “modo” (se são números
reais, complexos, valores lógicos, palavras, etc.) onde todas as dimensões do vector têm que ser do mesmo “modo”.
17
Objectos• E.g., durante um empréstimo a 3 anos
capitalizado, a taxa de juro dos anos foi 3.7%, 4.1% e 4.9%. Posso guardar essas taxas num vector executando Juros<-c(0.037,0.041,0.049)
• Se quiser saber quantos elementos tem o vector executo length(Juros)
18
Objectos• Resumindo sabemos como definir• Constantes
X = 45• Expressões
i <- ((X*2 + 5^2)^2) / log(1.05)• Vectores
Juros<-c(0.037,0.041,0.049)
19
Operações com vectores
• Eu posso usar os vectores na expressões algébricas
• O R vai calcular a expressão para cada um dos elementos e retorna como resultado outro vector.
• Não se trata de cálculo vectorial normal
20
Operações com vectores
• Por exemplo, as taxas de juro sãoJuros<-c(0.037,0.041,0.049)
• E eu emprestei 5000€, recebendo os juros no fim de cada ano. Obtenho os juros recebidos nos 3 anos executando o comando … de que resulta 5000*Juros[1] 185 205 245
21
Operações com vectores
• Nota. Uma constante é um vector de dimensão unitária.
22
Operações com vectores
• Se eu executar operações com dois vectores, as operações vão ser realizada entre os elementos de igual índice.
• Por exemplo, se eu executar … resultará v1 <- c(4, 6, 87)v2 <- c(34, 32.4, 12)v1 + v2[1] 38.0 38.4 99.0
23
Operações com vectores
• Se eu aplicar funções a vectores, a função é aplicada a cada elemento do vector.
• Por exemplo, se eu executar… resultaráv1 <- c(4, 6, 87) v1^0.5[1] 2.000000 2.449490 9.327379.
24
Exercício• Ex.3.2. Um banco personaliza as taxas de
juro dos depósitos dos seus clientes. • i) Crie, para 10 clientes, um hipotético
vector de taxas de juro, um vector de saldos e calcule os juros a pagar a cada cliente.
• ii) Capitalize esses saldos com a taxa de juro respectiva a 5 anos.
25
ExercícioTx.juros<- c(4.5, 5.1, 4, 3.6, 3, 5, 4.6, 4.8,
3.6, 5)/100Saldos<- c(10, 150, 45, 20, 100, 75, 15, 67,
9, 2)*1000Juros <- Saldos*Tx.juros• ii) Cap.final<-
Saldos*(c(1,1,1,1,1,1,1,1,1,1) + Tx.juros)^5
26
Exercício• Ex.3.3. Quero saber, em função do
prazo, qual é o capital final de emprestar 1000€ a uma taxa anual de 4%.
• Experimente 1, 2, 5 e 10 anos.
27
Exercício• R. Vou usar as potencialidades do R
relativamente a “operações” com vectores.Anos <- c(1, 2, 5, 10)Tx.juro.anual<-0.04Capital.final <- 1000*(1+Tx.juro.anual)^AnosCapital.final
[1] 1040.000 1081.600 1216.653 1480.244
2.ª Aula
28
29
Operações com vectores
• Reciclagem. Se realizar operações com dois vectores de tamanhos diferentes, o vector mais pequeno vai ser “reciclado” até ficar com o tamanho do maior.
30
Operações com vectores
• Por exemplo, se executar … resultaráv3 <- c(1, 2, 3, 4)v4 <- c(10, 2)v3 + v4[1] 12 4 13 6
• É como se o vector v4 fosse v4 <-(10, 2, 10, 2)
31
Operações com vectores
• Se, numa operação com vectores, usar uma constante, esta vai ser reciclada até ficar com o tamanho do vector.
• No ex.3.2 bastaria executar• Capital.final<- Saldos*(1 + Tx.juros)^5• Nota. Se os tamanhos não forem
múltiplos um do outro, o R imprime um aviso.
32
Operações com vectores
• Sequências. Quando os elementos do vector são uma série, podemos usar o operador “:” para criá-lo.
• Por exemplo, se executar … resultav5 <- 1:10 V5[1] 1 2 3 4 5 6 7 8 9 10
33
Operações com vectores • Fazendo operações algébricas com este
gerador de séries, posso criar series mais complicadas.
• Por exemplo se executar … resultav5<- (1+0.05)^-(1:10) v5 [1] 0.9523810 0.9070295 0.8638376 0.8227025[4] 0.7835262 0.7462154 0.7106813 0.6768394[9] 0.6446089 0.6139133• que é o factor que desconta os valores
futuros ao presente à taxa anual de 5%
34
Operações com vectores
• Devemos ter cuidado com a precedência do operador “:” pelo que se aconselha a usar parênteses:
• -(1:10) é diferente de -1:10• Por exemplo, um vector de dimensão
10 com 5 em todos os elementos, posso fazer v <- (1:5)*0 + 5
35
Exercício• Ex.3.4. Como criar num vector a
sequência (10, 10.5, 11, 11.5, 12)?
v <- 10 + (0:4)/2
36
Exercício• Ex.3.5. Num investimento, apliquei
1000€ e recebi 250€, 350€, 450€ a intervalos de um ano. Sendo que a taxa de desconto é de 4.5% ao ano, qual o VAL deste investimento?
37
ExercícioCash.flow<-c(-1000, 250, 350, 450)Taxa.de.desconto<-0.045Desconto<-(1+Taxa.de.desconto)^-(0:3)Vai<-Cash.flow*DescontoVai[1] -1000.0000 239.2344 320.5055 394.3335Va<-sum(Vai)Va[1] -45.9266
38
Exercício
• Ex.3.6. Apliquei 5000€ a 10 anos. Sendo que as taxas de juro foram 3.1%, 3.7%, 4.1%, 3.9%, 4.2%,4.3%, 4.5%, 3.9%, 3.5%, 3.2%, quanto dinheiro recebi no fim do prazo?
• Terei que capitalizar os 10 anos multiplicando as taxas de todos os anos.
• Para isso uso a função prod() ou log(), somo os resultados e aplico a função exp()
39
ExercícioPossso usar a função prod() Tx.juro<-c(3.1, 3.7, 4.1, 3.9, 4.2,4.3, 4.5,
3.9, 3.5, 3.2)/100Tx.juro.total<- prod(Tx.juro+1)Capital<-5000*Tx.juro.totalCapital[1] 7287.484
40
ExercícioTx.juro<-c(3.1, 3.7, 4.1, 3.9, 4.2,4.3, 4.5,
3.9, 3.5, 3.2)/100Tx.juro.total<- sum(log(Tx.juro+1))Capital<-5000*exp(Tx.juro.total)Capital[1] 7287.484
41
Operações com vectores
Sequências de números aleatórios. O R (contrariamente ao Excel) tem geradores de números aleatórios de muitas funções de distribuição.
42
Operações com vectores
Para criar um vector com 1000 números aleatórios que seguem Distribuição Normal com, por exemplo, média 10 e desvio padrão 5, executo
va<-rnorm(10000, mean=10, sd=5)Depois, posso usar este vector nas
minhas simulações
43
Operações com vectores
Por exemplo, a taxa de juro futura assume-se ser N(0.03;0.015). Pretende-se saber qual a prestação antecipada de amortizar 250mil€ em 50 anos.
)1/())600()^1(1/(. iiiVP
44
Operações com vectores
r<-rnorm(10000, mean=0.03, sd=0.015)rm<-(1+r)^(1/12)-1P<-25000*rm/(1-(1+rm)^(-600))/(1+rm)c(mean(P),sd(P))[1] 80.81870 21.28977summary(P) Min. 1st Qu. Median Mean 3rd Qu. Max. 18.69 65.63 79.86 80.82 94.65 164.80
3.a Aula
45
46
Indexação de vectoresAcesso a elementos do vector
47
Indexação de vectores
Quando pretendo aceder um elemento do vector, uso o índice do elemento que eu quero, entre parênteses rectos. E.g., se quisesse saber a taxa de juro do 2º ano, executava … resultavaTx.juro<-c(3.1, 3.7, 4.1, 3.9, 4.2, 4.3)/100Tx.juro[2][1] 0.037
48
Indexação de vectores
Posso alterar E.g., para alterar o 4º ano da série fazia Tx.juro[4] <- 0.043Ou criar novo elemento (o 7º ano)Tx.juro[7]<- 0.041
49
Indexação de vectores
Também posso querer o valor que tem determinada característica e qual:
max(Tx.juro)min(Tx.juro)which.max(Tx.juro)which.min(Tx.juro)
50
Indexação de vectores
Se quiser aceder a vários elementos, uso um vector com os seus índices.
E.g., quero o 1º e o 5º anoTx.juro[c(1,5)]Notar que tenho que usar o comando de
vector c().
51
Indexação de vectores
Posso também usar o gerador de séries executando (4 primeiros anos)
Tx.juro[1:4]
52
Exercício• Ex.3.7. i) Crie um vector com 1000
número aleatórios que seguem lei normal com média 100 e desvio padrão 50.
53
Exercício• serie<-rnorm(1000, mean=100, sd=50)
• i) Determine a diferença entre a média dos primeiros 500 valores para os últimos 500 valores.
54
Exercíciodiferenca<- mean(serie[1:500])-
mean(serie[501:1000])
diferenca[1] 0.4310512
Quando temos números aleatórios, em cada execução resultará um número diferente
55
Exercício• iii) Determine a média dos 100 maiores
valores e dos 100 menores valores (use o comando sort( ) para ordenar de forma crescente).
56
Exercícioordenados<-sort(serie)m.menores <- mean(ordenados[1:100])m.maiores<- mean(ordenados[901:1000])m.menores[1] 9.373458m.maiores[1] 190.8691
57
Exercício
• Ex.3.8. Num vector estão os salários anuais de determinado trabalhador que se quer reformar (crie aleatoriamente o vector com 40 elementos com média 600 e d.p. 200).
• Determine o valor da sua reforma que será 2% por cada ano da média dos maiores 10 anos dos últimos 15.
58
Exercício
salarios<-rnorm(40, mean=600, sd=200)us.mel<- sort(salarios[26:40])[6:15]s.medio <- mean(us.mel)(reforma<-s.medio*length(salarios)*2/100)[1] 577.2028colocando a expressão entre parêntesis,
atribui-se a variável e visualiza-se imediatamente o resultado
59
Filtragem de vectores.
60
Filtragem de vectores. Pode acontecer eu precisar retirar do
vector os elementos que obedecem a determinado critério. Por exemplo, quero os elementos que são maiores que zero.
61
Filtragem de vectores. Para isso uso uma condição no índice:x <- rnorm(40,mean=0,sd=10) x[x>0]Reparar que o que está no índice é um
vector com a mesma dimensão de x mas em que os elementos são TRUE ou FALSE.
62
Filtragem de vectores.
63
Filtragem de vectores. Por exemplo, quero saber na distribuição
normal de média zero quanto é a média dos maiores que zerox<-rnorm(1000000,mean=0,sd=10)mean(x)[1] 0.009357231mean(x[x>0])[1] 7.973201
64
Filtragem de vectores. Posso usar como comparações maior >maior ou igual >=menor <menor ou igual <=, igual == (dois iguais)diferente !=
65
Filtragem de vectores. Pode ainda usar-se o “ou” de várias
condições com o carácter | ou o “e” com o carácter &.
e.g., quero os valores maiores que 0 e menores ou iguais a 5 executo
X[X>0 & X<=5] Para negar uma condição uso o
carácter !.
66
Exercício
Ex.3.9. Suponha que as notas de um disciplina seguem lei normal com média 11.47 valores e desvio padrão de 3.51 valores.
i) Crie um vector com 250 “indivíduos”.
67
Exercícionotas <-rnorm(250, mean=11.47, sd=3.51)
ii) Retire para outro vector os alunos com nota maior ou igual a 9,5 valores e calcule a percentagem de passados.
68
Exercíciopassados <- notas [notas>=9.5]length(passados)/length(notas)
• iii) Substitua os valores maiores que 20 por 20 e os menores que zero por zero.
69
Exercíciopassados[passados > 20] <- 20passados[passados < 0] <- 0
• iv) arredonde as notas • v) determine quantos alunos tiveram 10
valores
70
Exercíciopassados <- round(passados,0)length(passados [passados == 10])
71
Exercício• Ex.3.10. Suponha que se prevê que a
EURIBOR do próximo ano segue lei normal com média 5% e desvio padrão 3 pontos percentuais mas que nunca poderá ser menor que 0.25% nem maior que 10%.
72
Exercício• i) Crie um vector com 1000 “indivíduos”
com estas características substituindo os valores “errados” por estas taxas limite.
• • ii) extraia 2000, apague os “errados” e
depois retire 1000 “certos”
73
Exercíciotx.prox.ano <- rnorm(1000, mean=0.05,
sd=0.03)tx.prox.ano [tx.prox.ano < 0.0025] <-
0.0025tx.prox.ano [tx.prox.ano > 0.1] <- 0.1
74
Exercíciotx.prox.ano <- rnorm(2000, mean=0.05,
sd=0.03)tx.prox.ano <- tx.prox.ano [tx.prox.ano >=
0.0025 & tx.prox.ano <= 0.1]tx.prox.ano <- tx.prox.ano [1:1000]
4.a Aula
75
76
Criação de uma Função
77
Funções• Eu posso criar uma função que • tem uma variável de entrada (que
também pode ser um vector) e • tem um resultado de saída (que pode
ser uma variável ou um vector).
78
Funções• Por exemplo, quero dividir as notas
dos alunos em “reprovou” ou “passou”. Para isso escrevo num editor de texto a função:Classifica <-function(nota){if(nota >= 9.5) decisao<- ”passou” else decisao<- ‘reprovou’decisao}
79
Funções• Depois copio estas linhas de comando
e executo-as no R. • Depois eu posso usar essa para
classificar se os alunos passaram ou reprovaram.
• Na sintaxe da função, antes de escrever o comando de saída (i.e., decisao}) é obrigatório mudar de linha.
80
Funções
81
FunçõesA função consiste em1º objecto que a vai conter,2º o sinal de atribuição3º o comando function 4º nome das variáveis dentro de parênteses
rectos.5ºAbrem-se chavetas que apenas se fecham
quando escrevermos o comando a dar o resultado (que tem que ser na última linha).
82
FunçõesA execução condicionada usa o comandoif(condição) Caso sim else Caso não.
83
FunçõesEx.3.11. i) Escreva uma função que tem
como variáveis o capital inicial, a taxa de juro e o prazo e retorna o capital final (capitalização composta).
84
Funçõescc <-function(cap.ini, t.juro, prazo){resultado<-cap.ini*(1+t.juro)^prazoresultado}
85
Funçõesii) Determine o capital final se aplicados
1000€ à taxa de juro anual de 5% durante 30 anos.
cc(1000, 0.05, 30)[1] 4321.942
86
Funçõesiii) Experimente usar a função para
determinar qual o capital final para três situações diferentes (a taxa de juro ser 4%, 5% ou 6%).
cc(1000, c(0.04,0.05,0.06) ,30)[1] 3243.398 4321.942 5743.491
87
Funçõesiv) acrescente uma condição de forma que,
se o capital for maior que 50000€, a taxa de juro é maior em 0.5pp e acrescente na saída a taxa de juro. Experimente a função.
88
Funçõescc <-function(cap.ini, t.jr, prazo){if(cap.ini < 50000) tx<- t.jr else tx<-t.jr+0.005cap.final<-cap.ini*(1+tx)^prazoresultado<-c(cap.ini, tx, prazo, cap.final)names(resultado)<-c("Cap.ini", "Tx.juro",
"Prazo", "Cap.final")resultado}
89
Execução repetida
90
Execução repetidaExiste recorrentemente necessidade de
repetir uma série de operaçõesPor exemplo, no Método de Monte Carlos1. Eu sei como resolver um modelo mas
uma variável segue uma variável aleatória
2. Experimento vários valores da variável3. Calculo o valor médio e o desvio padrão
e faço um histograma
91
Execução repetidaE.x. Do 2ºtesteInvisto 1 milhão de euros por ano e dentro
de N anos faço uma descobertaN é desconhecido mas tem distribuição
normal com média 10 anos e desvio padrão 5 anos.
Taxa de juro de 3% ao ano
92
Execução repetida#determino 1000 casos possíveisN <- rnorm(1000,mean=10,sd=5)#determino 1000 valores actuaisTx.j<-0.03VA<- 1/Tx.j*(1-(1+Tx.j)^-N)mean(VA)sd(VA)
93
Execução repetidaMas se eu repetir esta série de comandos,
resultam outros valoresEssas diferenças traduzem “erros de
calculo” que serão tanto menos quanto mais replicas usarmos
Posso fazer um ciclo para avaliar esse erro
94
Execução repetidaM=0 #crio o vector M senão não posso usar M[i]Dp=0 #crio o vector Dpfor (i in 1:100) #Faço 100 replicações do cálculo{ N <- rnorm(1000,mean=10,sd=5) Tx.j<-0.03 VA<- 1/Tx.j*(1-(1+Tx.j)^-N) M[i] =mean(VA) Dp[i]=sd(VA)}