4. Distribuições Contínuas

Distribuição Normal

A distribuição normal é um modelo bastante útil na estatística, pois sua função densidade de probabilidade (FDP) está associada ao fato de que aproxima de forma bastante satisfatória as curvas de frequências observadas quando se mensura diversas variáveis biológicas (ex., altura, massa, comprimento, etc). Como exemplo, vamos ver a distribuição da massa de mil grãos de híbridos de milho, disponíveis no conjunto de dados data_ge do pacote metan. Neste exemplo, a linha vermelha representa a distribuição normal.

Code
library(tidyverse)
library(metan)

# tema personalizado
my_theme <- 
  theme_gray(base_size = 14) +
  theme(panel.grid.minor = element_blank())
# define o tema para todos os gráficos
theme_set(my_theme)


ggplot(data_ge2, aes(TKW)) + 
  geom_histogram(aes(y = ..density..),
                 bins = 15) +
  stat_function(fun = dnorm,
                geom = "line",
                color = "red",
                size = 1,
                args = list(
                  mean = mean(data_ge2$TKW),
                  sd = sd(data_ge2$TKW)
                ))

Vamos ver a distribuição dos valores do comprimento da folha de café, mensurado na primeira aula de bioestatística.

Code
library(rio)
# link dos dados
link <- "https://docs.google.com/spreadsheets/d/1JMrkppvv1BdGKVCekzZPsPYCKcgUWjxpuDlWqejc22s/edit#gid=1453191616"

# função para importar os dados
df <-  
  import(link, dec = ",") |> 
  filter(tipo == "Folha")

ggplot(df, aes(comprimento)) + 
  geom_histogram(aes(y = ..density..),
                 bins = 10) +
  stat_function(fun = dnorm,
                geom = "line",
                color = "red",
                size = 1,
                args = list(
                  mean = mean(df$comprimento),
                  sd = sd(df$comprimento)
                ))

Parâmetros da distribuição

A distribuição normal possui dois parâmetros:

  • \(\mu\), sendo a média;
  • \(\sigma\), sendo o desvio padrão.

Estes parâmetros definem a posição e a dispersão do conjunto de dados. Assim, se X se distribui de forma normal e contínua (variável contínua) de \(-\infty < x <+\infty\), a área total sob a curva do modelo é 1.

O modelo da função normal possui a seguinte Função Densidade de Probabilidade:

\[ {f}(x) = \frac{1}{{\sqrt {2\pi {\sigma ^2}} }}{e^{ - \frac{{{{(x - \mu )}^2}}}{{2{\sigma ^2}}}}}-\infty< x < \infty \]

No exemplo abaixo, é apresentado a distribuição de uma variável aleatória contínua (X) com \(\mu = 20\), e \(\sigma = 2\). Assim, dizemos que \(X \sim N(\mu,\sigma)\), ou seja, segue uma distribuição normal com média \(\mu = 20\) e desvio padrão \(\sigma = 2\).

Code
ggplot() +
  stat_function(fun = dnorm,
                geom = "line",
                color = "red",
                size = 1,
                xlim = c(10, 30),
                args = list(
                  mean = 20,
                  sd = 2
                )) +
  labs(y = bquote(f(x)~~"densidades"),
       x = "x")

Abaixo, pode-se observar a distribuição de variáveis aleatórias contínuas com diferentes valores de parâmetros. No gráfico à esquerda, fixa-se a média e varia-se o desvio padrão. No exemplo central, fixa-se o desvio padrão e varia-se a média. No exemplo à direita, varia-se os dois parâmetros.

Mostrar código
get_norm <- function(mu, sd, col = "blue"){
  stat_function(fun=dnorm,
                geom = "line",
                size = 1,
                col=col,
                args = c(mean=mu,sd=sd))
}

p1 <- 
  ggplot(data.frame(x=c(0,30)),aes(x=x)) +
  get_norm(10, 1) +
  get_norm(10, 2, "green") +
  get_norm(10, 4, "red")

p2 <- 
  ggplot(data.frame(x=c(0,30)),aes(x=x)) +
  get_norm(6, 2) +
  get_norm(10, 2, "green") +
  get_norm(14, 2, "red")

p3 <- 
  ggplot(data.frame(x=c(0,30)),aes(x=x)) +
  get_norm(6, 1) +
  get_norm(10, 2, "green") +
  get_norm(14, 4, "red")

arrange_ggplot(p1, p2, p3)

Calculando as probabilidades

A probabilidade estatística de um valor estar no intervalo \(x_1,x_2\) é dada pela soma da área abaixo da curva contida no intervalo entre estes dois pontos. Tal área pode ser obtida conforme segue:

\[ P\left(x_{1}\le X \le x_{2}\right)=\int_{x_{1}}^{x_{2}} \frac{1}{\sigma \sqrt{2 \pi}} e^{-\frac{(x-\mu)^{2}}{2 \sigma^{2}}} d x \]

Considere como exemplo, a altura de planta em uma lavoura de milho que segue uma distribuição normal com média 2 e desvio padrão de 0,2. Pergunda-se: qual é a probabilidade de, ao entrar aleatoriamente nesta lavoura ser encontrada uma planta que mede de 1,75 m a 2 m?

SOLUÇÃO: Para resolver este problema, precisamos encontrar a área sombreada na figura abaixo.

Code
me <- 2
sdd <- 0.2

args <- 
  list(mean = me,
       sd = sdd)

ggplot() +
  scale_x_continuous(limits = c(1, 3),
                     breaks = seq(1, 3, by = 0.25)) +
  stat_function(fun = dnorm,
                geom = "area",
                fill = "steelblue",
                xlim = c(1.75, 2),
                args = args)+
  stat_function(fun = dnorm,
                geom = "line",
                size = 1,
                args = args)+
  scale_y_continuous(expand = expansion(mult = c(0, .1)))+
  labs(x = "Altura da planta (m)",
       y = "Probabilidade")

Para calcular esta probabilidade, precisamos encontrar a probabilidade associada a cada quantil, utilizando a função pnorm(). Esta função retorna por padrão a probabilidade \(PX \\le x\). Assim, ao se diminuir a probabilidade de encontrar uma planta com 2 m da probabilidade de encontrar uma planta com até 1,75 m, resolvemos o problema.

# P[X<= 2.0]
(p2 <- pnorm(q = 2, mean = 2, sd = 0.2))
[1] 0.5
# P[X<= 1.75]
(p175 <- pnorm(q = 1.75, mean = 2, sd = 0.2))
[1] 0.1056498
p2 - p175
[1] 0.3943502

Aproximação da integral da distribuição Normal

O cálculo da integral da distribuição Normal pode ser aproximado pelo método geométrico por soma de retângulos (Ou Soma de Riemann). Este método possibilita calcular a integral definida em dois pontos (ex., \(x_1\) e \(x_2\)), considerando uma variável com distribuição normal. Assim, a soma das áreas dos retângulos sob a curva da distribuição normal resultarão na probabilidade estatística de um valor estar no intervalo \(x_1,x_2\).

Code
##### N = 20
n <- 20
p <- 0.5
x <- seq(0, n, 1)
px <- dbinom(x, n, p)
df2 <- data.frame(x, px)


# Aproximação
media <- n*p # media
desvp <- sqrt(n*p*(1-p)) # desvio padrao

