Teste de Hipóteses: Definições
O objetivo de um teste de hipótese é testar a veracidade de uma hipótese, a hipótese nula, contra uma outra hipótese, chamada de alternativa. Em geral, assume-se que as duas hipóteses são complementares.
Matematicamente, temos um problema estatístico que envolve um parâmetro desconhecido. Suponha que particionemos e estamos interessados se está em ou está em . Dividimos essa parte nos seguintes itens:
- Hipótese Nula e Alternativa
- Região Crítica
- Estatística de Teste
- Função de Poder
- Tipos de Erro
- Nível e tamanho do teste
- P-valor
Hipótese Nula e Alternativa
Dizemos que é a hipótese de que e chamamos de hipótese nula, enquanto é a hipótese alternativa e representa . Queremos decidir qual das hipóteses é verdadeira (e só uma será, porque a partição é disjunta). Se decidimos que , rejeitamos , e se , não rejeitamos .
Hipótese Simples e Composta
Suponha que formam uma amostra aleatória com pdf . Queremos testar a hipótese de que
Se contem apenas um valor, então é dita hipótese simples. Se contém mais de um valor, dizemos que é composta.
Hipótese Unilateral e Bilateral
Seja um parâmetro unidimensional. Dizemos que a hipótese é unilateral (ou one tailed) quando é da forma ou . Ela será bilateral quando é do tipo .
Região Crítica
Suponha que queremos testar a hipótese de que
Quando queremos decidir qual hipótese escolher, observamos uma amostra dessa distribuição no espaço de amostras . O dever do estatístico é especificar um procedimento que particione o conjunto em dois subconjuntos e , onde contém os valores de que rejeitam .
Região crítica é o conjunto , isto é, o conjunto de amostras que, a partir de um procedimento, rejeita .
Esse tipo de teste também é chamado de não randomizado, visto que após a observação das amostras, ele está defoinido.
Estatística de Teste
Seja . Sejam uma estatística e um subconjunto da reta. Suponha que nosso procedimento de teste é o seguinte:
Rejeitamos se .
Chamamos de estatística de teste e de região de rejeição. Dessa forma a região crítica será: .
Na prática a maioria dos testes é do tipo
Rejeitamos se .
Observação: É importante lembrar que há duas diferentes divisões: , que é a divisão do espaço dos parâmetros, e é a divisão do espaço das amostras. Mas qual a relação entre eles? Se , então rejeitamos a hipótese . Além do mais, podemos encontrar e , mas dificilmente saberemos em qual dos conjuntos pertence com certeza.
Função de Poder e Tipos de Erro
A função poder é uma forma de mensurar a performance de um teste com fixo.
Função Poder
Seja um procedimento de teste (como esse assinalado acima). Se é a região crítica,
em que a última igualdade ocorre quando o proocedimento de teste é o citado acima.
O seu significado?
É a probabilidade, para cada valor de , de que rejeita . Queremos, intuitivamente que:
Entretanto isso não é em geral o que acontece. Por isso definimos:
Erros I e II
rejeita | Erro Tipo I | Certo |
não rejeita | Certo | Erro Tipo II |
Portanto se é a probabilidade de cometermos o erro do tipo I. Se é a probabilidade de cometer o erro do tipo II.
Nível/Tamanho
Um teste que satisfaz é chamado de teste nível , ou que o teste tem nível de significância .
O tamanho ou nível de significância de um teste é
Um teste terá nível se, e só se, seu tamanho for no máximo .
Com isso, é a pior chance de rejeitarmos de forma errônea.
Randomização
Por razões técnicas, as vezes é desejável haver uma randomização externa para se tomar uma decisão de rejeitar ou não uma hipótese.
Isso é feito da seguinte maneira.
Seja uma função de teste ou crítica tal que seja a chance de rejeitarmos .
Assim,
A maior vantagem de usar randomização é que a combinação convexa de funções críticas é uma função crítica.
P-valor
É o menor nível tal que rejeitaríamos a hipótese nula a nível com os dados observados.
Se rejeitamos a hipótese nula se, e somente se, o p-valor é no máximo , estamos usando um teste com nível de significância .
Compreensão e Implementação
Teste de hipótese é um método para que façamos decisões estatísticas a partir dos dados. É uma forma de compreender (fazer inferância sobre) um parâmetro.
Exemplo: Belgas tem, em média, maior altura do que peruanos.
Exemplo 2: Temperatura não é um fator relevante para o processo de cultivo de uva.
Estamos avaliando afirmações mutualmente exclusivas, ou os belgas tem maior altura do que os peruanos, ou não tem! Queremos saber qual dessas afirmações é suportada pelos dados que obtivermos.
A hipótese nula é a afirmação a ser testada e muitas vezes estabelece uma conjectura de que as características observadas em uma população são por um acaso, isto é, o fator a ser estudado "não existe". Por exemplo: o número de voos entre Rio de Janeiro e São Paulo não tem correlação com o nível do mar no Japão.
Em geral queremos anulá-la, rejeitá-la (daí o nome).
Exemplo
Vamos considerar um exemplo simples utilizando a distribuição normal. É a distribuição com cálculos simples e uma boa visualização. A ideia nesse exemplo vai ser a seguinte:
O preço do quilo ouro varia diariamente e essa variação em unidade de dólares será nosso objeto de interesse. Por exemplo: Se no dia 1 o preço mil e no dia 2 o preço era 1 050 e no dia 3 o preço é 1 025 temos que e . Vamos supor que as variações entre dois diferentes pares de dias são independentes (essa já uma simplificação da realidade!)
Primeiro vamos importar os dados.
```python import pandas as pd import numpy as np
import matplotlib.pyplot as plt import matplotlib.patches as mpatches import seaborn as sns sns.set() ```
```python gold_df = pd.read_csv('../data/gold.csv', low_memory = False, header=[2,3,4])
There has a lot of data. I will get average diary from USD price
gold_df = gold_df[[('Priced In', 'Price Type', 'Summary'), ('USD', 'Ask', 'Average')]] gold_df.columns = ['Day', 'Price'] gold_df.head() ```
Day | Price | |
---|---|---|
0 | 1/01/68 | NaN |
1 | 2/01/68 | NaN |
2 | 3/01/68 | NaN |
3 | 4/01/68 | NaN |
4 | 5/01/68 | NaN |
Observe que existem diversos Nan values. Na prática eu teria que fazer alguma espécie de limpeza rigorosa. Nesse caso, para tornar tudo bem simples, vou apenas limpar. Também precisamos garantir que as informações estejam em formato float
.
```python
Inplace assegura que eu não crie outro DataFrame
gold_df.dropna(inplace = True) gold_df.Price = gold_df.Price.apply(lambda x: float(x.strip().replace(',', ''))) ```
python
plt.plot(gold_df['Price'])
plt.title('Preço do Ouro em Dólares')
plt.show()
python
variation = gold_df.Price.diff()
sns.violinplot(x = variation)
plt.xlim((-50,50))
plt.title('Distribuição da variação diária')
plt.show()
De fato não parece uma normal (na verdade uma distribuição de cauda mais pesada talvez fosse interessante. Mas tudo bem!), mas vamos modelar dessa forma. A partir de agora vamos nos preocupar mais com as definições para dar a devida interpretação. O exemplo é só motivador.
Qual hipótese queremos testar? O que queremos saber sobre a variação?
A pergunta que nasce é o seguinte: será que a média dessa distribuição é 0? Isto é, será que se calcularmos as médias das variações, teremos que com infinitas observações, o resultado seria 0? Isso é importante porque vai nos ajudar a identificar se existe uma tendência de crescimento nas variações diárias.
Hipótese Nula: , onde .
Hipótese Alternativa: .
Vamos supor que é conhecido e que , mas a média é desconhecida.
- Quem é e ?
é a região dos parâmetros onde a hipótese nula é verdadeira, isto é , é um conjunto unitário. Por outro lado , por que a média pode assumir, em teoria, qualquer valor real.
- Qual é a região crítica?
Bom, ainda não podemos determinar essa resposta, afinal para determinar a região crítica (subconjunto do espaço dos estados em que se rejeita a hipótese nula), precisamos de um procedimento de teste. Mas vamos imaginar que o espaço de estados é , pois vamos considerar apenas duas amostras, inicialmente (queremos visualizar S).
- Qual será nosso procedimento de teste?
Procedimento de teste é uma maneira de tomarmos uma decisão. Ele tem a forma: rejeitamos se isso acontecer.
Um exemplo bobo seria: Rejeitamos a hipótese nula se
O problema é que em geral esse tipo de procedimento não é interessante. Para isso estabelecemos uma estatística de teste e uma Região de Rejeição , tal que nosso procedimento seja:
Rejeitamos se .
Nesse caso vamos considerar e vamos rejeitar a hipótese se estiver muito longe de , isto é, se . Portanto definimor nossa Região de Rejeição como , o que reduz nosso problema a determinar .
Qual seria razoável? 4, 5, 1? Essa pergunta não vai ser respondida. Antes vamos visualizar como fica a região crítica (2). Rejeitamos a hipótese se
Assim:
```python C = [1, 10, 30] decision = lambda x1, x2, c: 1np.logical_or(x1 + x2 >= 2c, x1 + x2 <= -2*c) x1,x2 = np.meshgrid(np.arange(-50,50,0.5),np.arange(-50,50,0.5))
fig, ax = plt.subplots(1,3, figsize = (21, 7)) for i, c in enumerate(C): ax[i].contourf(x1,x2,decision(x1,x2, c), levels = [0, 0.5, 1], colors = ['#fdcdac', '#cbd5e8']) ax[i].set_xlabel(r'', fontsize = 20) ax[i].set_ylabel(r'', fontsize = 20) ax[i].set_title('Região Crítica quando c = {}'.format(c), fontsize = 20) ax[i].legend(handles = [mpatches.Patch(color='#fdcdac', label=r''), mpatches.Patch(color='#cbd5e8', label=r'')])
sample = gold_df.Price.diff().sample(n = 2)
X1, X2 = sample.iloc[0], sample.iloc[1]
ax[i].scatter(X1, X2, color = 'black')
ax[i].text(X1 + 1, X2 + 1, s = r'$(X_1, X_2)$', fontsize = 15)
```
- Como a função poder entra nessa história?
A função poder é uma função do parâmetro, no caso , e retorna a probabilidade de rejeitarmos a hipótese, considerando esse parâmetro. Isto é,
O que poderíamos fazer, então, é obter a distribuição conjunta de e integrar na região .
Vamos considerar dois casos separados:
-
: Não sabemos disso, e em geral não é possível sabermos. Nesse caso indica a probabilidade de rejeitarmos a hipótese nula, mesmo ela sendo verdadeira (chamamos isso de Erro do Tipo I).
-
: Nesse caso indica a probabilidade de rejeitarmos a hipótese nula, quando de ela é falsa. Nesse caso é a probabilidade de não rejeitarmos a hipótese nula, quando de fato deveríamos (chamamos de Erro do Tipo II). ]
A função poder se trata mais do teste que estamos usando do que os dados em si. Por isso, podemos comparar testes usando essa função poder. Então vamos ver nesse caso quem é a função poder! Vou calcular usando um método numérico para que peguem a ideia. Agora é possível fazer as contas, mas nem sempre é trivial. Assim teremos apenas aproximação da função poder.
```python C = [1, 10, 30] mu_v = np.arange(-100, 100, 1) n = 10000 power = np.zeros((len(C),len(mu_v)))
for i, c in enumerate(C): for j, mu in enumerate(mu_v): X1 = np.random.normal(loc = mu, scale = 73, size = n) X2 = np.random.normal(loc = mu, scale = 73, size = n) p = (sum(X1 + X2 >= 2c) + sum(X1 + X2 <= -2c))/n power[i,j] = p
plt.plot(mu_v, power[i,:], label = 'c = {}'.format(c))
plt.title('Função poder') plt.xlabel(r'') plt.ylabel('Prob') plt.legend() plt.show() ```
- Vamos definir agora?
Sim, vamos. Para isso vamos usar o ponto (4) e a definição de tamanho do teste. Uma forma possível de se fazer isso é a seguinte: limitamos o Erro I por e miniminizamos o Erro II, isso é minimizamos quando , ou melhor, maximizamos .
Para isso dizemos que o tamanho do teste é o máximo da função poder, quando . Nesse caso . Queremos, então que:
Precisamos então encontrar tal que seja maximado.
Observamos que, quando , . Logo
Para maximizar em , observamos que decresce com (os gráficos acima representam bem isso). Como queremos maximizar, gostaríamos de tomar o mínimo possível, restrito a
como vimos acima. Estamos lidando com uma função inversível, então
O melhor valor de que respeita essa condição e maximiza a relação é, portanto
python
from scipy.stats import norm
Lembre que indica o máximo de Erro I que aceitamos.
python
alpha0 = 0.05
c = np.sqrt(73)/np.sqrt(2)*norm.ppf(1 - alpha0/2)
print(c)
11.841167465893536
É bem próximo do gráfico acima mostrado, quando testamos para .
python
t = np.arange(-20,20,0.1)
X = norm(loc = 0, scale = np.sqrt(73)/np.sqrt(2))
plt.plot(t, X.pdf(t))
plt.fill_between(t[(t < -c)], X.pdf(t[(t < -c)]), color = 'blue')
plt.fill_between(t[(t > c)], X.pdf(t[(t > c)]), color = 'blue')
plt.title('Distribuição Normal e Região de Rejeição')
plt.show()
Por exemplo vamos tirar duas amostras de nossa distribuição
python
X1, X2 = gold_df.Price.diff().sample(2)
T = np.abs(X1 + X2)/2
T >= c
False
- Mas como escolher agora?
Agora entra o conceito mais complexo, o do p-valor. Ele está associado à ideia de escolher o menor possível, para que rejeitemos a hipótese nula. Isso significa o seguinte:
Queremos minimizar o Erro do Tipo I e rejeitar a Hipótese Nula com os dados que obtivemos. Se o p-valor for muito alto, significa que o Erro do Tipo I é grande se rejeitarmos a hipótese nula. Você apostaria que podemos rejeitar a hipótese nula nesse caso? Agora, se o p-valor for pequeno e rejeitarmos nossa hipótese nula, o erro do tipo I vai ser pequeno, então apostar que a hipótese nula deva ser rejeitada é mais confortável.
Assim não escolhemos , só observamos seu menor valor e vemos se faz sentido. Em geral se p-valor < 0.05, as pessoas rejeitam a hipótese nula.
No nosso caso calcular o p-valor é tranquilo. Para calcular o p-valor, precisamos dos dados. Queremos rejeitar a hipótese nula, isto é, queremos que que seja o menor possível, onde é o valor observado de . Vamos diminuindo e para cada podemos calcular e verificamos se . Podemos fazer isso até que , assim:
python
p_value = 2*(1 - norm.cdf(np.sqrt(2)/np.sqrt(73)*T))
print(p_value)
0.8477386286989927
Como o p-valor é alto, não faz sentido rejeitar a hipótese nula.
Encerramos a atividade aqui!
Testes de Razão Verossimilhança
São testes baseados na verossimilhaça do modelo . Suponha que queremos testar a hipótese:
Vamos lembrar que a função de verossimilhança tende a ser mais alta próximo do valor verdadeiro do parâmetro. Com isso em mente, gostaríamos de saber se a verossimilhança é maior em ou em . Para isso, definimos a estatística de razão de verossimilhança: Observe que o denominador é o valor da função de verossimilhança no Estimador de Máxima Verossimilhança. Se o parâmetro verdadeiro estiver em , o númerador deve ser mais alto em , então a estatística se aproxima de 1. Baseado nisso, o teste de razão de verossimilhança é:
Rejeitamos se , para algum .
Teorema:
Seja aberto e suponha que seja , onde . Assuma que seja verdadeira e a função de verossimilhança satisfaça as condições para que o MLE seja assintoticamente normal e assintoticamente eficiente. Então: (converge em distribuição quando ).
A demonstração pode ser encontrada no StatLect
Testes não enviesados
Um teste é dito não enviesado se e
Não é muito utilizado dado seu difícil cálculo numérico e não traz resultados quem valem a pena.