Simulación de un ajuste lineal bajo la hipótesis alternativa (H₁)

Simulación de un modelo lineal
Simulación de un modelo lineal

Planteamiento de hipótesis

Sea

\[ \begin{equation} f:[-1,1] \rightarrow \mathbb{R} \ \ \ \ \ f(x) = sin(x) \end{equation} \] Para N=\(2\). Se quiere probar la verificar la siguiente hipóteis \[ \begin{eqnarray*} H_0 &:& h(x) = b \\ H_1 &:& h(x) = ax+b \end{eqnarray*} \] cuál es mejor, \(H_0\) o \(H_1\)?

\(H_0\) : h(x) = b

Para hallar la recta, hay que minimizar la suma de cuadrados del error \[ \sum_{i=1}^{n} e_i^2= \sum_{i=1}^{n} (sen(\pi x)-a)^2 \] derivamos con respecto a

\[ \frac{\partial}{\partial a} \sum_{i=1}^{n} e_i^2 = -2 \sum_{i=1}^{n} (sen(\pi x)-a) \] Igualando a cero y despejando a \[ \begin{eqnarray*} -2 \sum_{i=1}^{n} (sen(\pi x)-a) & = & 0\\ \sum_{i=1}^{n} (sen(\pi x)-a) & = & 0\\ na & = & \sum_{i=1}^{n} sen(\pi x) \\ \hat{a} & = & \frac{1}{n}\sum_{i=1}^{n} sen(\pi x) \\ \end{eqnarray*} \] ## Simulación

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import random
sns.set_theme()
n = 1
# Secuencia de x de -1 a 1 con paso de 0.001
x = np.arange(-1, 1, 0.001)
plt.figure(figsize=(12, 5))
plt.plot(x, np.sin(np.pi * x), color='blue', linewidth=0.2, label='sin(pi*x)')
plt.title(f"Simulación de {2} puntos para H₀")
for i in range(n):
    # Genera 2 valores uniformes en [-1, 1]
    u = np.random.uniform(-1, 1,2)
    y = np.sin(np.pi * u)
    # Línea horizontal 
    lin = (np.sin(np.pi * u[0]) + np.sin(np.pi * u[1])) / 2
    plt.axhline(y=lin, color='black', linewidth=0.3)
    # Línea horizontal en 0 (gris, discontinua)
    plt.axhline(y=0, color='grey', linestyle='--', linewidth=0.5)
    # Puntos 
    plt.scatter(u, y, color='black', s=10)
    plt.xlabel('x')
plt.ylabel('sin(pi*x)')
plt.grid(True, linestyle='--', alpha=0.4)
plt.show()

n = 100
# Secuencia de x de -1 a 1 con paso de 0.001
x = np.arange(-1, 1, 0.001)
plt.figure(figsize=(12, 5))
plt.plot(x, np.sin(np.pi * x), color='blue', linewidth=0.2, label='sin(pi*x)')
plt.title(f"Simulación de {2} puntos para H₀")
for i in range(n):
    # Genera 2 valores uniformes en [-1, 1]
    u = np.random.uniform(-1, 1,2)
    y = np.sin(np.pi * u)
    # Línea horizontal 
    lin = (np.sin(np.pi * u[0]) + np.sin(np.pi * u[1])) / 2
    plt.axhline(y=lin, color='black', linewidth=0.3)
    # Línea horizontal en 0 (gris, discontinua)
    plt.axhline(y=0, color='grey', linestyle='--', linewidth=0.5)
    # Puntos 
    plt.scatter(u, y, color='black', s=10)
    plt.xlabel('x')
plt.ylabel('sin(pi*x)')
plt.grid(True, linestyle='--', alpha=0.4)
plt.show()