ggplot(df2, aes(x = x, y = px)) + 
  geom_bar(stat = "identity",
           width = 1, 
           color = "black",
           size = 0.01,
           fill = "salmon") + 
  scale_y_continuous(expand = c(0.01, 0)) + 
  xlab("x") + 
  ylab("px e fx") +
  stat_function(aes(x=x),
                fun=dnorm,
                geom = "line",
                size=1,
                col="green",
                args = c(mean = media, sd = desvp))

No método geométrico, a função f(x) corresponderá a altura de cada retângulo. A base do retângulo (\(\Delta\)), será dada por:

\[ \Delta=\frac{x_2-x_1}{n} \]

onde n representa o número de retângulos no intervalo. Ao multiplicar a altura do retângulo pela sua base, temos a área de cada retângulo. Ao somarmos todas as n áreas, teremos a aproximação da probabilidade. Logo, é fácil notar que quanto maior o valor de n melhor será a aproximação do valor calculado pela integral.

A função abaixo pode ser utilizada para aproximar a integral da função da distribuição Normal. A função mnorm é a Função Densidade de Probabilidade e é aplicada dentro da função int_norm para encontrar a altura de cada retângulo. Por padrão, 50000 retângulos são utilizados.

# função normal, f(x)
mnorm <- function(x, m, dp){
  (1/(dp * sqrt(2 * pi) )) * exp(-((x - m)^2)/(2 * dp ^ 2))
}
# integral definida em dois pontos
# (método geométrico por soma de retângulos)
int_norm <- function(x1, x2, me, dp, n = 50000){
  # cria uma sequência com n retangulos de x1 a x2
  x <- seq(x1, x2, length.out = n)
  # acha a base da área
  barea <- (x2 - x1)/n
  # encontra a altura
  altrect <- mnorm(x, me, dp)
  # multiplica a altura pela base e soma
  sum(altrect * barea)
}

Abaixo, a função int_norm() é usada para aproximar a probabilidade obtida anteriormente com a função pnorm().

x1 <- 1.75 # x_0
x2 <- 2    # x_1
m <- 2     # média
dp <- 0.2  # desvio padrão

# método geométrico
(aprox <- int_norm(x1, x2, m, dp))
[1] 0.3943496
(fun_pnorm <- p2 - p175)
[1] 0.3943502
fun_pnorm - aprox
[1] 6.171243e-07

Nota-se que com 50000 retângulos, a aproximação da probabilidade pelo método geométrico apresentou diferença somente na quinta casa após a vírgula, demonstrando uma aproximação satisfatória. Vejamos o impacto do número de retângulos nesta aproximação. Para isso, vamos criar um gráfico para mostrar como esta aproximação vai melhorando com o aumento no número de retângulos. No exemplo, é simulado de 1 até 200 (apenas para fins didáticos). A linha vermelha horizontal representa a probabilidade compudata com a função pnorm().

x <- NULL
for (i in 1:200) {
  x[i] <- int_norm(x1, x2, m, dp, i)
}
df <- 
  data.frame(x = 1:200,
             prob = x)

ggplot(df, aes(x, prob)) +
  geom_line() +
  geom_hline(yintercept = p2 - p175,
             color = "red") +
  labs(x = "Números de retângulos",
       y = "Probabilidade aproximada")

Distribuição Normal Padrão

A distribuição Normal Padrão é nada mais que uma distribuição normal com média e desvio padrão fixos (\(\mu = 0; \sigma = 1\)). Uma vez que estes parâmetros são fixos, sempre que desejamos calcular uma probabilidade pode-se recorrer a uma tabela, onde valores de probabilidade já foram previamente calculados para essa única distribuição.

Para isso, precisamos definir uma nova variável aleatória Z, chamada de variável aleatória normal padronizada, dada pela função linear Z.

\[ Z = \frac{X- \mu}{\sigma} \]

Onde X é uma variável aleatória com distribuição normal com média \(\mu\) e \(\sigma \> 0\).

Como exemplo, vamos simular uma variável aleatória (X) com \(n = 300\) tal que \(X \sim N(\mu = 20; \sigma = 3)\).

set.seed(1) # assegura a reprodutibilidade
X <- round(rnorm(n = 300 , mean = 20, sd = 3), digits = 1)
hist(X)

(mu <- mean(X))
[1] 20.102
(sdx <- sd(X))
[1] 2.892973

Podemos criar uma função para criar a nova variável Z com base em um vetor numérico da variável original. Neste caso, a chamei de get_z().

get_z <- function(x){
  (x - mean(x)) / sd(x)
}
# obtém o valor Z de X
Z <- get_z(X)
hist(Z)

Os valores de Z podem ser interpretados como o número de desvios padrão afastados da média, em uma distribuição normal padrão.

Code
ggplot() +
  stat_function(fun = dnorm,
                geom = "area",
                fill = "cyan",
                xlim = c(-3, 3),
                alpha = 1) +
  stat_function(fun = dnorm,
                geom = "area",
                fill = "green",
                xlim = c(-2, 2),
                alpha = 1) +
  stat_function(fun = dnorm,
                geom = "area",
                fill = "salmon",
                xlim = c(-1, 1),
                alpha = 1) +
  
  stat_function(fun = dnorm,
                geom = "line")+
  scale_x_continuous(limits = c(-4, 4), breaks = c(seq(-5, 5, 1))) +
  scale_y_continuous(expand = expansion(mult = c(0, .5)),
                     breaks = NULL) +
  labs(x = "Z",
       y = "")+
  theme_gray(base_size = 16) +
  theme(panel.grid = element_blank(),
        panel.background = element_rect(fill = NA))

Desta forma, uma tabela contendo a área sobre a curva desta distribuição de Z pode ser utilizada.

A primeira decimal da variável Z encontra-se na linha e a segunda decimal na coluna. Como exemplo, a probabilidade de Z ser menor ou igual a -1 é de 0,15866.

# valor exato
pnorm(-1)
[1] 0.1586553
Note

Retomando o exemplo: Considere como exemplo, a altura de planta em uma lavoura de milho. Esta variável segue uma distribuição normal com média 2 e desvio padrão de 0,2. Pergunda-se: qual é a probabilidade de, ao entrar aleatoriamente nesta lavoura ser encontrada uma planta que mede de 1,75 m a 2 m? Neste caso, utilizando a normal padrão, a resolução é dada por:

me <- 2 # média 
sdd <- 0.2 # desvio padrão
val1 <- 1.75 # primeiro quantil do intervalo
val2 <- 2 # segundo quantil do intervalo
(Z1 <- (val1 - me) / sdd) # Z associado ao primeiro quantil
[1] -1.25
(Z2 <- (val2 - me) / sdd) # Z associado ao segundo quantil
[1] 0
(prob1 <- pnorm(Z1)) # P(Z <= -1,25)
[1] 0.1056498
(prob2 <- pnorm(Z2)) # P(z <= 0)
[1] 0.5
prob2 - prob1 # P(-1,25 <= Z <= 0)
[1] 0.3943502

No exemplo, a área da parte sombreada (probabilidade) é de 0,39455.

Code
normal <-
  ggplot() +
  scale_x_continuous(limits = c(1.2, 2.8)) +
  stat_function(fun = dnorm,
                geom = "area",
                fill = "steelblue",
                xlim = c(1.75, 2),
                args = list(
                  mean = me,
                  sd = sdd
                ))+
  stat_function(fun = dnorm,
                geom = "line",
                args = list(
                  mean = me,
                  sd = sdd
                )) +
  scale_y_continuous(expand = expansion(mult = c(0, .1)))+
  labs(x = "Valor original (altura em m)", y = "Probabilidade")

