O RStudio é um ambiente de desenvolvimento integrado (IDE) para R. Ele inclui um console(onde as saídas dos comandos são apresentadas), editor de sintaxe que suporta execução direta de código, bem como ferramentas para plotagem, histórico, depuração e gerenciamento de espaço de trabalho.
Se sua necessidade de usar o R requer um pacote específico você pode seguir as instruções abaixo para instalar o pacote.
É uma das áreas mais importantes da estatística. Ela deve ser considera como ferramenta inicial para análise de qualquer conjunto de dados. Tem como objetivo sumarizar e descrever os dados.
Vamos utilizar o software R para iniciarmos o nosso estudo em estatística descritiva básica.
Uma medida de tendência central (também conhecida como medidas de centro ou localização central) é uma medida resumo que tenta descrever um conjunto inteiro de dados com um único valor que representa o centro de sua distribuição.
Existem três principais medidas de tendência central: a moda, a mediana e a média. Cada uma dessas medidas descreve uma indicação diferente do valor típico ou central na distribuição dos dados.
Essas medidas são simples de serem calculadas dentro do R. Vamos utilizar o conjunto de dados abaixo para aplicar as funções presentes no R para calcular estas medidas.
| conc | rate | state |
|---|---|---|
| 0.02 | 76 | treated |
| 0.02 | 47 | treated |
| 0.06 | 97 | treated |
| 0.06 | 107 | treated |
| 0.11 | 123 | treated |
| 0.11 | 139 | treated |
| 0.22 | 159 | treated |
| 0.22 | 152 | treated |
| 0.56 | 191 | treated |
| 0.56 | 201 | treated |
| 1.10 | 207 | treated |
| 1.10 | 200 | treated |
| 0.02 | 67 | untreated |
| 0.02 | 51 | untreated |
| 0.06 | 84 | untreated |
| 0.06 | 86 | untreated |
| 0.11 | 98 | untreated |
| 0.11 | 115 | untreated |
| 0.22 | 131 | untreated |
| 0.22 | 124 | untreated |
| 0.56 | 144 | untreated |
| 0.56 | 158 | untreated |
| 1.10 | 160 | untreated |
Os dados tratam de um experimento para investigar a velocidade de uma determinada reação e a concentração do substrato em uma reação enzimática envolvendo células tratadas e não tratadas com puromicina.
O conjunto de dados apresenta 3 variáveis:
conc e rate são variáveis quantitativas. Já a variável state trata-se de uma variável qualitativa. Visto isso, vamos importar o conjunto de dados.
Neste caso, o conjunto de dados já está disponível na própria instalação do R. Para usá-lo basta utilizar o comando abaixo:
dados <- Puromycin
head(dados, 10) # Apresentando no console as 10 primeiras linhas do dataset
## conc rate state
## 1 0.02 76 treated
## 2 0.02 47 treated
## 3 0.06 97 treated
## 4 0.06 107 treated
## 5 0.11 123 treated
## 6 0.11 139 treated
## 7 0.22 159 treated
## 8 0.22 152 treated
## 9 0.56 191 treated
## 10 0.56 201 treated
Para importar arquivos que não estejam na base de dados do R, use o seguinte comando:
meus_dados <- read.csv("Digite o caminho do arquivo", sep = ",", dec = ".")
Os parâmetros sep e dec são respectivamente o tipo de parador usado no conjunto de dados para separar cada observação(vírgula) e o separador decimal para as variáveis quantitativas(ponto).
Dado que já importamos os dados. Vamos calcular algumas medidas de tendência central e dispersão.
Vamos calcular a média, mediana e amplitude(mínimo e máximo) das variáveis quantitativas do conjunto de dados. Para isso vamos usar os comandos abaixo:
# MEDIDAS DESCRITIVAS(GERAL) PARA A VARIAVEL CONC
mean(dados$conc) # MEDIA
## [1] 0.3121739
median(dados$conc) # MEDIANA
## [1] 0.11
range(dados$conc) # AMPLITUDE
## [1] 0.02 1.10
min(dados$conc) # MINIMO
## [1] 0.02
max(dados$conc) # MAXIMO
## [1] 1.1
var(dados$conc) # VARIANCIA
## [1] 0.1318632
sd(dados$conc) # DESVIO PADRAO
## [1] 0.3631298
quantile(dados$conc, c(0.25,0.5,0.75)) # QUARTIS
## 25% 50% 75%
## 0.06 0.11 0.56
# MEDIDAS DESCRITIVAS(GERAL) PARA A VARIAVEL RATE
mean(dados$rate) # MEDIA
## [1] 126.8261
median(dados$rate) # MEDIANA
## [1] 124
range(dados$rate) # AMPLITUDE
## [1] 47 207
min(dados$rate) # MINIMO
## [1] 47
max(dados$rate) # MAXIMO
## [1] 207
var(dados$rate) # VARIANCIA
## [1] 2257.514
sd(dados$rate) # DESVIO PADRAO
## [1] 47.5133
quantile(dados$rate, c(0.25,0.5,0.75)) # QUARTIS
## 25% 50% 75%
## 91.5 124.0 158.5
Para a variável categórica, podemos calcular a frequência de cada classe já que média e mediana não fazem sentido para esse tipo de informação. Para isso, use o comando abaixo:
table(dados$state)
##
## treated untreated
## 12 11
Agora vamos calcular as mesmas estatísticas agora considerado cada um dos grupos definidos pela variável state. Para isso usaremos o seguinte comando:
tapply(dados$conc, dados$state, mean)
## treated untreated
## 0.3450000 0.2763636
Observe a ordem a qual cada parâmetro foi adicionado na função. Primeiro inserimos a variável de interesse(conc). Em seguite, inserimos a variável que define os grupos(state). E por último a medida descritiva(no caso do exemplo acima foi a média).
Podemos repetir isso para outras medidas descritivas
tapply(dados$conc, dados$state, median)
## treated untreated
## 0.165 0.110
tapply(dados$conc, dados$state, range)
## $treated
## [1] 0.02 1.10
##
## $untreated
## [1] 0.02 1.10
tapply(dados$conc, dados$state, min)
## treated untreated
## 0.02 0.02
tapply(dados$conc, dados$state, max)
## treated untreated
## 1.1 1.1
tapply(dados$conc, dados$state, var)
## treated untreated
## 0.1589000 0.1126055
tapply(dados$conc, dados$state, sd)
## treated untreated
## 0.3986226 0.3355674
Outra importante estatística a ser calculada é o nível de associação linear entre duas variáveis. Para medirmos isso usamos o coeficiente de correlação. Para isso usaremos o comando abaixo:
cor(dados[,-3], method = "spearman")
## conc rate
## conc 1.0000000 0.9520149
## rate 0.9520149 1.0000000
Observe que a saída da função nos retorna uma matriz. Chamamos esta matriz de matriz de correlação. Nela apresentam-se as correlações entre as variáveis do conjunto de dados usado. Perceba também que os dados foram colocados dentro da função de forma diferente. Neste caso, retiramos a variável state do conjunto de dados(utilizando
[,-3], ou seja, removendo a 3 coluna do conjunto de dados) visto para o cálculo do coeficiente de correlação, não deve ser usada variáveis de natureza qualitativa. Observe também o parâmetro method. Nele é definido o tipo de coeficiente de correlação que se deseja calcular(Pearson, Spearman e Kendall). Mais informações sobre as difernças e em que situações usar esses coeficientes, clique AQUI.
Tente fazer o mesmo para a variável rate!
Muitas vezes a visualização de como os dados se apresentam em algum tipo de gráfico torna o entendimento de seu comportamento mais fácil. Um gráfico bastante usado em estatística é o boxplot.
Vamos inicialmente fazer um boxplot para a variável conc para cada um dos grupos(treated e untreated). Para isso, vamos utilizar o comando abaixo:
boxplot(dados$conc ~ dados$state, col="dodgerblue", main="Boxplot para variável conc")
A função
boxplotrecebe iniciamente como parâmetro a variável de interesse(conc) e em seguida a variável que define os grupos(state). O parâmetros col aplicar uma cor a escolha do usuário para os boxplots e o parâmetro main dá título ao boxplot.Link para uma tabela de cores AQUI!
Observe pelo tamanho das caixas que a variabilidade do grupo treated é maior do que a do grupo untreated. Resultado esse que verificamos mais acima utilizando a função tapply() juntamente com a função var() para calcularmos a variância desta variável para cada um dos grupos.
Replicando os comandos apresentados acima, vamos fazer o mesmo procedimento para a variável rate.
boxplot(dados$rate ~ dados$state, col="dodgerblue", main="Boxplot para variável rate")
Novamente voltando os resultados das medidas descritivas. Obtivemos um coeficiente de correlação de Pearson entre as variáveis conc e rate de 0.8055. Isso representa uma associação positiva de caráter forte entre as duas variáveis. Podemos verificar esta associação através de um ** gráfico de dispersão** ou scatter plot.
Para verificarmos esse comportamento graficamente, usaremos o comando abaixo:
plot(dados$conc, dados$rate, col="firebrick", pch=16)
Observe o comportamento crescente da variável rate em relação ao aumento da variável conc. Assim temos uma confirmação visual do nível de associação entre essas duas variáveis(como visto mais acima com o coeficiente de correlação).
Outro gráfico relevante em uma análise descritiva é o histograma. Com ele é possível verificar comportamentos como assimetria e curtose nos dados(Clique nos nomes para mais informações!).
Nativamente no R, não há função para calcularmos os coeficientes de assimetria e curtose mas podemos instalar o pacote fBasics que fornece funções para o cálculo desses coeficientes.
Na seção 1.2 vimos como instalar pacotes. Porém podemos usar um comando para instalar e carregar pacotes no R. Vamos instalar o pacote fBasics utilizando este comando.
install.packages("fBasics") # INSTALA O PACOTE
library(fBasics) # CARREGA O PACOTE PARA USO
Com o pacote carregado vamos utilizar as funções skewness() e kurtosis() para calcular respectivamente a assimetria e a curtose da variável conc do conjunto de dados.
skewness(dados$conc)
## [1] 1.205576
## attr(,"method")
## [1] "moment"
kurtosis(dados$conc)
## [1] 0.05829217
## attr(,"method")
## [1] "excess"
Observe que a saída da função retornou outras informações. Estas informações são referentes a como foram feito os cálculos para assimetria e curtose. Para o coeficiente de assimetria usou-se os momentos amostrais. E para curtose também foram usado os momentos amostrais porém o valor apresentado é o excesso de curtose em relação a distribuição Normal(Curtose da Normal é 3), isto é, a variável conc tem 0.05829217 a mais de curtose que a distribuição Normal.
Tente reproduzir tudo que foi feito até o momento e tirar conclusões sobre a variável rate deste conjunto de dados.
Uma tabela de contingência calcula observações para mais de uma variável categórica. Suas linhas e colunas representam as variáveis categóricas do conjunto de dados. Vamos utilizar como exemplo prático a eleição para chefe de departamento entre dois candidatos. Uma pesquisa registrou o sexo e o voto de 100 eleitores escolhidos através de um esquema de amostragem aleatório e tabulou-se os dados conforme mostrado abaixo:
| Candidato A | Candidato B | TOTAL | |
|---|---|---|---|
| HOMENS | 28 | 20 | 48 |
| MULHERES | 39 | 13 | 52 |
| TOTAL | 67 | 33 | 100 |
Esta tabela de contingência correlaciona as respostas por sexo e voto. A contagem na intersecção da linha i e coluna j é identificada por \(n_{ij}\), e representa o número de observações que exibem essa combinação de níveis. Por exemplo, \(n_{1,2}\) exibe o número de entrevistados do sexo masculino que tenham votado para o Candidato B.
A tabela também inclui totais marginais para cada nível das variáveis. Os totais marginais para as linhas mostram que 52 dos entrevistados eram mulheres. Os totais marginais para colunas mostram que 67 entrevistados votaram no Candidato A. Além disso, o total global mostra que o tamanho amostral é de 100.
As tabelas de contingência também podem revelar associação entre as duas variáveis. O teste Qui-quadrado ou Teste Exato de Fisher podem determinar se as contagens observadas diferem significativamente das contagens esperadas sob a hipótese nula de não associação. Por exemplo, você pode testar se existe uma associação entre sexo e voto. Veremos isto mais a frente na seção 2.
As tabelas de contingência mais simples são tabelas com dois fatores que contam as respostas por duas variáveis. Você pode categorizar observações por três ou mais variáveis “cruzando” as informações que cada variável representa. No exemplo do voto, pode-se classificar as respostas, por exemplo, por situação empregatícia como é apresentado abaixo:
| Candidato A | Candidato B | TOTAL | |
|---|---|---|---|
| HOMENS/EMPREGADOS | 18 | 19 | 37 |
| HOMENS/DESEMPREGADOS | 10 | 1 | 11 |
| MULHERES/EMPREGADAS | 33 | 10 | 43 |
| MULHERES/DESEMPREGADAS | 6 | 3 | 9 |
| TOTAL | 67 | 33 | 100 |
Vamos produzir uma tabela de contigência para o banco de dados cancer.csv. Para isso vamos importar os dados conforme o comando abaixo:
dados <- read.csv("~/Trabalhos/Escola de Bioestatistica/cancer.csv")
head(dados, 10) # APRESENTANDO AS 10 PRIMEIRAS LINHAS DO CONJUNTO DE DADOS,
## TREATMENT STATE
## 1 Aspirin Cancer
## 2 Aspirin Cancer
## 3 Aspirin Cancer
## 4 Aspirin Cancer
## 5 Aspirin Cancer
## 6 Aspirin Cancer
## 7 Aspirin Cancer
## 8 Aspirin Cancer
## 9 Aspirin Cancer
## 10 Aspirin Cancer
# PORÉM O CONJUNTO DE DADOS APRESENTA 39876 LINHAS.
Com os dados já importados, agora vamos criar nossa tabela de contigência para Tratamento \(\times\) Estado:
tabela <- table(dados$STATE, dados$TREATMENT)
tabela
##
## Aspirin Placebo
## Cancer 1438 1427
## No cancer 18496 18515
Vamos observar graficamente o resultado desta tabela de maneira gráfica. Para isso usaremos a função mosaicplot():
mosaicplot(t(tabela), col=c("firebrick", "dodgerblue"), cex.axis = 0.75, sub = "Tratamento", ylab = "Frequência Relativa", main = "")
Perceba que foi aplicada a função
t()na tabela criada anteriormente. Esta função transpõe os dados. Ou seja, as linhas viram coluna e as colunas viram linha. O parâmetro col é a cor de cada variável, cex.axis é o tamanho da fonte dentro do gráfico, sub é a legenda do eixo X, ylab é a legenda do eixo Y, main é o título do gráfico que no exemplo foi deixado em branco.
A Razão de Chances é usada para comparar as chances de dois eventos. A razão são as chances de sucesso dado que existe uma certa condição dividida pelas chances de sucesso dado que existe uma condição diferente. Você pode encontrar mais detalhes sobre isso AQUI.
Para o cálculo da razão de chances (Odds Ratio) iremos utilizar o pacote epitools. Instale e carregue este pacote da mesma forma que fizemos mais acima como pacote fBasics.
install.packages("epitools")
library(epitools)
Em alguns livros a fórmula para calcular a razão de chances usa o layout da tabela conforme o apresentado abaixo:
| TRATAMENTO | CONTROLE | |
|---|---|---|
| DOENTE | \(X_{1,1}\) | \(X_{1,2}\) |
| NÃO-DOENTE | \(X_{2,1}\) | \(X_{2,2}\) |
A tabela que criamos já se apresenta no layout apresentado assim. Então basta aplicarmos a função oddsratio().
oddsratio(tabela, method = "wald")
## $data
##
## Aspirin Placebo Total
## Cancer 1438 1427 2865
## No cancer 18496 18515 37011
## Total 19934 19942 39876
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## Cancer 1.000000 NA NA
## No cancer 1.008744 0.9349043 1.088415
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Cancer NA NA NA
## No cancer 0.8224348 0.8310911 0.8223986
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
O parâmetro method é usado para indicar qual método será usado para calcular as razões e os intervalos de confiança. A função aceita 3 métodos: Median-Unbiased Estimation (midp), Estimação por Máxima Verossimilhança condicional (Fisher), Estimação por Máxima Verossimilhança não-condicional (Wald) e Small Sample Adjustment (Small).
Risco relativo é um termo estatístico usado para descrever o risco de um certo evento acontecer em um grupo contra o outro. Você pode encontrar mais detalhes sobre isso AQUI.
Para calcularmos o risco relativo, usaremos outra função contida no pacote epitools chamada riskratio(). Porém, precisamos alterar a nossa tabela para que ela nos retorne uma saída correta. O layout da tabela que a função aceita como entrada é o oposto da que geramos mais acima. Então vamos usar a função t() em nossa tabela para obtermos a tabela transposta. Para isso vamos criar outra tabela, como mostrado abaixo:
tabela_trans <- t(tabela)
tabela_trans
##
## Cancer No cancer
## Aspirin 1438 18496
## Placebo 1427 18515
Vamos comparar as duas tabelas para ratificarmos as diferenças:
tabela
##
## Aspirin Placebo
## Cancer 1438 1427
## No cancer 18496 18515
tabela_trans
##
## Cancer No cancer
## Aspirin 1438 18496
## Placebo 1427 18515
Observe que as linhas de tabela são as colunas da tabela_trans. Essa operação que acabamos de fazer chamasse transpor uma tabela.
Com a tabela já transposta podemos agora inserí-la na função riskratio() e obter os resultados.
riskratio(tabela_trans, method = "wald")
## $data
##
## Cancer No cancer Total
## Aspirin 1438 18496 19934
## Placebo 1427 18515 19942
## Total 2865 37011 39876
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## Aspirin 1.000000 NA NA
## Placebo 1.000626 0.9951756 1.006106
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Aspirin NA NA NA
## Placebo 0.8224348 0.8310911 0.8223986
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
A estatística inferencial é um dos dois principais ramos da estatística. Ela usa uma amostra aleatória de dados de uma população para descrever e fazer inferências sobre a população. Ela é valiosa quando analisar cada membro de uma população inteira não é conveniente ou possível. Por exemplo, medir a taxa de açucar no sangue de todos os brasileiros é algo impraticável. Você pode medir as taxas de açucar em uma amostra aleatória representativa da população brasileira. Você pode usar as informações da amostra para fazer generalizações sobre a população. Para informações mais detalhadas clique AQUI.
O teste de independência Qui-Quadrado é usado para descobrir se existe uma associação entre as variáveis em uma tabela de contingência construída à partir de observações da amostra. Para maiores detalhes sobre o teste clique AQUI.
Algumas condições devem ser atendidas para o uso deste teste. As condições são:
As hipóteses deve ser montada da seguinte forma:
\[H_0: \text{As variáveis não são associadas}\] \[H_1: \text{As variáveis são associadas}\]
O teste se dá através do cálculo da estatística:
\[\chi^2 = \sum_{i,j}\frac{(f_{ij}-e_{ij})^2}{e_{ij}}\]
Onde \(f_{ij}\) é o vetor com de contagens observadas de cada classe e \(e_{ij}\) é o vetor que representa a frequência esperada de cada classe.
Vamos agora utilizar o R para exemplificar este teste.
Existe um conjunto de dados no R chamado survey. A coluna Smoke armazena os estudantes que que possuem o hábito de fumar, enquanto a coluna Exer indica o nível de atividade física de cada um dos estudantes. Vamos carregar as informações e criar uma tabela de contingência para este conjunto de dados.
library(MASS)
dados <- survey
tabela_1 <- table(dados$Smoke, dados$Exer)
tabela_1
##
## Freq None Some
## Heavy 7 1 3
## Never 87 18 84
## Occas 12 3 4
## Regul 9 1 7
Agora vamos testar a hipótese de que o hábito de fumar entre os estudantes da nossa amostra não está associado ao seus nível de atividade física a um nível de significância de 5%.
Para isso basta aplicarmos a função chisq.test():
chisq.test(tabela_1)
##
## Pearson's Chi-squared test
##
## data: tabela_1
## X-squared = 5.4885, df = 6, p-value = 0.4828
O p-valor calculado pela função, 0.4828, é maior que o nível de significância especificado no teste. Logo não existem indícios para rejeitarmos a nossa hipótese nula de que o hábito de fumar dos estudantes não esteja associado a seus níveis de atividade física.
O teste t de uma amostra é usado para comparar a média de uma amostra com uma média conhecida (ou teórica/hipotética). Para maiores detalhes sobre o teste, clique AQUI.
O teste é baseado na seguinte estatística:
\[t = \frac{m-\mu}{\dfrac{s}{\sqrt{n}}},\]
onde:
Algumas condições devem ser verificadas antes de se aplicar o teste:
Vamos utilizar o conjunto de dados bottles.csv para exemplificarmos o teste utilizando o R. Novamente, vamos importar os dados para iniciarmos o teste:
dados <- read.csv("~/Trabalhos/Escola de Bioestatistica/bottles.csv")
Este conjunto de dados é referente ao seguinte problema. Em uma fábrica de produtos farmacêuticos, existe uma linha de produção de frascos de soro fisiológico com volume de 500ml. Desconfia-se de que a máquina responsável pelo preenchimento dos frascos esteja desregulada e que os frascos estejam saindo com menos de 500ml de soro. Uma amostra de 20 frascos foi coletada e seus volumes avaliados. Será que realmente os frascos estão saindo da linha de produção com menos de 500ml?
Vamos formular as hipóteses:
\[H_0: \text{Média do volume dos frascos é igual a 500ml}\] \[H_1: \text{Média do volume dos frascos é menor que 500ml}\]
Observe que temos apenas a observação do volume de 20 frascos. O que nos dá um tamanho amostral de 20. O que, a priori, fere um dos pré-requisitos para a aplicação do teste. Porém, neste caso, vamos verificar a normalidade dos dados através do teste de Shapiro-Wilks e com a função qqPlot() do pacote car(instale e carregue este pacote para usar a função). Para isso vamos usar o comando:
shapiro.test(dados$Volume)
##
## Shapiro-Wilk normality test
##
## data: dados$Volume
## W = 0.97329, p-value = 0.8223
qqPlot(dados$Volume)
## [1] 12 19
A um nível de significância de 5%, podemos considerar que os dados seguem distribuição Normal (p-valor > 0.05).
Agora vamos calcular o volume médio da amostra retirada.
mean(dados$Volume)
## [1] 491.5705
Aparentemente a máquina mostra-se desregulada mas não podemos tirar conclusões ainda. Vamos aplicar o teste-t para esta amostra utilizando a função t.test(). Vamos utilizar um nível de significância de 5% (ou nível de confiança de 95%).
t.test(dados$Volume, mu=500, alternative="less", conf.level=0.95)
##
## One Sample t-test
##
## data: dados$Volume
## t = -1.5205, df = 19, p-value = 0.07243
## alternative hypothesis: true mean is less than 500
## 95 percent confidence interval:
## -Inf 501.1569
## sample estimates:
## mean of x
## 491.5705
Utilizando-se um nível de significância de 5%, não temos indícios suficientes para rejeitar a hipótese nula de que o volume médio dos frascos produzidos seja 500ml.
Teste-t para duas amostras independentes ou Teste-t não-pareado para duas amostras é auto-explicativo. Ele testa hipóteses sobre a média de duas amostras independentes. Para mais detalhes e informações sobre o teste, clique AQUI.
Neste teste temos que considerar alguns pontos:
Para verificar a normalidade temos o teste de Shapiro-Wilks e para verificar a variância dos grupos testemos o Teste-F.
Sabendo que as suposições de independencia e normalidade são atendidas, temos duas opções para verificar suposições sobre a média dos grupos:
Para cada situação acima apresentada, temos diferenças no cálculo da estatística para o teste. Você pode verificar como as estatísticas são calculadas em cada caso neste link.
Vamos utilizar o exemplo onde queremos testar se a média do peso em um grupo composto por 9 homens e 9 mulheres são diferentes ou não. Assim, nossas hipóteses são:
\[H_0: \mu_{homem} = \mu_{mulher}\] \[H_0: \mu_{homem} \neq \mu_{mulher}\]
Vamos carregar os dados e verificar inicialmente a normalidade dos dados e a homogeneidade dos grupos, tudo isso a um nível de significância de 5% (visto que o quesito independência já está explicito no experimento. O peso de um homem não influencia no peso de uma mulher).
dados <- read.csv("~/Trabalhos/Escola de Bioestatistica/peso_sexo.csv")
| Peso | Sexo |
|---|---|
| 38.9 | Masculino |
| 61.2 | Masculino |
| 73.3 | Masculino |
| 21.8 | Masculino |
| 63.4 | Masculino |
| 64.6 | Masculino |
| 48.4 | Masculino |
| 48.8 | Masculino |
| 48.5 | Masculino |
| 67.8 | Feminino |
| 60.0 | Feminino |
| 63.4 | Feminino |
| 76.0 | Feminino |
| 89.4 | Feminino |
| 73.3 | Feminino |
| 67.3 | Feminino |
| 61.3 | Feminino |
| 62.4 | Feminino |
Varificando normalidade para os dois grupos.
tapply(dados$Peso, dados$Sexo, shapiro.test)
## $Feminino
##
## Shapiro-Wilk normality test
##
## data: X[[i]]
## W = 0.86425, p-value = 0.1066
##
##
## $Masculino
##
## Shapiro-Wilk normality test
##
## data: X[[i]]
## W = 0.94266, p-value = 0.6101
Podemos considerar que os grupos são oriundos de uma distribuição Normal.
Agora vamos verificar a homogeneidade dos grupos. Ou seja, se a variância nos grupos são iguais. Para isso usaremos a função var.test().
var.test(dados$Peso ~ dados$Sexo, data = dados)
##
## F test to compare two variances
##
## data: dados$Peso by dados$Sexo
## F = 0.36134, num df = 8, denom df = 8, p-value = 0.1714
## alternative hypothesis: true ratio of variances is not equal to 1
## 95 percent confidence interval:
## 0.08150656 1.60191315
## sample estimates:
## ratio of variances
## 0.3613398
Como o p-valor > 0.05, então não temos indícios para rejeitar a hipótese nula de que as variâncias de cada grupo sejam iguais.
Finalmente, iremos aplicar o teste-t para duas amostras.
t.test(dados$Peso ~ dados$Sexo, data = dados, var.equal=TRUE)
##
## Two Sample t-test
##
## data: dados$Peso by dados$Sexo
## t = 2.7842, df = 16, p-value = 0.01327
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## 4.029759 29.748019
## sample estimates:
## mean in group Feminino mean in group Masculino
## 68.98889 52.10000
Como o p-valor < 0.05, existem indícios suficientes para rejeitar a hipótese nula de que o peso médio dos homens é diferente do peso médio das mulheres.
A regressão linear (ou modelo linear) é usada para prever uma variável quantitativa \(Y\) com base em uma ou várias(caso múltiplo) variáveis preditoras X. (James et al., 2014, P. Bruce e Bruce, 2017).
O objetivo é construir um modelo matemático que a variável resposta \(Y\) em função das variáveis preditoras (ou explicativas) \(X\). Dessa forma, uma vez construído um modelo estatísticamente significante, é possível usá-lo para fazer previsões futuras com base em novos valores de \(X\).
Quando você cria um modelo de regressão, é necessário avaliar o desempenho do modelo preditivo. Em outras palavras, você precisa avaliar o quão bem o modelo prevê o resultado de novos dados de teste que não foram usados para construir o modelo.
Duas métricas importantes são comumente usadas para avaliar o desempenho do modelo de regressão:
A fórmula matemática para os modelos de regressão linear simples é definida por:
\[y_i = \beta_0 + \beta_1 x_i + \epsilon_i, \\ i=\{1,2,...,n\},\]
onde n é a quantidade de observações.
Quando se tem mais de uma variável preditora, o modelo é definido por:
\[y_i = \beta_0 + \beta_1 x_{1i} + \beta_2 x_{2i} + ... + \beta_j x_{ji} + \epsilon_{ji}, \\ i=\{1,2,...,n\},\\ j=\{1,2,..., m\},\]
onde n é a quantidade de observações e m é a quantidade variáveis preditoras.
Grande parte da teoria sobre modelos de regressão linear simples e múltiplos será omitida nesta seção, pois o intuito deste documento é gerar um guia para o uso de algumas ferramentas estatísticas sob o apoio computacional do software R. Para mais informações sobre toda a teoria que envolve os modelos de regressão linear simples e múltipla, verifique este livro.
O conjunto de dados publicidade.csv contêm o impacto de três mídias de publicidade (YouTube, Facebook e Jornal Convencional) nas vendas. Os dados são o orçamento de publicidade em milhares de dólares, juntamente com as vendas. O experimento de publicidade foi repetido 200 vezes.
Inicialmente, vamos importar e verificar os dados.
dados <- read.csv("~/Trabalhos/Escola de Bioestatistica/publicidade.csv")
| youtube | newspaper | sales | |
|---|---|---|---|
| 276.12 | 45.36 | 83.04 | 26.52 |
| 53.40 | 47.16 | 54.12 | 12.48 |
| 20.64 | 55.08 | 83.16 | 11.16 |
| 181.80 | 49.56 | 70.20 | 22.20 |
| 216.96 | 12.96 | 70.08 | 15.48 |
| 10.44 | 58.68 | 90.00 | 8.64 |
| 69.00 | 39.36 | 28.20 | 14.16 |
| 144.24 | 23.52 | 13.92 | 15.84 |
| 10.32 | 2.52 | 1.20 | 5.76 |
| 239.76 | 3.12 | 25.44 | 12.72 |
| 79.32 | 6.96 | 29.04 | 10.32 |
| 257.64 | 28.80 | 4.80 | 20.88 |
| 28.56 | 42.12 | 79.08 | 11.04 |
| 117.00 | 9.12 | 8.64 | 11.64 |
| 244.92 | 39.48 | 55.20 | 22.80 |
| 234.48 | 57.24 | 63.48 | 26.88 |
| 81.36 | 43.92 | 136.80 | 15.00 |
| 337.68 | 47.52 | 66.96 | 29.28 |
| 83.04 | 24.60 | 21.96 | 13.56 |
| 176.76 | 28.68 | 22.92 | 17.52 |
Acima foram apresentadas as 20 primeiras linhas do conjunto de dados. Como dito anteriormente, o experimento foi realizado 200 vezes.
Inicialmente, vamos identificar as variáveis regressoras e a variável resposta:
Outra verificação que devemos fazer é se existe realmente alguma relação linear entre as variáveis regressoras e a variável resposta. Para isso vamos usar o gráfico que apresenta essa correlação.
pairs(dados, col="blue", pch=16)
Observe que existe, mesmo que de maneira moderada para a variável newspaper, uma correlação linear entre sales com as demais variáveis. Assim é plausível usar um modelo de regressão linear neste conjunto de dados.
Inicialmente vamos escolher apenas a variável facebook para modelar uma regressão linear simples. Para isso usaremos o seguinte comando:
reg_simples <- lm(sales ~ facebook, data = dados)
summary(reg_simples)
##
## Call:
## lm(formula = sales ~ facebook, data = dados)
##
## Residuals:
## Min 1Q Median 3Q Max
## -18.8766 -2.5589 0.9248 3.3330 9.8173
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 11.17397 0.67548 16.542 <2e-16 ***
## facebook 0.20250 0.02041 9.921 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 5.13 on 198 degrees of freedom
## Multiple R-squared: 0.332, Adjusted R-squared: 0.3287
## F-statistic: 98.42 on 1 and 198 DF, p-value: < 2.2e-16
plot(dados$facebook, dados$sales, col="blue", pch=16)
abline(reg_simples, lwd=2, col="red")
Com as informações que obtivemos com a saída da função lm(), temos que o nosso modelo é:
\[\hat{y}_{sales} = 11.17397 + 0.20250 x_{facebook}\]
Observe também que os dois coeficientes são extremamente significativos neste modelo pois o p-valor calculado para os dois foi algo muito próximo de 0 (\(2.10^{-16}\)). O \(R^2\) ajustado calculado para o modelo foi de 0.3287. Em geral esse valor é baixo e pode ser explicado pelo espalhamento dos dados no gráfico dispersão entre a variável facebook e sales. Perceba que os dados estão bastante “espalhados” no gráfico, indicando uma variabilidade muito grande. Como o objetivo da reta regressora é passar o mais próximo de todos os pontos, quanto maior a dispersão dos dados menor será a adequabilidade do modelo.
Agora vamos fazer um modelo de regressão linear múltipla utilizando os mesmos dados.
reg_mult <- lm(sales ~ youtube + facebook + newspaper, data = dados)
summary(reg_mult)
##
## Call:
## lm(formula = sales ~ youtube + facebook + newspaper, data = dados)
##
## Residuals:
## Min 1Q Median 3Q Max
## -10.5932 -1.0690 0.2902 1.4272 3.3951
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.526667 0.374290 9.422 <2e-16 ***
## youtube 0.045765 0.001395 32.809 <2e-16 ***
## facebook 0.188530 0.008611 21.893 <2e-16 ***
## newspaper -0.001037 0.005871 -0.177 0.86
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.023 on 196 degrees of freedom
## Multiple R-squared: 0.8972, Adjusted R-squared: 0.8956
## F-statistic: 570.3 on 3 and 196 DF, p-value: < 2.2e-16
Observe agora que temos 3 variáveis preditoras, porém apenas 2 se mostram significativas no modelo (youtube, facebook - p-valor = \(2.10^{-16}\) e newspaper - p-valor = 0.86). Perceba também que o valor do \(R^2\) ajustado é alto (0.8956) o que é um indício de que nosso modelo está bem ajustado. Já que vimos que a variável newspaper não é significativa em nosso modelo vamos retirá-la e recalcular o modelo.
reg_mult <- lm(sales ~ youtube + facebook, data = dados)
summary(reg_mult)
##
## Call:
## lm(formula = sales ~ youtube + facebook, data = dados)
##
## Residuals:
## Min 1Q Median 3Q Max
## -10.5572 -1.0502 0.2906 1.4049 3.3994
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.50532 0.35339 9.919 <2e-16 ***
## youtube 0.04575 0.00139 32.909 <2e-16 ***
## facebook 0.18799 0.00804 23.382 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.018 on 197 degrees of freedom
## Multiple R-squared: 0.8972, Adjusted R-squared: 0.8962
## F-statistic: 859.6 on 2 and 197 DF, p-value: < 2.2e-16
Perceba agora que o \(R^2\) ajustado mudou muito pouco. O que significa que a variável newspaper é de pouca relevância na construção do modelo.
Com as informações que obtivemos com a saída da função lm(), temos que o nosso modelo é:
\[\hat{y}_{sales} = 3.50532 + 0.04575 x_{youtube} + 0.18799 x_{facebook}\]
Como que temos 3 variáveis é possível visualizar o plano regressor (já que estamos em 3 dimensões agora) para o nosso modelo juntamente com os dados.
scatter3d(sales~facebook+youtube, data=dados, fit="linear",residuals=TRUE,bg="white",axis.scales=TRUE, grid=TRUE, ellipsoid=FALSE)
rglwidget()