Exercícios

Para todos os exercícios a seguir não se esqueça de:

  • Verificar sempre se as entradas passadas pelo usuário são viáveis para os cálculos das funções.
  • Inventar várias entradas para as funções implementadas a fim de verificar se elas estão funcionando corretamente.
  • Sempre que possível chamar as funções já implementadas dentro de uma nova função. Assim você simplifica bastante seu código. ______________________________________________________________________________________________________________________________

Questão 1

Faça o que se pede sem usar as funções max()ou which.max() do R.

(a). No computador implemente o algoritmo visto em sala de aula que recebe como entrada um vetor v e retorna o seu valor máximo.

maximo = function(v){
  if(class(v)!="numeric"  )
    stop("Não são números reais")
  
  n = length(v)
  max = v[1]
  for (i in 2:n) {
    if( v[i] > max ){
      max = v[i]
    }
    i = i + 1
  }
  return(max)
}

v = c(4,8,0.7,999,3)
maximo(v)
## [1] 999

(b). Em seu caderno escreva um pseudo-código para o algoritmo que recebe como entrada um vetor v e retorna a posição onde se encontra o máximo. Nesse item não é para usar o computador.

#Entrada: v = array com os dados.
#Saída: valor da posição do máximo em v.

#1. Defina n como o tamanho do vetor v;
#2. Faça max = v[1];
#3. Faça p = 1;
#4. Inicie i = 2;
#5. Se v[i] > max , p = i;
#6. Incremente i: i = i + 1;
#7. Se i <= n, volta para a linha 4;
#8. Retorne p.

(c). Agora, novamente no computador, implemente uma nova função que executa o pseudo-código elaborado no item b. Não use o mesmo nome da função implementada no item a.

posicao_max = function(v){
  if(class(v)!="numeric"  )
    stop("Não são números reais")
  n = length(v)
  max = v[1]
  p = 1
  for (i in 2:n) {
    if( v[i] > max){
      p = i
    }
    i = i + 1
  }
  return(p)
}

v = c(4,8,0.7,8,999,3)
posicao_max(v)
## [1] 5
which.max(v)
## [1] 5

Questão 2

