Test ANOVA de una vía (f_regression) para problemas de regresión#

  • Ultima modificación: 2023-03-11 | YouTube

  • La capacidad explicativa de las variables independientes en modelos de regresión puede realizarse a traves del uso del estadístico F y su respectivos valores críticos.

  • Se debe calcular la correlación cruzada entre cada regresor y la variable explicada:

\text{cross-corr}(x_i, y) = \frac{\frac{1}{n}\sum_i (x_i - \bar{x}) * (y - \bar{y})}{\text{std}(x_i) * \text{std}(y)}

  • El estadístico F se calcula en este caso como:

    F_\text{statistic} = \frac{\text{cross-corr}(x_i, y)^2}{1 - \text{cross-corr}(x_i, y)^2} * (n - 2)

    donde n es la cantidad de patrones del dataset.

  • El estadístico sigue una distribución F(1, n-2).

[1]:
import numpy as np
from sklearn.datasets import make_regression

X, y = make_regression(
    n_samples=30,
    n_features=2,
    n_informative=1,
    noise=12,
    random_state=123,
)
[2]:
#
# Cómputo de las medias y las desviaciones estándar
#
y_mean = np.mean(y)
y_std = np.std(y)

x0 = X[:, 0].reshape(-1)
x0_mean = np.mean(x0)
x0_std = np.std(x0)

x1 = X[:, 1].reshape(-1)
x1_mean = np.mean(x1)
x1_std = np.std(x1)
[3]:
#
# Coeficientes de correlación
#
corr_coeff_x0 = np.mean((x0 - x0_mean) * (y - y_mean)) / (x0_std * y_std)
corr_coeff_x1 = np.mean((x1 - x1_mean) * (y - y_mean)) / (x1_std * y_std)

squared_corr_coeff_x0 = corr_coeff_x0 ** 2
squared_corr_coeff_x1 = corr_coeff_x1 ** 2
[4]:
#
# Cálculo de los estadísticos F
#
f_statistic_x0 = squared_corr_coeff_x0 / (1 - squared_corr_coeff_x0) * (len(X) - 2)
f_statistic_x1 = squared_corr_coeff_x1 / (1 - squared_corr_coeff_x1) * (len(X) - 2)

display(
    f_statistic_x0,
    f_statistic_x1,
)
2325.283260155656
1.4326568685428067
[5]:
#
# Cálculo de los valores críticos
#
from scipy.stats import f

display(
    1 - f.cdf(f_statistic_x0, 1, len(X) - 2),
    1 - f.cdf(f_statistic_x1, 1, len(X) - 2),
)
1.1102230246251565e-16
0.2413675068071277

https://scikit-learn.org/stable/modules/generated/sklearn.feature_selection.f_regression.html#sklearn.feature_selection.f_regression

[6]:
#
# --- Verificación ------------------------------------------------------------
#
from sklearn.feature_selection import f_regression

f_statistic, p_values = f_regression(X, y)

display(
    f_statistic[0],
    f_statistic[1],
    p_values[0],
    p_values[1],
)
2325.2832601555683
1.4326568685428058
1.7127059787182625e-28
0.24136750680712935