padrao <-
  ggplot() +
  scale_x_continuous(limits = c(-4, 4)) +
  stat_function(fun = dnorm,
                geom = "area",
                fill = "steelblue",
                xlim = c(Z1, Z2))+
  stat_function(fun = dnorm,
                geom = "line")+
  scale_y_continuous(expand = expansion(mult = c(0, .1)))+
  labs(x = "Valor de Z", y = "Probabilidade")

arrange_ggplot(normal, padrao, ncol = 1)

Tutorial R

Exemplos de aplicação

Exemplo 1

A série histórica das vendas de uma determinada fórmula de adubo seguem uma distribuição normal com média 25.000 t e desvio padrão de 2.600 t. Se a empresa fabricante decidir fabricar 30000 toneladas deste adubo para suprir a demanda da safra atual, qual é a probabilidade de que ela não possa atender todas as vendas por estar com a produção esgotada?

R = 0,0272

SOLUÇÃO: encontrar a probabilidade de vender mais que 30000 t.

Code
me <- 25000
sdd <- 2600
val <- 30000
(Z <- (val - me) / sdd)
[1] 1.923077
Code
(prob <- 1 - pnorm(Z))
[1] 0.0272352
Code
# gráfico da normal padrão
normal <-
  ggplot() +
  xlim(c(15900, 34100)) +
  stat_function(fun = dnorm,
                geom = "area",
                fill = "steelblue",
                xlim = c(30000, 34100),
                args = list(
                  mean = me,
                  sd = sdd
                )) +
  stat_function(fun = dnorm,
                geom = "line",
                args = list(
                  mean = me,
                  sd = sdd
                )) +
  scale_y_continuous(expand = expansion(mult = c(0, .1)))+
  labs(x = "Valor original", y = "Probabilidade")+
  ggtitle("Distribuição da variável original")

# gráfico da variável original
padrao <-
  ggplot() +
  stat_function(fun = dnorm,
                geom = "area",
                fill = "steelblue",
                xlim = c(Z, 3.5)) +
  stat_function(fun = dnorm,
                geom = "line")+
  scale_x_continuous(limits = c(-3.5, 3.5), breaks = c(seq(-3, 3, 1)))+
  scale_y_continuous(expand = expansion(mult = c(0, .1)))+
  labs(x = "Valor de Z", y = "Probabilidade")+
  ggtitle("Distribuição da variável padronizada",
          subtitle = paste("Valor de Z:", round(Z, 4), "; Prob área sombreada:", round(prob, 4)))

arrange_ggplot(normal, padrao, ncol = 1)

Exemplo 2

Uma variável aleatória X segue uma distribuição normal com média 100 e desvio padrão 10. Calcule a probabilidade de x estar entre 90 e 110.

R: 0.6826895

RESOLUÇÃO: encontrar os valores de Z associado a 90 e 100, encontrando a área sobre a curva entre estes dois valores.

Code
me <- 100
sdd <- 10
val1 <- 90
val2 <- 110
(Z1 <- (val1 - me) / sdd)
[1] -1
Code
(Z2 <- (val2 - me) / sdd)
[1] 1
Code
# probabilidade dos valores estarem a 1 desvio padrão para mais ou menos
pnorm(Z2) - pnorm(Z1)
[1] 0.6826895
Code
args <- list(
  mean = 100,
  sd = 10
)
normal <-
  ggplot() +
  scale_x_continuous(limits = c(60, 140),
                     breaks = seq(60, 140, 10)) +
  stat_function(fun = dnorm,
                geom = "area",
                fill = "steelblue",
                xlim = c(90, 110),
                args = args) +
  stat_function(fun = dnorm,
                geom = "line",
                args = args) +
  scale_y_continuous(expand = expansion(mult = c(0, .1)))+
  labs(x = "Valor original", y = "Probabilidade")+
  ggtitle("Distribuição da variável original")

padrao <-
  ggplot() +
  stat_function(fun = dnorm,
                geom = "area",
                fill = "steelblue",
                xlim = c(Z1, Z2)) +
  stat_function(fun = dnorm,
                geom = "line")+
  scale_x_continuous(limits = c(-4, 4), breaks = c(seq(-4, 4, 1)))+
  scale_y_continuous(expand = expansion(mult = c(0, .1)))+
  labs(x = "Valor de Z",
       y = "Probabilidade")+
  ggtitle("Distribuição da variável padronizada")

arrange_ggplot(normal, padrao, ncol = 1)

Distribuição t

A distribuição t de Student é uma distribuição de probabilidade contínua, publicada por William Sealy Gosset sob o pseudônimo Student 1.

A distribuição t possui como único parâmetro o Grau Liberdade (GL). Esta distribuição detém caudas mais pesadas que a distribuição normal quando o tamanho da amostra é pequeno e a medida que \(n \to N\), a distribuição t de Student se aproxima da normal. Note abaixo as diferenças nas curvas quando se compara a distribuição Normal com a distribuição t com diferentes GLs.

Code
ggplot() +
  scale_x_continuous(limits = c(-6, 6)) +
  stat_function(fun = dnorm,
                size = 1.5,
                aes(color = "black")) +
  stat_function(fun = dt,
                aes(color = "blue"),
                size = 1.5,
                args = list(df = 1)) +
  stat_function(fun = dt,
                size = 1.5,
                aes(color = "red"),
                args = list(df = 3)) +
  stat_function(fun = dt,
                size = 1.5,
                aes(color = "green"),
                args = list(df = 20))  +
  scale_color_manual(labels = c("normal", "t - 1 GL", "t - 20 GL", "t - 3 GL"),
                     values = c("black", "blue", "red", "green")) +
  ylab("") +
  theme(legend.position = "bottom",
        legend.title = element_blank())

Abaixo, é mostrada a Função Densidade de Probabilidade de uma distribuição t com 20 graus liberdade. As áreas sombreadas em azul escuro representam os quantis que acumulam uma área de \(\alpha / 2\) em cada lado da distribuição, de tal forma que a área destacada em verde representa 1 - \(\alpha\), sendo \(\alpha\) a probabilidade de erro.

Code
ggplot() +
  stat_function(fun = dt, 
                args = list(df = 20),
                geom = "area", 
                fill = "steelblue", 
                xlim = c(-4, -2.08)) +
  stat_function(fun = dt, 
                args = list(df = 20),
                geom = "area", 
                fill = "steelblue", 
                xlim = c(4, 2.08)) +
  stat_function(fun = dt, 
                args = list(df = 20),
                geom = "area", 
                fill = "green", 
                xlim = c(-2.08, 2.08)) +
  stat_function(fun = dt,
                args = list(df = 20),
                size = 1) +
  scale_x_continuous(limits = c(-4, 4),
                     breaks = c(-2.08, 2.08)) +
  scale_y_continuous(expand = expansion(mult = c(0, .1)),
                     breaks = NULL) +
  ylab("")

Intervalo de confiança

A estimação por pontos (ex., média) não nos fornece a ideia da margem de erro cometida ao estimar um determinado parâmetro. Por isso, para verificar se uma dada hipótese \(H_0\) (de igualdade) é ou não verdadeira, deve-se utilizar intervalos de confiança ou testes de hipóteses. A construção destes intervalos, e as particularidades dos testes de hipóteses para amostras independentes e dependentes, serão discutidos a seguir. Recomendo como literatura o livro Estatística Básica escrito pelo Prof. Daniel Furtado Ferreira.