n = 1000
# Secuencia de x de -1 a 1 con paso de 0.001
x = np.arange(-1, 1, 0.001)
plt.figure(figsize=(12, 5))
plt.plot(x, np.sin(np.pi * x), color='blue', linewidth=0.2, label='sin(pi*x)')
plt.title(f"Simulación de {2} puntos para H₀")
for i in range(n):
    # Genera 2 valores uniformes en [-1, 1]
    u = np.random.uniform(-1, 1,2)
    y = np.sin(np.pi * u)
    # Línea horizontal 
    lin = (np.sin(np.pi * u[0]) + np.sin(np.pi * u[1])) / 2
    plt.axhline(y=lin, color='black', linewidth=0.3)
    # Línea horizontal en 0 (gris, discontinua)
    plt.axhline(y=0, color='grey', linestyle='--', linewidth=0.5)
    # Puntos 
    plt.scatter(u, y, color='black', s=10)
    plt.xlabel('x')
plt.ylabel('sin(pi*x)')
plt.grid(True, linestyle='--', alpha=0.4)
plt.show()

\(H_1\) : h(x) = ax + b

Primero se tiene que minimizar la suma de cuadrados del error \[ \sum_{i=1}^{n} e_i^2 = \sum_{i=1}^{n} (sen(\pi x_i) - a x_i +b)^2 \] derivamos parcialmente con respecto a a y b e igualamos a cero, de la forma siguiente:

\[ \begin{eqnarray} \frac{\partial e^2}{\partial a} & = & -2 \sum_{i=1}^{n} (x_i sen(\pi x_i )-a x_i^2 bx_i) \nonumber \\ 0 & = & \sum_{i=1}^{n} (x_i sen(\pi x_i )-a x_i^2 bx_i) \end{eqnarray} \] y \[ \begin{eqnarray} \frac{\partial e^2}{\partial b} & = & -2 \sum_{i=1}^{n} (sen(\pi x_i )-a x_i - b) \nonumber \\ 0 & = & \sum_{i=1}^{n} (sen(\pi x_i )-a x_i - b) \end{eqnarray} \] Resolviendo el sistema se tiene que \[ \begin{eqnarray} \sum_{i=1}^{n} (sen(\pi x_i )-a \sum_{i=1}^{n} x_i - nb & = & 0 \nonumber \\ nb & = & \sum_{i=1}^{n} (sen(\pi x_i )-a \sum_{i=1}^{n} x_i \nonumber \\ \hat{b} & = & \cfrac{\sum_{i=1}^{n} (sen(\pi x_i )-a \sum_{i=1}^{n} x_i} {n} \end{eqnarray} \] Sustituyendo y resolviendo para \(a\) \[ \begin{eqnarray*} \sum_{i=1}^{n} x_i sen(\pi x_i)-a\sum_{i=1}^{n} x_i^2 - b \sum_{i=1}^{n} x_i & = & 0\\ \sum_{i=1}^{n} x_i sen(\pi x_i)-\sum_{i=1}^{n} a x_i^2 - \left(\sum_{i=1}^{n} (sen(\pi x_i )-a \sum_{i=1}^{n} x_i \right) \sum_{i=1}^{n} x_i & = & 0\\ \sum_{i=1}^{n} x_i sen(\pi x_i)- a \sum_{i=1}^{n} x_i^2 + \frac{a}{n} \left(\sum_{i=1}^{n} x_i \right)^2 - \frac{1}{n} \sum_{i=1}^{n} x_i \sum_{i=1}^{n} sen(\pi x_i)& = & 0\\ a \left( \frac{1}{n} \left(\sum_{i=1}^{n} x_i \right)^2 - \sum_{i=1}^{n} x_i^2 \right) = \frac{1}{n} \sum_{i=1}^{n} x_i \sum_{i=1}^{n} sen(\pi x_i) - \sum_{i=1}^{n} x_i sen(\pi x_i) \end{eqnarray*} \] \[ \begin{eqnarray} \hat{a} & = & \cfrac{\cfrac{1}{n} \sum_{i=1}^{n} x_i \sum_{i=1}^{n} sen(\pi x_i) - \sum_{i=1}^{n} x_i sen(\pi x_i)}{ \cfrac{1}{n} \left(\sum_{i=1}^{n} x_i \right)^2 - \sum_{i=1}^{n} x_i^2 } \end{eqnarray} \] Con base en lo anterior se obtuvo los resultados mostrados en las siguientes gr'aficas.

Simulación

m = 1
# Secuencia de y de -1 a 1 con paso de 0.001
y = np.arange(-1, 1, 0.001)
plt.figure(figsize=(12, 5))
plt.plot(y, np.sin(np.pi * y), color='blue', linewidth=0.2)
plt.title(f"Simulación {m} pares de puntos para H₁")
# Línea horizontal en y = 0 (gris, discontinua)
plt.axhline(y=0, color='grey', linestyle='--', linewidth=0.8)
for i in range(m):
    # Genera 2 valores uniformes en [-1, 1]
    x = np.random.uniform(-1, 1, 2)
    n = len(x)
    # modelo lineal
    a = ((1/n) * np.sum(x) * np.sum(np.sin(np.pi * x)) - np.sum(x * np.sin(np.pi * x))) / \
        ((1/n) * (np.sum(x))**2 - np.sum(x**2))
    b = (-a * np.sum(x) + np.sum(np.sin(np.pi * x))) / n
    # Dibuja los puntos
    plt.scatter(x, np.sin(np.pi * x), color='black', s=10)
    # Línea ajustada
    x_line = np.linspace(-1, 1, 100)
    plt.plot(x_line, a * x_line + b, color='black', linewidth=0.4)
plt.xlabel('x')
plt.ylabel('sin(pi*x)')
plt.ylim(-1.5, 1.5)
## (-1.5, 1.5)
plt.grid(True, linestyle='--', alpha=0.4)
plt.show()

m = 100
# Secuencia de y de -1 a 1 con paso de 0.001
y = np.arange(-1, 1, 0.001)
plt.figure(figsize=(12, 5))
plt.plot(y, np.sin(np.pi * y), color='blue', linewidth=0.2)
plt.title(f"Simulación {m} pares de puntos para H₁")
# Línea horizontal en y = 0 (gris, discontinua)
plt.axhline(y=0, color='grey', linestyle='--', linewidth=0.8)
for i in range(m):
    # Genera 2 valores uniformes en [-1, 1]
    x = np.random.uniform(-1, 1, 2)
    n = len(x)
    # modelo lineal
    a = ((1/n) * np.sum(x) * np.sum(np.sin(np.pi * x)) - np.sum(x * np.sin(np.pi * x))) / \
        ((1/n) * (np.sum(x))**2 - np.sum(x**2))
    b = (-a * np.sum(x) + np.sum(np.sin(np.pi * x))) / n
    # Dibuja los puntos
    plt.scatter(x, np.sin(np.pi * x), color='black', s=10)
    # Línea ajustada
    x_line = np.linspace(-1, 1, 100)
    plt.plot(x_line, a * x_line + b, color='black', linewidth=0.4)
plt.xlabel('x')
plt.ylabel('sin(pi*x)')
plt.ylim(-1.5, 1.5)
## (-1.5, 1.5)
plt.grid(True, linestyle='--', alpha=0.4)
plt.show()

m = 1000
# Secuencia de y de -1 a 1 con paso de 0.001
y = np.arange(-1, 1, 0.001)
plt.figure(figsize=(12, 5))
plt.plot(y, np.sin(np.pi * y), color='blue', linewidth=0.2)
plt.title(f"Simulación {m} pares de puntos para H₁")
# Línea horizontal en y = 0 (gris, discontinua)
plt.axhline(y=0, color='grey', linestyle='--', linewidth=0.8)
for i in range(m):
    # Genera 2 valores uniformes en [-1, 1]
    x = np.random.uniform(-1, 1, 2)
    n = len(x)
    # modelo lineal
    a = ((1/n) * np.sum(x) * np.sum(np.sin(np.pi * x)) - np.sum(x * np.sin(np.pi * x))) / \
        ((1/n) * (np.sum(x))**2 - np.sum(x**2))
    b = (-a * np.sum(x) + np.sum(np.sin(np.pi * x))) / n
    # Dibuja los puntos
    plt.scatter(x, np.sin(np.pi * x), color='black', s=10)
    # Línea ajustada
    x_line = np.linspace(-1, 1, 100)
    plt.plot(x_line, a * x_line + b, color='black', linewidth=0.4)
plt.xlabel('x')
plt.ylabel('sin(pi*x)')
plt.ylim(-1.5, 1.5)
## (-1.5, 1.5)
plt.grid(True, linestyle='--', alpha=0.4)
plt.show()