14. Exemplo: regressão linear#

import numpy as np
%matplotlib inline
from matplotlib import pyplot as plt

x = np.array([1.0, 2.0, 3.0, 4.0, 5.0])
y = np.array([1.0, 2.1, 2.8, 4.1, 5.2])
p = plt.plot(x,y, 'o')
_images/3ac41d01ec98d96378536290eb2c02520980bf056e10597804821a31c75dd6c3.png

from scipy.stats import linregress
m, b, R, p, SEm = linregress(x, y)
  • m: declive

  • b: ordenada na origem

  • R: coeficiente de correlação (de Pearson)

  • p: p-value do teste F em que H0: y = const, independente de x

  • SEm: erro padrão do declive

Falta calcular o SE da ordenada na origem.

def lin_regression(x, y):
    """Simple linear regression (y = m * x + b + error)."""
    m, b, R, p, SEm = linregress(x, y)

    # need to compute SEb, linregress only computes SEm
    n = len(x)
    SSx = np.var(x, ddof=1) * (n-1)  # this is sum( (x - mean(x))**2 )
    SEb2 = SEm**2 * (SSx/n + np.mean(x)**2)
    SEb = SEb2**0.5

    return m, b, SEm, SEb, R, p
m, b, Sm, Sb, R, p = lin_regression(x, y)
plt.plot(x,y, 'o')
plt.xlim(0,None)
plt.ylim(0, None)

# desenho da recta, dados 2 pontos extremos
# escolhemos a origem e o max(x)
x2 = np.array([0, max(x)])

plt.plot(x2, m * x2 + b, '-')

# Anotação sobre o gráfico:
ptxt = 'm = {:>.4g} ± {:6.4f}\nb = {:>.4g} ± {:6.4f}\nR2 = {:7.5f}'

t = plt.text(0.5, 4, ptxt.format(m, Sm, b, Sb, R**2), fontsize=14)
plt.show()
_images/9b951475c5494c88b535cc67cda7eef221493eb60d8eddfdb84ed355a433e01a.png