O intervalo de confiança de uma média amostral assumindo uma taxa de erro \(\alpha\) é dado por:

\[ P\left[ {\bar X - {t_{\alpha /2}}\frac{S}{{\sqrt n }} \le \mu \le \bar X + {t_{\alpha /2}}\frac{S}{{\sqrt n }}} \right] = 1 - \alpha \]

Na expressão acima, \(\bar X\) é a média, \(S\) é o desvio padrão e \(-t \frac{\alpha}{2}\) e \(+t\frac{\alpha}{2}\) são os quantis inferior e superior, respectivamente, da distribuição t de Student. O intervalo acima indica que o valor do parâmetro (\(\mu\)) tem \(1 - \alpha\) de chance de estar contido no intervalo.

Exemplo 1 (altura da turma)

Como exemplo de motivação, vamos utilizar os dados referentes a altura (em cm) dos alunos da disciplina de Bioestatística e Experimentação Agrícola, mensurada em sala de aula. A amostra é composta por 25observações.

library(rio)
df_altura <- 
  import("https://docs.google.com/spreadsheets/d/18aXD_2ISvzB8h8_kgOfSBbr9a9d9pT0QVazt-KjVLRw/edit#gid=1590128876") |> 
  metan::remove_rows_na() # remove valores faltantes
Warning: Row(s) 1, 2, 3, 5, 8, 10, 15, 22, 26, 27, 28, 31, 32, 33, 34, 40 with
NA values deleted.
str(df_altura)
'data.frame':   25 obs. of  4 variables:
 $ id    : int  4 7 11 13 14 20 21 29 30 35 ...
 $ aluno : chr  "Bruna Waltrich" "Danielli Zangalli Kern" "Gabriela Araujo Catto" "Helena dos Santos Vanderlinde" ...
 $ crm   : chr  "xx" "xx" "xx" "xx" ...
 $ altura: int  156 169 162 180 166 165 164 170 164 158 ...
 - attr(*, "na.action")= 'omit' Named int [1:16] 1 2 3 5 8 10 15 22 26 27 ...
  ..- attr(*, "names")= chr [1:16] "1" "2" "3" "5" ...

Como n = 25, o grau liberdade para encontrar o quantil da distribuição t é 24. O quantil t associado a este Grau Liberdade, considerando \(\alpha = 0,05\) (2,063) é encontrado na tabela da distribuição t observando-se a linha com GL = 24 e a coluna \(\alpha = 0.05\).

Tamém podemos encontrar este quantil utilizando a função qt(). No próximo código, o quantil (2.5% e 97.5%), a média e o desvio padrão são calculados. Note que

(quantil_t <- qt(c(0.025, 0.975), df = 24))
[1] -2.063899  2.063899
(n <- nrow(df_altura))
[1] 25
(media <- mean(df_altura$altura))
[1] 170.44
(desvpad <- sd(df_altura$altura))
[1] 8.381925

De posse destas informações, podemos calcular o intervalo de confiança (limite inferior, LI e limite superior, LS)

\[ LI = 170,44 - 2,063 \times \frac{{8,38}}{{\sqrt {25} }} = 166,98 \]

\[ LS = 170,44 + 2,063 \times \frac{{8,38}}{{\sqrt {25} }} = 173,90 \]

Para facilitar nossos próximos exemplos, vamos criar uma função para computar o intervalo de confiança 95%.

get_ci_t <- function(media, dp, n){
  quantil_t <- qt(0.975, n - 1)
  semi_amp <- quantil_t * dp / sqrt(n)
  message(
    "[", round(media - semi_amp, 3), " <= mu <= ", round(media + semi_amp, 3), "]"
  )
  return(semi_amp)
}
get_ci_t(media, desvpad, n)
[166.98 <= mu <= 173.9]
[1] 3.459889
Code
df <- 
  tibble(
    media = media,
    desvpad = desvpad,
    LI = media - get_ci_t(media, desvpad, n),
    LS = media + get_ci_t(media, desvpad, n)
  )
[166.98 <= mu <= 173.9]
[166.98 <= mu <= 173.9]
Code
df
# A tibble: 1 × 4
  media desvpad    LI    LS
  <dbl>   <dbl> <dbl> <dbl>
1  170.    8.38  167.  174.
Code
# criar o gráfico com os intervalos
# média geral
ggplot(df, aes(x = media, y = "")) +
  geom_errorbar(aes(xmin = LI,
                    xmax = LS),
                width = 0.1) +
  geom_point(color = "blue",
             size = 3) +
  geom_text(aes(x = LS,
                label = round(LS, 2)),
            vjust = -1) +
  geom_text(aes(x = LI,
                label = round(LI, 2)),
            vjust = -1) +
  scale_x_continuous(breaks = seq(166, 175, by = 1), limits = c(166, 175)) +
  labs(x = "Altura do aluno (cm)",
       y = "") + 
  theme(panel.grid.minor = element_blank())

A função t.test() pode também ser utilizada para calcular o intervalo de confiança de 95% quando se tem apenas uma amostra.

ic <- t.test(df_altura$altura)
ic$conf.int
[1] 166.9801 173.8999
attr(,"conf.level")
[1] 0.95

Exemplo 2 (altura da turma por grupo)

Como temos dois grupos (xx e xy) o intervalo de confiança para a média pode ser calculado para cada grupo. Neste caso é válido utilizar os intervalos de confiança da média como critério para significância da diferença entre duas médias. Médias onde os intervalos de confiança não se sobrepõe podem ser consideradas significativas na probabilidade de erro considerada para o cálculo do intervalo.

Code
library(tidyverse)
# média por cromossomo
df2 <- 
  df_altura |> 
  group_by(crm) |> 
  summarise(media = mean(altura),
            desvpad = sd(altura),
            n = n()) |> 
  mutate(LI = media - get_ci_t(media, desvpad, n),
         LS = media + get_ci_t(media, desvpad, n))
[162.02170.36 <= mu <= 170.134179.974]
[162.02170.36 <= mu <= 170.134179.974]
Code
# criar o gráfico com os intervalos
# média por cromossomo
ggplot(df2, aes(x = media, y = crm)) +
  geom_errorbar(aes(xmin = LI,
                    xmax = LS,
                    color = crm),
                width = 0.1) +
  geom_point(aes(color = crm),
             size = 3) +
  geom_text(aes(x = LS,
                label = round(LS, 2)),
            vjust = -1,
            size = 2.5) +
  geom_text(aes(x = LI,
                label = round(LI, 2)),
            vjust = -1,
            size = 2.5) +
  labs(x = "Altura do aluno (cm)",
       y = "Cromossomo") + 
  theme(panel.grid.minor = element_blank())

Exemplo 3 (peso de frango)

Considere um aviário com 15000 frangos. O criador realizou a amostragem de 25 frangos aleatoriamente para realizar uma estimativa da média do peso do lote visando a programação para abate. Após analisar as pesagens coletadas, o produtor encontrou uma média de 2,83 Kg e um desvio padrão de 0,27 Kg. Pergunta-se: Qual o intervalo de 95% para a média estimada?

