回归系数与条件均值不匹配
Regression coefficients do not match conditional means
您可以下载以下数据集from this repo。
Y
CONST
T
X1
X1T
X2
X2T
0
2.31252
1
1
0
0
1
1
1
-0.836074
1
1
1
1
1
1
2
-0.797183
1
0
0
0
1
0
我有一个因变量 (Y
) 和三个二进制列 (T
、X1
和 X2
)。根据这些数据,我们可以创建四个组:
X1 == 0
和 X2 == 0
X1 == 0
和 X2 == 1
X1 == 1
和 X2 == 0
X1 == 1
和 X2 == 1
在每个组中,我想计算 T == 1
和 T == 0
观察值之间 Y
平均值的差异。
我可以使用以下代码:
# Libraries
import pandas as pd
# Group by T, X1, X2 and get the mean of Y
t = df.groupby(['T','X1','X2'])['Y'].mean().reset_index()
# Reshape the result and rename the columns
t = t.pivot(index=['X1','X2'], columns='T', values='Y')
t.columns = ['Teq0','Teq1']
# I want to replicate these differences with a regression
t['Teq1'] - t['Teq0']
> X1 X2
> 0 0 0.116175
> 1 0.168791
> 1 0 -0.027278
> 1 -0.147601
问题
我想使用以下回归模型 (m
) 重新创建这些结果。
# Libraries
from statsmodels.api import OLS
# Fit regression with interaction terms
m = OLS(endog=df['Y'], exog=df[['CONST','T','X1','X1T','X2','X2T']]).fit()
# Estimated values
m.params[['T','X1T','X2T']]
> T 0.162198
> X1T -0.230372
> X2T -0.034303
我期待系数:
T
= 0.116175
T + X1T
= 0.168791
T + X2T
= -0.027278
T + X1T + X2T
= -0.147601
问题
为什么回归系数与第一个块的输出结果不匹配 (t['Teq1'] - t['Teq0']
)?
感谢@Josef 注意到 T
、X1
和 X2
有八种不同的组合,而我的回归模型有六个参数。因此,我缺少两个交互项(因此缺少两个参数)。
即回归模型需要考虑X1
和X2
之间的交互作用以及X1
、X2
和[=12=之间的交互作用].
这可以通过声明缺少的交互列并拟合模型来完成:
# Declare missing columns
df = df.assign(X1X2 = df['X1'].multiply(df['X2']),
X1X2T = df['X1'].multiply(df['X2T']))
# List of independent variables
cols = ['CONST','T','X1','X1T','X2','X2T','X1X2','X1X2T']
# Fit model
m = OLS.fit(endog=df['Y'], exog=df[cols]).fit()
或者,我们可以使用公式界面:
# Declare formula
f = 'Y ~ T + X1 + I(X1*T) + X2 + I(X2*T) + I(X1*X2) + I(X1*X2*T)'
# Fit model
m = OLS.from_formula(formula=f, data=df).fit()
您可以下载以下数据集from this repo。
Y | CONST | T | X1 | X1T | X2 | X2T | |
---|---|---|---|---|---|---|---|
0 | 2.31252 | 1 | 1 | 0 | 0 | 1 | 1 |
1 | -0.836074 | 1 | 1 | 1 | 1 | 1 | 1 |
2 | -0.797183 | 1 | 0 | 0 | 0 | 1 | 0 |
我有一个因变量 (Y
) 和三个二进制列 (T
、X1
和 X2
)。根据这些数据,我们可以创建四个组:
X1 == 0
和X2 == 0
X1 == 0
和X2 == 1
X1 == 1
和X2 == 0
X1 == 1
和X2 == 1
在每个组中,我想计算 T == 1
和 T == 0
观察值之间 Y
平均值的差异。
我可以使用以下代码:
# Libraries
import pandas as pd
# Group by T, X1, X2 and get the mean of Y
t = df.groupby(['T','X1','X2'])['Y'].mean().reset_index()
# Reshape the result and rename the columns
t = t.pivot(index=['X1','X2'], columns='T', values='Y')
t.columns = ['Teq0','Teq1']
# I want to replicate these differences with a regression
t['Teq1'] - t['Teq0']
> X1 X2
> 0 0 0.116175
> 1 0.168791
> 1 0 -0.027278
> 1 -0.147601
问题
我想使用以下回归模型 (m
) 重新创建这些结果。
# Libraries
from statsmodels.api import OLS
# Fit regression with interaction terms
m = OLS(endog=df['Y'], exog=df[['CONST','T','X1','X1T','X2','X2T']]).fit()
# Estimated values
m.params[['T','X1T','X2T']]
> T 0.162198
> X1T -0.230372
> X2T -0.034303
我期待系数:
T
= 0.116175T + X1T
= 0.168791T + X2T
= -0.027278T + X1T + X2T
= -0.147601
问题
为什么回归系数与第一个块的输出结果不匹配 (t['Teq1'] - t['Teq0']
)?
感谢@Josef 注意到 T
、X1
和 X2
有八种不同的组合,而我的回归模型有六个参数。因此,我缺少两个交互项(因此缺少两个参数)。
即回归模型需要考虑X1
和X2
之间的交互作用以及X1
、X2
和[=12=之间的交互作用].
这可以通过声明缺少的交互列并拟合模型来完成:
# Declare missing columns
df = df.assign(X1X2 = df['X1'].multiply(df['X2']),
X1X2T = df['X1'].multiply(df['X2T']))
# List of independent variables
cols = ['CONST','T','X1','X1T','X2','X2T','X1X2','X1X2T']
# Fit model
m = OLS.fit(endog=df['Y'], exog=df[cols]).fit()
或者,我们可以使用公式界面:
# Declare formula
f = 'Y ~ T + X1 + I(X1*T) + X2 + I(X2*T) + I(X1*X2) + I(X1*X2*T)'
# Fit model
m = OLS.from_formula(formula=f, data=df).fit()