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