Code
df3 <- tibble(
  media = 2.83,
  desvpad = 0.27,
  LI = media - get_ci_t(media, desvpad, n = 25),
  LS = media + get_ci_t(media, desvpad, n = 25)
)
[2.719 <= mu <= 2.941]
[2.719 <= mu <= 2.941]
Code
ggplot(df3, aes(x = media, y = "")) +
  geom_errorbar(aes(xmin = LI,
                    xmax = LS),
                width = 0.1) +
  geom_point(color = "blue",
             size = 3) +
  labs(x = "Peso médio do frango",
       y = "")

Variação no desvio padrão

Abaixo, são simuladas 4 amostras de n = 20 com médias igual a 10 e desvios padrões variantes. Note como o intervalo de confiança é menor a medida em que o desvio padrão é mais baixo.

Code
df4 <- tibble(
  amostra = paste0(1:4),
  media = c(10, 10, 10, 10),
  desvpad = c(1, 4, 6, 8),
  LI = media - get_ci_t(media, desvpad, n = 20),
  LS = media + get_ci_t(media, desvpad, n = 20),
  lab = paste0("dp: ", desvpad)
)
[9.5328.1287.1926.256 <= mu <= 10.46811.87212.80813.744]
[9.5328.1287.1926.256 <= mu <= 10.46811.87212.80813.744]
Code
df4
# A tibble: 4 × 6
  amostra media desvpad    LI    LS lab  
  <chr>   <dbl>   <dbl> <dbl> <dbl> <chr>
1 1          10       1  9.53  10.5 dp: 1
2 2          10       4  8.13  11.9 dp: 4
3 3          10       6  7.19  12.8 dp: 6
4 4          10       8  6.26  13.7 dp: 8
Code
# criar o gráfico com os intervalos
ggplot(df4, aes(x = media, y = amostra)) +
  geom_vline(xintercept = 10, linetype = 2) + 
  geom_errorbar(aes(xmin = LI,
                    xmax = LS),
                width = 0.1) +
  geom_point(color = "blue",
             size = 3) +
  scale_x_continuous(breaks = seq(169, 177, by = 1)) +
  geom_text(aes(label = lab),
            vjust = -1,
            hjust = 2) +
  labs(x = "Variável hipotética",
       y = "Amostra")

Variação no tamanho da amostra

Code
df_t <- tibble(
  dist = "t",
  n = seq(2, 30, length.out = 200),
  media = 10,
  desvpad = 2,
  UL = media + get_ci_t(media, desvpad, n = n),
  LL = media - get_ci_t(media, desvpad, n = n)
)
[-7.969-3.041-0.1791.6462.8923.7894.4614.9835.3985.7376.0186.2556.4586.6336.7876.9237.0447.1527.257.3397.427.4947.5637.6267.6847.7397.797.8387.8837.9257.9658.0028.0388.0728.1048.1358.1648.1928.2188.2448.2688.2918.3148.3368.3568.3768.3968.4148.4338.458.4678.4838.4998.5148.5298.5448.5588.5718.5848.5978.618.6228.6348.6458.6578.6688.6798.6898.6998.7098.7198.7298.7388.7478.7568.7658.7738.7828.798.7988.8068.8148.8218.8298.8368.8438.858.8578.8648.8718.8778.8848.898.8968.9028.9088.9148.928.9268.9318.9378.9438.9488.9538.9588.9648.9698.9748.9798.9838.9888.9938.9989.0029.0079.0119.0169.029.0249.0289.0339.0379.0419.0459.0499.0539.0579.069.0649.0689.0729.0759.0799.0829.0869.0899.0939.0969.19.1039.1069.119.1139.1169.1199.1229.1259.1289.1319.1349.1379.149.1439.1469.1499.1529.1549.1579.169.1639.1659.1689.1719.1739.1769.1789.1819.1839.1869.1889.1919.1939.1969.1989.29.2039.2059.2079.219.2129.2149.2169.2189.2219.2239.2259.2279.2299.2319.2339.2359.2379.2399.2419.2439.2459.2479.2499.2519.253 <= mu <= 27.96923.04120.17918.35417.10816.21115.53915.01714.60214.26313.98213.74513.54213.36713.21313.07712.95612.84812.7512.66112.5812.50612.43712.37412.31612.26112.2112.16212.11712.07512.03511.99811.96211.92811.89611.86511.83611.80811.78211.75611.73211.70911.68611.66411.64411.62411.60411.58611.56711.5511.53311.51711.50111.48611.47111.45611.44211.42911.41611.40311.3911.37811.36611.35511.34311.33211.32111.31111.30111.29111.28111.27111.26211.25311.24411.23511.22711.21811.2111.20211.19411.18611.17911.17111.16411.15711.1511.14311.13611.12911.12311.11611.1111.10411.09811.09211.08611.0811.07411.06911.06311.05711.05211.04711.04211.03611.03111.02611.02111.01711.01211.00711.00210.99810.99310.98910.98410.9810.97610.97210.96710.96310.95910.95510.95110.94710.94310.9410.93610.93210.92810.92510.92110.91810.91410.91110.90710.90410.910.89710.89410.8910.88710.88410.88110.87810.87510.87210.86910.86610.86310.8610.85710.85410.85110.84810.84610.84310.8410.83710.83510.83210.82910.82710.82410.82210.81910.81710.81410.81210.80910.80710.80410.80210.810.79710.79510.79310.7910.78810.78610.78410.78210.77910.77710.77510.77310.77110.76910.76710.76510.76310.76110.75910.75710.75510.75310.75110.74910.747]
[-7.969-3.041-0.1791.6462.8923.7894.4614.9835.3985.7376.0186.2556.4586.6336.7876.9237.0447.1527.257.3397.427.4947.5637.6267.6847.7397.797.8387.8837.9257.9658.0028.0388.0728.1048.1358.1648.1928.2188.2448.2688.2918.3148.3368.3568.3768.3968.4148.4338.458.4678.4838.4998.5148.5298.5448.5588.5718.5848.5978.618.6228.6348.6458.6578.6688.6798.6898.6998.7098.7198.7298.7388.7478.7568.7658.7738.7828.798.7988.8068.8148.8218.8298.8368.8438.858.8578.8648.8718.8778.8848.898.8968.9028.9088.9148.928.9268.9318.9378.9438.9488.9538.9588.9648.9698.9748.9798.9838.9888.9938.9989.0029.0079.0119.0169.029.0249.0289.0339.0379.0419.0459.0499.0539.0579.069.0649.0689.0729.0759.0799.0829.0869.0899.0939.0969.19.1039.1069.119.1139.1169.1199.1229.1259.1289.1319.1349.1379.149.1439.1469.1499.1529.1549.1579.169.1639.1659.1689.1719.1739.1769.1789.1819.1839.1869.1889.1919.1939.1969.1989.29.2039.2059.2079.219.2129.2149.2169.2189.2219.2239.2259.2279.2299.2319.2339.2359.2379.2399.2419.2439.2459.2479.2499.2519.253 <= mu <= 27.96923.04120.17918.35417.10816.21115.53915.01714.60214.26313.98213.74513.54213.36713.21313.07712.95612.84812.7512.66112.5812.50612.43712.37412.31612.26112.2112.16212.11712.07512.03511.99811.96211.92811.89611.86511.83611.80811.78211.75611.73211.70911.68611.66411.64411.62411.60411.58611.56711.5511.53311.51711.50111.48611.47111.45611.44211.42911.41611.40311.3911.37811.36611.35511.34311.33211.32111.31111.30111.29111.28111.27111.26211.25311.24411.23511.22711.21811.2111.20211.19411.18611.17911.17111.16411.15711.1511.14311.13611.12911.12311.11611.1111.10411.09811.09211.08611.0811.07411.06911.06311.05711.05211.04711.04211.03611.03111.02611.02111.01711.01211.00711.00210.99810.99310.98910.98410.9810.97610.97210.96710.96310.95910.95510.95110.94710.94310.9410.93610.93210.92810.92510.92110.91810.91410.91110.90710.90410.910.89710.89410.8910.88710.88410.88110.87810.87510.87210.86910.86610.86310.8610.85710.85410.85110.84810.84610.84310.8410.83710.83510.83210.82910.82710.82410.82210.81910.81710.81410.81210.80910.80710.80410.80210.810.79710.79510.79310.7910.78810.78610.78410.78210.77910.77710.77510.77310.77110.76910.76710.76510.76310.76110.75910.75710.75510.75310.75110.74910.747]
Code
df_n <- tibble(
  dist = "normal",
  n = seq(2, 30, length.out = 200),
  media = 10,
  desvpad = 2,
  UL = media + qnorm(0.975) * desvpad / sqrt(n),
  LL = media - qnorm(0.975) * desvpad / sqrt(n)
)
df_dists <- rbind(df_t, df_n)

