Diferenças
Aqui você vê as diferenças entre duas revisões dessa página.
| Ambos lados da revisão anterior Revisão anterior Próxima revisão | Revisão anterior | ||
| 02_tutoriais:tutorial2:start [2023/08/14 16:04] – edição externa 127.0.0.1 | 02_tutoriais:tutorial2:start [2025/10/24 18:01] (atual) – adalardo | ||
|---|---|---|---|
| Linha 1: | Linha 1: | ||
| + | <WRAP tabs> | ||
| + | * [[02_tutoriais: | ||
| + | * [[01_curso_atual: | ||
| + | * [[03_apostila: | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | ====== 2. Tutoriais de Funções Matemáticas no R ====== | ||
| + | |||
| + | {{: | ||
| + | |||
| + | |||
| + | |||
| + | No nosso [[02_tutoriais: | ||
| + | |||
| + | <WRAP center round box 60%> | ||
| + | |||
| + | {{youtube> | ||
| + | |||
| + | </ | ||
| + | |||
| + | ===== Criando Vetores ===== | ||
| + | |||
| + | As características básica do vetor no R são: | ||
| + | |||
| + | * uma dimensão de dados | ||
| + | * tamanho definido pelo número de elementos | ||
| + | * armazena dado de um só tipo | ||
| + | * classificado pelo tipo de dado armazenado | ||
| + | |||
| + | Os vetores podem ser construídos de várias formas no R, as principais são: | ||
| + | <WRAP center round box 70%> | ||
| + | |||
| + | ^função ^ nome ^descrição ^ | ||
| + | | <code rsplus> c() </ | ||
| + | | <code rsplus> seq() </ | ||
| + | | <code rsplus> : </ | ||
| + | | <code rsplus> rep() </ | ||
| + | |||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| + | Execute o código abaixo para entender como criar uma sequência de 1 a 10 em intervalos inteiros de diferentes maneiras: | ||
| + | |||
| + | <code rsplus> | ||
| + | a <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) | ||
| + | b <- seq(from = 1, to = 10, by = 1) | ||
| + | c <- 1:10 | ||
| + | length(a) | ||
| + | class(a) | ||
| + | length(c) | ||
| + | class(c) | ||
| + | a == b | ||
| + | a == c | ||
| + | identical(a, | ||
| + | identical(a, | ||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| + | Acima, apesar dos objetos conterem a mesma informação de dados, o objeto '' | ||
| + | '' | ||
| + | |||
| + | ===== Operações com Vetores ===== | ||
| + | |||
| + | As operações algébricas com vetores apresentam duas características importantes: | ||
| + | |||
| + | Estude os resultados dos comandos nos três exemplos abaixo para entender as operações com vetores. | ||
| + | |||
| + | <code rsplus> | ||
| + | a <- 1:10 | ||
| + | b <- -(1:10) | ||
| + | a+b | ||
| + | sum(a, b) | ||
| + | </ | ||
| + | |||
| + | |||
| + | Aqui temos a característica da **equivalência**. Os vetores de mesmos tamanhos, quando operados algebricamente, | ||
| + | |||
| + | |||
| + | <code rsplus> | ||
| + | a <- seq(from = 0, to = 1, length = 9) | ||
| + | b <- seq(from = 0, to = 0.5, length = 9) | ||
| + | a | ||
| + | b | ||
| + | a/b | ||
| + | b/a | ||
| + | 1+b/a | ||
| + | (1+b)/a | ||
| + | </ | ||
| + | |||
| + | Nesse último bloco de código temos, além da equivalência entre as posições de vetores de mesmo tamanho, algumas operações algébricas que retornam palavras reservadas no R: '' | ||
| + | O '' | ||
| + | |||
| + | |||
| + | <code rsplus> | ||
| + | a <- rep( c(1, 2), each = 3 ) | ||
| + | length(a) | ||
| + | b <- rep( c(3, 4), 6) | ||
| + | length(b) | ||
| + | a+b | ||
| + | </ | ||
| + | |||
| + | |||
| + | <code rsplus> | ||
| + | a <- rep( c(1, 2, 3), each = 3 ) | ||
| + | length(a) | ||
| + | b <- rep( c(3, 4), length = 7) | ||
| + | length(b) | ||
| + | a+b | ||
| + | </ | ||
| + | |||
| + | Nestes blocos temos o princípio da ciclagem. Ao realizar operações com vetores de tamanhos diferentes, o vetor menor é ciclado, ou seja, reutilizado para a operação. Note que se o tamanho dos vetores for múltiplo, todas as posições do vetor serão utilizadas um mesmo número de vezes e o R não retorna nenhuma mensagem de aviso((lembre-se de sempre inspecionar os objetos que você criar!)). Se os vetores não forem múltiplos a operação é realizada porém com uma mensagem de aviso. | ||
| + | |||
| + | |||
| + | ===== Operações sintéticas ===== | ||
| + | |||
| + | As operações de vetores acima retornam vetores do tamanho do vetor operado, ou do maior vetor. | ||
| + | <code rsplus> | ||
| + | pesos <- c(78.4, 79.8, 76.0, 75.3, 77.4, 78.6, 77.9, 78.8, 79.2, 75.2, 75.0, 79.4) | ||
| + | </ | ||
| + | |||
| + | A diferença de peso entre um mês e o consecutivo é obtida pela função '' | ||
| + | <code rsplus> | ||
| + | |||
| + | pesos.dif <- diff(pesos) | ||
| + | |||
| + | </ | ||
| + | |||
| + | Que tem a particularidade de retornar como resultado um vetor de tamanho uma posição menor do que o comprimento do vetor de entrada. | ||
| + | |||
| + | <code rsplus> | ||
| + | length(pesos) | ||
| + | length(pesos.dif) | ||
| + | </ | ||
| + | |||
| + | Vamos calcular o valor mínimo, máximo e médio do peso: | ||
| + | |||
| + | <code rsplus> | ||
| + | max(pesos) | ||
| + | min(pesos) | ||
| + | mean(pesos) | ||
| + | </ | ||
| + | |||
| + | O valor mínimo e máximo também é obtido com: | ||
| + | <code rsplus> | ||
| + | range(pesos) | ||
| + | </ | ||
| + | |||
| + | E mesmo que não tivéssemos a função '' | ||
| + | <code rsplus> | ||
| + | sum(pesos)/ | ||
| + | </ | ||
| + | |||
| + | |||
| + | <WRAP center round tip 90%> | ||
| + | |||
| + | ===== Vocabulário de Referência ===== | ||
| + | |||
| + | [[http:// | ||
| + | |||
| + | Um dos problemas que enfrentamos ao aprender uma linguagem é a falta de vocabulário que nos impede de fazer uma comunicação eficiente. Isso acontece no R também. Além disso, é mais fácil encontrar um documento que explica como fazer uma análise complexa do que encontrar o nome de uma função que faz uma tarefa simples! É muito bom poder contar com um dicionário da linguagem nessas horas. No caso do R, e outras linguagens computacionais, | ||
| + | **__É possível fazer quase tudo que precisamos no R com essas 4 páginas de vocabulário básico do card!!__** Imprima frente e verso e mantenha junto ao computador! | ||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | ===== Operando NaN ===== | ||
| + | |||
| + | Calcule a média do logaritmo na base 10 das diferenças de peso, obtidas no tópico anterior ([[02_tutoriais: | ||
| + | |||
| + | <code rsplus> | ||
| + | mean(log(pesos.dif, | ||
| + | </ | ||
| + | |||
| + | Este comando retorna um aviso e um resultado não numérico, '' | ||
| + | |||
| + | <code rsplus> | ||
| + | pesos.dif | ||
| + | log(pesos.dif, | ||
| + | </ | ||
| + | |||
| + | ===== Operando Valores Faltantes ===== | ||
| + | |||
| + | É muito comum termos posições em vetores que não tem informação disponível. Por exemplo, no caso acima a pessoa pode ter esquecido de anotar o peso em um dos meses. Nesses casos, para registrar que o valor não está disponível podemos usar a palavra reservada '' | ||
| + | Basta um valor faltante ('' | ||
| + | |||
| + | <code rsplus> | ||
| + | faltaUm <- pesos | ||
| + | faltaUm[5] <- NA | ||
| + | faltaUm | ||
| + | mean(faltaUm) | ||
| + | </ | ||
| + | |||
| + | <code rsplus> | ||
| + | sqrt(-1:9) | ||
| + | mean(sqrt(-1: | ||
| + | </ | ||
| + | |||
| + | Muitas funções têm um argumento lógico '' | ||
| + | |||
| + | <code rsplus> | ||
| + | mean(faltaUm, | ||
| + | var(sqrt(-1: | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | ===== Índice de Shannon ===== | ||
| + | |||
| + | O índice de diversidade de Shannon é dado pela fórmula: | ||
| + | |||
| + | $$H´=-\sum \ p_i \ ln p_i$$ | ||
| + | |||
| + | |||
| + | onde $p_i$ é a proporção de indivíduos da espécie $i$ em relação ao total de indivíduos. A seguir construímos um objeto chamado '' | ||
| + | |||
| + | <code rsplus> | ||
| + | abund <- c(13, 23, 29, 29, 30, 48, 72, 76, 83, 84, 86, 97, 102, 229, 343) | ||
| + | tot <- sum(abund) | ||
| + | tot | ||
| + | pi <- abund/tot | ||
| + | pi | ||
| + | log.pi <- log(pi) | ||
| + | log.pi | ||
| + | pi.log.pi <- pi*log.pi | ||
| + | pi.log.pi | ||
| + | H <- - sum(pi.log.pi) | ||
| + | H | ||
| + | </ | ||
| + | |||
| + | O mesmo cálculo pode ser feito em uma única linha com: | ||
| + | <code rsplus> | ||
| + | -sum(abund/ | ||
| + | </ | ||
| + | |||
| + | Compare os resultados. | ||
| + | |||
| + | |||
| + | <WRAP center round box 90%> | ||
| + | |||
| + | ===== Funções Aninhadas ===== | ||
| + | {{: | ||
| + | |||
| + | No código acima, | ||
| + | |||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | ===== Onde foi parar o pi? ===== | ||
| + | |||
| + | No [[: | ||
| + | |||
| + | Mas não se preocupe. O objeto '' | ||
| + | |||
| + | Como o R busca qualquer objeto chamado na ordem estabelecida no caminho de busca ('' | ||
| + | Verifique o caminho de busca ('' | ||
| + | <code rsplus> | ||
| + | search() | ||
| + | </ | ||
| + | |||
| + | Sua área de trabalho ('' | ||
| + | <code rsplus> | ||
| + | pi | ||
| + | </ | ||
| + | |||
| + | Podemos indicar para o R que queremos um objeto em um compartimento de memória específico e, nesse caso, ele irá buscar o objeto diretamente. Podemos então acessar o número π explicitando o ambiente (pacote) onde ele está da seguinte forma, '' | ||
| + | |||
| + | <code rsplus> | ||
| + | base::pi | ||
| + | </ | ||
| + | |||
| + | Nesse caso, se o objeto não existir nesse compartimento, | ||
| + | |||
| + | |||
| + | <code rsplus> | ||
| + | a <- 0 | ||
| + | base::a | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | ===== Distribuições Probabilísticas ===== | ||
| + | <WRAP center round box 60%> | ||
| + | |||
| + | {{youtube> | ||
| + | |||
| + | </ | ||
| + | |||
| + | O R contém muitas distribuições probabilísticas no pacote '' | ||
| + | |||
| + | Vamos entender como essas distribuições são utilizadas no R com um exemplo de dados. | ||
| + | |||
| + | ==== Eita avião apertado ==== | ||
| + | |||
| + | {{: | ||
| + | |||
| + | * a média e o desvio são uma boa estimativa dos parâmetros da distribuição da largura de quadril da população de mulheres de 20 e poucos anos; | ||
| + | * a distribuição de largura do quadril é bem representada por uma distribuição probabilística normal | ||
| + | |||
| + | A partir desses dois parâmetros (média e desvio) da distribuição normal podemos, por exemplo, simular os dados de uma amostra de 200 tamanhos de quadris no R. A função '' | ||
| + | |||
| + | <code rsplus> | ||
| + | |||
| + | amostra <- rnorm(n = 200, mean = 35, sd = 3.4) | ||
| + | hist(amostra) | ||
| + | |||
| + | |||
| + | </ | ||
| + | |||
| + | Quantas mulheres na nossa amostra não caberiam nas cadeiras do avião? | ||
| + | |||
| + | <code rsplus> | ||
| + | |||
| + | sum(amostra > 40.6) | ||
| + | |||
| + | </ | ||
| + | |||
| + | Conseguiu entender o que foi feito acima? Uma forma de compreender códigos mais complexos é dividir em partes e estudar cada elemento independentemente: | ||
| + | |||
| + | |||
| + | <code rsplus> | ||
| + | vf_41 <- amostra > 41 | ||
| + | vf_41 | ||
| + | sum(vf_41) # lembre-se que TRUE pode ser considerado como 1 e FALSE como 0. | ||
| + | </ | ||
| + | |||
| + | Como entendemos todos os comandos acima, podemos refazer a simulação de amostra e contar as mulheres que não caberiam nos assentos de avião em uma única linha. Agora vamos repetir a nossa amostra 10x: | ||
| + | |||
| + | |||
| + | <code rsplus> | ||
| + | |||
| + | sum(rnorm(n = 200, mean = 35, sd = 3.4) > 40.6) | ||
| + | sum(rnorm(n = 200, mean = 35, sd = 3.4) > 40.6) | ||
| + | sum(rnorm(n = 200, mean = 35, sd = 3.4) > 40.6) | ||
| + | sum(rnorm(n = 200, mean = 35, sd = 3.4) > 40.6) | ||
| + | sum(rnorm(n = 200, mean = 35, sd = 3.4) > 40.6) | ||
| + | sum(rnorm(n = 200, mean = 35, sd = 3.4) > 40.6) | ||
| + | sum(rnorm(n = 200, mean = 35, sd = 3.4) > 40.6) | ||
| + | sum(rnorm(n = 200, mean = 35, sd = 3.4) > 40.6) | ||
| + | sum(rnorm(n = 200, mean = 35, sd = 3.4) > 40.6) | ||
| + | sum(rnorm(n = 200, mean = 35, sd = 3.4) > 40.6) | ||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| + | A cada amostra nosso valor varia um pouco. Isso ocorre porque a simulação de amostra é uma realização aleatória de 200 valores da distribuição normal teórica. Podemos obter o valor teórico dessa proporção de mulheres em nossa população estatística teórica. Para isso usamos a função '' | ||
| + | |||
| + | <code rsplus> | ||
| + | |||
| + | pnorm(q = 40.6, mean = 35, sd = 3.4) | ||
| + | |||
| + | </ | ||
| + | |||
| + | Esse valor é a proporção de mulheres que caberiam nos assentos com 40.6cm de largura. Para o cálculo das que não caberiam podemos fazer de duas formas: | ||
| + | |||
| + | <code rsplus> | ||
| + | |||
| + | 1 - pnorm(q = 40.6, mean = 35, sd = 3.4) | ||
| + | pnorm(q = 40.6, mean = 35, sd = 3.4, lower.tail = FALSE) | ||
| + | |||
| + | </ | ||
| + | |||
| + | Por volta de 5% das mulheres não caberiam nessas poltronas, o que não parece lá muito simpático por parte das companhias aéreas! | ||
| + | Vamos nos perguntar outra coisa, por exemplo, qual o tamanho de assento no qual caberiam 99% das mulheres de cerca de vinte anos? Para extrair esse valor diretamente da distribuição normal teórica, usamos a função '' | ||
| + | |||
| + | <code rsplus> | ||
| + | |||
| + | qnorm(p = 0.99, mean = 35, sd = 3.4) | ||
| + | |||
| + | </ | ||
| + | |||
| + | Isso significa que apenas 2.3 cm de aumento na largura das poltronas das aeronaves é capaz de reduzir em 5x a proporção de mulheres que não caberiam. Parece uma boa política para a companhia aérea... | ||
| + | |||
| + | ==== Amplitude de uma Amostra Normal ==== | ||
| + | |||
| + | Vamos simular uma amostra de 10 valores, tomados de uma distribuição normal com média 10 e desvio padrão 2.5: | ||
| + | |||
| + | <code rsplus> | ||
| + | normal.1 <- rnorm(10, mean = 10, sd = 2.5) | ||
| + | </ | ||
| + | |||
| + | Calcule mínimo e máximo e a amplitude destes valores: | ||
| + | <code rsplus> | ||
| + | range(normal.1) | ||
| + | diff(range(normal.1)) | ||
| + | </ | ||
| + | |||
| + | O que acontece à medida que aumentamos o tamanho da amostra? Verifique para simulações de 100, 1000 e 10000 valores: | ||
| + | <code rsplus> | ||
| + | diff(range(rnorm(100, | ||
| + | diff(range(rnorm(1000, | ||
| + | diff(range( rnorm(10000, | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | ==== As Funções que operam distribuições de probabilidades ==== | ||
| + | |||
| + | |||
| + | <WRAP center round box 80%> | ||
| + | **If data fails the Teacher' | ||
| + | |||
| + | [[https:// | ||
| + | </ | ||
| + | |||
| + | |||
| + | O que foi apresentado para **Distribuição Normal** | ||
| + | |||
| + | Há quatro principais funções para se extrair informações básicas de distribuições probabilísticas: | ||
| + | |||
| + | * **d**// | ||
| + | * **p**// | ||
| + | * **q**// | ||
| + | * **r**// | ||
| + | |||
| + | No caso da Distribuição Normal: //distrib// = '' | ||
| + | |||
| + | <WRAP center round box 95%> | ||
| + | |||
| + | /* | ||
| + | |||
| + | <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, | ||
| + | | beta | beta | shape1, shape2, ncp | | ||
| + | | binomial | ||
| + | | Cauchy | ||
| + | | qui-quadrado | chisq | df, ncp | | ||
| + | | exponential | ||
| + | | F | f | df1, df2, ncp | | ||
| + | | gamma | gamma | shape, scale | | ||
| + | | geométrica | ||
| + | | hypergeométrica | hyper | m, n, k | | ||
| + | | log-normal | ||
| + | | logística | ||
| + | | binomial negativa | nbinom | ||
| + | | normal | ||
| + | | Poisson | ||
| + | | t de Student | t | df, ncp | | ||
| + | | uniforme | ||
| + | | Weibull | ||
| + | | Wilcoxon | ||
| + | |||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | ===== Qui-quadrado na unha ===== | ||
| + | Vamos fechar com um exemplo hipotético de um estudo de preferência alimentar. | ||
| + | Nosso ecólogo virtual estimou a proporção de cinco tipos de itens alimentares para uma espécie de ave em uma área. Esses itens estavam disponíveis na proporção de 60%, 28%, 9%, 2,5% e 0,5%. No mesmo local, amostrou-se ao acaso eventos de alimentação desta ave, contando quantos eventos foram de consumo de cada um dos itens. Os resultados das contagens dos eventos de alimentação foram 544, 285, 117, 54, 12, para cada um dos itens respectivamente. | ||
| + | |||
| + | Vamos criar os objetos com estes valores: | ||
| + | |||
| + | <code rsplus> | ||
| + | disp <- c(60, 28, 9, 2.5, 0.5) | ||
| + | cons <- c(544, 285, 117, 54, 12) | ||
| + | </ | ||
| + | |||
| + | A pergunta que esses trabalhos de dieta se fazem é: "a espécie tem preferência por algum item?" | ||
| + | <code rsplus> | ||
| + | totItens <- sum(cons) | ||
| + | </ | ||
| + | E os valores esperados pela hipótese de falta de preferência serão: | ||
| + | <code rsplus> | ||
| + | espe <- totItens*disp/ | ||
| + | </ | ||
| + | O que resulta em uma série de desvios entre os valores esperados e os observados: | ||
| + | <code rsplus> | ||
| + | desv <- cons - espe | ||
| + | desv | ||
| + | </ | ||
| + | Para testar esta diferença, calculamos o valor do Qui-quadrado, | ||
| + | <code rsplus> | ||
| + | dQuad <- desv^2/espe | ||
| + | dQuad | ||
| + | qui2 <- sum(dQuad) | ||
| + | qui2 | ||
| + | </ | ||
| + | Qual a chance de um valor de Qui-quadrado maior ou igual a este ocorrer por acaso (ou seja, mesmo que não haja preferência)? | ||
| + | <code rsplus> | ||
| + | pchisq(q = qui2, df = 4, lower.tail = FALSE) | ||
| + | </ | ||
| + | |||
| + | A probabilidade é baixíssima, | ||
| + | |||
| + | |||
| + | {{: | ||
| + | |||
| + | |||
| + | == Extra == | ||
| + | Para reproduzir a figura acima digite os comandos abaixo. Para entender, veja a ajuda da função '' | ||
| + | |||
| + | <code rsplus> | ||
| + | ## Faz o grafico da funcao Qui-quadrado com 4 graus de liberdade, | ||
| + | ## veja a ajuda da funcao curve | ||
| + | curve(dchisq(x, | ||
| + | ## Sobrepoe uma linha vermelha a partir | ||
| + | ##do valor calculado do Qui-quadrado | ||
| + | curve(dchisq(x, | ||
| + | </ | ||
| + | |||
| + | <WRAP center round warning 100%> | ||
| + | |||
| + | <WRAP center round box 90%> | ||
| + | |||
| + | |||
| + | ==== Código Canalizado ==== | ||
| + | |||
| + | [[https:// | ||
| + | |||
| + | As linguagens de programação, | ||
| + | |||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | |||
| + | |||
| + | </ | ||
| + | |||
| + | </ | ||