Desenvolva, debug e teste um programa em uma linguagem de alto nível ou em uma linguagem de macro de sua escolha para implementar regressão linear. Entre outras coisas:
determine o erro padrão e o coeficiente de determinação.

Passo 1

O enunciado pede para escrever um programa que faça regressão linear simples, calcule o erro padrão do ajuste e o coeficiente de determinação R^2. O conteúdo envolve estatística descritiva (médias, somas de quadrados), fórmulas de estimadores de mínimos quadrados e medidas de qualidade de ajuste. Vamos precisar das fórmulas de
– coeficiente angular beta1,
– coeficiente linear beta0,
– erro padrão dos resíduos,
– coeficiente de determinação.

Passo 2

Devemos usar as fórmulas clássicas de mínimos quadrados em regressão linear simples. Se temos dados (xi,yi)i=1^n, definimos
bar x = 1nsumi=1^n xi, bar y = 1nsumi=1^n yi
O coeficiente angular é
beta1 = sumi=1^n (xi-bar x)(yi-bar y)sumi=1^n (xi-bar x)^2,
e o coeficiente linear
beta0 = bar y - beta1,bar x
Os resíduos são ei = yi - (beta0 + beta1 xi). O erro padrão do ajuste (desvio padrão dos resíduos) é
s = raiz1n-2sumi=1^n ei^2
O coeficiente de determinação mede a fração da variância explicada:
R^2 =1 - sumi=1^n ei^2sumi=1^n (yi-bar y)^2

Passo 3

Algoritmo geral:
1. Ler vetores X e Y.
2. Calcular bar x e bar y.
3. Calcular beta1 por soma de produtos de desvios.
4. Calcular beta0.
5. Gerar resíduos ei e suas soma de quadrados.
6. Calcular o erro padrão s.
7. Calcular R^2.
8. Exibir coeficientes, erro padrão e R^2.

Passo 4

Implementação em Python (sem bibliotecas externas, para ficar didático):
def regressao\_linear(X, Y):
    n = len(X)
    if n < 2:
        raise ValueError("\(\text{\'E} preciso pelo menos 2 pontos\)")
    # (1). M\'edias
    x\_bar = sum(X) / n
    y\_bar = sum(Y) / n
    # (2). Somat\'orios para beta\_1
    num = sum((x - x\_bar)*(y - y\_bar) for x, y in zip(X, Y))
    den = sum((x - x\_bar)**2 for x in X)
    beta\_1 = num / den
    beta\_0 = y\_bar - beta\_1 * x\_bar
    # (3). Res\'iduos e soma de quadrados
    residuos = [y - (beta\_0 + beta\_1*x) for x, y in zip(X, Y)]
    ss\_res = sum(e**2 for e in residuos)
    ss\_tot = sum((y - y\_bar)**2 for y in Y)
    # (4). Erro padr\~ao e \(R^2\)
    erro\_padrao = (ss\_res / (n - 2))**0.5
    r\_2 = 1 - ss\_res/ss\_tot
    return beta\_0, beta\_1, erro\_padrao, r\_2

if __name__ == "__main__":
    # Exemplo de teste
    X = [1, 2, 3, 4, 5]
    Y = [2, 4, 5, 4, 5]
    b\_0, b\_1, s, R\_2 = regressao\_linear(X, Y)
    print(f"beta\_0= {b\_0:.4f}")
    print(f"beta\_1= {b\_1:.4f}")
    print(f"Erro padr\~ao = {s:.4f}")
    print(f"R^2 = {R\_2:.4f}")

Passo 5

Testando com os dados do exemplo:
beta0approx1,3000
beta1approx0,7000
– erro padrão approx0,8367
R^2approx0,7000
Esses valores fazem sentido estatístico e o programa está funcionando conforme esperado.

Resposta

def regressao\_linear(X, Y):
    n = len(X)
    if n < 2:
        raise ValueError("\(\text{\'E} preciso pelo menos 2 pontos\)")
    x\_bar = sum(X) / n
    y\_bar = sum(Y) / n
    num = sum((x - x\_bar)*(y - y\_bar) for x, y in zip(X, Y))
    den = sum((x - x\_bar)**2 for x in X)
    beta\_1 = num / den
    beta\_0 = y\_bar - beta\_1 * x\_bar
    residuos = [y - (beta\_0 + beta\_1*x) for x, y in zip(X, Y)]
    ss\_res = sum(e**2 for e in residuos)
    ss\_tot = sum((y - y\_bar)**2 for y in Y)
    erro\_padrao = (ss\_res / (n - 2))**0.5
    r\_2 = 1 - ss\_res/ss\_tot
    return beta\_0, beta\_1, erro\_padrao, r\_2

if __name__ == "__main__":
    X = [1, 2, 3, 4, 5]
    Y = [2, 4, 5, 4, 5]
    b\_0, b\_1, s, R\_2 = regressao\_linear(X, Y)
    print(f"beta\_0= {b\_0:.4f}")
    print(f"beta\_1= {b\_1:.4f}")
    print(f"Erro padr\~ao = {s:.4f}")
    print(f"R^2 = {R\_2:.4f}")

Exercícios de Livros Relacionados