# criar o gráfico com os intervalos
ggplot(df_dists, aes(color = dist)) +
  geom_line(aes(x = n, y = LL), size = 1) +
  geom_line(aes(x = n, y = UL), size = 1) +
  scale_x_continuous(breaks = seq(2, 30, by = 2)) +
  labs(x = "Tamanho da amostra",
       y = "Intervalo de confiança (95%)") +
  theme(legend.position = "bottom",
        legend.title = element_blank())

Testes de hipóteses

Os testes de hipóteses são utilizados para determinar quais resultados de um estudo científico podem levar à rejeição da hipótese nula (\(H_0\)) a um nível de significância pré–estabelecido. Os testes de hipóteses aqui demonstrados tem como objetivo:

1) verificar se determinada amostra difrere ou não de zero (\({H_0}:\mu = 0\));

2) Verificar se duas amostras independentes são ou não iguais (\({H_0}:{\mu _1} = {\mu _2}\));

2) Verificar se duas amostras dependentes possuem desvios iguais a zero (\({H_0}:d_i = 0\)).

Teste de hipótese para uma amostra

No caso de uma amostra, a estatística teste (t calculado) é dada por

\[ {t_{c(\alpha; \nu)}} = \frac{{\bar Y - \mu }}{{\frac{{{S_Y}}}{{\sqrt n }}}} \]

Onde \(\alpha\) é a probabilidade de erro, \(\nu\) é o grau de liberdade (nº de amostras menos 1), \(\bar Y\) é a média da amostra, \(S_y\) é o desvio padrão da amostra e \(n\) é o número de amostras.

Vamos retornar ao exemplo da altura da turma. A média da amostragem é de 170,44 cm. Digamos que a altura média dos alunos da UFSC é de 165 cm. Pode-se dizer que a estimativa da altura da turma de Bioestatística difere de 165 cm, considerando uma taxa de erro de 5%?

Primeiramente, define-se as hipóteses;

\[ {H_0}:170,44 = 165 \]

\[ H_1:170,44 \ne 165 \]

altura <- df_altura$altura
(dp <- sd(altura))
[1] 8.381925
(media <- mean(altura))
[1] 170.44
(n <- length(altura))
[1] 25
(t_tab <- qt(0.975, df = n - 1))
[1] 2.063899

\[ {t_c} = \frac{{170,44 - 165}}{{\frac{{8,38}}{{\sqrt {25} }}}} \]

\[ {t_c} = 3,245 \]

Como o t calculado (3,245) é maior que o t tabelado (2,064), rejeita-se a hipótese nula e afirma-se que a estimativa da média da altura da turma difere de 165 cm. Este mesmo teste pode ser realizado com a função t.test().

# t tabelado
t.test(altura, mu = 165)

    One Sample t-test

data:  altura
t = 3.2451, df = 24, p-value = 0.003443
alternative hypothesis: true mean is not equal to 165
95 percent confidence interval:
 166.9801 173.8999
sample estimates:
mean of x 
   170.44 

Teste de hipóteses para amostras independentes

Neste tipo de teste de hipótese, o objetivo é comparar se a estimativa da média de um grupo “A” difere estatisticamente da estimativa da média de um grupo “B”. Utilizaremos como amostras os dados da altura dos alunos, onde deseja-se testar a hipótese de diferença entre as médias da altura dos homens (\(\bar X_{xx}\)) e das mulheres (\(\bar X_{xx}\)). Primeiramente, define-se as hipóteses:

\[ {H_0}:\bar X_{xx} = \bar X_{xy} \]

\[ {H_1}:\bar X_{xx} \ne \bar X_{xy} \]

Code
#gráfico
ggplot(df_altura, aes(altura, fill = crm)) +
  geom_density(alpha = 0.6) +
  scale_fill_manual(values = c("green", "red")) +
  theme(legend.position = "bottom",
        legend.title = element_blank())

Neste caso, a estatística do teste é dada por

\[ {t_c} = \frac{{\left( {{{\bar X}_{xy}} - {{\bar X}_{xx}}} \right)}}{{\sqrt {S_p^2\left( {\frac{1}{{{n_{xy}}}} + \frac{1}{{{n_{xx}}}}} \right)} }} \]

Onde

\[ S_p^2 = \frac{{\left( {{n_{xy}} - 1} \right)S_{{xy}}^2 + \left( {{n_{xx}} - 1} \right)S_{{xx}}^2}}{{{n_{xy}} + {n_{xx}} - 2}} \]

Onde \(\bar X_{xy}\), \(n_{xy}\) e \(S^2_{xy}\) são a média, o tamanho da amostra e a variância para a amostra da altura dos homens; \(\bar X_{xx}\), \(n_{xx}\) e \(S^2_{xx}\) são a média, o tamanho da amostra e a variância para a amostra da altura das mulheres. Vamos calcular estas estatísticas para os dados em questão. A estatística de teste é então comparada com o t tabelado com 23 (12 + 13 - 2) Graus Liberdade.

df_altura |> 
  desc_stat(altura,
            by = crm,
            stats = c("n, mean, var.amo")) |> 
  as.data.frame()
  crm variable  n     mean var.amo
1  xx   altura 13 166.0769 45.0769
2  xy   altura 12 175.1667 57.2424
(t_tab <- qt(0.975, df = 23))
[1] 2.068658

Com base nos valores obtidos, a estatística t é obtida com:

\[ S_p^2 = \frac{{\left( {12 - 1} \right)57,242 + \left( {13 - 1} \right)45,077}}{{12 + 13 - 2}} \]

\[ S_p^2 = 50,895 \]

\[ {t_c} = \frac{{\left( {175,167-166,077} \right)}}{{\sqrt {50,894\left( {\frac{1}{{12}} + \frac{1}{{13}}} \right)} }} \]

\[ {t_c} = 3,1825 \]

Como \(3,18 > 2,064\), rejeita-se a hipótese \(H_0\) e conclui-se que as médias dos dois grupos são estatisticamente distintas. Usando a função t.test(), este teste de hipótese é realizado com:

# testa se as amostras difrem entre si
t.test(altura ~ crm, data = df_altura, var.equal = TRUE)

    Two Sample t-test