Faça o que se pede sem usar as funções max()ou which.max()´` do R.

(a). Primeiro escreva em seu caderno um pseudo-código para o algoritmo que recebe como entrada um vetor v e retorna o valor mínimo guardado em v. Nesse item não é para usar o computador.

#Entrada: v = array com os dados.
#Saída: valor minimo em v.

#1. Defina n como o tamanho do vetor v;
#2. Faça min = v[1];
#3. Inicie i = 2;
#4. Se v[i] < min , min = v[i];
#5. Incremente i: i = i + 1;
#6. Se i <= n, volta para a linha 4;
#7. Retorne max.

(b). Agora no computador implemente uma função que executa o pseudo-código elaborado do item a.

minimo = function(v){
  if(class(v)!="numeric"  )
    stop("Não são números reais")
  
  n = length(v)
  min = v[1]
  for (i in 2:n) {
    if( v[i] < min ){
      min = v[i]
    }
    i = i + 1
  }
  return(min)
}

v = c(4,8,0.7,999,3)
minimo(v)
## [1] 0.7

(c). De volta ao caderno escreva um pseudo-código para o algoritmo que recebe como entrada um vetor v e retorna a posição onde se encontra o mínimo. Nesse item não é para usar o computador.

#Entrada: v = array com os dados.
#Saída: valor da posição do minimo em v.

#1. Defina n como o tamanho do vetor v;
#2. Faça min = v[1];
#3. Faça p = 1;
#4. Inicie i = 2;
#5. Se v[i] < min , p = i;
#6. Incremente i: i = i + 1;
#7. Se i <= n, volta para a linha 4;
#8. Retorne p.

(d). Novamente no computador implemente no uma nova função que executa o pseudo-código elaborado no item c. Não use o mesmo nome da função implementada no item a.

posicao_min = function(v){
  if(class(v)!="numeric"  )
    stop("Não são números reais")
  n = length(v)
  min = v[1]
  p = 1
  for (i in 2:n) {
    if( v[i] < min ){
      p = i
    }
    i = i + 1
  }
  return(p)
}

v = c(0.7, 999, 0, 1)
posicao_min(v)
## [1] 3
which.min(v)
## [1] 3

Questão 3

A amplitude de um conjunto \(A\) é definida por \(max(A)−min(A)\).

(a). Primeiro escreva no caderno um pseudo-código para o algoritmo que recebe como entrada um vetor v e retorna a sua amplitude. Considere que você já fez as funções que retornam o máximo e o mínimo de v(itens anteriores). Não é para usar o computador ainda.

#Entrada: v = array com os dados.
#Saída: valor da amplitude em v.

#1. Faça min = maximo(v);
#2. Faça min = maximo(v);
#3. Faça amplitude = max - min;
#4. Retorne abs(amplitude).

(b). Agora no computador implemente o passo-a-passo feito do item a. Dentro da sua função chame as funções implementadas nos Exercício 1 e 2.

amplitude = function(v){
  if( class(v) != "numeric")
    stop("Não são números reais")
  
  max = maximo(v)
  min = minimo(v)
  amplitude = max - min
  return(abs(amplitude))
}

v = c(99,74,12,5)
amplitude(v)
## [1] 94

Questão 4

Faça o que se pede sem usar as funções mean() e sum() do R. No computador implemente o algoritmo visto em sala de aula que recebe como entrada um vetor v e retorna a média amostral dos valores em v. Obs: Se quiser use a função mean() apenas para comparação.

media = function(v){
  if( class(v) != "numeric")
    stop("Não são números reais")
  
  n = length(v)
  soma = 0
  for (i in 1:n){
    soma = soma + v[i]
    i = i + 1
  }
  
  media = soma/n
  return(media)
}

v = c(2,4,7,6,6,6.5,8)
media(v)
## [1] 5.642857
mean(v)
## [1] 5.642857

Questão 5

Faça o que se pede sem usar a função median() do R. Para ordenar o vetor de entrada use a função sort() do R. No computador implemente o algoritmo visto em sala de aula que recebe como entrada um vetor v e retorna a mediana de v. Obs: Se quiser use a função median() apenas para comparação.

mediana = function(v){
  if( class(v) != "numeric")
    stop("Não são números reais")
  
  n = length(v)
  v_o = sort(v)
  if( n%%2 != 0){
    mediana = v_o[ (n+1)/2 ]
  } else{ mediana = ( v_o[n/2] + v_o[ (n/2)+1 ] )/2
  }
  return(mediana)
}

v = c(2,4,4.2,7.2,6,6.5)
mediana(v)
## [1] 5.1
median(v)
## [1] 5.1

Questão 6

Faça o que se pede sem usar a função quantile() do R. Para ordenar o vetor de entrada use a função sort() do R.

(a). No computador implemente o pseudo-código visto em sala de aula, baseado no Método 1, que recebe como entrada um vetor v e retorna um array com os valores dos três quartis.

quartil_1 = function(v){
  if( class(v) != "numeric")
    stop("Não são números reais")
  
  n = length(v)
  v_o = sort(v)
  
  if(n%%2==0){
     k = n/2 ; j = k + 1
  }else{ k = (n-1)/2 ; j = k + 2}
  
  v_1 = v[1:k]
  v_2 = v[j:n]
  q_1 = mediana(v_1)
  q_2 = mediana(v)
  q_3 = mediana(v_2)
  q = c(q_1,q_2,q_3)
  return(q)
}

v = c(35,32,33,20,37,39,40,55,90)
quartil_1(v)
## [1] 32.5 37.0 47.5

(b). No caderno escreva um pseudo-código que calcula os três quartis a partir do Método 2.

#Entrada: v = array com os dados.
#Saída: um array com os 3 quartis dos valores de v.

#1. Defina n como o tamanho do vetor v;
#2. Defina v_o como o vetor v ordenado;
#3. Defina m como a mediana do vetor v;
#4. Defina A1 e A2 como vetores numéricos;
#5. Faça p1 = 1 e p2 = 1
#6. Inicie i = 1;
#7. Se v_o[i] <= m, A1[p1] = v_o[i];
#8. Incremente p1: p1 = p1 + 1;
#9. Se v_o[i] >= m, A2[p2] = v_o[i];
#10. Incremente p2: p2 = p2 + 1; 
#11. q_1 = mediana de A1;
#12. q_2 = mediana de v;
#13. q_3 = mediana de A2;
#14. Retorna o vetor (q_1, q_2, q_3).

(c). No computador implemente o pseudo-código escrito no item acima.

quartil_2 = function(v){
  if( class(v) != "numeric")
    stop("Não são números reais")
  
  n = length(v)
  v_o = sort(v)
  m = mediana(v)
  A1 = numeric(0); A2 = numeric(0)
  p1 = 1; p2 = 1
  
  for (i in 1:n){
    if(v_o[i] <= m){
      A1[p1] = v_o[i]
      p1 = p1 + 1 
    }
    if(v_o[i] >= m){
      A2[p2] = v_o[i]
      p2 = p2 + 1 
    }
  }
  
  q_1 = mediana(A1)
  q_2 = m
  q_3 = mediana(A2)
  q = c(q_1,q_2,q_3)
  return(q)
}

v = c(35,32,33,20,37,39,40,55,90)
quartil_2(v)
## [1] 33 37 40
quantile(v)
##   0%  25%  50%  75% 100% 
##   20   33   37   40   90

Questão 7

A distânica interquartílica de um conjunto \(A\) é definida por \(q3−q1\), onde \(q1\) e \(q3\) são, respectivamentes, o primeiro e terceiro quartil.

(a). Primeiro escreva no caderno um pseudo-código para o algoritmo que recebe como entrada um vetor v e retorna a sua Distância Interquartílica. Considere que você já sabe calcular os quartis de v. Não é para usar o computador ainda.

#Entrada: v = array com os dados.
#Saída: valor da distânica interquartílica em v.

#1. Defina q1 como primeiro quartil do vetor v;
#2. Defina q3 como terceiro quartil do vetor v;
#3. Faça inter = abs(q3 - q1) ;
#4. Retorne inter.

(b). Agora no computador implemente o passo-a-passo feito do item a. Dentro da sua função chame a função implementadas no Exercício 6.

interquartil = function(v){
  if( class(v) != "numeric")
    stop("Não são números reais")
  
  q1 = quartil_1(v)[1]
  q3 = quartil_1(v)[3]
  inter = abs(q3 - q1)
  return(inter)
}

v = c(35,32,33,20,37,39,40,55,90)
interquartil(v)
## [1] 15

Questão 8

Faça o que se pede sem usar as funções sd(), mean() e sum() do R. No computador implemente o algoritmo visto em sala de aula que recebe como entrada um vetor v e retorna a sua variância amostral. Para simplificar use a função implementada no Exercício 4. Obs: Se quiser use a função sd() apenas para comparação.

var_amostral = function(v){
  if( class(v) != "numeric")
    stop("Não são números reais")
  
  n = length(v)
  m = media(v)
  soma = 0
  i = 1
  while(i<=n){
    soma = soma + (v[i] - m)^2
    i = i + 1
  }
  
  s2 = soma/(n-1)
  return(s2)
}

v = c(35,32,33,20,37,39,40,55,90)
var_amostral(v)
## [1] 403
var(v)
## [1] 403

Questão 9

O Desvio Médio de um conjunto de dados \(A={a1,…,an}\) é definido pela expressão abaixo, onde \(m\) é a média amostral de \(A\). \[\hbox{dm } = \frac{\sum_{i=1}^n |a_i - m|}{n}\].

(a). Primeiro escreva no caderno um pseudo-código para o algoritmo que recebe como entrada um vetor v e retorna o seu Desvio Médio. Não é para usar o computador ainda. Considere que você já sabe calcular a média amostral de v.

#Entrada: v = array com os dados.
#Saída: valor do desvio médio em v.

#1. Defina n como o tamanho do vetor v;
#2. Defina m como a média amostral do vetor v;
#3. Inicie soma = 0;
#4. Inicie i=1;
#5. Incremente a variável soma: soma = soma + abs(v[i] - m);
#6. Incremente i: i = i + 1;
#7. Se i <= n, volta para a linha 5;
#8. Faça dm = soma/n;
#9. Retorne dm.

(b). Agora no computador implemente o pseudo-código feito do item a.

desvio_medio = function(v){
  if( class(v) != "numeric")
    stop("Não são números reais")
  
  n = length(v)
  m = media(v)
  soma = 0
  i = 1
  while(i<=n){
    soma = soma + abs(v[i] - m)
    i = i + 1
  }
  
  dm = soma/(n)
  return(dm)
}

v = c(35,32,33,20,37,39,40,55,90)
desvio_medio(v)
## [1] 13.40741

Questão 10

Faça o que se pede sem usar as funções mean(), sum() ou qualquer outra pronta do R.

(a). Implemente o algoritmo visto em sala de aula que recebe como entrada dois vetores v e w e retorna a covariância amostral entre eles. Para simplificar use a função implementada no Exercício 4.

cov_amostral = function(v,w){
  if( class(v) != "numeric" | class(w) != "numeric")
    stop("Não são números reais")
  
  n = length(v); k = length(w)
  if( n!=k)
    stop("Amostras de tamanhos diferentes")
  
  m_v = media(v)
  m_w = media(w)
  soma = 0 
  i = 1
  while(i<=n){
    soma = soma + (v[i] - m_v)*(w[i] - m_w)
    i = i + 1
  }
  
  cov = soma/(n-1)
  return(cov)
  
}

v = c(25,42,53,10,7,19,85,57,81)
w = c(35,32,33,20,37,39,40,55,90)
cov_amostral(v,w)
## [1] 368.5833
cov(v,w)
## [1] 368.5833

(b). Desafio: vamos generalizar o item a. Implemente uma função que recebe como entrada uma matriz de dados. Considere que cada coluna dessa matriz representa um vetor de dados. A função implementada deve retornar a matriz de covariância amostral entre os vetores coluna dessa matriz. Lembre-se que a matriz de covariância é definida pela matriz cuja posição \((i,j)\) guarda a covariância da variável \(i\) com a \(j\).Nesse item pode (e deve) chamar a função implementada no item a.

matriz_cov = function(m){

  n = length(m[1,])
  matriz = matrix(nrow = n,ncol = n)
  for (i in 1:n) {
    for (j in 1:n) {
      matriz[i,j] = round(cov_amostral(m[,i],m[,j]),2)
    }
  }
  return(matriz)
}

v = c(6,9,7,3,9,2,2,6,4,4,6,1,1,2,7,4)
m = matrix(v, nrow = 4)
matriz_cov(m)
##       [,1]  [,2]  [,3]  [,4]
## [1,]  6.25 -4.92  3.75 -0.83
## [2,] -4.92 11.58 -3.08 -5.17
## [3,]  3.75 -3.08  4.25  1.83
## [4,] -0.83 -5.17  1.83  7.00

Questão 11

Para o próximo exercício considere A1 = c(6,9,7,3,9,2,2,6), A2 = c(4,4,6,1,1,2,7,4) e A3 = c(1,9,5,7,2,4,2,1,9,4).

A1 = c(6,9,7,3,9,2,2,6); A2 = c(4,4,6,1,1,2,7,4); A3 = c(1,9,5,7,2,4,2,1,9,4)

Usando as funções que você implementou nos exercícios anteriores faça as contas que se pede. Tente fazer cada item usando apenas uma linha de comando no R.

(a). Qual a amplitude do conjunto \(A1\)?

amplitude(A1)
## [1] 7

(b). Qual a média amostral do conjunto \(A3\)?

media(A3)
## [1] 4.4

(c). Qual a variância amostral do conjunto \(A2\)?

var_amostral(A2)
## [1] 4.839286

(d). Se A4 for definido pela união dos conjuntos \(A1\) e \(A2\), qual a média de \(A4\)?

A4 = c(A1,A2) ; media(A4)
## [1] 4.5625

(e). Qual a mediana de \(A4\)?

mediana(A4)
## [1] 4

(f). Qual o desvio médio de \(A4\)?

desvio_medio(A4)
## [1] 2.257812

(g). Quais os quartis de \(A3\)?

quartil_1(A3)
## [1] 5 4 4

(h). Qual a distância interquartílica de \(A3\)?

interquartil(A3)
## [1] 1

(i). Qual a covariância entre \(A1\) e \(A2\)? É possível fazer essa conta?

cov_amostral(A1,A2)
## [1] -0.5

Resposta: Sim.

(j). Qual a covariância entre \(A1\) e \(A3\)? É possível fazer essa conta?

# cov_amostral(A1,A3)

Resposta: Não, pois os conjuntos A1 e A3 tem tamanhos distintos.