Modelo Linear
Mínimos quadrados
Sejam os pontos . A reta que minimiza segundo e tem inclinação e intercepto
A verificação desse resultado é direta ao derivar o funcional objetivo com respeito aos parâmetros e igualando a 0. Além disso, observar que a Hessiana é definida positiva, o que garante a existência do mínimo local (que nesse caso será global).
```python import numpy as np import matplotlib.pyplot as plt from scipy.stats import t from statsmodels.regression.linear_model import OLS plt.style.use('ggplot')
ro = np.random.RandomState(10000) ```
Vamos gerar os pontos e calcular a reta que minimiza os mínimos quadrados.
```python n = 20 x = ro.uniform(0,10, size = n) epsilon = ro.normal(0, scale = 3, size = n) beta0, beta1 = ro.uniform(0,10, size = 2) y = beta0 + beta1*x + epsilon
plt.scatter(x,y) plt.title('Pontos gerados') plt.show() ```
Estimando os coeficientes
```python beta1_hat = np.dot(y - y.mean(), x - x.mean())/np.dot(x - x.mean(), x - x.mean()) beta0_hat = y.mean() - beta1_hat*x.mean()
t = np.linspace(0,10,1000) plt.scatter(x,y, label = r' = {:.2f}, = {:.2f}'.format(beta0, beta1)) plt.plot(t,beta0_hat + beta1_hat*t, color = 'blue', label = r' = {:.2f}, = {:.2f}'.format(beta0_hat, beta1_hat)) plt.legend() plt.title('Reta mínimos quadrados') plt.show() ```
Agora vamos usar numpy para a estimação. Observe que o resultado coincide com o calculado usando a fórmula derivada.
```python
adiciona coluna de 1 para lidar com o beta_0
xlinha = np.c_[np.ones(n),x]
sol, _, _, _ = np.linalg.lstsq(xlinha, y, rcond = None)
print(sol)
```
[3.40285283 3.52323316]
Várias variáveis
Nesse caso, queremos encontrar um hiperplano que minimiza
Nesse caso teremos equações para resolver.
Regressão
Dizemos que são preditores e é a resposta. A esperança condicional da resposta dados os preditores é chamada de função regressão. Assim a regressão de sobre depende dos valores assumidos pelos preditores. Vamos assumir que estamos com uma regressão linear e, portanto,
onde os coeficientes são coeficientes de regressão, que são desconhecidos (parâmetros do modelo).
Regressão Linear Simples
Nesse caso para cada e, em geral, .
Assumimos que
- Os preditores são conhecidos;
- A distribuição de condicionada em é normal.
- A média condicional é linear com parâmetros e .
- Homoscedasticidade, isto é, variância constante.
- Independência das respostas dadas as covariáveis.
Teorema: Os estimadores de máxima verossimilhança de e são os de mínimos quadrados e de é
Distribuição dos estimadores: Considere os estimadores de mínimos quadrados como função das variáveis aleatórias dados os preditores .
tal que Em particular a distribuição conjunta desses parâmetros é uma normal bivariada com as médias, variâncias e covariância especificadas acima. As distribuições são todas condicionadas em .
Além disso, se é independente de e tem distribuição com graus de liberdade.
Inferência sobre regressão linear simples
Teste de hipóteses sobre os coeficientes
Defina
Sejam e números especificados onde para algum e suponha que queiramos testar
Para cada um teste de hipóteses com nível é rejeitar se , onde
Para ver isso, basta olhar a variável que tem distribuição normal padrão
e que
A mesma derivação pode ser usada para testes unilaterais. A diferença é que rejeitaremos quando quando a hipótese nula é uma desigualdade do tipo menor igual ou quando é do tipo maior ou igual.
Exemplo: Vamos testar a hipótese de que em relação a curva anterior. Só para lembrar:
python
t = np.linspace(0,10,1000)
plt.scatter(x,y, label = r'$\beta_0$ = {:.2f}, $\beta_1$ = {:.2f}'.format(beta0, beta1))
plt.plot(t,beta0_hat + beta1_hat*t, color = 'blue', label = r'$\beta_0$ = {:.2f}, $\beta_1$ = {:.2f}'.format(beta0_hat, beta1_hat))
plt.legend()
plt.title('Reta mínimos quadrados')
plt.show()
Nesse caso temos e . Assim:
```python
O denominador da divisão é n - ddof
sx2 = np.var(x, ddof = n - 1) S2 = sum((y - beta0_hat - beta1_hatx)2) sigma_prime = (S2/(n-2))*(1/2)
Estatística de teste
U = np.sqrt(sx2)*beta1_hat/sigma_prime ```
Seja o nível de significância
python
alpha0 = 0.05
abs(U) >= t.ppf(1 - alpha0/2, df = n-2)
True
Como isso é verdade, rejeitamos a hipótese nula!
Intervalos de confiança
Temos que é un intervalo de confiança para . Para encontrar esse intervalo basta encontrar o conjunto de todos os valores para que a hipótese nula seja rejeitada a nível de significância .
No nosso exemplo, um intervalo para é
python
[beta1_hat - sigma_prime*(1/np.sqrt(sx2))*t.ppf(1 - alpha0/2, df = n-2),
beta1_hat + sigma_prime*(1/np.sqrt(sx2))*t.ppf(1 - alpha0/2, df = n-2)]
[3.00233584703191, 4.044130469815932]
Usando o pacote statsmodels
python
model = OLS(y,xlinha)
result = model.fit()
print(result.params)
[3.40285283 3.52323316]
Observe que os parâmetros estimados são os mesmo que encontramos com numpy
e na mão. Também observe que o tvalor calculado coincide com nossa estatística U
python
print('Nossa: {}'.format(U))
print('Statsmodels: {}'.format(result.tvalues[1]))
Nossa: 14.210167788464632
Statsmodels: 14.21016778846464
Podemos colocar e e obteremos o intervalo de confiança como desejávamos!
python
result.t_test([0,1])
<class 'statsmodels.stats.contrast.ContrastResults'>
Test for Constraints
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
c0 3.5232 0.248 14.210 0.000 3.002 4.044
==============================================================================