data:  altura by crm
t = -3.1828, df = 23, p-value = 0.004146
alternative hypothesis: true difference in means between group xx and group xy is not equal to 0
95 percent confidence interval:
 -14.997666  -3.181821
sample estimates:
mean in group xx mean in group xy 
        166.0769         175.1667 

O pacote ggstatplot pode ser utilizado para confecionar gráficos que incluem teste de hipóteses.

Code
library(ggstatsplot)

ggbetweenstats(df_altura, 
               x = crm,
               y = altura,
               plot.type = "box",
               bf.message = FALSE,
               k = 3, # dígitos
               var.equal = TRUE)

Teste de hipóteses para amostras dependentes

As formas de comparação discutidas acima consideram as amostras como sendo independentes entre si. Em certas ocasiões, um mesmo indivíduo de uma amostra é medido ao longo do tempo ou avaliado antes ou depois da aplicação de um determinado tratamento.

Assim, nessas ocasiões, é possível avaliar se a diferença média das observações é estatisticamente igual a zero ou não. Se esta diferença for estatisticamente diferente de zero, pode-se afirmar que tal tratamento possui efeito significativo.

A estatística do teste t para amostras pareadas é dada por

\[ {t_c} = \frac{{\bar D}}{{\frac{{{S_D}}}{{\sqrt n }}}} \sim {t_{\left( {\alpha ,\nu } \right)}} \]

Onde \(\bar D\) é a média das diferenças e \(S_D\) é o desvio padrão das diferenças.

A fim de determinar a eficiência de um medicamento antitérmico, a temperatura corporal (em graus Celsius) de 7 indivíduos foi medida. Em seguida, foi administrado o medicamento e após uma hora a temperatura foi medida novamente.

paired <- 
  import("https://docs.google.com/spreadsheets/d/1JMrkppvv1BdGKVCekzZPsPYCKcgUWjxpuDlWqejc22s/edit#gid=1507821405",
         dec = ",")
paired
  INDIVIDUO ANTES DEPOIS DIFERENCA
1         1  37.5   36.8      -0.7
2         2  36.0   35.4      -0.6
3         3  39.0   37.6      -1.4
4         4  38.0   37.2      -0.8
5         5  37.8   36.9      -0.9
6         6  38.5   37.7      -0.8
7         7  39.3   38.0      -1.3
(mean_dif <- mean(paired$DIFERENCA))
[1] -0.9285714
(dp_dif <- sd(paired$DIFERENCA))
[1] 0.3039424
(n <- length(paired$DIFERENCA))
[1] 7

A estatística de teste é dada por:

\[ {t_c} = \frac{{-0.928 - 0}}{{\frac{{0,3039}}{{\sqrt {7} }}}} \]

\[ t_c = -8,079 \]

antes <- paired$ANTES
depois <- paired$DEPOIS
t.test(depois, antes, paired = TRUE, var.equal = TRUE)

    Paired t-test

data:  depois and antes
t = -8.083, df = 6, p-value = 0.0001921
alternative hypothesis: true mean difference is not equal to 0
95 percent confidence interval:
 -1.2096712 -0.6474716
sample estimates:
mean difference 
     -0.9285714 

Note que o mesmo resultado é obtido ao se realizar um teste para uma amostra utilizando a diferença calculada.

t.test(paired$DIFERENCA, var.equal = TRUE)

    One Sample t-test

data:  paired$DIFERENCA
t = -8.083, df = 6, p-value = 0.0001921
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
 -1.2096712 -0.6474716
sample estimates:
 mean of x 
-0.9285714 

Exercícios distribuição t

Questão 1

Um experimento visando comparar dois híbridos de milho (H1 e H2) obteve dados da massa de grãos (MGRA) e número de grãos (NGRA) por espiga, apresentados abaixo.

df <- import("https://docs.google.com/spreadsheets/d/1JMrkppvv1BdGKVCekzZPsPYCKcgUWjxpuDlWqejc22s/edit#gid=1657403926",
             
             dec = ",")

df
   HIBRIDO MGRA NGRA
1       H1  219  570
2       H1  280  665
3       H1  224  627
4       H1  243  644
5       H1  289  734
6       H1  203  541
7       H1  148  409
8       H1  246  652
9       H1  129  384
10      H1  246  709
11      H2  226  529
12      H2  208  531
13      H2  132  339
14      H2  125  295
15      H2  224  533
16      H2  113  498
17      H2  122  497
18      H2  114  521
19      H2  119  640
20      H2   61  196
# encontrando o desvio padrão e a média

df |>
  desc_stat(MGRA, NGRA,
            by = HIBRIDO,
            stats = c("mean, sd.amo, n")) |>
  as.data.frame()
  HIBRIDO variable  mean   sd.amo  n
1      H1     MGRA 222.7  51.5753 10
2      H1     NGRA 593.5 118.5685 10
3      H2     MGRA 144.4  55.3598 10
4      H2     NGRA 457.9 135.6396 10

Assumindo que as variáveis MGRA e NGRA seguem uma distribuição normal, utilize um teste t para testar a hipótese de diferença das médias destas variáveis entre os dois híbridos. Após a obtenção dos resultados, realize a interpretação para cada variável.

  • Variável MGRA

\[ {t_c} = \frac{{\left( {{{\bar x}_1} - {{\bar x}_2}} \right)}}{{\sqrt {S_p^2\left( {\frac{1}{{{n_1}}} + \frac{1}{{{n_2}}}} \right)} }} \]

\[ S_p^2 = \frac{{\left( {10 - 1} \right)51,575^2 + \left( {10 - 1} \right)55,359^2}}{{10 + 10 - 2}} \]

\[ 2862,299 \]

\[ {t_c} = \frac{{\left( {{222,7} - {144,4}} \right)}}{{\sqrt {2862,299\left( {\frac{1}{{10}} + \frac{1}{{10}}} \right)} }} \]

\[ t_c = 3,2725 \]

A aplicação no software R, é dada no seguinte exemplo

Code
t.test(MGRA ~ HIBRIDO, data = df, var.equal = TRUE)

    Two Sample t-test

data:  MGRA by HIBRIDO
t = 3.2725, df = 18, p-value = 0.00423
alternative hypothesis: true difference in means between group H1 and group H2 is not equal to 0
95 percent confidence interval:
  28.03252 128.56748
sample estimates:
mean in group H1 mean in group H2 
           222.7            144.4 
Code
library(ggstatsplot)

ggbetweenstats(df,
               
               x = HIBRIDO,
               
               y = MGRA,
               
               plot.type = "box",
               
               bf.message = FALSE,
               
               var.equal = TRUE)

  • Variável NGRA

\[ S_p^2 = \frac{{\left( {10 - 1} \right)118,5685^2 + \left( {10 - 1} \right)135,6396^2}}{{10 + 10 - 2}} \]

\[ 16228,29 \]

\[ {t_c} = \frac{{\left( {{593,5} - {457,9}} \right)}}{{\sqrt {16228,29\left( {\frac{1}{{10}} + \frac{1}{{10}}} \right)}}} \]

\[ t_c = 2,38 \]

Code
t.test(NGRA ~ HIBRIDO, data = df, var.equal = TRUE)

    Two Sample t-test

data:  NGRA by HIBRIDO
t = 2.3802, df = 18, p-value = 0.02856
alternative hypothesis: true difference in means between group H1 and group H2 is not equal to 0
95 percent confidence interval:
  15.90901 255.29099
