Aqui você vê as diferenças entre duas revisões dessa página.
03_apostila:03-funcoes [2020/08/17 18:22] adalardo [Mantendo a Coerência Lógica-Matemática] |
03_apostila:03-funcoes [2023/08/22 12:51] |
||
---|---|---|---|
Linha 1: | Linha 1: | ||
- | <WRAP tabs> | ||
- | * [[02_tutoriais:tutorial2:start|Tutorial]] | ||
- | * [[01_curso_atual:exercicios2| Exercícios]] | ||
- | * [[03_apostila:03-funcoes| Apostila]] | ||
- | </WRAP> | ||
- | |||
- | ====== 2. Funções Matemáticas e Estatísticas ====== | ||
- | |||
- | ===== O R como uma Calculadora Fora do Comum ===== | ||
- | |||
- | |||
- | ==== Operações Aritméticas Básicas ==== | ||
- | |||
- | A linha de comando do R funciona como uma calculadora. Todas operações aritméticas | ||
- | e funções matemáticas principais estão disponíveis. Exemplo: | ||
- | |||
- | <code> | ||
- | > 4 + 9 | ||
- | [1] 13 | ||
- | > 4 - 5 | ||
- | [1] -1 | ||
- | > 4 * 5 | ||
- | [1] 20 | ||
- | > 4 / 5 | ||
- | [1] 0.8 | ||
- | > 4^5 | ||
- | [1] 1024 | ||
- | > | ||
- | </code> | ||
- | |||
- | A notação básica de operações algébricas, como a aplicação hierárquica de parênteses, | ||
- | também pode ser utilizada: | ||
- | <code> | ||
- | > (4 + 5 ) * 7 - (36/18)^3 | ||
- | [1] 55 | ||
- | > (2 * ( 2 * ( 2 * (3-4)))) | ||
- | [1] -8 | ||
- | > | ||
- | </code> | ||
- | |||
- | Note que somente os parênteses podem ser utilizados nas expressões matemáticas. As chaves ("{}") e os colchetes ("[]") têm outras funções no R: | ||
- | <code> | ||
- | > (2 * { 2 * [ 2 * (3-4)]}) | ||
- | Error: syntax error in "(2 * { 2 * [" | ||
- | > | ||
- | </code> | ||
- | |||
- | Por que o R é uma calculadora **fora do comum** ? Experimente fazer a seguinte operação matemática na sua calculadora: | ||
- | <code> | ||
- | > 1 - (1 + 10^(-15)) | ||
- | </code> | ||
- | |||
- | |||
- | ==== Funções Matemáticas Comuns ==== | ||
- | |||
- | As funções matemáticas comuns também estão disponíveis e podem ser aplicadas diretamente na linha de comando: | ||
- | <code> | ||
- | > sqrt(9) # Raiz Quadrada | ||
- | [1] 3 | ||
- | > abs( - 1 ) # Módulo ou valor absoluto | ||
- | [1] 1 | ||
- | > abs( 1 ) | ||
- | [1] 1 | ||
- | > log( 10 ) # Logaritmo natural ou neperiano | ||
- | [1] 2.302585 | ||
- | > log( 10, base = 10) # Logaritmo base 10 | ||
- | [1] 1 | ||
- | > log10(10) # Também logaritmo de base 10 | ||
- | [1] 1 | ||
- | > log( 10, base = 3.4076) # Logaritmo base 3.4076 | ||
- | [1] 1.878116 | ||
- | > exp( 1 ) # Exponencial | ||
- | [1] 2.718282 | ||
- | > | ||
- | </code> | ||
- | |||
- | As funções trigonométricas: | ||
- | <code> | ||
- | > sin(0.5*pi) # Seno | ||
- | [1] 1 | ||
- | > cos(2*pi) # Coseno | ||
- | [1] 1 | ||
- | > tan(pi) # Tangente | ||
- | [1] -1.224647e-16 | ||
- | > | ||
- | > asin(1) # Arco seno (em radianos) | ||
- | [1] 1.570796 | ||
- | > asin(1) / pi * 180 | ||
- | [1] 90 | ||
- | > | ||
- | > acos(0) # Arco coseno (em radianos) | ||
- | [1] 1.570796 | ||
- | > acos(0) / pi * 180 | ||
- | [1] 90 | ||
- | > atan(0) # Arco tangente (em radianos) | ||
- | [1] 0 | ||
- | > atan(0) / pi * 180 | ||
- | [1] 0 | ||
- | > | ||
- | </code> | ||
- | |||
- | Funções para arredondamento: | ||
- | <code> | ||
- | > ceiling( 4.3478 ) | ||
- | [1] 5 | ||
- | > floor( 4.3478 ) | ||
- | [1] 4 | ||
- | > round( 4.3478 ) | ||
- | [1] 4 | ||
- | > round( 4.3478 , digits=3) | ||
- | [1] 4.348 | ||
- | > round( 4.3478 , digits=2) | ||
- | [1] 4.35 | ||
- | > | ||
- | </code> | ||
- | |||
- | |||
- | Funções matemáticas de especial interesse estatístico: | ||
- | <code> | ||
- | > factorial( 4 ) # Fatorial de 4 | ||
- | [1] 24 | ||
- | > choose(10, 3) # Coeficientes binomiais: combinação de 10 3-a-3 | ||
- | [1] 120 | ||
- | > | ||
- | </code> | ||
- | |||
- | |||
- | |||
- | ==== Criando Variáveis com Atribuição==== | ||
- | |||
- | Mais do que simples operações aritméticas, o R permite que executemos operações **algébricas** operando sobre variáveis pré-definidas. | ||
- | |||
- | Para definir uma variável, basta escolher um nome (//lembre-se das regras de nomes no R//) e atribuir a ela um valor: | ||
- | <code> | ||
- | |||
- | > a = 3.6 | ||
- | > b = sqrt( 35 ) | ||
- | > c = -2.1 | ||
- | > a | ||
- | [1] 3.6 | ||
- | > b | ||
- | [1] 5.91608 | ||
- | > c | ||
- | [1] -2.1 | ||
- | > | ||
- | > a * b / c | ||
- | [1] -10.14185 | ||
- | > b^c | ||
- | [1] 0.02391820 | ||
- | > a + exp(c) - log(b) | ||
- | [1] 1.944782 | ||
- | > | ||
- | > a - b * c / d | ||
- | Error: object "d" not found | ||
- | </code> | ||
- | |||
- | Não esqueça de definir as variáveis previamente!! | ||
- | |||
- | |||
- | === Exercícios === | ||
- | |||
- | <box left red 80% | **Exercício 2.1. //Estimador de Pollard//**> | ||
- | |||
- | Pollard (1971) propôs o seguinte estimador para estimar a densidade no método de | ||
- | quadrantes: | ||
- | |||
- | $$\hat{N} = \frac{4(4n-1)}{\pi \sum_{i=1}^n \sum_{j=1}^4 r_{ij}^2} $$ | ||
- | |||
- | onde, $r_{ij}$ é a distância de árvore do quadrante $j$ no | ||
- | ponto $i$ ao centro do ponto quadrante e $n$ é o número de pontos quadrantes. | ||
- | |||
- | A variância desse estimador é: | ||
- | |||
- | $$Var(\hat{N_p}) = \frac{\hat{N_p}}{4n-2}$$ | ||
- | |||
- | Imagine que foram amostrados 30 quadrantes, e que o valor da soma do quadrado das distâncias de cada árvore ao centro de seu quadrante foi de: | ||
- | |||
- | $$\sum_{i=1}^{30} \sum_{j=1}^4 r_{ij}^2 = 2531,794$$ | ||
- | |||
- | |||
- | - Qual a densidade estimada? | ||
- | - Qual a variância? | ||
- | |||
- | </box> | ||
- | |||
- | |||
- | <box left red 80% | **Exercício 2.2. //Área transversal de uma Árvore//** > | ||
- | |||
- | A área transversal de uma árvore é calculada assumindo que a secção transversal | ||
- | do tronco à altura do peito (1,3m) é perfeitamente circular. | ||
- | Se o diâmetro à altura do peito (DAP) de uma árvore for 13.5cm, qual | ||
- | a área transversal? | ||
- | |||
- | Se uma árvore possui três fustes com DAPs de: 7cm, 9cm e 12cm, qual | ||
- | a sua área transversal? | ||
- | |||
- | </box> | ||
- | |||
- | |||
- | <box left red 80% | **Exercício 2.3. //Área transversal de uma Árvore (Revisitado)//** > | ||
- | |||
- | Se uma árvore possui três fustes com DAPs de: 7cm, 9cm e 12cm, qual | ||
- | o diâmetro (único) que é equivalente à sua área transversal? | ||
- | |||
- | </box> | ||
- | |||
- | |||
- | <box left red 80% | **Exercício 2.4. //Cálculo da Biomassa de Árvores do Cerrado//**> | ||
- | |||
- | O modelo alométrico de biomassa ajustado para árvores do Cerradão | ||
- | estabele que a biomassa é dada pela expressão: | ||
- | |||
- | $$\hat{b} = e^{-1,7953} d^{2.2974}$$ | ||
- | |||
- | onde ''b'' é a biomassa em //kg// e | ||
- | ''d'' é o DAP em //cm//. | ||
- | |||
- | Já um outro modelo para biomassa das árvores na | ||
- | mesma situação tem a forma: | ||
- | |||
- | $$\hat{ln(b)} = -2.6464 + 1,996ln(d) + 0,7558ln(h)$$ | ||
- | |||
- | |||
- | onde ''h'' é a altura das árvores em //m//. | ||
- | |||
- | Para uma árvore com DAP de 15//cm// e altura de 12//m//, os | ||
- | modelos resultarão em estimativas muito distintas? | ||
- | |||
- | </box> | ||
- | |||
- | |||
- | |||
- | ==== Mantendo a Coerência Lógica-Matemática ==== | ||
- | |||
- | |||
- | O R também lida com operações matemáticas que envolvem **elementos infinitos** e **elementos indeterminados**: | ||
- | |||
- | > 1/0 | ||
- | [1] Inf | ||
- | > -5/0 | ||
- | [1] -Inf | ||
- | > 500000000000000000/Inf | ||
- | [1] 0 | ||
- | > 0/0 | ||
- | [1] NaN | ||
- | > Inf/Inf | ||
- | [1] NaN | ||
- | > log(0) | ||
- | [1] -Inf | ||
- | > exp(-Inf) | ||
- | [1] 0 | ||
- | > sqrt(Inf) | ||
- | [1] Inf | ||
- | > sqrt(-1) | ||
- | [1] NaN | ||
- | Warning message: | ||
- | NaNs produced in: sqrt(-1) | ||
- | > 2 * NA | ||
- | [1] NA | ||
- | > 2 * NaN | ||
- | [1] NaN | ||
- | > NA / 10 | ||
- | [1] NA | ||
- | > NaN / -1 | ||
- | [1] NaN | ||
- | |||
- | |||
- | Note que determinadas **palavras** (além do nome das funções) estão reservadas no R, pois são utilizadas com significado especial: | ||
- | * ''pi'' - constante pi = 3.141593 ; | ||
- | * ''Inf'' - infinito; | ||
- | * ''NaN'' - indeterminado (Not a Number), normalmente resultado de uma operação matemática indeterminada; | ||
- | * ''NA'' - indeterminado (Not Available), normalmente caracterizando uma observação perdida (//missing value//). | ||
- | |||
- | |||
- | Na operações matemáticas, ''NaN'' e ''NA'' atuam sempre como **indeterminado**. | ||
- | |||
- | |||
- | |||
- | <box left red 80% | //**2.5. Exercício Conceitual:** Criando Variáveis com Nomes Reservados// > | ||
- | |||
- | O que acontece se você criar uma variável com o nome ''pi''? Por exemplo, | ||
- | <code> | ||
- | > pi = 10 | ||
- | </code> | ||
- | O que acontece com a constante //pi//? | ||
- | |||
- | E se for criada uma constante de nome ''sqrt''? O que acontece com a função raíz quadrada (''sqrt()'')? | ||
- | |||
- | **DICA:** O que faz a função ''search'', no comando: | ||
- | <code> | ||
- | > search() | ||
- | </code> | ||
- | </box> | ||
- | |||
- | |||
- | |||
- | === Exercícios === | ||
- | |||
- | <box left red 80%| //**2.6. Exercício Conceitual:** O que é uma Observação Perdida//> | ||
- | |||
- | Como se caracteriza uma **observação perdida**? | ||
- | |||
- | Quando o diâmetro de uma árvore deve ter o valor **zero** ou o valor **NA**? | ||
- | |||
- | E o peso de um animal? E a biomassa de uma floresta? E a espécie de uma ave? | ||
- | |||
- | </box> | ||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | ===== O R como uma Calculadora Vetorial ===== | ||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | ==== Criação de Vetores ==== | ||
- | |||
- | |||
- | O R, e a linguagem S, foram criados para operar não apenas //número-a-número// como uma calculadora convencional. | ||
- | |||
- | O R é um ambiente **vetorial**, isto é, quase todas suas operações atuam sobre um //conjunto de valores//, | ||
- | que genericamente chamaremos de vetores((No R, "vetores" são uma classe de objetos definida simplesmente como conjuntos de elementos de um mesmo tipo. Os vetores do R não correspondem a vetores de valores da álgebra matricial, para os quais há outra classe de objetos, que é "matrix")). | ||
- | |||
- | Uma definição mais detalhada dos vetores está [[04-dados#Vetores|na seção sobre manipulação de dados]]. Aqui fornecemos apenas algumas definições e funções importantes para compreender as operações numéricas com vetores. | ||
- | |||
- | |||
- | === Concatenação de Elementos em um Vetor: a Função "c" === | ||
- | |||
- | Para criar um vetor, podemos usar a função ''c'' (c = colar, concatenar). Essa função simplesmente junta todos | ||
- | os argumentos dados a ela, formando um vetor: | ||
- | <code> | ||
- | > a = c(1, 10, 3.4, pi, pi/4, exp(-1), log( 2.23 ), sin(pi/7) ) | ||
- | > a | ||
- | [1] 1.0000000 10.0000000 3.4000000 3.1415927 0.7853982 0.3678794 0.8020016 0.4338837 | ||
- | > | ||
- | </code> | ||
- | |||
- | === Criação de Sequências: Operador ":" e Função "seq" === | ||
- | |||
- | Para criar vetores de números com intervalo fixo unitário (intervalo de 1) se utiliza o //operador seqüencial// ('':''): | ||
- | <code> | ||
- | > b = 1:8 | ||
- | > b | ||
- | [1] 1 2 3 4 5 6 7 8 | ||
- | > c = 20:32 | ||
- | > c | ||
- | [1] 20 21 22 23 24 25 26 27 28 29 30 31 32 | ||
- | > d = 2.5:10 | ||
- | > d | ||
- | [1] 2.5 3.5 4.5 5.5 6.5 7.5 8.5 9.5 | ||
- | </code> | ||
- | |||
- | Uma forma mais flexível de criar seqüências de números (inteiros ou reais) é usando a função '''seq''': | ||
- | <code> | ||
- | > seq(10, 30) | ||
- | [1] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | ||
- | > seq(10, 30, by=2) | ||
- | [1] 10 12 14 16 18 20 22 24 26 28 30 | ||
- | > seq(1.5, 7.9, length=20) | ||
- | [1] 1.500000 1.836842 2.173684 2.510526 2.847368 3.184211 3.521053 3.857895 | ||
- | [9] 4.194737 4.531579 4.868421 5.205263 5.542105 5.878947 6.215789 6.552632 | ||
- | [17] 6.889474 7.226316 7.563158 7.900000 | ||
- | </code> | ||
- | |||
- | === Vetores de Valores Repetidos: Função "rep" === | ||
- | |||
- | Também é fácil criar uma seqüência de números repetidos utilizando a função '''rep''': | ||
- | <code> | ||
- | > rep(5, 3) | ||
- | [1] 5 5 5 | ||
- | > rep(1:5, 3) | ||
- | [1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 | ||
- | > rep(1:5,each=3) | ||
- | [1] 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 | ||
- | > | ||
- | </code> | ||
- | |||
- | |||
- | === Exercícios === | ||
- | |||
- | <box left red | //**Exercício 2.7.** Palmeira com Muitos Fustes I//> | ||
- | |||
- | Uma palmeira perfilhada possui 10 fustes com os seguintes diâmetros: 5, 6, 7, 5, 10, 11, 6, 8, 9 e 7. | ||
- | |||
- | Crie um vetor '''dap''' com os diâmetros acimas e uma seqüência que enumera os fustes. | ||
- | |||
- | </box> | ||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | ==== Vetores: Operações Matemáticas ==== | ||
- | |||
- | Todas operações matemáticas aplicadas sobre um vetor, serão aplicadas sobre cada elemento desse vetor: | ||
- | <code> | ||
- | > 2 * a | ||
- | [1] 2.0000000 20.0000000 6.8000000 6.2831853 1.5707963 0.7357589 1.6040032 | ||
- | [8] 0.8677675 | ||
- | > sqrt( a ) | ||
- | [1] 1.0000000 3.1622777 1.8439089 1.7724539 0.8862269 0.6065307 0.8955454 | ||
- | [8] 0.6586985 | ||
- | > | ||
- | > log( a ) | ||
- | [1] 0.0000000 2.3025851 1.2237754 1.1447299 -0.2415645 -1.0000000 -0.2206447 | ||
- | [8] -0.8349787 | ||
- | > | ||
- | </code> | ||
- | |||
- | Se as variáveis que trabalhamos são vetores, operações matemáticas entre variáveis serão realizadas | ||
- | pareando os elementos dos vetores: | ||
- | <code> | ||
- | > a* b | ||
- | [1] 1.000000 20.000000 10.200000 12.566371 3.926991 2.207277 5.614011 | ||
- | [8] 3.471070 | ||
- | > a - b | ||
- | [1] 0.0000000 8.0000000 0.4000000 -0.8584073 -4.2146018 -5.6321206 -6.1979984 | ||
- | [8] -7.5661163 | ||
- | > a^(1/b) | ||
- | [1] 1.0000000 3.1622777 1.5036946 1.3313354 0.9528356 0.8464817 0.9689709 | ||
- | [8] 0.9008898 | ||
- | > | ||
- | > sqrt( a ) | ||
- | [1] 1.0000000 3.1622777 1.8439089 1.7724539 0.8862269 0.6065307 0.8955454 | ||
- | [8] 0.6586985 | ||
- | > log( b ) | ||
- | [1] 0.0000000 0.6931472 1.0986123 1.3862944 1.6094379 1.7917595 1.9459101 | ||
- | [8] 2.0794415 | ||
- | > | ||
- | </code> | ||
- | |||
- | === Comprimento de Vetores e a Função "length" === | ||
- | |||
- | A função ''length'' retorna o número de elementos de um objeto: | ||
- | <code> | ||
- | > a <- seq(from=0, to=10, by=2) | ||
- | > a | ||
- | [1] 0 2 4 6 8 10 | ||
- | > length(a) | ||
- | [1] 6 | ||
- | > length(1:20) | ||
- | [1] 20 | ||
- | > length(rep(1:10,each=10)) | ||
- | [1] 100 | ||
- | > | ||
- | </code> | ||
- | |||
- | === A Regra da Ciclagem === | ||
- | |||
- | O comprimento é muito importante para as operações vetoriais, pois o R permite operações entre dois vetores de comprimentos diferentes, com a seguinte regra: | ||
- | |||
- | <box red |**Ciclagem de Valores**> Operações entre vetores de comprimentos diferentes são realizadas pareando-se seus elementos. Os elementos do vetor mais curto são repetidos sequencialmente até que a operação seja aplicada a todos os elementos do vetor mais longo</box> | ||
- | |||
- | Quando o comprimento do vetor maior não é múltiplo do comprimento do maior, o R retorna o resultado e um aviso: | ||
- | |||
- | <code> | ||
- | > b | ||
- | [1] 0 0 0 0 0 1 1 1 1 1 | ||
- | > c | ||
- | [1] 1 2 3 | ||
- | > c*b | ||
- | [1] 0 0 0 0 0 3 1 2 3 1 | ||
- | Warning message: | ||
- | In c * b : longer object length is not a multiple of shorter object length | ||
- | > length(b) | ||
- | [1] 10 | ||
- | > length(c) | ||
- | [1] 3 | ||
- | > | ||
- | </code> | ||
- | |||
- | Mas se o comprimento do vetor maior é um múltiplo do maior, o R retorna apenas o resultado, sem nenhum alerta: | ||
- | |||
- | <code> | ||
- | > a | ||
- | [1] 1 2 | ||
- | > b | ||
- | [1] 0 0 0 0 0 1 1 1 1 1 | ||
- | > a*b | ||
- | [1] 0 0 0 0 0 2 1 2 1 2 | ||
- | > length(b)/length(a) | ||
- | [1] 5 | ||
- | > | ||
- | </code> | ||
- | |||
- | Portanto **muito cuidado com as operações entre vetores de diferentes comprimentos**. A regra da ciclagem é um recurso poderoso da linguagem R ((A vantagem mais óbvia da regra da ciclagem é a possibilidade de multiplicação de um vetor por um valor único. Você compreende por que?)), mas se você não tiver clareza do que deseja fazer, pode obter resultados indesejados. | ||
- | |||
- | === Exercícios === | ||
- | |||
- | <box left red | //**Exercício 2.8. ** Palmeira com Muitos Fustes II//> | ||
- | |||
- | Uma palmeira perfilhada possui 10 fustes com os seguintes diâmetros: 5, 6, 7, 5, 10, 11, 6, 8, 9 e 7. | ||
- | |||
- | - Calcule a área transversal de cada fuste dessa palmeira. Guarde este resultado em novo objeto. | ||
- | - Calcule a média das áreas transversais, sem usar a função ''mean''. | ||
- | - Calcule a variância das áreas transversais, sem usar a função ''var'' | ||
- | |||
- | </box> | ||
- | |||
- | |||
- | |||
- | <box left red | //**Exercício 2.9.** Bits e Bytes//> | ||
- | |||
- | Como construir uma seqüência que representa o aumento do número | ||
- | de bits por byte de computador, quando se dobra o tamanho dos bytes? | ||
- | |||
- | Essa seqüência numérica parte do 2 e dobra os valores a cada passo. | ||
- | |||
- | </box> | ||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | ==== Vetores: Operações Estatísticas ==== | ||
- | |||
- | As funções matemáticas sobre vetores operam //elemento-a-elemento//. Já as funções estatísticas operam no vetor **como um todo**: | ||
- | <code> | ||
- | > mean( a ) | ||
- | [1] 2.491344 | ||
- | > var( b ) | ||
- | [1] 6 | ||
- | > max( c ) | ||
- | [1] 32 | ||
- | > sd( a ) | ||
- | [1] 3.259248 | ||
- | > sum( c ) | ||
- | [1] 338 | ||
- | > min( b ) | ||
- | [1] 1 | ||
- | > range( c ) | ||
- | [1] 20 32 | ||
- | > | ||
- | </code> | ||
- | |||
- | Algumas funções úteis que não são estatísticas, mas operam no vetor são: | ||
- | <code> | ||
- | > a | ||
- | [1] 1.0000000 10.0000000 3.4000000 3.1415927 0.7853982 0.3678794 0.8020016 | ||
- | [8] 0.4338837 | ||
- | > sort(a) | ||
- | [1] 0.3678794 0.4338837 0.7853982 0.8020016 1.0000000 3.1415927 3.4000000 | ||
- | [8] 10.0000000 | ||
- | > rev(sort(a)) | ||
- | [1] 10.0000000 3.4000000 3.1415927 1.0000000 0.8020016 0.7853982 0.4338837 | ||
- | [8] 0.3678794 | ||
- | > cumsum(sort(a)) | ||
- | [1] 0.3678794 0.8017632 1.5871613 2.3891629 3.3891629 6.5307556 9.9307556 | ||
- | [8] 19.9307556 | ||
- | > cumsum(a) | ||
- | [1] 1.00000 11.00000 14.40000 17.54159 18.32699 18.69487 19.49687 19.93076 | ||
- | > diff(a) | ||
- | [1] 9.0000000 -6.6000000 -0.2584073 -2.3561945 -0.4175187 0.4341221 -0.3681178 | ||
- | > diff( seq(10, 34, length=15) ) | ||
- | [1] 1.714286 1.714286 1.714286 1.714286 1.714286 1.714286 1.714286 1.714286 | ||
- | [9] 1.714286 1.714286 1.714286 1.714286 1.714286 1.714286 | ||
- | > | ||
- | </code> | ||
- | |||
- | |||
- | === Exercícios === | ||
- | |||
- | <box left red 100% | //**Exercício 2.10.** Conta de Luz//> | ||
- | |||
- | As leituras mensais do medidor de consumo de eletricidade de uma casa foram: | ||
- | ^Jan^Fev^Mar^Abr^Mai^Jun^Jul^Ago^Set^Out^Nov^Dez^ | ||
- | |9839|10149|10486|10746|11264|11684|12082|12599|13004|13350|13717|14052| | ||
- | |||
- | - Calcule o consumo de cada mês neste período. | ||
- | - Qual foi o máximo e mínimo de consumo mensal? | ||
- | - Qual a média, mediana e variância dos consumos mensais? | ||
- | |||
- | |||
- | </box> | ||
- | |||
- | ===== As Funções no R ===== | ||
- | |||
- | Já foi visto que ao se digitar o nome de uma função na linha de comando, o R retorna o **código** da função. Veja a diferença de: | ||
- | <code> | ||
- | > ls() | ||
- | </code> | ||
- | para: | ||
- | <code> | ||
- | > ls | ||
- | </code> | ||
- | |||
- | |||
- | A maioria das funções precisa de certas **informações** para orientar o seu procedimento, tais informações são chamados de **argumentos**. | ||
- | |||
- | Os argumentos de qualquer função são detalhadamente explicados nas páginas de ajuda sobre a função. Mas para uma rápida consulta dos argumentos de uma função podemos usar a função '''args''': | ||
- | <code> | ||
- | > args(ls) | ||
- | function (name, pos = -1, envir = as.environment(pos), all.names = FALSE, | ||
- | pattern) | ||
- | NULL | ||
- | > args(q) | ||
- | function (save = "default", status = 0, runLast = TRUE) | ||
- | NULL | ||
- | > args(save.image) | ||
- | function (file = ".RData", version = NULL, ascii = FALSE, compress = !ascii, | ||
- | safe = TRUE) | ||
- | NULL | ||
- | > | ||
- | </code> | ||
- | |||
- | Algumas funções, entretanto, são primitivas ou internas e seus argumentos não são apresentados. Geralmente, nesses casos os argumentos são bastante óbvios: | ||
- | <code> | ||
- | > args(sin) | ||
- | NULL | ||
- | > sin | ||
- | .Primitive("sin") | ||
- | > | ||
- | </code> | ||
- | |||
- | Outras funções simplesmente não possuem argumentos: | ||
- | <code> | ||
- | > args(getwd) | ||
- | function () | ||
- | NULL | ||
- | > getwd | ||
- | function () | ||
- | .Internal(getwd()) | ||
- | <environment: namespace:base> | ||
- | > | ||
- | </code> | ||
- | |||
- | |||
- | Ao observar o resultado da função '''args''', você notará que alguns argumentos são seguidos de uma expressão que se inicia com o sinal de igualdade ('''='''). A expressão após o sinal de igualdade é chamada de **valor default** do argumento. Se o usuário não informar o valor para um dado argumento, a função usa o valor default. Como exemplo veja a função '''save.image''': | ||
- | <code> | ||
- | > args(save.image) | ||
- | function (file = ".RData", version = NULL, ascii = FALSE, compress = !ascii, | ||
- | safe = TRUE) | ||
- | NULL | ||
- | > | ||
- | </code> | ||
- | |||
- | Se o usuário simplesmente evocar a função '''save.image()''', sem informar o nome do arquivo onde a área de trabalho deve ser gravada, o R gravará as informações num arquivo com nome '''.RData'''. | ||
- | |||
- | |||
- | |||
- | === Exercícios === | ||
- | |||
- | <box left red 100% | //**Exercício 2.11.** Argumentos de Funções Estatísticas //> | ||
- | Quais são os argumentos (e seus valores default) das seguintes funções: | ||
- | * **mean** | ||
- | * **sd** | ||
- | * **range** | ||
- | * **cumsum** | ||
- | </box> | ||
- | |||
- | |||
- | <box left red 100% | //**Exercício 2.12.** Argumentos de Funções de Uso Comum //> | ||
- | Quais são os argumentos (e seus valores default) das funções: | ||
- | * **sort** | ||
- | * **log** | ||
- | * **seq** | ||
- | |||
- | O que é o argumento **". . ."**? | ||
- | </box> | ||
- | |||
- | |||
- | ===== Distribuições Estatísticas: Funções no R ===== | ||
- | |||
- | |||
- | Sendo um ambiente para análise de dados, o R dispõe de um grande conjunto de funções para trabalhar com //Distribuições Estatísticas//. Essas funções ajudam não só na análise de dados, como também permitem a //simulação// de dados. | ||
- | |||
- | |||
- | |||
- | |||
- | ==== Distribuição Normal ==== | ||
- | |||
- | A distribuição Normal é a distribuição central da teoria estatística. Para gerar uma amostra de observações de uma distribuição normal utilizamos a função '''rnorm''': | ||
- | <code> | ||
- | > args( rnorm ) | ||
- | function (n, mean = 0, sd = 1) | ||
- | NULL | ||
- | > vn1 = rnorm( 1000, mean = 40, sd = 9 ) | ||
- | > mean( vn1 ) | ||
- | [1] 39.47248 | ||
- | > sd( vn1 ) | ||
- | [1] 8.523735 | ||
- | > range( vn1 ) | ||
- | [1] 14.93126 62.11959 | ||
- | > | ||
- | > vn2 = rnorm( 100000, mean = 40, sd = 9 ) | ||
- | > mean( vn2 ) | ||
- | [1] 40.02547 | ||
- | > sd( vn2 ) | ||
- | [1] 9.025218 | ||
- | > range( vn2 ) | ||
- | [1] 3.40680 78.25496 | ||
- | > | ||
- | </code> | ||
- | |||
- | Se quisermos saber a //probabilidade acumulada// até um certo valor de uma variável com distribuição normal utilizamos a função '''pnorm''': | ||
- | <code> | ||
- | > args(pnorm ) | ||
- | function (q, mean = 0, sd = 1, lower.tail = TRUE, log.p = FALSE) | ||
- | NULL | ||
- | > | ||
- | > pnorm( 1.96, mean = 0 , sd = 1 ) | ||
- | [1] 0.9750021 | ||
- | > pnorm( 1.96 ) | ||
- | [1] 0.9750021 | ||
- | > | ||
- | > pnorm( 27, mean = 20, sd = 7 ) | ||
- | [1] 0.8413447 | ||
- | > pnorm( 13, mean = 20, sd = 7 ) | ||
- | [1] 0.1586553 | ||
- | > | ||
- | </code> | ||
- | |||
- | |||
- | Se quisermos obter o valor de um //quantil// da distribuição normal utilizamos a função '''qnorm''': | ||
- | <code> | ||
- | > args( qnorm ) | ||
- | function (p, mean = 0, sd = 1, lower.tail = TRUE, log.p = FALSE) | ||
- | NULL | ||
- | > qnorm( 0.90 ) | ||
- | [1] 1.281552 | ||
- | > qnorm( 0.30 ) | ||
- | [1] -0.5244005 | ||
- | > | ||
- | > qnorm( 0.90, 20, 7) | ||
- | [1] 28.97086 | ||
- | > qnorm( 0.30, 20, 7) | ||
- | [1] 16.32920 | ||
- | > | ||
- | </code> | ||
- | |||
- | A função '''dnorm''' fornece a //densidade probabilística// para cada valor de uma variável Normal: | ||
- | <code> | ||
- | > args( dnorm ) | ||
- | function (x, mean = 0, sd = 1, log = FALSE) | ||
- | NULL | ||
- | > x = seq(-4, 4, length=10000) # Seqüência de -4 a 4 com 10.000 valores | ||
- | > | ||
- | > plot(x, dnorm(x)) # Curva da Dist. Normal com média 0 e desvio padrão 1 | ||
- | > points(x, dnorm(x, sd=2)) # Curva da Dist. Normal com média 0 e desvio padrão 2 (adicionada ao gráfico) | ||
- | > | ||
- | </code> | ||
- | |||
- | |||
- | |||
- | === Exercícios === | ||
- | |||
- | <box left red 100% | //**Exercício 2.13** Amplitude Normal//> | ||
- | |||
- | Tomando uma variável que segue a Distribuição Normal, o que acontence com a //amplitude de variação// dos dados à medida que o tamanho da amostra cresce (por exemplo n= 100, 1000, 10000)? | ||
- | |||
- | **Dica:** use as funções ''range'' e ''diff'' | ||
- | |||
- | </box> | ||
- | |||
- | |||
- | <box left red 100% | //**Exercício 2.14.** Intervalo Normal I //> | ||
- | Qual o intervalo da Distribuição Normal Padronizada que têm a média no centro e contem 50% das observações? | ||
- | |||
- | </box> | ||
- | |||
- | <box left red 100% | //**Exercício 2.15.** Intervalo Normal II //> | ||
- | Qual a probabilidade de uma observação da variável Normal Padronizada estar no intervalo [-1.96 , 1.96]? | ||
- | |||
- | </box> | ||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | ==== As Funções que Operam em Distribuições Estatísticas ==== | ||
- | |||
- | O que foi apresentado para Distribuição Normal pode ser generalizado para todas as distribuições que o R trabalha. | ||
- | |||
- | Há quatro funções para se trabalhar com distribuições estatísticas: | ||
- | * **d**//distrib// - retorna a //densidade probabilística// para um dado valor da variável; | ||
- | * **p**//distrib// - retorna a //probabilidade acumulada// para um dado valor da variável; | ||
- | * **q**//distrib// - retorna o //quantil// para um dado valor de probabilidade acumulada; | ||
- | * **r**//distrib// - retorna //valores// (números aleatórios) gerados a partir da distribuição; | ||
- | |||
- | No caso da Distribuição Normal: //distrib// = ''norm''. Para outras distribuições temos: | ||
- | |||
- | <box 70% orange centered | **DISTRIBUIÇÕES ESTATÍSTICAS NO R**> | ||
- | ^ Distribuição ^ Nome no R ^ Parâmetros((os argumentos de cada função incluem estes parâmetros, entre outras coisas)) ^ | ||
- | | beta | beta | shape1, shape2, ncp | | ||
- | | binomial | binom | size, prob | | ||
- | | Cauchy | cauchy | location, scale | | ||
- | | qui-quadrado | chisq | df, ncp | | ||
- | | exponential | exp | rate | | ||
- | | F | f | df1, df2, ncp | | ||
- | | gamma | gamma | shape, scale | | ||
- | | geométrica | geom | prob | | ||
- | | hypergeométrica | hyper | m, n, k | | ||
- | | log-normal | lnorm | meanlog, sdlog | | ||
- | | logística | logis | location, scale | | ||
- | | binomial negativa | nbinom | size, prob | | ||
- | | normal | norm | mean, sd | | ||
- | | Poisson | pois | lambda | | ||
- | | t de Student | t | df, ncp | | ||
- | | uniforme | unif | min, max | | ||
- | | Weibull | weibull | shape, scale | | ||
- | | Wilcoxon | wilcox | m, n | | ||
- | </box> | ||
- | |||
- | |||
- | === Exercícios === | ||
- | |||
- | <box left red 100% | //**Exercício 2.16.** Teste t //> | ||
- | Você realizou um teste //t// de Student bilateral e obteve o valor //t = 2.2// com 19 graus de liberdade. | ||
- | |||
- | O teste é significativo ao nível de probabilidade de 5%? E se o valor observado fosse //t = 1.9//? | ||
- | |||
- | </box> | ||
- | |||
- | |||
- | <box left red 100% | //**Exercício 2.17.** Teste F //> | ||
- | Você realizou um teste //F// e obteve o valor //F = 2.2// com 19 graus de liberdade no numerador e 24 graus de liberdade no denominador. | ||
- | |||
- | O teste é significativo ao nível de probabilidade de 5%? E se o valor observado fosse //F = 2.5//? | ||
- | |||
- | </box> | ||
- | |||
- | |||
- | <box left red 100% | //**Exercício 2.18.** Padrão Espacial I //> | ||
- | Gere duas amostras (p.ex.: //x// e //y//) de tamanho 1000 (n=1000) de números da distribuição Uniforme. | ||
- | |||
- | Faça um gráfico plotando uma amostra contra a outra (''plot(x,y)''). Qual o padrão espacial observado? | ||
- | |||
- | Você consegue explicá-lo? | ||
- | |||
- | </box> | ||
- | |||
- | |||
- | <box left red 100% | //**Exercício 2.19.** Padrão Espacial II //> | ||
- | Gere duas amostras (p.ex.: //xp// e //yp//) de tamanho 10 (n=10) de números da distribuição Uniforme, com valor mínimo de zero e máximo de 100. | ||
- | |||
- | Gere duas amostras (p.ex.: //xf// e //yf//) de tamanho 1000 (n=1000) de números da distribuição Normal com média zero e desvio padrão 2) | ||
- | |||
- | Faça um gráfico plotando a soma das amostras X (//xp+xf//) contra a soma das amostras Y (//yp+yf//) (''plot(xp+xf,yp+yf)''). | ||
- | |||
- | Qual o padrão espacial observado? Você consegue explicá-lo? | ||
- | |||
- | </box> | ||
- | |||
- | <box left red red 100% | //**Exercício 2.20.** Gráfico Quantil-Quantil //> | ||
- | Construa uma seqüência **ordenada** de 1000 números entre 0 e 1: | ||
- | <code> | ||
- | > p = seq(0, 1, length=1000) | ||
- | </code> | ||
- | O vetor '''p''' representa um vetor de probabilidades acumuladas. | ||
- | |||
- | Gere 1000 números aleatórios da distribuição Normal com média e desvio-padrão 1 (um) e coloque os números em ordem: | ||
- | <code> | ||
- | > x = sort( rnorm(1000, mean=1) ) | ||
- | </code> | ||
- | |||
- | Faça um gráfico dos quantis da distribuição Normal, tomando o vetor '''p''' de probabilidades, contra os valores de '''x''': | ||
- | <code> | ||
- | > plot( qnorm(p, mean=1), x ) | ||
- | </code> | ||
- | |||
- | Como é o gráfico resultante? | ||
- | |||
- | Repita o mesmo processo para a distribuição Exponencial ( '''rexp''' ), cujo valor //default// resulta em média = 1 . Como é o gráfico resultante? Por que? | ||
- | |||
- | </box> | ||
- | |||
- | |||
- | |||
- | /* | ||
- | ===== Soluções dos Exercícios ===== | ||
- | |||
- | {{:03_apostila:exerc3apostila.r|Aqui}} você encontra os códigos que solucionam alguns dos exercícios propostos. | ||
- | |||
- | |||
- | Se o seu código for diferente, não quer dizer necessariamente que errou. Compare os dois resultados! Como qualquer linguagem, o R é criativo: em muitos casos há mais de uma maneira de solucionar um problema. | ||
- | */ | ||