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() ```

png

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() ```

png

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

  1. Os preditores são conhecidos;
  2. A distribuição de condicionada em é normal.
  3. A média condicional é linear com parâmetros e .
  4. Homoscedasticidade, isto é, variância constante.
  5. 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()

png

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
==============================================================================