sample estimates:
mean in group H1 mean in group H2 
           593.5            457.9 
Code
ggbetweenstats(df,
               
               x = HIBRIDO,
               
               y = NGRA,
               
               plot.type = "box",
               
               bf.message = FALSE,
               
               var.equal = TRUE)

O valor de t tabelado para 5% de erro e grau liberdade de 18 é 2,10.

qt(0.975, df = 18)
[1] 2.100922

Considerando os resultados do teste de hipótese, rejeita-se a hipótese nula para as duas variáveis e afirma-se que as médias dos dois híbridos para MGRA e NGRA por espiga são diferentes.

Questão 2

Nos últimos anos, o melhoramento ganhou ferramentas que aumentam a eficiência no desenvolvimento de novas cultivares. Dentre essas, pode-se citar a genotipagem por meio do mapeamento genético e marcadores moleculares, gerando uma infinidade de informações genéticas. No entanto, mesmo com o avanço exponencial desse ramo da ciência, há ainda uma enorme necessidade de obtenção de dados fenotípicos confiáveis 2.

Técnicas que utilizam visão computacional e análise de imagens possibilitam ganho de tempo e, principalmente recursos durante as etapas do melhoramento. Com tais análises, é possível obter grande quantidade de dados em pouco tempo. No entanto, é necessário que tais medidas sejam acuradas, ou seja, representem fidedignamente os valores reais observados. Para validar a obtenção de medidas de comprimento e largura de folhas via imagens, medidas de comprimento e largura de 15 folhas foram obtidas utilizando duas técnicas. A primeira, utilizando análises de imagens no pacote R pliman e a segunda por meio do auxílio de uma régua. Os dados coletados são encontrados a seguir.

library(rio)

library(metan)

library(tidyverse)

df <- import("https://docs.google.com/spreadsheets/d/1JMrkppvv1BdGKVCekzZPsPYCKcgUWjxpuDlWqejc22s/edit#gid=2115165499",
             
             dec = ",")

df
   folha metodo comprimento largura
1      1  regua       16.50    6.40
2      2  regua       16.00    4.70
3      3  regua       12.50    3.40
4      4  regua       10.00    4.20
5      5  regua        7.60    3.40
6      6  regua        6.80    3.20
7      7  regua       14.10    6.80
8      8  regua        9.90    4.80
9      9  regua        9.70    4.30
10    10  regua        6.50    2.60
11    11  regua        5.70    2.50
12     1   foto       15.64    6.66
13     2   foto       15.40    4.55
14     3   foto       12.29    3.38
15     4   foto        9.71    4.16
16     5   foto        7.66    3.41
17     6   foto        6.67    3.17
18     7   foto       14.55    6.90
19     8   foto       10.22    4.98
20     9   foto        9.96    4.46
21    10   foto        6.61    2.72
22    11   foto        5.94    2.54

Considerando que as medidas (régua e foto) foram obtidas no mesmo indivíduo, utilize um teste t pareado para testar, a 5% de probabilidade de erro, se o método de mensuração por imagem difere do método manual (por régua) para as variáveis em questão.

# variável comprimento da folha

# ex

comp_foto <- df |> subset(metodo == "foto") |> pull(comprimento)

comp_foto
 [1] 15.64 15.40 12.29  9.71  7.66  6.67 14.55 10.22  9.96  6.61  5.94
comp_regua <- df |> subset(metodo == "regua") |> pull(comprimento)

comp_regua
 [1] 16.5 16.0 12.5 10.0  7.6  6.8 14.1  9.9  9.7  6.5  5.7
# calcula a diferença

dif <- comp_foto - comp_regua

dif
 [1] -0.86 -0.60 -0.21 -0.29  0.06 -0.13  0.45  0.32  0.26  0.11  0.24
# realiza um teste t com a diferença

t.test(dif)

    One Sample t-test

data:  dif
t = -0.48217, df = 10, p-value = 0.6401
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
 -0.3321539  0.2139721
sample estimates:
  mean of x 
-0.05909091 
# mesma coisa informando as duas médias com 'paired = TRUE'

t.test(comprimento ~ metodo, data = df, paired = TRUE)

    Paired t-test

data:  comprimento by metodo
t = -0.48217, df = 10, p-value = 0.6401
alternative hypothesis: true mean difference is not equal to 0
95 percent confidence interval:
 -0.3321539  0.2139721
sample estimates:
mean difference 
    -0.05909091 
# variável largura da folha

t.test(largura ~ metodo, data = df, paired = TRUE)

    Paired t-test

data:  largura by metodo
t = 1.5996, df = 10, p-value = 0.1408
alternative hypothesis: true mean difference is not equal to 0
95 percent confidence interval:
 -0.02250533  0.13705079
sample estimates:
mean difference 
     0.05727273 

Questão 3

Um Engenheiro Florestal realizou mensurações do Diâmetro a Altura do Peito em duas áreas plantadas de eucalipto. Ambas as áreas possuem 05 anos de idade, mas se encontram em diferentes tipos de solo. Após coletar os dados, os seguintes valores foram obtidos:

Parâmetro | Área 1 | Área 2 |

|—————|——–|——–|

\(\bar X (cm)\) | 11,5 | 13,6 |

S (cm) | 3 | 5 |

n (contagem) | 23 | 31 |

Com base nessas informações, calcule o intervalo de confiança de 95% para as médias do DAP da área 1 e área 2 e, com base nos intervalos, justifique se a média do DAP das duas áreas pode ser considerada estatisticamente diferente.

Code
df <- tibble(
  area = c("Área 1", "Área 2"),
  media = c(11.5, 13.6),
  desvpad = c(3, 5),
  n = c(20, 31),
  LI = media - get_ci_t(media, desvpad, n),
  LS = media + get_ci_t(media, desvpad, n)
)
[10.09611.766 <= mu <= 12.90415.434]
[10.09611.766 <= mu <= 12.90415.434]
Code
df
# A tibble: 2 × 6
  area   media desvpad     n    LI    LS
  <chr>  <dbl>   <dbl> <dbl> <dbl> <dbl>
1 Área 1  11.5       3    20  10.1  12.9
2 Área 2  13.6       5    31  11.8  15.4
Code
# criar o gráfico com os intervalos

ggplot(df, aes(x = media, y = area)) +
  geom_errorbar(aes(xmin = LI,
                    xmax = LS),
                width = 0.1) +
  geom_point(size = 3) +
  labs(x = "Diâmetro a Altura do Peito (cm)",
       y = "")

Considerando que os intervalos de confiança se cruzam, pode-se afirmar que as médias não diferem estatisticamente. Vamos testar esta hipótese utilizando um teste t?. Neste caso, o t calculado é comparado com o t tabelado a 52 (23 + 31 - 2) graus liberdade.

qt(0.975, df = 52)
[1] 2.006647

\[ {t_c} = \frac{{11,5 - 13,6}}{{\sqrt {\frac{{\left( {20 - 1} \right){3^2} + \left( {31 - 1} \right){5^2}}}{{20 + 31 - 2}} \times \left( {\frac{1}{{20}} + \frac{1}{{31}}} \right)} }} \]

\[ {t_c} = 1,688 \]

Como o t calculado foi menor que o tabelado, não rejeita-se a hipótese nula de diferença entre as médias, assumindo-se que as médias são estatisticamente iguais.