Tengo una variable dependiente continua Y y 2 factores de agrupamiento cruzados dicotómicos formando 4 grupos: A1, A2, B1 y B2. Estoy buscando los efectos principales de cualquier factor, por lo que ajusto un modelo lineal sin una interacción con statsmodels.formula.api.ols
. Aquí tienes un ejemplo reproducible:
np.random.seed(12312)
means = {
'A1': 5,
'A2': 6,
'B1': 3,
'B2': 4
}
N = 20
var = .85
y = []
x1 = []
x2 = []
for k, v in means.items():
y.append(np.random.normal(loc=v, scale=var, size=N))
x1.append([int(k[0]=='A') for i in range(N)])
x2.append([int(k[1]=='1') for i in range(N)])
y = np.concatenate(y)
x1 = np.concatenate(x1)
x2 = np.concatenate(x2)
data = np.stack([y,x1,x2], axis=1)
df = pd.DataFrame(data, columns=['y','x1','x2'])
df.loc[:, 'x1'] = df.x1.astype(int); df.loc[:, 'x2'] = df.x2.astype(int)
lm = ols('y ~ x1 + x2', data=df).fit()
Y aquí tienes el resumen de resultados dado por print(lm.summary())
:
Resultados de Regresión OLS
==============================================================================
Variable dependiente: y R-cuadrado: 0.686
Modelo: OLS R-cuadrado ajustado: 0.677
Método: Mínimos cuadrados Estadística F: 83.93
Fecha: Mar, 03 Dic 2019 Prob (Estadística F): 4.53e-20
Hora: 11:51:53 Log-Likelihood: -98.488
Observaciones: 80 AIC: 203.0
Residuos df: 77 BIC: 210.1
Modelo df: 2
Tipo de covarianza: no robusta
==============================================================================
coeficiente error estándar t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
Intercepto 4.0107 0.164 24.518 0.000 3.685 4.336
x1 2.1321 0.189 11.288 0.000 1.756 2.508
x2 -1.2013 0.189 -6.360 0.000 -1.577 -0.825
==============================================================================
Omnibus: 0.639 Durbin-Watson: 2.121
Prob(Omnibus): 0.727 Jarque-Bera (JB): 0.761
Asimetría: 0.185 Prob(JB): 0.684
Curtosis: 2.699 Cond. No. 3.19
==============================================================================
Puedo ver que los efectos principales que generé están allí, pero no estoy seguro de cómo interpretar exactamente los coeficientes. Intuitivamente, el término de intercepción debería ser exactamente la media de la categoría de referencia (x1=0; x2=0), pero al mirar las medias de los grupos, no lo es:
x1 x2
0 0 4.090842
1 2.729360
1 0 6.062789
1 5.021698
Y la diferencia (entre la intercepción y la media) es aún más pronunciada cuando trabajo con los datos reales.
Dado que no puedo interpretar el coeficiente de intercepción, no estoy seguro de si los otros dos coeficientes representan diferencias entre grupos en relación con la categoría de referencia.
Me di cuenta de que cuando se incluye una interacción (por ejemplo, lm = ols('y ~ x1 * x2', data=df).fit()
), el coeficiente de intercepción se convierte precisamente en la media de la categoría de referencia, y todos los demás coeficientes corresponden a diferencias entre grupos. Entonces, ¿cuáles son los coeficientes cuando la interacción no está incluida?